<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">""" suite builder example for 2013 ecFlow course """</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">'/home/ma/emos/def/ecflow'</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 "dynamical suite", with a "family producer task"</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">'-'</span><span class="p">,</span> <span class="s">''</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">""" provide structure for derived classes"""</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">""" ksh is not the only language for task wrappers"""</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">"perl"</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">"^"</span><span class="p">,</span> <span class="n">ECF_JOB_CMD</span><span class="o">=</span> <span class="s">"^ECF_JOB^ > ^ECF_JOBOUT^ 2>&1"</span><span class="p">),</span> <span class="n">Meter</span><span class="p">(</span><span class="s">"step"</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">"1"</span><span class="p">),</span> <span class="n">Event</span><span class="p">(</span><span class="s">"2"</span><span class="p">),</span> <span class="n">Label</span><span class="p">(</span><span class="s">"info"</span><span class="p">,</span> <span class="s">"none"</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">""" ksh is not the only language for task wrappers"""</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">"python"</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">"p"</span><span class="p">),</span> <span class="n">Event</span><span class="p">(</span><span class="s">"c"</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">"produce"</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">"step"</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">"</span><span class="si">%s</span><span class="s">"</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">""" in some situation, user may want its family to continue, and</span> <span class="sd"> repeat to increment, even when some tasks abort """</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">"daily"</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">"YMD"</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">"action"</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">"10:00"</span><span class="p">)),</span> <span class="n">Family</span><span class="p">(</span><span class="s">"loop"</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">"11:00"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"dummy"</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">"1==1"</span><span class="p">))),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"fallback"</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">"info"</span><span class="p">,</span> <span class="s">"force complete when action is aborted"</span><span class="p">),</span> <span class="n">Time</span><span class="p">(</span><span class="s">"10:55"</span><span class="p">),</span> <span class="n">Trigger</span><span class="p">(</span><span class="s">"action eq aborted"</span><span class="p">),</span> <span class="n">Complete</span><span class="p">(</span><span class="s">"action eq complete"</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">""" anopther method to have daily repeat increment, with aborted tasks"""</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">"daily_inc"</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">"YMD"</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">"info"</span><span class="p">,</span> <span class="s">"requeue will reset repeat attribute!"</span><span class="p">),</span> <span class="n">Complete</span><span class="p">(</span><span class="s">"daily_inc/loop/dummy eq complete"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"action"</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">"10:00"</span><span class="p">)),</span> <span class="n">Family</span><span class="p">(</span><span class="s">"loop"</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">"11:00"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"dummy"</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">"1==1"</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">""" producer-consumer pattern can be implemented in many ways"""</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">""" pass the parent node, so that absolute paths can be used </span> <span class="sd"> with triggers"""</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">"consume"</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">"limits"</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">"consume"</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">"leader"</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">"info"</span><span class="p">,</span> <span class="s">"set event to get produce1 leader"</span><span class="p">),</span> <span class="n">Event</span><span class="p">(</span><span class="s">"1"</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">"produce"</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">"info"</span><span class="p">,</span> <span class="s">"both produce and consume in a task"</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">"produce0"</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">"info"</span><span class="p">,</span> <span class="s">"only produce"</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">"produce"</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">"produce1"</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">"info"</span><span class="p">,</span> <span class="s">"repeat, one job per step"</span><span class="p">),</span> <span class="n">_leaf</span><span class="p">(</span><span class="s">"produce"</span><span class="p">,</span> <span class="n">init</span><span class="o">=</span><span class="s">"%STEP%"</span><span class="p">,</span> <span class="n">stop</span><span class="o">=</span><span class="s">"%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="o">.</span><span class="n">add</span><span class="p">(</span> <span class="n">Meter</span><span class="p">(</span><span class="s">"step"</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">"integer"</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">"STEP"</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">"suspended"</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">"produce2"</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">"info"</span><span class="p">,</span> <span class="s">"limited, one task per step, step by 3"</span><span class="p">),</span> <span class="n">Limit</span><span class="p">(</span><span class="s">"prod"</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">"produce2:prod"</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">"</span><span class="si">%02d</span><span class="s">"</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">"produce"</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">"/consume/leader:1"</span> <span class="n">prod</span> <span class="o">=</span> <span class="n">path</span> <span class="o">+</span> <span class="s">"/consume/produce"</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">"consume"</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">"info"</span><span class="p">,</span> <span class="s">"trigger may be inside a task"</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">"limits:consume"</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">":step ge $step or "</span> <span class="o">+</span> <span class="n">prod</span> <span class="o">+</span> <span class="s">" eq complete"</span><span class="p">,)),</span> <span class="n">Family</span><span class="p">(</span><span class="s">"consume1"</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">"info"</span><span class="p">,</span> <span class="s">"explicit trigger, follow faster"</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">"(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 "</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">"(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 "</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">"(</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)"</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">"limits:consume"</span><span class="p">),</span> <span class="n">_leaf</span><span class="p">(</span><span class="s">"consume"</span><span class="p">,</span> <span class="s">"%STEP%"</span><span class="p">,</span> <span class="s">"%STEP%"</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">"integer"</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">"STEP"</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">"consume2"</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">"info"</span><span class="p">,</span> <span class="s">"one task per step, step by three"</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">"consume"</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">"consume2:consume"</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">"</span><span class="si">%02d</span><span class="s">"</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">"(</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 "</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">"(</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">)"</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">"consume"</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">""" a 'barber shop' example with families created by a task """</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">""" generator """</span> <span class="k">return</span> <span class="n">Task</span><span class="p">(</span><span class="s">"passby"</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">"00:00 23:59 00:05"</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">"info"</span><span class="p">,</span> <span class="s">""</span><span class="p">),</span> <span class="n">Label</span><span class="p">(</span><span class="s">"rem"</span><span class="p">,</span> <span class="s">"this task alters its variable ID, "</span> <span class="o">+</span> <span class="s">"aliases won't work natively"</span><span class="p">),</span> <span class="n">InLimit</span><span class="p">(</span><span class="s">"limits:passby"</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">""" python version of the family created initialy</span> <span class="sd"> attention: raw definition file is located in passby task wrapper"""</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">"/limits"</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">"list"</span><span class="p">)</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">"</span><span class="si">%s</span><span class="s">"</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">"cut"</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">":barbers"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"pay"</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">"cut eq complete"</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">":barbers"</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">":cashiers"</span><span class="p">)),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"leave"</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">"info"</span><span class="p">,</span> <span class="s">""</span><span class="p">),</span> <span class="n">Trigger</span><span class="p">([</span><span class="s">"cut"</span><span class="p">,</span> <span class="s">"pay"</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">"complete"</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">"shop"</span><span class="p">)</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">"suspended"</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">"limits"</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">"passby"</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">"barbers"</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">"cashiers"</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">"/tmp/</span><span class="si">%s</span><span class="s">/ecflow/"</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">"/scripts"</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">"/include"</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">""" host families together """</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">"course"</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">""" define limits (empty) """</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">"suspended"</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">"/tmp/</span><span class="si">%s</span><span class="s">/"</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">".def"</span><span class="p">,</span> <span class="s">"w"</span><span class="p">)</span> <span class="k">print</span> <span class="o">>></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">""" 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"> """</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">"admin"</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">"admin"</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">"YMD"</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">"suspended"</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">""" return self contained Family/Task, without absolute node references</span> <span class="sd"> or with relative path triggers"""</span> <span class="n">remote_submit</span> <span class="o">=</span> <span class="s">"rsh -l %USER</span><span class="si">% %</span><span class="s">HOST</span><span class="si">% %</span><span class="s">ECF_JOB% > </span><span class="si">%E</span><span class="s">CF_JOBOUT% 2>&1"</span> <span class="n">logpath</span> <span class="o">=</span> <span class="s">"/home/ma/map/course/201303/ecflow"</span> <span class="k">return</span> <span class="p">(</span> <span class="n">Task</span><span class="p">(</span><span class="s">"newlog"</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">"info"</span><span class="p">,</span> <span class="s">"renew server log-file"</span><span class="p">),</span> <span class="n">Time</span><span class="p">(</span><span class="s">"08:00"</span><span class="p">)),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"logsvr"</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">"pikachu"</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">":"</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">"info"</span><span class="p">,</span> <span class="s">"(re)start the logsvr on HOST"</span><span class="p">),</span> <span class="n">Time</span><span class="p">(</span><span class="s">"08:00"</span><span class="p">)),</span> <span class="n">Family</span><span class="p">(</span><span class="s">"loop"</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">"08:30"</span><span class="p">),</span> <span class="n">Family</span><span class="p">(</span><span class="s">"dummy"</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">"1==1"</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">""" 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"> """</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">"ecevents"</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">"info"</span><span class="p">,</span> <span class="s">"use web... menu"</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">"http://eccmd.ecmwf.int:8090/#Mainpanel"</span><span class="p">,</span> <span class="n">ECF_URL_CMD</span><span class="o">=</span> <span class="s">"${BROWSER:=firefox} -remote 'openURL(%URL%"</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">"list"</span><span class="p">,</span> <span class="s">"register"</span><span class="p">,</span> <span class="s">"delete"</span><span class="p">,</span> <span class="s">"register_all"</span><span class="p">,</span> <span class="s">"delete_all"</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">"list"</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">"regs"</span><span class="p">,</span> <span class="s">""</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">"ecjobs"</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">"info"</span><span class="p">,</span> <span class="s">"none"</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">"_all"</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">"_all_"</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">"register"</span><span class="p">,</span> <span class="s">"delete"</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">"an12h000"</span><span class="p">),</span> <span class="n">Label</span><span class="p">(</span><span class="s">"info"</span><span class="p">,</span> <span class="s">"update EVENT variable"</span><span class="p">))</span> <span class="n">event</span> <span class="o">=</span> <span class="s">"an00h000"</span> <span class="n">node</span><span class="o">.</span><span class="n">family</span><span class="p">(</span><span class="s">"ref"</span><span class="p">)</span><span class="o">.</span><span class="n">defstatus</span><span class="p">(</span><span class="s">"complete"</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">"YMD"</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">"user"</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">"YMD"</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">"info"</span><span class="p">,</span> <span class="s">"extern cannot be used anymore for "</span> <span class="o">+</span> <span class="s">"intra-suite reference triggers"</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">":YMD le </span><span class="si">%s</span><span class="s">/ref/</span><span class="si">%s</span><span class="s">:YMD"</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">"consume"</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">""" add trigger on the previous task """</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">"to_ecflow"</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">"./</span><span class="si">%s</span><span class="s"> eq complete"</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">""" a simple task to download SMS content and translate it to ecFlow """</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">"reload"</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">"info"</span><span class="p">,</span> <span class="s">"from sms to ecFlow"</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">"https://software.ecmwf.int/wiki/display/ECFLOW/Home"</span><span class="p">,</span> <span class="n">ECF_URL_CMD</span><span class="o">=</span> <span class="s">"${BROWSER:=firefox} -remote 'openURL(%URL%"</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">"reload"</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">"get"</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">"eras"</span><span class="p">,</span> <span class="c"># SMS_PROG= 314159, SMS_NODE= "localhost",</span> <span class="c"># SMS_PROG= 314199, SMS_NODE= "marhaus", # 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">"marhaus"</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">"translate"</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">"edit"</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">"mail"</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">"load"</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">"bench"</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">'__main__'</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">"--host"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">"localhost"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span> <span class="s">"server hostname"</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">"--port"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">"3141"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span> <span class="s">"server port number"</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">></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">"course"</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">"localhost"</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">"localhost"</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">"localhost"</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 'consume'</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">"remote"</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">"mk_remote"</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">"info"</span><span class="p">,</span> <span class="s">"do not forget to create directory structure"</span> <span class="o">+</span> <span class="s">"on remote host for job output creation"</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">"class01"</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">"/tmp/</span><span class="si">%s</span><span class="s">/ecflow"</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">"class02"</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">"/</span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">user</span><span class="p">()</span> <span class="c"># path = "/%s/course" % user()</span> <span class="c"># path = "/%s/admin" % user()</span> <span class="c"># path = "/%s/ecevents" % 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">""" a layer over raw ecflow api """</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">"ALL"</span> <span class="c"># DECORATE = "ONLY_TRIGGER"</span> <span class="c"># DECORATE = "NO_TRIGGER"</span> <span class="c"># DECORATE = "ONLY_EVENT"</span> <span class="c"># DECORATE = "NO_ATTRIBUTE"</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">"ecflow"</span> <span class="c"># ECF_MODE = "sms"</span> <span class="k">if</span> <span class="n">DECORATE</span> <span class="o">==</span> <span class="s">"ONLY_TRIGGER"</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">"NO_ATTRIBUTE"</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">"ONLY_EVENT"</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">"NO_TRIGGER"</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">"ALL"</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">""" Translate from sms to ecflow """</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">"sms"</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">""" this class aims at affording a user the possibility to add Triggers as</span> <span class="sd"> t1 = Task("t1")</span> <span class="sd"> Task("ts").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"> """</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">""" store the status """</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">""" translate into string """</span> <span class="k">return</span> <span class="s">"</span><span class="si">%s</span><span class="s">"</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">""" when == is used, we should care about task name starting with 0-9"""</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">""</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">"./"</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">" == "</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">" == "</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">""" aka != """</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">""</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">"./"</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">" != "</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">" != "</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">""" return state """</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">""" return state """</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">"submitted"</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">"active"</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">"suspended"</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">"aborted"</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">"queued"</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">"complete"</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">"unknown"</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">""" generic attribute to be attached to a node"""</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">""" use polymorphism to attach attribute to a node"""</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">""" filter variables to be attached to a node, may alter its name SMS-ECF"""</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">""" add_variable"""</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">""" wrap around label"""</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">""" add_label"""</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">""" wrap around meter"""</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">""" add_meter"""</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">""" wrap around event"""</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">""" add_event"""</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">""" 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) """</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">":"</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">""</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">""" add_inlimit"""</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">""" get limit fullpath-name """</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">":"</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">""" get limit name """</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">""" add trigger (string, list of task names, or directly</span> <span class="sd"> expression and: and'ed (True) or or'ed (False) unk: add or</span> <span class="sd"> [name]==unknown for RD</span> <span class="sd"> """</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">""</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">""</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 "0123456789":</span> <span class="n">pre</span> <span class="o">=</span> <span class="s">"./"</span> <span class="k">if</span> <span class="s">':'</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">"</span><span class="si">%s</span><span class="s"> == complete"</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">" or </span><span class="si">%s%s</span><span class="s">==unknown"</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">"what? trigger?"</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">":"</span> <span class="ow">in</span> <span class="n">expr</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s">" eq "</span> <span class="ow">in</span> <span class="n">expr</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s">"=="</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">" eq complete"</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">""" attribute to be added to node when it is not expected to run</span> <span class="sd"> any task"""</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">""" add an 'impossible trigger', for a task not to run """</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">"1==0"</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">""" attribute to be added to node when it is not expected to run</span> <span class="sd"> any task"""</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">""" add an 'impossible trigger', for a task not to run """</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">"1==1"</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">""" class to host complete expression, added later to a node"""</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">""" wrapper to add clock """</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">"hybrid"</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">':'</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">"WAR: clock can only be attached to suite node, "</span> <span class="k">print</span> <span class="s">"WAR: clock is ignored"</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">""" wrapper to add time """</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">':'</span><span class="p">)</span> <span class="n">rel</span> <span class="o">=</span> <span class="s">'+'</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">""" wrapper to add time """</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">""" wrapper to add time """</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">""" wrapper to add time """</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("-w", default=0, help= "weekdays")</span> <span class="c"># parser.add_argument("-d", default=0, help= "days")</span> <span class="c"># parser.add_argument("-m", default=0, help= "months")</span> <span class="c"># parser.add_argument("bes", nargs='*', type=str, help= "begin end step")</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 = ' '.join(''.join(parsed.bes).split(' '))</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">','</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">','</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">','</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">""" wrapper to add date """</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">"DATEMASK"</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">'.'</span><span class="p">)</span> <span class="k">if</span> <span class="n">ddd</span> <span class="o">==</span> <span class="s">'*'</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">'*'</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">'*'</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">""" wrapper to add day """</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">"WEEKDAY"</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">""" wrapper to add defstatus complete """</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">"complete"</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">""" add defstatus attribute"""</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">"suspended"</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">"aborted"</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">"complete"</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">"active"</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">"submitted"</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">"unknown"</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">"queued"</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">""" wrapper to add conditional defstatus complete </span> <span class="sd"> just change name to make it explicit</span> <span class="sd"> """</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">"complete"</span><span class="p">)</span> <span class="c"># else: node.defstatus("queued") # 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">""" wrapper to add limit """</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">""" wrapper around late, to be add'ed to families and tasks """</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">" "</span><span class="p">):</span> <span class="k">if</span> <span class="n">item</span> <span class="o">==</span> <span class="s">"-s"</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">"-c"</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">"-a"</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">":"</span><span class="p">)</span> <span class="n">rel</span> <span class="o">=</span> <span class="s">"+"</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">""" submitted"""</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">""" complete"""</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">""" active"""</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">""" dedicated class to enable variable addition with different</span> <span class="sd"> syntax """</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">""" facilitate to load a ecflow suite to SMS, translating</span> <span class="sd"> variable names"""</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">></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">></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">""" dedicated class to enable limits addition with different syntax """</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">""" append limits """</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">></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">></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">"YMD"</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">"date"</span><span class="p">):</span> <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">"date"</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">"integer"</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">"string"</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">"enumerated"</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">"day"</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">""" enable Task("t1").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 'dead code' as it is with python language 'if' 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"> """</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">""" generic tree node """</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">"</span><span class="si">%s</span><span class="s"> == "</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">"</span><span class="si">%s</span><span class="s"> != "</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">"</span><span class="si">%s</span><span class="s"> and "</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">"</span><span class="si">%s</span><span class="s"> or "</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">""" simple syntax """</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">"YMD"</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">"date"</span><span class="p">):</span> <span class="sd">""" add repeat attribute"""</span> <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="s">"date"</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">"integer"</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">"string"</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">"enumerated"</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">"day"</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">""" add defstatus attribute"""</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">"suspended"</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">"aborted"</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">"complete"</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">"active"</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">"submitted"</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">"unknown"</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">"queued"</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">""" add a task, a family or an attribute """</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">"not yet"</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">></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">"you don't want that"</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">""" add limit attribute"""</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">""" add inlimit attribute"""</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">":"</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">""" Node class is shared by family and task """</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">""" add limit dependency"""</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">""" add meter attribute"""</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">""</span><span class="p">):</span> <span class="sd">""" add label attribute"""</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">""" add event attribute"""</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">""" wrapper for add_cron """</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">""" wrapper around time """</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">""" wrapper around time, None argument is silently ignored """</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">""" add trigger attribute"""</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">""" append to existing trigger"""</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">""" append to existing trigger"""</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">""" add complete attribute"""</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">""" append to existing complete"""</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">""" append to existing complete"""</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">""" get parent, one level up"""</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">""" wrapper for the definition """</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">""" add suite """</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">""" add suite providing its name """</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">""" wrapper around client """</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">"localhost"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="s">"31415"</span><span class="p">):</span> <span class="k">if</span> <span class="s">"@"</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">"@"</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">"#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">"</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">""" wrapper for a suite """</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">""" add family """</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">""" add family """</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">""" wrapper around family """</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">""" add a family """</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">""" add a task """</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">""" wrapper around task """</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">""" print defs"""</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">"w"</span><span class="p">)</span> <span class="k">print</span> <span class="o">>></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">""" a test case """</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">""" a test """</span> <span class="n">suite</span> <span class="o">=</span> <span class="n">Suite</span> <span class="p">(</span><span class="s">"a_suite"</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">"suspended"</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">"a_family"</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">"a_task"</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">"a_fam"</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">"VALUE"</span> <span class="c"># edit VAR "VALUE"</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">"-s 00:05 -c 01:00"</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">"1"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"2"</span><span class="p">)),</span> <span class="p">[</span><span class="n">Task</span><span class="p">(</span><span class="s">"11"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"12"</span><span class="p">)],</span> <span class="n">Task</span><span class="p">(</span><span class="s">"111"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"211"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"t2"</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">"01:00"</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">"t3"</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">"2t"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"t4"</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">"-s 00:05 -c 01:00"</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">"VALUE"</span><span class="p">),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"t5"</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">"t4"</span><span class="p">,</span> <span class="s">"t3"</span><span class="p">,</span> <span class="s">"t2"</span><span class="p">])),</span> <span class="n">Task</span><span class="p">(</span><span class="s">"t6"</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">"2t"</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">"t7"</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">"2t eq complete"</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">"a_limit"</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">"a_task:a_limit"</span><span class="p">),</span> <span class="n">Meter</span><span class="p">(</span><span class="s">"step"</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">"info"</span><span class="p">,</span> <span class="s">"none"</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">"a"</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">"A"</span><span class="p">:</span> <span class="s">"a"</span><span class="p">,</span> <span class="s">"B"</span><span class="p">:</span> <span class="s">"b"</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">"d"</span><span class="p">,</span> <span class="n">E</span><span class="o">=</span><span class="s">"e"</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">"C"</span><span class="p">,</span> <span class="s">"c"</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">"another"</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">"another"</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">"suspended"</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">"tn"</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">"another_fam"</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">"t2n"</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">"test_ecf.tmp"</span><span class="p">)</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</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> |