<div class="section" id="python-definition-example">
<span id="cookbook-python-definition-example"></span><span id="index-0"></span>
<p>Here is an example of a Python Suite Definition, hosting a task that
might be helpful for simple SMS suite translation to ecFlow:</p>
<div class="highlight-python"><pre>:: cd ~map/course/201303/ecflow; python course.py</pre>
</div>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span>
<span class="sd">&quot;&quot;&quot; suite builder example for 2013 ecFlow course &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">os</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39;/home/ma/emos/def/ecflow&#39;</span><span class="p">)</span>

<span class="kn">import</span> <span class="nn">ecf</span> <span class="kn">as</span> <span class="nn">ec</span>
<span class="kn">from</span> <span class="nn">ecf</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">import</span> <span class="nn">inc_emos</span> <span class="kn">as</span> <span class="nn">ie</span> <span class="c"># provides Seed class + system related dependencies </span>

<span class="c"># cd ~map/course/201303/ecflow; python course.py # task wrappers underneath</span>
<span class="c"># consume: choices for a family matching the producer-consumer pattern</span>
<span class="c">#   local family + remote family + BEWARE ECF_OUT + log-server example</span>
<span class="c"># barber:  an example of a &quot;dynamical suite&quot;, with a &quot;family producer task&quot;</span>
<span class="c"># perl + python: example that task wrapper may not be ksh/bash scripts</span>

<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">date</span>
<span class="kn">import</span> <span class="nn">argparse</span>

<span class="n">today</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">())</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;-&#39;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>

<span class="c">############################################################################</span>

<span class="k">class</span> <span class="nc">GenericFamily</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; provide structure for derived classes&quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">make</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span> 
        <span class="k">return</span> <span class="n">node</span>
    <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span> 
        <span class="k">return</span> <span class="ne">BaseException</span> <span class="c"># return node</span>
    <span class="k">def</span> <span class="nf">arch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span> 
        <span class="k">return</span> <span class="n">node</span>

<span class="c">############################################################################</span>

<span class="k">class</span> <span class="nc">NativePerl</span><span class="p">(</span><span class="n">GenericFamily</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; ksh is not the only language for task wrappers&quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;perl&quot;</span>

    <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="n">tsk</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Variables</span><span class="p">(</span><span class="n">ECF_MICRO</span><span class="o">=</span> <span class="s">&quot;^&quot;</span><span class="p">,</span>
                          <span class="n">ECF_JOB_CMD</span><span class="o">=</span> <span class="s">&quot;^ECF_JOB^ &gt; ^ECF_JOBOUT^ 2&gt;&amp;1&quot;</span><span class="p">),</span>
                <span class="n">Meter</span><span class="p">(</span><span class="s">&quot;step&quot;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span>
                <span class="n">Event</span><span class="p">(</span><span class="s">&quot;1&quot;</span><span class="p">),</span>
                <span class="n">Event</span><span class="p">(</span><span class="s">&quot;2&quot;</span><span class="p">),</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;none&quot;</span><span class="p">),</span>            
                <span class="p">)</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tsk</span><span class="p">)</span>

<span class="c">############################################################################</span>

<span class="k">class</span> <span class="nc">NativePython</span><span class="p">(</span><span class="n">NativePerl</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; ksh is not the only language for task wrappers&quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">NativePerl</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;python&quot;</span>

<span class="c">############################################################################</span>

<span class="k">def</span> <span class="nf">_kind</span><span class="p">(</span><span class="n">prod</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">cons</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="n">Variables</span><span class="p">(</span><span class="n">CONSUME</span><span class="o">=</span> <span class="n">cons</span><span class="p">,</span> <span class="n">PRODUCE</span><span class="o">=</span><span class="n">prod</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_evt</span><span class="p">():</span> <span class="k">return</span> <span class="p">(</span><span class="n">Event</span><span class="p">(</span><span class="s">&quot;p&quot;</span><span class="p">),</span> <span class="n">Event</span><span class="p">(</span><span class="s">&quot;c&quot;</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_leaf</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;produce&quot;</span><span class="p">,</span> <span class="n">init</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">stop</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
    <span class="n">add</span> <span class="o">=</span> <span class="bp">None</span>
    <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">stop</span><span class="p">)</span> <span class="o">==</span> <span class="nb">int</span><span class="p">:</span>
        <span class="n">add</span> <span class="o">=</span> <span class="n">Meter</span><span class="p">(</span><span class="s">&quot;step&quot;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">stop</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
        <span class="n">_evt</span><span class="p">(),</span>
        <span class="n">add</span><span class="p">,</span>
        <span class="n">Variables</span><span class="p">(</span><span class="n">INIT</span><span class="o">=</span> <span class="n">init</span><span class="p">,</span>
                  <span class="n">STOP</span><span class="o">=</span> <span class="n">stop</span><span class="p">,</span>
                  <span class="n">STEP</span><span class="o">=</span> <span class="n">step</span><span class="p">),)</span>               

<span class="c">############################################################################</span>
<span class="k">class</span> <span class="nc">FallBack</span><span class="p">(</span><span class="n">GenericFamily</span><span class="p">):</span>    
    <span class="sd">&quot;&quot;&quot; in some situation, user may want its family to continue, and</span>
<span class="sd">    repeat to increment, even when some tasks abort &quot;&quot;&quot;</span>
    
    <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">Family</span><span class="p">(</span><span class="s">&quot;daily&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;YMD&quot;</span><span class="p">,</span> 
                                      <span class="n">start</span><span class="o">=</span><span class="n">today</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="n">DATE_STOP</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;action&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Time</span><span class="p">(</span><span class="s">&quot;10:00&quot;</span><span class="p">)),</span>
            <span class="n">Family</span><span class="p">(</span><span class="s">&quot;loop&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Time</span><span class="p">(</span><span class="s">&quot;11:00&quot;</span><span class="p">),</span>
                <span class="n">Task</span><span class="p">(</span><span class="s">&quot;dummy&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                    <span class="n">TriggerImpossible</span><span class="p">(),</span>
                    <span class="n">Complete</span><span class="p">(</span><span class="s">&quot;1==1&quot;</span><span class="p">))),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;fallback&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;force complete when action is aborted&quot;</span><span class="p">),</span>
                <span class="n">Time</span><span class="p">(</span><span class="s">&quot;10:55&quot;</span><span class="p">),</span>
                <span class="n">Trigger</span><span class="p">(</span><span class="s">&quot;action eq aborted&quot;</span><span class="p">),</span>
                <span class="n">Complete</span><span class="p">(</span><span class="s">&quot;action eq complete&quot;</span><span class="p">)))</span>

<span class="k">class</span> <span class="nc">DailyInc</span><span class="p">(</span><span class="n">GenericFamily</span><span class="p">):</span>    
    <span class="sd">&quot;&quot;&quot; anopther method to have daily repeat increment, with aborted tasks&quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">Family</span><span class="p">(</span><span class="s">&quot;daily_inc&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;YMD&quot;</span><span class="p">,</span> 
                                          <span class="n">start</span><span class="o">=</span><span class="n">today</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="n">DATE_STOP</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;requeue will reset repeat attribute!&quot;</span><span class="p">),</span>
            <span class="n">Complete</span><span class="p">(</span><span class="s">&quot;daily_inc/loop/dummy eq complete&quot;</span><span class="p">),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;action&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Time</span><span class="p">(</span><span class="s">&quot;10:00&quot;</span><span class="p">)),</span>
            <span class="n">Family</span><span class="p">(</span><span class="s">&quot;loop&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Time</span><span class="p">(</span><span class="s">&quot;11:00&quot;</span><span class="p">),</span>
                <span class="n">Task</span><span class="p">(</span><span class="s">&quot;dummy&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">TriggerImpossible</span><span class="p">(),</span>
                                  <span class="n">Complete</span><span class="p">(</span><span class="s">&quot;1==1&quot;</span><span class="p">))))</span>            

<span class="k">class</span> <span class="nc">Consume</span><span class="p">(</span><span class="n">GenericFamily</span><span class="p">):</span>   
    <span class="sd">&quot;&quot;&quot; producer-consumer pattern can be implemented in many ways&quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">init</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">stop</span> <span class="o">=</span> <span class="mi">48</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">step</span> <span class="o">=</span> <span class="mi">3</span>

    <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; pass the parent node, so that absolute paths can be used </span>
<span class="sd">        with triggers&quot;&quot;&quot;</span> 
        <span class="n">path</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span>

        <span class="n">top</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;consume&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Variables</span><span class="p">(</span><span class="n">SLEEP</span><span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
                      <span class="n">PRODUCE</span><span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="c"># default: tasks will do both</span>
                      <span class="n">CONSUME</span><span class="o">=</span> <span class="mi">1</span><span class="p">),</span>
            <span class="n">Family</span><span class="p">(</span><span class="s">&quot;limits&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Defcomplete</span><span class="p">(),</span>
                                <span class="n">Limit</span><span class="p">(</span><span class="s">&quot;consume&quot;</span><span class="p">,</span> <span class="mi">7</span><span class="p">)),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;leader&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;set event to get produce1 leader&quot;</span><span class="p">),</span>
                <span class="n">Event</span><span class="p">(</span><span class="s">&quot;1&quot;</span><span class="p">),</span> <span class="c"># set/cleared by user</span>
                <span class="n">Defcomplete</span><span class="p">()),</span>

            <span class="c"># task does both, ie serial ###########################</span>
            <span class="n">_leaf</span><span class="p">(</span><span class="s">&quot;produce&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">init</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;both produce and consume in a task&quot;</span><span class="p">)),</span>

            <span class="c"># meter will report about producer progress ###########</span>
            <span class="n">Family</span><span class="p">(</span><span class="s">&quot;produce0&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;only produce&quot;</span><span class="p">),</span>
                <span class="n">_kind</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
                <span class="n">_leaf</span><span class="p">(</span><span class="s">&quot;produce&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">init</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">)),</span>

            <span class="c"># serialy produced, create a new task for each step ###</span>
            <span class="n">Family</span><span class="p">(</span><span class="s">&quot;produce1&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                    <span class="n">_kind</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
                    <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;repeat, one job per step&quot;</span><span class="p">),</span>
                    <span class="n">_leaf</span><span class="p">(</span><span class="s">&quot;produce&quot;</span><span class="p">,</span> <span class="n">init</span><span class="o">=</span><span class="s">&quot;%STEP%&quot;</span><span class="p">,</span> <span class="n">stop</span><span class="o">=</span><span class="s">&quot;%STEP%&quot;</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                    <span class="n">Meter</span><span class="p">(</span><span class="s">&quot;step&quot;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">)))</span>\
                    <span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&quot;integer&quot;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;STEP&quot;</span><span class="p">,</span>
                            <span class="n">start</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">init</span><span class="p">,</span>
                            <span class="n">end</span> <span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">,</span>
                            <span class="n">step</span> <span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">()</span>
            <span class="p">)</span>

        <span class="n">top</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;suspended&quot;</span><span class="p">)</span>
        <span class="n">fam</span> <span class="o">=</span> <span class="n">Family</span><span class="p">(</span><span class="s">&quot;produce2&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>         <span class="c"># parallel</span>
            <span class="n">_kind</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
            <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;limited, one task per step, step by 3&quot;</span><span class="p">),</span>
            <span class="n">Limit</span><span class="p">(</span><span class="s">&quot;prod&quot;</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
            <span class="n">InLimit</span><span class="p">(</span><span class="s">&quot;produce2:prod&quot;</span><span class="p">))</span>
        <span class="n">top</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">fam</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">init</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">):</span>
            <span class="n">fam</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Family</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%02d</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">step</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                    <span class="n">Variables</span><span class="p">(</span><span class="n">STEP</span><span class="o">=</span> <span class="n">step</span><span class="p">),</span>
                    <span class="n">_leaf</span><span class="p">(</span><span class="s">&quot;produce&quot;</span><span class="p">,</span> <span class="n">step</span><span class="p">,</span> <span class="n">step</span><span class="p">,</span> <span class="mi">1</span><span class="p">)))</span>
        
        <span class="c">######################</span>
        <span class="n">lead</span> <span class="o">=</span> <span class="n">path</span> <span class="o">+</span> <span class="s">&quot;/consume/leader:1&quot;</span>
        <span class="n">prod</span> <span class="o">=</span> <span class="n">path</span> <span class="o">+</span> <span class="s">&quot;/consume/produce&quot;</span>
        
        <span class="n">top</span><span class="o">.</span><span class="n">add</span><span class="p">(</span> <span class="c">### trigger may be inside a task</span>
            <span class="n">_leaf</span><span class="p">(</span><span class="s">&quot;consume&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">init</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;trigger may be inside a task&quot;</span><span class="p">),</span>
                <span class="n">_kind</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
                <span class="n">InLimit</span><span class="p">(</span><span class="s">&quot;limits:consume&quot;</span><span class="p">),</span>
                <span class="n">Variables</span><span class="p">(</span><span class="n">CALL_WAITER</span><span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
                          <span class="n">SLEEP</span><span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="c"># sleep less than producer</span>
                          <span class="n">TRIGGER_EXPRESSION</span><span class="o">=</span> <span class="n">prod</span> <span class="o">+</span> <span class="s">&quot;:step ge $step or &quot;</span> <span class="o">+</span>
                          <span class="n">prod</span> <span class="o">+</span> <span class="s">&quot; eq complete&quot;</span><span class="p">,)),</span>
            <span class="n">Family</span><span class="p">(</span><span class="s">&quot;consume1&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;explicit trigger, follow faster&quot;</span><span class="p">),</span>
                <span class="n">_kind</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
                <span class="n">Trigger</span><span class="p">(</span><span class="s">&quot;(consume1:STEP lt </span><span class="si">%s</span><span class="s">1:STEP and </span><span class="si">%s</span><span class="s">) or &quot;</span> <span class="o">%</span> 
                        <span class="p">(</span><span class="n">prod</span><span class="p">,</span> <span class="n">lead</span><span class="p">)</span> <span class="o">+</span> 
                        <span class="s">&quot;(consume1:STEP lt </span><span class="si">%s</span><span class="s">0/produce:step and not </span><span class="si">%s</span><span class="s">) or &quot;</span> <span class="o">%</span> 
                        <span class="p">(</span><span class="n">prod</span><span class="p">,</span> <span class="n">lead</span><span class="p">)</span> <span class="o">+</span> <span class="c"># lt while both are repeat</span>
                        <span class="s">&quot;(</span><span class="si">%s</span><span class="s">1 eq complete and </span><span class="si">%s</span><span class="s">0 eq complete)&quot;</span> <span class="o">%</span>
                        <span class="p">(</span><span class="n">prod</span><span class="p">,</span> <span class="n">prod</span><span class="p">)</span>
                        <span class="p">),</span>
                <span class="n">InLimit</span><span class="p">(</span><span class="s">&quot;limits:consume&quot;</span><span class="p">),</span>
                <span class="n">_leaf</span><span class="p">(</span><span class="s">&quot;consume&quot;</span><span class="p">,</span> <span class="s">&quot;%STEP%&quot;</span><span class="p">,</span> <span class="s">&quot;%STEP%&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
                <span class="p">)</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">&quot;integer&quot;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;STEP&quot;</span><span class="p">,</span> 
                         <span class="n">start</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">init</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">))</span>
        
        <span class="n">fam</span> <span class="o">=</span> <span class="n">Family</span><span class="p">(</span><span class="s">&quot;consume2&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span> <span class="c"># parallel</span>
            <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;one task per step, step by three&quot;</span><span class="p">),</span>
            <span class="n">_kind</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
            <span class="n">Limit</span><span class="p">(</span><span class="s">&quot;consume&quot;</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
            <span class="n">InLimit</span><span class="p">(</span><span class="s">&quot;consume2:consume&quot;</span><span class="p">))</span>
        <span class="n">top</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">fam</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">init</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">):</span>
            <span class="n">fam</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Family</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%02d</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">step</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                    <span class="n">Variables</span><span class="p">(</span><span class="n">STEP</span> <span class="o">=</span> <span class="n">step</span><span class="p">),</span>
                    <span class="n">Trigger</span><span class="p">(</span><span class="s">&quot;(</span><span class="si">%02d</span><span class="s">:STEP le </span><span class="si">%s</span><span class="s">1:STEP and </span><span class="si">%s</span><span class="s">) or &quot;</span> <span class="o">%</span>
                            <span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">prod</span><span class="p">,</span> <span class="n">lead</span><span class="p">)</span> <span class="o">+</span>                    
                            <span class="s">&quot;(</span><span class="si">%02d</span><span class="s">:STEP le </span><span class="si">%s</span><span class="s">0/produce:step and not </span><span class="si">%s</span><span class="s">)&quot;</span> <span class="o">%</span>
                            <span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">prod</span><span class="p">,</span> <span class="n">lead</span><span class="p">)),</span>
                    <span class="n">_leaf</span><span class="p">(</span><span class="s">&quot;consume&quot;</span><span class="p">,</span> <span class="n">init</span><span class="o">=</span><span class="n">step</span><span class="p">,</span> <span class="n">stop</span><span class="o">=</span><span class="n">step</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="mi">1</span><span class="p">)))</span>

<span class="c">############################################################################</span>

<span class="k">class</span> <span class="nc">Barber</span><span class="p">(</span><span class="n">GenericFamily</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; a &#39;barber shop&#39; example with families created by a task &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">_passer_by</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; generator &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;passby&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Time</span><span class="p">(</span><span class="s">&quot;00:00 23:59 00:05&quot;</span><span class="p">),</span>
                <span class="n">Variables</span><span class="p">(</span><span class="n">ID</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">),</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;rem&quot;</span><span class="p">,</span> <span class="s">&quot;this task alters its variable ID, &quot;</span> <span class="o">+</span>
                      <span class="s">&quot;aliases won&#39;t work natively&quot;</span><span class="p">),</span>
                <span class="n">InLimit</span><span class="p">(</span><span class="s">&quot;limits:passby&quot;</span><span class="p">))</span>
                
    <span class="k">def</span> <span class="nf">_client</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">position</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; python version of the family created initialy</span>
<span class="sd">        attention: raw definition file is located in passby task wrapper&quot;&quot;&quot;</span>
        <span class="n">path</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span> <span class="o">+</span> <span class="s">&quot;/limits&quot;</span>
        <span class="n">fam</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;list&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">position</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">AutoCancel</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;cut&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">inlimit</span><span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="s">&quot;:barbers&quot;</span><span class="p">),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;pay&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Trigger</span><span class="p">(</span><span class="s">&quot;cut eq complete&quot;</span><span class="p">),</span>
                <span class="n">InLimit</span><span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="s">&quot;:barbers&quot;</span><span class="p">),</span>
                <span class="n">InLimit</span><span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="s">&quot;:cashiers&quot;</span><span class="p">)),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;leave&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">),</span>
                <span class="n">Trigger</span><span class="p">([</span><span class="s">&quot;cut&quot;</span><span class="p">,</span> <span class="s">&quot;pay&quot;</span><span class="p">])))</span>
              
        <span class="n">fam</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;complete&quot;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_shop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="n">fam</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;shop&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;suspended&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Variables</span><span class="p">(</span><span class="n">NB_CHAIRS</span><span class="o">=</span> <span class="mi">4</span><span class="p">),</span>
            <span class="n">Family</span><span class="p">(</span><span class="s">&quot;limits&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Defcomplete</span><span class="p">(),</span>
                                 <span class="n">Limit</span><span class="p">(</span><span class="s">&quot;passby&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
                                 <span class="n">Limit</span><span class="p">(</span><span class="s">&quot;barbers&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span>
                                 <span class="n">Limit</span><span class="p">(</span><span class="s">&quot;cashiers&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)),</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_passer_by</span><span class="p">(),</span>
            <span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="p">(</span><span class="n">fam</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
                

    <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_shop</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>

<span class="c">############################################################################</span>
<span class="k">def</span> <span class="nf">user</span><span class="p">():</span> 
    <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">getlogin</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">locate_scripts</span><span class="p">():</span>
    <span class="n">pwd</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span>

    <span class="k">return</span> <span class="n">Variables</span><span class="p">(</span>
        <span class="n">ECF_HOME</span><span class="o">=</span> <span class="s">&quot;/tmp/</span><span class="si">%s</span><span class="s">/ecflow/&quot;</span> <span class="o">%</span> <span class="n">user</span><span class="p">(),</span> <span class="c"># pwd,</span>
        <span class="n">ECF_FILES</span><span class="o">=</span> <span class="n">pwd</span> <span class="o">+</span> <span class="s">&quot;/scripts&quot;</span><span class="p">,</span>
        <span class="n">ECF_INCLUDE</span><span class="o">=</span> <span class="n">pwd</span> <span class="o">+</span> <span class="s">&quot;/include&quot;</span><span class="p">,</span> <span class="p">)</span>

<span class="n">DATE_STOP</span> <span class="o">=</span> <span class="mi">20300115</span>

<span class="k">class</span> <span class="nc">Course</span><span class="p">(</span><span class="n">ie</span><span class="o">.</span><span class="n">Seed</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; host families together &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Course</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;course&quot;</span>

    <span class="k">def</span> <span class="nf">suite</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; define limits (empty) &quot;&quot;&quot;</span>
        
        <span class="n">node</span> <span class="o">=</span> <span class="n">Suite</span><span class="p">(</span><span class="n">user</span><span class="p">())</span>
        <span class="n">node</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;suspended&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Variables</span><span class="p">(</span><span class="n">USER</span><span class="o">=</span> <span class="n">user</span><span class="p">()),</span>
            <span class="n">locate_scripts</span><span class="p">())</span> <span class="c"># </span>
        <span class="bp">self</span><span class="o">.</span><span class="n">top</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
        
        <span class="n">fp</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&quot;/tmp/</span><span class="si">%s</span><span class="s">/&quot;</span> <span class="o">%</span> <span class="n">user</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s">&quot;.def&quot;</span><span class="p">,</span> <span class="s">&quot;w&quot;</span><span class="p">)</span>
        <span class="k">print</span> <span class="o">&gt;&gt;</span> <span class="n">fp</span><span class="p">,</span> <span class="n">node</span>
        <span class="k">return</span> <span class="n">node</span>

    <span class="k">def</span> <span class="nf">top</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="n">barber_shop</span> <span class="o">=</span> <span class="n">Barber</span><span class="p">()</span>
        <span class="n">perl</span> <span class="o">=</span> <span class="n">NativePerl</span><span class="p">()</span>
        <span class="n">python</span> <span class="o">=</span> <span class="n">NativePython</span><span class="p">()</span>
        <span class="n">consume</span> <span class="o">=</span> <span class="n">Consume</span><span class="p">()</span>

        <span class="k">with</span> <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="k">as</span> <span class="n">node</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">FallBack</span><span class="p">()</span><span class="o">.</span><span class="n">main</span><span class="p">(),</span>
                     <span class="n">DailyInc</span><span class="p">()</span><span class="o">.</span><span class="n">main</span><span class="p">())</span>
            <span class="n">barber_shop</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
            <span class="n">perl</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
            <span class="n">python</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
            <span class="n">consume</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">node</span>

<span class="c">###############################################################################</span>

<span class="k">class</span> <span class="nc">Admin</span><span class="p">(</span><span class="n">Course</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; host newlog task + logsvr start/stop/check task</span>
<span class="sd">        -- server logs can be renewed with a ecflowview menu command also</span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;admin&quot;</span>

    <span class="k">def</span> <span class="nf">top</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">with</span> <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;admin&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">node</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">main</span><span class="p">())</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;YMD&quot;</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="n">today</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="n">DATE_STOP</span><span class="p">)</span>
            <span class="n">node</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;suspended&quot;</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">node</span>

    <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> 
        <span class="sd">&quot;&quot;&quot; return self contained Family/Task, without absolute node references</span>
<span class="sd">        or with relative path triggers&quot;&quot;&quot;</span>
        <span class="n">remote_submit</span> <span class="o">=</span> <span class="s">&quot;rsh -l %USER</span><span class="si">% %</span><span class="s">HOST</span><span class="si">% %</span><span class="s">ECF_JOB% &gt; </span><span class="si">%E</span><span class="s">CF_JOBOUT% 2&gt;&amp;1&quot;</span>
        <span class="n">logpath</span> <span class="o">=</span> <span class="s">&quot;/home/ma/map/course/201303/ecflow&quot;</span>
        <span class="k">return</span> <span class="p">(</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;newlog&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;renew server log-file&quot;</span><span class="p">),</span>
                <span class="n">Time</span><span class="p">(</span><span class="s">&quot;08:00&quot;</span><span class="p">)),</span>
            
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;logsvr&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Defcomplete</span><span class="p">(),</span>
                <span class="n">Variables</span><span class="p">(</span><span class="n">HOST</span><span class="o">=</span> <span class="s">&quot;pikachu&quot;</span><span class="p">,</span>
                          <span class="n">ECF_LOGPORT</span><span class="o">=</span><span class="mi">9316</span><span class="p">,</span>
                          <span class="n">ECF_LOGPATH</span><span class="o">=</span> <span class="n">logpath</span><span class="p">,</span>
                          <span class="n">ECF_LOGMAP</span><span class="o">=</span> <span class="n">logpath</span> <span class="o">+</span> <span class="s">&quot;:&quot;</span> <span class="o">+</span> <span class="n">logpath</span><span class="p">,</span>
                          <span class="n">ECF_JOB_CMD</span><span class="o">=</span> <span class="n">remote_submit</span><span class="p">),</span>                          
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;(re)start the logsvr on HOST&quot;</span><span class="p">),</span>
                <span class="n">Time</span><span class="p">(</span><span class="s">&quot;08:00&quot;</span><span class="p">)),</span>

            <span class="n">Family</span><span class="p">(</span><span class="s">&quot;loop&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Time</span><span class="p">(</span><span class="s">&quot;08:30&quot;</span><span class="p">),</span>
                <span class="n">Family</span><span class="p">(</span><span class="s">&quot;dummy&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="c"># TriggerImpossible(),</span>
                    <span class="n">Complete</span><span class="p">(</span><span class="s">&quot;1==1&quot;</span><span class="p">))))</span>

<span class="c">###############################################################################</span>

<span class="k">class</span> <span class="nc">EcEvents</span><span class="p">(</span><span class="n">Admin</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; connecting to third party software as event generator to update</span>
<span class="sd">    a suite variable, and enable daily family run</span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">top</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="n">node</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;ecevents&quot;</span><span class="p">)</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;use web... menu&quot;</span><span class="p">),</span>
            <span class="n">Defcomplete</span><span class="p">(),</span>
            <span class="n">Variables</span><span class="p">(</span>
                <span class="n">URL</span><span class="o">=</span> <span class="s">&quot;http://eccmd.ecmwf.int:8090/#Mainpanel&quot;</span><span class="p">,</span>
                <span class="n">ECF_URL_CMD</span><span class="o">=</span> <span class="s">&quot;${BROWSER:=firefox} -remote &#39;openURL(%URL%&quot;</span><span class="p">))</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">main</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">node</span>
    
    <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>        
        <span class="k">for</span> <span class="n">mode</span> <span class="ow">in</span> <span class="p">[</span><span class="s">&quot;list&quot;</span><span class="p">,</span> 
                     <span class="s">&quot;register&quot;</span><span class="p">,</span> <span class="s">&quot;delete&quot;</span><span class="p">,</span> 
                     <span class="s">&quot;register_all&quot;</span><span class="p">,</span> <span class="s">&quot;delete_all&quot;</span><span class="p">]:</span>
            <span class="n">added</span> <span class="o">=</span> <span class="bp">None</span>
            <span class="k">if</span> <span class="s">&quot;list&quot;</span> <span class="ow">in</span> <span class="n">mode</span><span class="p">:</span>
                <span class="n">added</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="s">&quot;regs&quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>

            <span class="n">fam</span> <span class="o">=</span> <span class="n">Family</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                    <span class="n">Variables</span><span class="p">(</span><span class="n">MODE</span><span class="o">=</span> <span class="n">mode</span><span class="p">),</span>
                    <span class="n">Task</span><span class="p">(</span><span class="s">&quot;ecjobs&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;none&quot;</span><span class="p">),</span> 
                                       <span class="n">added</span><span class="p">))</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">fam</span><span class="p">)</span>
            <span class="k">if</span> <span class="s">&quot;_all&quot;</span> <span class="ow">in</span> <span class="n">mode</span><span class="p">:</span>
                <span class="n">fam</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Variables</span><span class="p">(</span><span class="n">EVENT</span><span class="o">=</span> <span class="s">&quot;_all_&quot;</span><span class="p">))</span>
            <span class="k">elif</span> <span class="n">mode</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&quot;register&quot;</span><span class="p">,</span> <span class="s">&quot;delete&quot;</span><span class="p">):</span>
                <span class="n">fam</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Variables</span><span class="p">(</span><span class="n">EVENT</span><span class="o">=</span> <span class="s">&quot;an12h000&quot;</span><span class="p">),</span>
                         <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;update EVENT variable&quot;</span><span class="p">))</span>

        <span class="n">event</span> <span class="o">=</span> <span class="s">&quot;an00h000&quot;</span>
        <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;ref&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;complete&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Task</span><span class="p">(</span><span class="n">event</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Variables</span><span class="p">(</span><span class="n">YMD</span><span class="o">=</span> <span class="n">today</span><span class="p">),</span>
                            <span class="n">Label</span><span class="p">(</span><span class="s">&quot;YMD&quot;</span><span class="p">,</span> <span class="n">today</span><span class="p">)))</span>

        <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;user&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="n">event</span><span class="p">)</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span>
            <span class="n">name</span><span class="o">=</span><span class="s">&quot;YMD&quot;</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="n">today</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="n">DATE_STOP</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;extern cannot be used anymore for &quot;</span> <span class="o">+</span>
                  <span class="s">&quot;intra-suite reference triggers&quot;</span><span class="p">),</span>
            <span class="n">Variables</span><span class="p">(</span><span class="n">SLEEP</span><span class="o">=</span> <span class="mi">1</span><span class="p">),</span>
            <span class="n">Trigger</span><span class="p">(</span><span class="n">event</span> <span class="o">+</span> <span class="s">&quot;:YMD le </span><span class="si">%s</span><span class="s">/ref/</span><span class="si">%s</span><span class="s">:YMD&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">fullname</span><span class="p">(),</span> <span class="n">event</span><span class="p">)),</span>
            <span class="n">_leaf</span><span class="p">(</span><span class="s">&quot;consume&quot;</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">node</span>

<span class="c">###############################################################################</span>

<span class="k">class</span> <span class="nc">SerialTask</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; add trigger on the previous task &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">prev</span> <span class="o">=</span> <span class="bp">None</span>

    <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="n">fam</span> <span class="o">=</span> <span class="n">Family</span><span class="p">(</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Variables</span><span class="p">(</span><span class="n">MODE</span><span class="o">=</span> <span class="n">name</span><span class="p">),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;to_ecflow&quot;</span><span class="p">))</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">prev</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">fam</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Trigger</span><span class="p">(</span><span class="s">&quot;./</span><span class="si">%s</span><span class="s"> eq complete&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">prev</span><span class="p">))</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">prev</span> <span class="o">=</span> <span class="n">name</span>
        <span class="k">return</span> <span class="n">fam</span>

<span class="k">class</span> <span class="nc">Reload</span><span class="p">(</span><span class="n">Admin</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; a simple task to download SMS content and translate it to ecFlow &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">top</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="n">node</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;reload&quot;</span><span class="p">)</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;from sms to ecFlow&quot;</span><span class="p">),</span>
            <span class="n">Defcomplete</span><span class="p">(),</span>
            <span class="n">Variables</span><span class="p">(</span>
                <span class="n">URL</span><span class="o">=</span> <span class="s">&quot;https://software.ecmwf.int/wiki/display/ECFLOW/Home&quot;</span><span class="p">,</span>
                <span class="n">ECF_URL_CMD</span><span class="o">=</span> <span class="s">&quot;${BROWSER:=firefox} -remote &#39;openURL(%URL%&quot;</span><span class="p">),</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">main</span><span class="p">())</span>
        <span class="k">return</span> <span class="n">node</span>
    
    <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>        
        <span class="n">fam</span> <span class="o">=</span> <span class="n">Family</span><span class="p">(</span><span class="s">&quot;reload&quot;</span><span class="p">)</span>
        <span class="n">serial</span> <span class="o">=</span> <span class="n">SerialTask</span><span class="p">()</span>
        <span class="n">fam</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">serial</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&quot;get&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Variables</span><span class="p">(</span>
                    <span class="n">SMS_SUITE</span><span class="o">=</span> <span class="s">&quot;eras&quot;</span><span class="p">,</span>
                    <span class="c"># SMS_PROG= 314159, SMS_NODE= &quot;localhost&quot;,</span>
                    <span class="c"># SMS_PROG= 314199, SMS_NODE= &quot;marhaus&quot;, # eras</span>
                    <span class="n">SMS_PROG</span><span class="o">=</span> <span class="mi">314197</span><span class="p">,</span> <span class="n">SMS_NODE</span><span class="o">=</span> <span class="s">&quot;marhaus&quot;</span><span class="p">,</span> <span class="c"># eras2</span>
                    <span class="p">),),</span>
            <span class="n">serial</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&quot;translate&quot;</span><span class="p">),</span>
            <span class="n">serial</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&quot;edit&quot;</span><span class="p">),</span>
            <span class="n">serial</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&quot;mail&quot;</span><span class="p">),</span> 
            <span class="n">serial</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&quot;load&quot;</span><span class="p">),</span>
            <span class="n">serial</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s">&quot;bench&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Defcomplete</span><span class="p">()))</span>
        <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> 
            <span class="k">return</span> <span class="n">node</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">fam</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">fam</span>    

<span class="c">############################################################################</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="kn">import</span> <span class="nn">cli_proc</span><span class="o">,</span> <span class="nn">sys</span>
    <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span>
        <span class="n">description</span><span class="o">=</span><span class="n">DESC</span><span class="p">,</span>
        <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">RawDescriptionHelpFormatter</span><span class="p">)</span>

    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;--host&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;localhost&quot;</span><span class="p">,</span>
                        <span class="n">help</span><span class="o">=</span> <span class="s">&quot;server hostname&quot;</span><span class="p">)</span>
    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&quot;--port&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;3141&quot;</span><span class="p">,</span>
                        <span class="n">help</span><span class="o">=</span> <span class="s">&quot;server port number&quot;</span><span class="p">)</span>

    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
        <span class="n">suites</span> <span class="o">=</span> <span class="p">{</span> <span class="s">&quot;course&quot;</span><span class="p">:</span> <span class="n">Course</span><span class="p">(),</span>        <span class="p">}</span> 
        <span class="n">argv</span> <span class="o">=</span> <span class="n">cli_proc</span><span class="o">.</span><span class="n">process</span><span class="p">(</span><span class="n">suites</span><span class="p">,</span> <span class="n">compare</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
    <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>

    <span class="n">clt</span> <span class="o">=</span> <span class="n">ec</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">port</span><span class="p">)</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">clt</span><span class="o">.</span><span class="n">ping</span><span class="p">()</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="n">clt</span> <span class="o">=</span> <span class="n">ec</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="s">&quot;localhost&quot;</span><span class="p">,</span> <span class="mi">1000</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">geteuid</span><span class="p">())</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">clt</span><span class="o">.</span><span class="n">ping</span><span class="p">()</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="n">clt</span> <span class="o">=</span> <span class="n">ec</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="s">&quot;localhost&quot;</span><span class="p">,</span> <span class="mi">31415</span><span class="p">)</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">clt</span><span class="o">.</span><span class="n">ping</span><span class="p">()</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="n">clt</span> <span class="o">=</span> <span class="n">ec</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="s">&quot;localhost&quot;</span><span class="p">,</span> <span class="mi">3199</span><span class="p">)</span>
    <span class="n">defs</span> <span class="o">=</span> <span class="n">ec</span><span class="o">.</span><span class="n">ecflow</span><span class="o">.</span><span class="n">Defs</span><span class="p">()</span>

    <span class="n">course</span> <span class="o">=</span> <span class="n">Course</span><span class="p">()</span>
    <span class="n">suite</span> <span class="o">=</span> <span class="n">course</span><span class="o">.</span><span class="n">suite</span><span class="p">()</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Reload</span><span class="p">()</span><span class="o">.</span><span class="n">main</span><span class="p">())</span>

    <span class="k">if</span> <span class="mi">1</span><span class="p">:</span> <span class="c"># enable/disable remote version of &#39;consume&#39;</span>
        <span class="n">rem</span> <span class="o">=</span> <span class="n">suite</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;remote&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;mk_remote&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Defcomplete</span><span class="p">(),</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;do not forget to create directory structure&quot;</span> <span class="o">+</span>
                      <span class="s">&quot;on remote host for job output creation&quot;</span><span class="p">),</span>
                <span class="n">ie</span><span class="o">.</span><span class="n">onws</span><span class="p">(</span><span class="n">host</span> <span class="o">=</span> <span class="s">&quot;class01&quot;</span><span class="p">)),</span>
            <span class="n">Variables</span><span class="p">(</span><span class="n">ECF_HOME</span><span class="o">=</span> <span class="s">&quot;/tmp/</span><span class="si">%s</span><span class="s">/ecflow&quot;</span> <span class="o">%</span> <span class="n">user</span><span class="p">()),</span>
            <span class="n">ie</span><span class="o">.</span><span class="n">onws</span><span class="p">(</span><span class="n">host</span> <span class="o">=</span> <span class="s">&quot;class02&quot;</span><span class="p">))</span>
        <span class="n">course</span><span class="o">.</span><span class="n">top</span><span class="p">(</span><span class="n">rem</span><span class="p">)</span>

    <span class="c"># print clt.stats()</span>

    <span class="n">Admin</span><span class="p">()</span><span class="o">.</span><span class="n">top</span><span class="p">(</span><span class="n">suite</span><span class="p">)</span>

    <span class="n">EcEvents</span><span class="p">()</span><span class="o">.</span><span class="n">top</span><span class="p">(</span><span class="n">suite</span><span class="p">)</span>

    <span class="n">defs</span><span class="o">.</span><span class="n">add_suite</span><span class="p">(</span><span class="n">suite</span><span class="p">)</span>
    
    <span class="n">path</span> <span class="o">=</span> <span class="s">&quot;/</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">user</span><span class="p">()</span>
    <span class="c"># path = &quot;/%s/course&quot; % user()</span>
    <span class="c"># path = &quot;/%s/admin&quot; % user()</span>
    <span class="c"># path = &quot;/%s/ecevents&quot; % user()</span>
    <span class="c"># print defs</span>
    
    <span class="n">clt</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">defs</span><span class="p">)</span>

    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span> <span class="p">(</span><span class="mi">0</span><span class="p">)</span> 
</pre></div>
</div>
<p>A simple tar file can be downloaded to get script wrappers and include
files (~map/course/201303/course2013ex.tgz).</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span>
<span class="c"># This software is provided under the ECMWF standard software license agreement.</span>
<span class="sd">&quot;&quot;&quot; a layer over raw ecflow api &quot;&quot;&quot;</span>

<span class="kn">import</span> <span class="nn">unittest</span>

<span class="kn">from</span> <span class="nn">ecflow</span> <span class="kn">import</span> <span class="n">JobCreationCtrl</span> <span class="k">as</span> <span class="n">JobCreationCtrl</span>
<span class="c"># from ecflow import Client as Client</span>
<span class="kn">from</span> <span class="nn">ecflow</span> <span class="kn">import</span> <span class="n">ChildCmdType</span><span class="p">,</span> <span class="n">TimeSlot</span>
<span class="kn">from</span> <span class="nn">ecflow</span> <span class="kn">import</span> <span class="n">ZombieType</span><span class="p">,</span> <span class="n">ZombieAttr</span><span class="p">,</span> <span class="n">ZombieUserActionType</span>
<span class="kn">import</span> <span class="nn">ecflow</span><span class="o">,</span> <span class="nn">argparse</span>

<span class="n">DEBUG</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">DECORATE</span> <span class="o">=</span> <span class="s">&quot;ALL&quot;</span>
<span class="c"># DECORATE = &quot;ONLY_TRIGGER&quot;</span>
<span class="c"># DECORATE = &quot;NO_TRIGGER&quot;</span>
<span class="c"># DECORATE = &quot;ONLY_EVENT&quot;</span>
<span class="c"># DECORATE = &quot;NO_ATTRIBUTE&quot;</span>

<span class="n">USE_TIME</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">USE_LATE</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">USE_TRIGGER</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">USE_LIMIT</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">ECF_MODE</span> <span class="o">=</span> <span class="s">&quot;ecflow&quot;</span>
<span class="c"># ECF_MODE = &quot;sms&quot;</span>

<span class="k">if</span> <span class="n">DECORATE</span> <span class="o">==</span> <span class="s">&quot;ONLY_TRIGGER&quot;</span><span class="p">:</span>
    <span class="n">USE_TRIGGER</span> <span class="o">=</span> <span class="bp">True</span> 
    <span class="n">USE_LIMIT</span> <span class="o">=</span> <span class="bp">False</span> 
    <span class="n">USE_EVENT</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">elif</span> <span class="n">DECORATE</span> <span class="o">==</span> <span class="s">&quot;NO_ATTRIBUTE&quot;</span><span class="p">:</span>
    <span class="n">USE_TRIGGER</span> <span class="o">=</span> <span class="bp">False</span>
    <span class="n">USE_LIMIT</span> <span class="o">=</span> <span class="bp">False</span>
    <span class="n">USE_EVENT</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">elif</span> <span class="n">DECORATE</span> <span class="o">==</span> <span class="s">&quot;ONLY_EVENT&quot;</span><span class="p">:</span>
    <span class="n">USE_TRIGGER</span> <span class="o">=</span> <span class="bp">False</span>
    <span class="n">USE_LIMIT</span> <span class="o">=</span> <span class="bp">False</span>
    <span class="n">USE_EVENT</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">elif</span> <span class="n">DECORATE</span> <span class="o">==</span> <span class="s">&quot;NO_TRIGGER&quot;</span><span class="p">:</span>
    <span class="n">USE_TRIGGER</span> <span class="o">=</span> <span class="bp">False</span>
    <span class="n">USE_LIMIT</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">USE_EVENT</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">elif</span> <span class="n">DECORATE</span> <span class="o">==</span> <span class="s">&quot;ALL&quot;</span><span class="p">:</span>
    <span class="n">USE_TRIGGER</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">USE_LIMIT</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">USE_EVENT</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">else</span><span class="p">:</span>
    <span class="k">raise</span> <span class="ne">BaseException</span>


<span class="k">def</span> <span class="nf">translate</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Translate from sms to ecflow &quot;&quot;&quot;</span>
    <span class="kn">import</span> <span class="nn">sms2ecf</span>
    <span class="k">if</span> <span class="n">ECF_MODE</span> <span class="o">!=</span> <span class="s">&quot;sms&quot;</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span>
    <span class="k">else</span><span class="p">:</span> <span class="n">sms2ecf</span><span class="o">.</span><span class="n">ECF_MODE</span> <span class="o">=</span> <span class="n">ECF_MODE</span>
    <span class="k">return</span> <span class="n">sms2ecf</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">State</span><span class="p">:</span>
    <span class="sd">&quot;&quot;&quot; this class aims at affording a user the possibility to add Triggers as</span>
<span class="sd">    t1 = Task(&quot;t1&quot;)</span>
<span class="sd">    Task(&quot;ts&quot;).add(Trigger(t1 == COMPLETE))</span>

<span class="sd">    SUBMITTED, ACTIVE, SUSPENDED, ABORTED, QUEUED, COMPLETE, UNKNOWN</span>
<span class="sd">    are instance of this class.</span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; store the status &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">state</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; translate into string &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span>

    <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; when == is used, we should care about task name starting with 0-9&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">:</span>
            <span class="n">add</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">arg</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="nb">int</span><span class="p">:</span>
                <span class="n">add</span> <span class="o">=</span> <span class="s">&quot;./&quot;</span>                
            <span class="k">return</span> <span class="n">add</span> <span class="o">+</span> <span class="n">arg</span> <span class="o">+</span> <span class="s">&quot; == &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span>
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
            <span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">get_abs_node_path</span><span class="p">()</span> <span class="o">+</span> <span class="s">&quot; == &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; aka != &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">:</span>
            <span class="n">add</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">arg</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="nb">int</span><span class="p">:</span>
                <span class="n">add</span> <span class="o">=</span> <span class="s">&quot;./&quot;</span>                
            <span class="k">return</span> <span class="n">add</span> <span class="o">+</span> <span class="n">arg</span> <span class="o">+</span> <span class="s">&quot; != &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span>
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
            <span class="k">return</span> <span class="n">arg</span><span class="o">.</span><span class="n">get_abs_node_path</span><span class="p">()</span> <span class="o">+</span> <span class="s">&quot; != &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; return state &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span>

    <span class="k">def</span> <span class="nf">eval</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; return state &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="o">==</span> <span class="n">node</span><span class="o">.</span><span class="n">get_state</span><span class="p">()</span>



<span class="n">SUBMITTED</span> <span class="o">=</span> <span class="n">State</span><span class="p">(</span><span class="s">&quot;submitted&quot;</span><span class="p">)</span>
<span class="n">ACTIVE</span>    <span class="o">=</span> <span class="n">State</span><span class="p">(</span><span class="s">&quot;active&quot;</span><span class="p">)</span>
<span class="n">SUSPENDED</span> <span class="o">=</span> <span class="n">State</span><span class="p">(</span><span class="s">&quot;suspended&quot;</span><span class="p">)</span>
<span class="n">ABORTED</span>   <span class="o">=</span> <span class="n">State</span><span class="p">(</span><span class="s">&quot;aborted&quot;</span><span class="p">)</span>
<span class="n">QUEUED</span>    <span class="o">=</span> <span class="n">State</span><span class="p">(</span><span class="s">&quot;queued&quot;</span><span class="p">)</span>
<span class="n">COMPLETE</span>  <span class="o">=</span> <span class="n">State</span><span class="p">(</span><span class="s">&quot;complete&quot;</span><span class="p">)</span>
<span class="n">UNKNOWN</span>   <span class="o">=</span> <span class="n">State</span><span class="p">(</span><span class="s">&quot;unknown&quot;</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Attribute</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; generic attribute to be attached to a node&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; use polymorphism to attach attribute to a node&quot;&quot;&quot;</span>
        <span class="k">pass</span>

<span class="k">class</span> <span class="nc">Variable</span><span class="p">(</span><span class="n">Attribute</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Variable</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; filter variables to be attached to a node, may alter its name SMS-ECF&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add_variable&quot;&quot;&quot;</span>
        <span class="n">keyt</span><span class="p">,</span> <span class="n">valt</span> <span class="o">=</span> <span class="n">translate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">())</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="n">keyt</span><span class="p">,</span> <span class="n">valt</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Label</span><span class="p">(</span><span class="n">Attribute</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Label</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrap around label&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add_label&quot;&quot;&quot;</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add_label</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Meter</span><span class="p">(</span><span class="n">Attribute</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Meter</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrap around meter&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add_meter&quot;&quot;&quot;</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add_meter</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Event</span><span class="p">(</span><span class="n">Attribute</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Event</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrap around event&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add_event&quot;&quot;&quot;</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add_event</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">InLimit</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; a class to host a path for a limit</span>
<span class="sd">        silently ignore if USE_LIMIT is False, </span>
<span class="sd">        (in debug mode) &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fullpath</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="k">if</span> <span class="n">USE_LIMIT</span><span class="p">:</span> 
            <span class="k">try</span><span class="p">:</span> <span class="n">path</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">fullpath</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;:&quot;</span><span class="p">)</span>
            <span class="k">except</span><span class="p">:</span> <span class="n">name</span> <span class="o">=</span> <span class="n">fullpath</span><span class="p">;</span> <span class="n">path</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
            <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> 
                <span class="k">raise</span> <span class="ne">BaseException</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span>  <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">InLimit</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">path_</span> <span class="o">=</span> <span class="n">path</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">name_</span> <span class="o">=</span> <span class="n">name</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add_inlimit&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">USE_LIMIT</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> 
            <span class="k">raise</span> <span class="ne">BaseException</span>
        <span class="k">if</span>  <span class="n">USE_LIMIT</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_inlimit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>        
        <span class="sd">&quot;&quot;&quot; get limit fullpath-name &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">path_</span> <span class="o">+</span> <span class="s">&quot;:&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">name_</span>

    <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; get limit name &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name_</span>

<span class="k">class</span> <span class="nc">Inlimit</span><span class="p">(</span><span class="n">InLimit</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fullpath</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Inlimit</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">fullpath</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Trigger</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; add trigger (string, list of task names, or directly</span>
<span class="sd">           expression and: and&#39;ed (True) or or&#39;ed (False) unk: add or</span>
<span class="sd">           [name]==unknown for RD</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">unk</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">anded</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="k">if</span> <span class="n">expr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> 
            <span class="k">return</span>
        <span class="k">if</span> <span class="n">expr</span> <span class="o">==</span> <span class="s">&quot;&quot;</span><span class="p">:</span> 
            <span class="k">return</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">:</span>
            <span class="c"># self.expr = ecflow.Expression(expr)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="o">=</span> <span class="n">expr</span>
            <span class="k">return</span>

        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="o">==</span> <span class="nb">tuple</span><span class="p">:</span>
            <span class="n">prep</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
            <span class="n">expr</span> <span class="o">=</span> <span class="n">prep</span>

        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="o">==</span> <span class="nb">list</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
                <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span> 
                    <span class="k">continue</span>
                <span class="n">pre</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>

                <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">in</span> <span class="p">(</span><span class="n">Node</span><span class="p">,</span> <span class="n">Task</span><span class="p">,</span> <span class="n">Family</span><span class="p">,</span> <span class="n">Suite</span><span class="p">):</span>
                    <span class="n">fullname</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span>
                    <span class="n">name</span> <span class="o">=</span> <span class="n">fullname</span>
                <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">in</span> <span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">Task</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Family</span><span class="p">):</span>
                    <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">name</span><span class="p">()</span>

                <span class="k">if</span> <span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span> <span class="c"># in &quot;0123456789&quot;:</span>
                    <span class="n">pre</span> <span class="o">=</span> <span class="s">&quot;./&quot;</span>

                <span class="k">if</span> <span class="s">&#39;:&#39;</span> <span class="ow">in</span> <span class="n">name</span><span class="p">:</span>
                    <span class="n">item</span> <span class="o">=</span> <span class="n">pre</span> <span class="o">+</span> <span class="n">name</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">item</span> <span class="o">=</span> <span class="n">pre</span> <span class="o">+</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> == complete&quot;</span> <span class="o">%</span> <span class="n">name</span>
                    <span class="k">if</span> <span class="n">unk</span><span class="p">:</span>
                        <span class="n">item</span> <span class="o">+=</span> <span class="s">&quot; or </span><span class="si">%s%s</span><span class="s">==unknown&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">pre</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>

                <span class="k">if</span> <span class="n">index</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Expression</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">PartExpression</span><span class="p">(</span><span class="n">item</span><span class="p">,</span><span class="n">anded</span><span class="p">))</span>

        <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="ow">in</span> <span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span> 
                            <span class="n">ecflow</span><span class="o">.</span><span class="n">PartExpression</span><span class="p">):</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Expression</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">print</span> <span class="nb">type</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s">&quot;what? trigger?&quot;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">USE_TRIGGER</span><span class="p">:</span>
            <span class="k">return</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span>
        <span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">get_trigger</span><span class="p">()</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_trigger</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_part_trigger</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">PartExpression</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="bp">True</span><span class="p">))</span>

<span class="k">class</span> <span class="nc">TriggerAnd</span><span class="p">(</span><span class="n">Trigger</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">unk</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">anded</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
        <span class="c"># super(TriggerAnd, self).__init__(expr, unk, anded)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="o">=</span> <span class="n">expr</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="s">&quot;:&quot;</span> <span class="ow">in</span> <span class="n">expr</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s">&quot; eq &quot;</span> <span class="ow">in</span> <span class="n">expr</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s">&quot;==&quot;</span> <span class="ow">in</span> <span class="n">expr</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="o">+=</span> <span class="s">&quot; eq complete&quot;</span>
    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>        
        <span class="n">node</span><span class="o">.</span><span class="n">add_part_trigger</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">PartExpression</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="bp">True</span><span class="p">))</span>

<span class="k">class</span> <span class="nc">TriggerImpossible</span><span class="p">(</span><span class="n">Trigger</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; attribute to be added to node when it is not expected to run</span>
<span class="sd">    any task&quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add an &#39;impossible trigger&#39;, for a task not to run &quot;&quot;&quot;</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">TriggerImpossible</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="s">&quot;1==0&quot;</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">TriggerAlways</span><span class="p">(</span><span class="n">Trigger</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; attribute to be added to node when it is not expected to run</span>
<span class="sd">    any task&quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add an &#39;impossible trigger&#39;, for a task not to run &quot;&quot;&quot;</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">TriggerAlways</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="s">&quot;1==1&quot;</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Complete</span><span class="p">(</span><span class="n">Trigger</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; class to host complete expression, added later to a node&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">unk</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">anded</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Complete</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">unk</span><span class="p">,</span> <span class="n">anded</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">USE_TRIGGER</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_complete</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Clock</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add clock &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">:</span>
            <span class="n">hybrid</span> <span class="o">=</span> <span class="s">&quot;hybrid&quot;</span> <span class="ow">in</span> <span class="n">arg</span>
            <span class="n">hhh</span><span class="p">,</span> <span class="n">mmm</span><span class="p">,</span> <span class="n">sss</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">hhh</span><span class="p">,</span> <span class="n">mmm</span><span class="p">,</span> <span class="n">sss</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;:&#39;</span><span class="p">)</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Clock</span><span class="p">(</span><span class="n">hhh</span><span class="p">,</span> <span class="n">mmm</span><span class="p">,</span> <span class="n">sss</span><span class="p">,</span> <span class="n">hybrid</span><span class="p">)</span>
            <span class="k">except</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Clock</span><span class="p">(</span><span class="n">hybrid</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Clock</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="o">!=</span> <span class="n">Suite</span><span class="p">:</span>
            <span class="k">print</span> <span class="s">&quot;WAR: clock can only be attached to suite node, &quot;</span>
            <span class="k">print</span> <span class="s">&quot;WAR: clock is ignored&quot;</span>
            <span class="k">return</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add_clock</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">AutoCancel</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add time &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">:</span>
            <span class="n">hhh</span><span class="p">,</span> <span class="n">mmm</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;:&#39;</span><span class="p">)</span>
            <span class="n">rel</span> <span class="o">=</span> <span class="s">&#39;+&#39;</span> <span class="ow">in</span> <span class="n">arg</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Autocancel</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">hhh</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">mmm</span><span class="p">),</span> <span class="n">rel</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Autocancel</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add_autocancel</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Time</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add time &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">arg</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">USE_TIME</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Today</span><span class="p">(</span><span class="n">Time</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add time &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">arg</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">USE_TIME</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_today</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Cron</span><span class="p">(</span><span class="n">Time</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add time &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bes</span><span class="p">,</span> <span class="n">wdays</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">days</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">months</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">bes</span><span class="p">)</span> <span class="o">==</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Cron</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">arg</span>
            <span class="k">return</span>

        <span class="c"># parser = argparse.ArgumentParser()</span>
        <span class="c"># parser.add_argument(&quot;-w&quot;, default=0, help= &quot;weekdays&quot;)</span>
        <span class="c"># parser.add_argument(&quot;-d&quot;, default=0, help= &quot;days&quot;)</span>
        <span class="c"># parser.add_argument(&quot;-m&quot;, default=0, help= &quot;months&quot;)</span>
        <span class="c"># parser.add_argument(&quot;bes&quot;, nargs=&#39;*&#39;, type=str, help= &quot;begin end step&quot;)</span>
        <span class="c"># parsed = parser.parse_args(arg)</span>

        <span class="c"># self.data = ecflow.Cron()</span>
        <span class="c"># if parsed.w: self.data.set_week_days(parsed.w)</span>
        <span class="c"># if parsed.d: self.data.set_days_of_month(parsed.d)</span>
        <span class="c"># if parsed.m: self.data.set_months(parsed.m)</span>
        <span class="c"># cli = &#39; &#39;.join(&#39;&#39;.join(parsed.bes).split(&#39; &#39;))</span>
        <span class="c"># print cli, parsed.bes, parsed.w, parsed.d, parsed.m</span>
        <span class="c"># self.data.set_time_series(cli)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Cron</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">wdays</span><span class="p">:</span> 
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">set_week_days</span><span class="p">([</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">wdays</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;,&#39;</span><span class="p">)])</span>
        <span class="k">if</span> <span class="n">days</span><span class="p">:</span> 
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">set_days_of_month</span><span class="p">([</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">days</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;,&#39;</span><span class="p">)])</span>
        <span class="k">if</span> <span class="n">months</span><span class="p">:</span> 
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">set_months</span><span class="p">([</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">months</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;,&#39;</span><span class="p">)])</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">set_time_series</span><span class="p">(</span><span class="n">bes</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">USE_TIME</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_cron</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Date</span><span class="p">(</span><span class="n">Time</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add date &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">,</span> <span class="n">mask</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Date</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">mask</span> <span class="o">=</span> <span class="n">mask</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">USE_TIME</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="c">### ??? FIX, emos avoids dates, datasvc would not</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mask</span><span class="p">:</span>
                <span class="n">node</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;DATEMASK&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">ddd</span><span class="p">,</span> <span class="n">mmm</span><span class="p">,</span> <span class="n">yyy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">ddd</span> <span class="o">==</span> <span class="s">&#39;*&#39;</span><span class="p">:</span> <span class="n">ddd</span> <span class="o">=</span> <span class="mi">0</span>
                <span class="k">if</span> <span class="n">mmm</span> <span class="o">==</span> <span class="s">&#39;*&#39;</span><span class="p">:</span> <span class="n">mmm</span> <span class="o">=</span> <span class="mi">0</span>
                <span class="k">if</span> <span class="n">yyy</span> <span class="o">==</span> <span class="s">&#39;*&#39;</span><span class="p">:</span> <span class="n">yyy</span> <span class="o">=</span> <span class="mi">0</span>

                <span class="n">node</span><span class="o">.</span><span class="n">add_date</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">ddd</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">mmm</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">yyy</span><span class="p">))</span>
                <span class="c"># node.add_date(self.data)</span>

<span class="k">class</span> <span class="nc">Day</span><span class="p">(</span><span class="n">Date</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add day &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">USE_TIME</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="c"># node.add_date(self.data) ### FIX</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;WEEKDAY&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Defcomplete</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add defstatus complete &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">pass</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="n">node</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;complete&quot;</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Defstatus</span><span class="p">(</span><span class="n">Defcomplete</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; add defstatus attribute&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">kind</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">:</span>
            <span class="n">kinds</span> <span class="o">=</span> <span class="p">{</span><span class="s">&quot;suspended&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">suspended</span><span class="p">,</span>
                     <span class="s">&quot;aborted&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">aborted</span><span class="p">,</span>
                     <span class="s">&quot;complete&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">complete</span><span class="p">,</span>
                     <span class="s">&quot;active&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">active</span><span class="p">,</span>
                     <span class="s">&quot;submitted&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">submitted</span><span class="p">,</span>
                     <span class="s">&quot;unknown&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">unknown</span><span class="p">,</span>
                     <span class="s">&quot;queued&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">queued</span><span class="p">,</span>
                     <span class="p">}</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">kinds</span><span class="p">[</span><span class="n">kind</span><span class="p">]</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">kind</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="n">node</span><span class="o">.</span><span class="n">add_defstatus</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">DefcompleteIf</span><span class="p">(</span><span class="n">Defcomplete</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add conditional defstatus complete </span>
<span class="sd">    just change name to make it explicit</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
        <span class="c"># super(DefcompleteIf, self).__init__()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">arg</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;complete&quot;</span><span class="p">)</span>
        <span class="c"># else: node.defstatus(&quot;queued&quot;) # in comment to prevent</span>
        <span class="c"># overwrite when using multiple defcomplete</span>

<span class="k">class</span> <span class="nc">Limit</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper to add limit &quot;&quot;&quot;</span>

    <span class="n">name</span> <span class="o">=</span> <span class="bp">None</span>
    <span class="n">size</span> <span class="o">=</span> <span class="mi">1</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nam</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">lim</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">nam</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">lim</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">USE_LIMIT</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_limit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Late</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper around late, to be add&#39;ed to families and tasks &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="c"># if not USE_LATE: if 1: raise</span>
        <span class="c"># return</span>
        <span class="n">sub</span> <span class="o">=</span> <span class="bp">False</span>
        <span class="n">act</span> <span class="o">=</span> <span class="bp">False</span>
        <span class="n">com</span> <span class="o">=</span> <span class="bp">False</span>
        <span class="n">rel</span> <span class="o">=</span> <span class="bp">False</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Late</span><span class="p">()</span>
        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">arg</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">):</span>
            <span class="k">if</span>   <span class="n">item</span> <span class="o">==</span> <span class="s">&quot;-s&quot;</span><span class="p">:</span> 
                <span class="n">sub</span> <span class="o">=</span> <span class="bp">True</span>
            <span class="k">elif</span> <span class="n">item</span> <span class="o">==</span> <span class="s">&quot;-c&quot;</span><span class="p">:</span> 
                <span class="n">com</span> <span class="o">=</span> <span class="bp">True</span>
            <span class="k">elif</span> <span class="n">item</span> <span class="o">==</span> <span class="s">&quot;-a&quot;</span><span class="p">:</span> 
                <span class="n">act</span> <span class="o">=</span> <span class="bp">True</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">hour</span><span class="p">,</span> <span class="n">mins</span> <span class="o">=</span> <span class="n">item</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;:&quot;</span><span class="p">)</span>
                <span class="n">rel</span> <span class="o">=</span> <span class="s">&quot;+&quot;</span> <span class="ow">in</span> <span class="n">hour</span>
                <span class="k">if</span>   <span class="n">sub</span><span class="p">:</span> 
                    <span class="bp">self</span><span class="o">.</span><span class="n">_add_sub</span><span class="p">(</span><span class="n">hour</span><span class="p">,</span> <span class="n">mins</span><span class="p">)</span>
                <span class="k">elif</span> <span class="n">com</span><span class="p">:</span> 
                    <span class="bp">self</span><span class="o">.</span><span class="n">_add_com</span><span class="p">(</span><span class="n">hour</span><span class="p">,</span> <span class="n">mins</span><span class="p">,</span> <span class="n">rel</span><span class="p">)</span>
                <span class="k">elif</span> <span class="n">act</span><span class="p">:</span> 
                    <span class="bp">self</span><span class="o">.</span><span class="n">_add_act</span><span class="p">(</span><span class="n">hour</span><span class="p">,</span> <span class="n">mins</span><span class="p">,</span> <span class="n">rel</span><span class="p">)</span>
                <span class="n">sub</span> <span class="o">=</span> <span class="bp">False</span>
                <span class="n">act</span> <span class="o">=</span> <span class="bp">False</span>
                <span class="n">com</span> <span class="o">=</span> <span class="bp">False</span>

    <span class="k">def</span> <span class="nf">_add_sub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hour</span><span class="p">,</span> <span class="n">mins</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; submitted&quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">submitted</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">hour</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">mins</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">_add_com</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hour</span><span class="p">,</span> <span class="n">mins</span><span class="p">,</span> <span class="n">rel</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; complete&quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">complete</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">TimeSlot</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">hour</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">mins</span><span class="p">)),</span> <span class="n">rel</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_add_act</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hour</span><span class="p">,</span> <span class="n">mins</span><span class="p">,</span> <span class="n">rel</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; active&quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">active</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">TimeSlot</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">hour</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">mins</span><span class="p">)),</span> <span class="n">rel</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">USE_LATE</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_late</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Variables</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; dedicated class to enable variable addition with different</span>
<span class="sd">    syntax &quot;&quot;&quot;</span>
    
    <span class="k">def</span> <span class="nf">_set_tvar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>        
        <span class="sd">&quot;&quot;&quot; facilitate to load a ecflow suite to SMS, translating</span>
<span class="sd">        variable names&quot;&quot;&quot;</span>
        <span class="n">keyt</span><span class="p">,</span> <span class="n">valt</span> <span class="o">=</span> <span class="n">translate</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">))</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="n">keyt</span><span class="p">,</span> <span class="n">valt</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="nb">next</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">next</span> <span class="o">=</span> <span class="n">Variables</span><span class="p">(</span><span class="n">keyt</span><span class="p">,</span> <span class="n">valt</span><span class="p">,</span> <span class="nb">next</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">__a</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">__b</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">__next</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">next</span> <span class="o">=</span> <span class="n">__next</span>

        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="nb">list</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">args</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">(),</span> <span class="n">item</span><span class="o">.</span><span class="n">value</span><span class="p">())</span>
            <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="nb">tuple</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">args</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">BaseException</span><span class="p">()</span>
        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> 
            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">__a</span><span class="p">)</span> <span class="o">==</span> <span class="nb">dict</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">__a</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
        <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">__a</span><span class="p">)</span> <span class="o">==</span> <span class="nb">tuple</span><span class="p">:</span> 
            <span class="k">raise</span> <span class="ne">BaseException</span><span class="p">()</span>
            <span class="c"># for key, val in __a.items(): self._set_tvar(key, val)</span>
        <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">__a</span><span class="p">)</span> <span class="o">==</span> <span class="nb">list</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">BaseException</span><span class="p">()</span>
        <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">__a</span><span class="p">)</span> <span class="o">==</span> <span class="n">Variable</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">__a</span>
        <span class="k">elif</span> <span class="n">__a</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">__b</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">__a</span><span class="p">,</span> <span class="n">__b</span><span class="p">)</span>
        <span class="k">elif</span> <span class="n">__a</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">__b</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="k">pass</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">print</span> <span class="n">__a</span><span class="p">,</span> <span class="n">__b</span><span class="p">,</span> <span class="n">__next</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">;</span> 
            <span class="k">raise</span> <span class="ne">BaseException</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="o">.</span><span class="n">add_to</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">what</span><span class="p">):</span>
        <span class="k">print</span> <span class="n">what</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span>
        <span class="k">raise</span> <span class="n">baseException</span>

<span class="k">class</span> <span class="nc">Limits</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; dedicated class to enable limits addition with different syntax &quot;&quot;&quot;</span>
    
    <span class="k">def</span> <span class="nf">_set_tvar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>        
        <span class="sd">&quot;&quot;&quot; append limits &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">Limit</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="nb">next</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">next</span> <span class="o">=</span> <span class="n">Limits</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="nb">next</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">__a</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">__b</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">__next</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">next</span> <span class="o">=</span> <span class="n">__next</span>

        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="nb">list</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">args</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">(),</span> <span class="n">item</span><span class="o">.</span><span class="n">value</span><span class="p">())</span>
            <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="nb">tuple</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">args</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
        <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> 
            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
        <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">__a</span><span class="p">)</span> <span class="o">==</span> <span class="nb">dict</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">__a</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">__a</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">__b</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_set_tvar</span><span class="p">(</span><span class="n">__a</span><span class="p">,</span> <span class="n">__b</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_limit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="o">.</span><span class="n">add_to</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Repeat</span><span class="p">(</span><span class="n">Attribute</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;YMD&quot;</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">20120101</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="mi">20120101</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">kind</span><span class="o">=</span><span class="s">&quot;date&quot;</span><span class="p">):</span>
       <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;date&quot;</span><span class="p">:</span>
           <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatDate</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">end</span><span class="p">),</span> 
                                         <span class="nb">int</span><span class="p">(</span><span class="n">step</span><span class="p">))</span>
       <span class="k">elif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;integer&quot;</span><span class="p">:</span>
           <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatInteger</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">end</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">step</span><span class="p">))</span>
       <span class="k">elif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;string&quot;</span><span class="p">:</span>
           <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatString</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">start</span><span class="p">)</span>
       <span class="k">elif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;enumerated&quot;</span><span class="p">:</span>
           <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatEnumerated</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">start</span><span class="p">)</span>
       <span class="k">elif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;day&quot;</span><span class="p">:</span>
           <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatDay</span><span class="p">(</span><span class="n">step</span><span class="p">)</span>        
       <span class="k">else</span><span class="p">:</span>
           <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">None</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">If</span><span class="p">(</span><span class="n">test</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">then</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">otow</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; enable Task(&quot;t1&quot;).add(If(test= (1==1),</span>
<span class="sd">                                 then= Variables(ONE=1),</span>
<span class="sd">                                 otow= Variables(TWO=2)))</span>
<span class="sd">        appreciate that both branches are evaluated, using this If class</span>
<span class="sd">        ie there is no &#39;dead code&#39; as it is with python language &#39;if&#39; structure</span>

<span class="sd">        using If to distinguish od/rd mode request that both users share</span>
<span class="sd">        the variables (parameter.py) and ecf.py</span>
<span class="sd">                                 </span>
<span class="sd">        otow: on the other way?</span>
<span class="sd">        &quot;&quot;&quot;</span>
    <span class="k">if</span> <span class="n">test</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">then</span>
    <span class="k">return</span> <span class="n">otow</span>

<span class="k">class</span> <span class="nc">Root</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c"># from where Suite and Node derive</span>
    <span class="sd">&quot;&quot;&quot; generic tree node &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span>
        <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
            <span class="k">return</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> == &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>        
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
            <span class="k">return</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> != &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">def</span> <span class="nf">__and__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
            <span class="k">return</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> and &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">def</span> <span class="nf">__or__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
            <span class="k">return</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> or &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">def</span> <span class="nf">fullname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; simple syntax &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_abs_node_path</span><span class="p">()</span>
        <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
    
    <span class="k">def</span> <span class="nf">repeat</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;YMD&quot;</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">20120101</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="mi">20321212</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
               <span class="n">kind</span><span class="o">=</span><span class="s">&quot;date&quot;</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add repeat attribute&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;date&quot;</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatDate</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">end</span><span class="p">),</span> 
                                              <span class="nb">int</span><span class="p">(</span><span class="n">step</span><span class="p">)))</span>
        <span class="k">elif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;integer&quot;</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatInteger</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">end</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">step</span><span class="p">)))</span>
        <span class="k">elif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;string&quot;</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatString</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">start</span><span class="p">))</span>
        <span class="k">elif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;enumerated&quot;</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatEnumerated</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">start</span><span class="p">))</span>
        <span class="k">elif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">&quot;day&quot;</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">RepeatDay</span><span class="p">(</span><span class="n">step</span><span class="p">))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">BaseException</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">defstatus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">kind</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add defstatus attribute&quot;&quot;&quot;</span>
        <span class="n">status</span> <span class="o">=</span> <span class="n">kind</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">:</span>
            <span class="n">kinds</span> <span class="o">=</span> <span class="p">{</span><span class="s">&quot;suspended&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">suspended</span><span class="p">,</span>
                     <span class="s">&quot;aborted&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">aborted</span><span class="p">,</span>
                     <span class="s">&quot;complete&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">complete</span><span class="p">,</span>
                     <span class="s">&quot;active&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">active</span><span class="p">,</span>
                     <span class="s">&quot;submitted&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">submitted</span><span class="p">,</span>
                     <span class="s">&quot;unknown&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">unknown</span><span class="p">,</span>
                     <span class="s">&quot;queued&quot;</span><span class="p">:</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">queued</span><span class="p">,</span>
                     <span class="p">}</span>
            <span class="n">status</span> <span class="o">=</span> <span class="n">kinds</span><span class="p">[</span><span class="n">kind</span><span class="p">]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_defstatus</span><span class="p">(</span><span class="n">status</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add a task, a family or an attribute &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="k">print</span> <span class="bp">self</span><span class="o">.</span><span class="n">fullname</span><span class="p">()</span>

        <span class="k">if</span> <span class="n">item</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="o">==</span> <span class="nb">tuple</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">item</span><span class="p">:</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
            <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="o">==</span> <span class="nb">list</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">item</span><span class="p">:</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">try</span><span class="p">:</span>
                    <span class="n">item</span><span class="o">.</span><span class="n">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
                <span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">exc</span><span class="p">:</span>
                    <span class="k">try</span><span class="p">:</span> <span class="k">print</span> <span class="n">item</span><span class="o">.</span><span class="n">fullname</span><span class="p">(),</span> <span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">()</span>
                    <span class="k">except</span><span class="p">:</span> <span class="k">pass</span>
                    <span class="k">print</span> <span class="s">&quot;not yet&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">item</span><span class="p">),</span> <span class="n">item</span><span class="p">,</span> <span class="n">exc</span> 
                    <span class="k">raise</span> <span class="ne">BaseException</span>

        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="nb">tuple</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
            <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="nb">list</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">BaseException</span><span class="p">()</span>

        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Node</span><span class="p">):</span>
            <span class="k">print</span> <span class="s">&quot;you don&#39;t want that&quot;</span>
            <span class="k">raise</span> <span class="ne">BaseException</span><span class="p">()</span>

        <span class="k">return</span> <span class="bp">self</span>
 
    <span class="k">def</span> <span class="nf">limit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add limit attribute&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> 
            <span class="k">raise</span> <span class="ne">BaseException</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_limit</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">inlimit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">full_path</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add inlimit attribute&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">USE_LIMIT</span><span class="p">:</span> 
            <span class="k">return</span> <span class="bp">self</span>

        <span class="n">path</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">full_path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;:&quot;</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">BaseException</span>
        <span class="k">if</span> <span class="n">path</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">BaseException</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">add_inlimit</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

<span class="k">class</span> <span class="nc">Node</span><span class="p">(</span><span class="n">Root</span><span class="p">):</span> <span class="c"># from where Task and Family derive</span>
    <span class="sd">&quot;&quot;&quot; Node class is shared by family and task &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">add_limits</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">__a</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">__b</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add limit dependency&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">__a</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_limit</span><span class="p">(</span><span class="n">__a</span><span class="p">,</span> <span class="n">__b</span><span class="p">)</span>
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">__a</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
            <span class="k">assert</span> <span class="n">__b</span> <span class="ow">is</span> <span class="bp">None</span>
            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">__a</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">add_limit</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_limit</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">meter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add meter attribute&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">threshold</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">threshold</span> <span class="o">=</span> <span class="n">end</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_meter</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">threshold</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">label</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;&quot;</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add label attribute&quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_label</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add event attribute&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">USE_EVENT</span><span class="p">:</span> 
            <span class="bp">self</span><span class="o">.</span><span class="n">add_event</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">cron</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">dom</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">wdays</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">month</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; wrapper for add_cron &quot;&quot;&quot;</span>
        <span class="n">cron</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Cron</span><span class="p">()</span>
        <span class="n">cron</span><span class="o">.</span><span class="n">set_time_series</span><span class="p">(</span><span class="n">time</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">wdays</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">False</span><span class="p">:</span>
            <span class="n">cron</span><span class="o">.</span><span class="n">set_week_days</span><span class="p">(</span><span class="n">wdays</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">month</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">False</span><span class="p">:</span>
            <span class="n">cron</span><span class="o">.</span><span class="n">set_months</span><span class="p">(</span><span class="n">month</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">dom</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">False</span><span class="p">:</span>
            <span class="n">cron</span><span class="o">.</span><span class="n">set_day_of_month</span><span class="p">(</span><span class="n">dom</span><span class="p">)</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">add_cron</span><span class="p">(</span><span class="n">cron</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">today</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hhmm</span><span class="p">):</span> 
        <span class="sd">&quot;&quot;&quot; wrapper around time &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="p">(</span><span class="n">hhmm</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span> <span class="c"># ???</span>

    <span class="k">def</span> <span class="nf">time</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hhmm</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; wrapper around time, None argument is silently ignored &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">hhmm</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span><span class="n">hhmm</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add trigger attribute&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">USE_TRIGGER</span> <span class="ow">and</span> <span class="n">arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_trigger</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">trigger_and</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; append to existing trigger&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">USE_TRIGGER</span> <span class="ow">and</span> <span class="n">arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_part_trigger</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">PartExpression</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="bp">True</span><span class="p">))</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">trigger_or</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; append to existing trigger&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">USE_TRIGGER</span> <span class="ow">and</span> <span class="n">arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_part_trigger</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">PartExpression</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="bp">False</span><span class="p">))</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">complete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add complete attribute&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">USE_TRIGGER</span> <span class="ow">and</span> <span class="n">arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_complete</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">complete_and</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; append to existing complete&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">USE_TRIGGER</span> <span class="ow">and</span> <span class="n">arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_part_complete</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">PartExpression</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="bp">True</span><span class="p">))</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">complete_or</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; append to existing complete&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="n">USE_TRIGGER</span> <span class="ow">and</span> <span class="n">arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">add_part_complete</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">PartExpression</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="bp">False</span><span class="p">))</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">up</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; get parent, one level up&quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_parent</span><span class="p">()</span>

<span class="k">class</span> <span class="nc">Defs</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">Defs</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper for the definition &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">suite</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add suite &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_suite</span><span class="p">(</span><span class="n">suite</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">suite</span>

    <span class="k">def</span> <span class="nf">suite</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add suite providing its name &quot;&quot;&quot;</span>
        <span class="n">suite</span> <span class="o">=</span> <span class="n">Suite</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">suite</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">suite</span>

<span class="k">class</span> <span class="nc">Client</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">Client</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper around client &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="s">&quot;localhost&quot;</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="s">&quot;31415&quot;</span><span class="p">):</span>
        <span class="k">if</span> <span class="s">&quot;@&quot;</span> <span class="ow">in</span> <span class="n">host</span><span class="p">:</span>
            <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">host</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;@&quot;</span><span class="p">)</span>
            <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">port</span><span class="p">))</span>            
        <span class="k">else</span><span class="p">:</span>
            <span class="nb">super</span><span class="p">(</span><span class="n">Client</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">port</span><span class="p">))</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">port</span> <span class="o">=</span> <span class="n">port</span>

    <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="s">&quot;#MSG: ecflow client </span><span class="si">%s</span><span class="s">@</span><span class="si">%s</span><span class="s"> v</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">port</span><span class="p">,</span> 
                                                 <span class="bp">self</span><span class="o">.</span><span class="n">version</span><span class="p">())</span>

<span class="k">class</span> <span class="nc">Suite</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">Suite</span><span class="p">,</span> <span class="n">Root</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper for a suite &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">family</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add family &quot;&quot;&quot;</span>
        <span class="n">fam</span> <span class="o">=</span> <span class="n">Family</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_family</span><span class="p">(</span><span class="n">fam</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">fam</span>

    <span class="k">def</span> <span class="nf">task</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add family &quot;&quot;&quot;</span>
        <span class="n">tsk</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">tsk</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">tsk</span>

    <span class="c"># def __enter__(self):</span>
    <span class="c">#     return self</span>

    <span class="c"># def __exit__(self, *args):</span>
    <span class="c">#     pass</span>

<span class="k">class</span> <span class="nc">Family</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">Family</span><span class="p">,</span> <span class="n">Node</span><span class="p">,</span> <span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper around family &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">family</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add a family &quot;&quot;&quot;</span>
        <span class="n">fam</span> <span class="o">=</span> <span class="n">Family</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_family</span><span class="p">(</span><span class="n">fam</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">fam</span>

    <span class="k">def</span> <span class="nf">task</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; add a task &quot;&quot;&quot;</span>
        <span class="n">tsk</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">tsk</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">tsk</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>        
        <span class="n">node</span><span class="o">.</span><span class="n">add_family</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>

    <span class="c"># def __enter__(self):</span>
    <span class="c">#     return self</span>

    <span class="c"># def __exit__(self, *args):</span>
    <span class="c">#     pass</span>

<span class="k">class</span> <span class="nc">Task</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">Task</span><span class="p">,</span> <span class="n">Node</span><span class="p">,</span> <span class="n">Attribute</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; wrapper around task &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
        <span class="c"># assert key.isupper()</span>
        <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">isupper</span><span class="p">():</span>
            <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="o">=</span> <span class="n">translate</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">add_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
            <span class="n">node</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">display</span><span class="p">(</span><span class="n">defs</span><span class="p">,</span> <span class="n">fname</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; print defs&quot;&quot;&quot;</span>
    <span class="k">if</span> <span class="n">fname</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">print</span> <span class="n">defs</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">fop</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="s">&quot;w&quot;</span><span class="p">)</span>
        <span class="k">print</span> <span class="o">&gt;&gt;</span> <span class="n">fop</span><span class="p">,</span> <span class="n">defs</span>


<span class="k">class</span> <span class="nc">TestEcf</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; a test case &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">test_xxx</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; a test &quot;&quot;&quot;</span>

        <span class="n">suite</span> <span class="o">=</span> <span class="n">Suite</span> <span class="p">(</span><span class="s">&quot;a_suite&quot;</span><span class="p">)</span>
        <span class="n">suite</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;suspended&quot;</span><span class="p">)</span>

        <span class="n">fam</span> <span class="o">=</span> <span class="n">Family</span><span class="p">(</span><span class="s">&quot;a_family&quot;</span><span class="p">)</span>
        <span class="n">tsk</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;a_task&quot;</span><span class="p">)</span>

        <span class="n">ft2</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;a_fam&quot;</span><span class="p">)</span>
        <span class="n">ft2</span><span class="o">.</span><span class="n">add_to</span><span class="p">(</span><span class="n">fam</span><span class="p">)</span>

        <span class="n">tsk</span><span class="o">.</span><span class="n">VAR</span> <span class="o">=</span> <span class="s">&quot;VALUE&quot;</span>                         <span class="c"># edit VAR &quot;VALUE&quot;</span>
        <span class="n">tsk</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Late</span><span class="p">(</span><span class="s">&quot;-s 00:05 -c 01:00&quot;</span><span class="p">))</span>
        <span class="n">fam</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tsk</span><span class="p">,</span>

                <span class="p">(</span><span class="n">Task</span><span class="p">(</span><span class="s">&quot;1&quot;</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;2&quot;</span><span class="p">)),</span> 
                <span class="p">[</span><span class="n">Task</span><span class="p">(</span><span class="s">&quot;11&quot;</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;12&quot;</span><span class="p">)],</span> 
                <span class="n">Task</span><span class="p">(</span><span class="s">&quot;111&quot;</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;211&quot;</span><span class="p">),</span>

                <span class="n">Task</span><span class="p">(</span><span class="s">&quot;t2&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Trigger</span><span class="p">(</span><span class="n">tsk</span> <span class="o">==</span> <span class="n">COMPLETE</span><span class="p">),</span>
                               <span class="n">Time</span><span class="p">(</span><span class="s">&quot;01:00&quot;</span><span class="p">))</span>            <span class="p">)</span>

        <span class="n">fam</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Task</span><span class="p">(</span><span class="s">&quot;t3&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">If</span><span class="p">(</span><span class="n">test</span><span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">==</span><span class="mi">1</span><span class="p">),</span>
                   <span class="n">then</span><span class="o">=</span> <span class="n">Variables</span><span class="p">(</span><span class="n">ADD_ONE</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span>
                   <span class="n">otow</span><span class="o">=</span> <span class="n">Variables</span><span class="p">(</span><span class="n">ADD_TWO</span><span class="o">=</span><span class="mi">1</span><span class="p">)),</span>

                <span class="n">If</span><span class="p">(</span><span class="n">test</span><span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">==</span><span class="mi">0</span><span class="p">),</span>
                   <span class="n">then</span><span class="o">=</span> <span class="n">Variables</span><span class="p">(</span><span class="n">ADD_ONE</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span>
                   <span class="n">otow</span><span class="o">=</span> <span class="n">Variables</span><span class="p">(</span><span class="n">ADD_TWO</span><span class="o">=</span><span class="mi">0</span><span class="p">)),</span>
                <span class="n">Trigger</span><span class="p">(</span><span class="n">tsk</span> <span class="o">!=</span> <span class="n">ABORTED</span><span class="p">),</span>
                <span class="n">Complete</span><span class="p">(</span><span class="n">tsk</span> <span class="o">==</span> <span class="n">COMPLETE</span><span class="p">)))</span> <span class="c"># longer</span>

        <span class="n">fam</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;2t&quot;</span><span class="p">),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;t4&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
                <span class="n">Trigger</span><span class="p">(</span><span class="n">tsk</span><span class="o">.</span><span class="n">name</span><span class="p">()</span> <span class="o">!=</span> <span class="n">COMPLETE</span><span class="p">)),</span>
            <span class="n">Late</span><span class="p">(</span><span class="s">&quot;-s 00:05 -c 01:00&quot;</span><span class="p">),</span>
            <span class="n">Variables</span><span class="p">(</span><span class="n">VAR</span><span class="o">=</span><span class="s">&quot;VALUE&quot;</span><span class="p">),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;t5&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Trigger</span><span class="p">([</span><span class="s">&quot;t4&quot;</span><span class="p">,</span> <span class="s">&quot;t3&quot;</span><span class="p">,</span> <span class="s">&quot;t2&quot;</span><span class="p">])),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;t6&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Trigger</span><span class="p">(</span><span class="s">&quot;2t&quot;</span> <span class="o">==</span> <span class="n">COMPLETE</span><span class="p">)),</span>
            <span class="n">Task</span><span class="p">(</span><span class="s">&quot;t7&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Trigger</span><span class="p">(</span><span class="s">&quot;2t eq complete&quot;</span><span class="p">)),</span>
            <span class="p">)</span>

        <span class="n">tsk</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Limit</span><span class="p">(</span><span class="s">&quot;a_limit&quot;</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span>
                <span class="n">InLimit</span><span class="p">(</span><span class="s">&quot;a_task:a_limit&quot;</span><span class="p">),</span>
                <span class="n">Meter</span><span class="p">(</span><span class="s">&quot;step&quot;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span>
                <span class="n">Label</span><span class="p">(</span><span class="s">&quot;info&quot;</span><span class="p">,</span> <span class="s">&quot;none&quot;</span><span class="p">),</span>
                <span class="n">Event</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span>
                <span class="n">Event</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">),</span>
                <span class="n">Defcomplete</span><span class="p">())</span>
        
        <span class="n">tsk</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Variables</span><span class="p">({</span><span class="s">&quot;A&quot;</span><span class="p">:</span> <span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="s">&quot;B&quot;</span><span class="p">:</span> <span class="s">&quot;b&quot;</span><span class="p">}))</span>
        <span class="n">tsk</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Variables</span><span class="p">(</span><span class="n">D</span><span class="o">=</span><span class="s">&quot;d&quot;</span><span class="p">,</span> <span class="n">E</span><span class="o">=</span><span class="s">&quot;e&quot;</span><span class="p">))</span>
        <span class="n">tsk</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Variables</span><span class="p">(</span><span class="s">&quot;C&quot;</span><span class="p">,</span> <span class="s">&quot;c&quot;</span><span class="p">))</span>
        <span class="n">suite</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">fam</span><span class="p">)</span>

        <span class="n">fam</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;another&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">DefcompleteIf</span><span class="p">(</span><span class="bp">True</span><span class="p">))</span>

        <span class="n">defs</span> <span class="o">=</span> <span class="n">Defs</span><span class="p">()</span>
        <span class="n">defs</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">suite</span><span class="p">)</span>
        <span class="n">another</span> <span class="o">=</span> <span class="n">defs</span><span class="o">.</span><span class="n">suite</span><span class="p">(</span><span class="s">&quot;another&quot;</span><span class="p">)</span>
        <span class="n">another</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">&quot;suspended&quot;</span><span class="p">)</span>
        <span class="n">another</span><span class="o">.</span><span class="n">task</span><span class="p">(</span><span class="s">&quot;tn&quot;</span><span class="p">)</span>
        <span class="n">afam</span> <span class="o">=</span> <span class="n">another</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">&quot;another_fam&quot;</span><span class="p">)</span>
        <span class="n">afam</span><span class="o">.</span><span class="n">task</span><span class="p">(</span><span class="s">&quot;t2n&quot;</span><span class="p">)</span>

        <span class="n">display</span><span class="p">(</span><span class="n">defs</span><span class="p">,</span> <span class="n">fname</span><span class="o">=</span><span class="s">&quot;test_ecf.tmp&quot;</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">()</span>
<span class="c"># http://intra.ecmwf.int/metapps/monitoring/sst/sst_ostia.png</span>
<span class="c"># http://intra.ecmwf.int/metapps/monitoring/sst/sstdiff_ostia.png</span>
</pre></div>
</div>
</div>