From bc3a3941426e2092b8ee823464d66d98259183c2 Mon Sep 17 00:00:00 2001
From: Ivan Kondov <ivan.kondov@kit.edu>
Date: Wed, 13 Nov 2019 13:06:57 +0100
Subject: [PATCH] adapted to work with current upstream/master of fireworks,
 agenda modified

---
 docs/agenda.rst                               | 24 ++++++++++----
 docs/basics.rst                               | 22 ++++++-------
 docs/exercise2.rst                            |  6 ++--
 docs/exercise4.rst                            |  4 +--
 exercises/demos/2_data_flow/foreach_task.json | 16 +++++-----
 exercises/demos/2_data_flow/foreach_task.yaml | 16 +++++-----
 .../2_data_flow/python_function_task.json     | 24 +++++++-------
 .../2_data_flow/python_function_task.yaml     | 24 +++++++-------
 .../foreach_task_cmd.json                     |  8 ++---
 .../foreach_task_cmd.yaml                     |  8 ++---
 exercises/inputs/2_data_flow/template.json    | 16 +++++-----
 exercises/inputs/2_data_flow/template.yaml    | 32 +++++++++----------
 .../problems/2_data_flow/recruiting-0.json    |  8 ++---
 .../problems/2_data_flow/recruiting-0.yaml    |  8 ++---
 .../problems/2_data_flow/recruiting-1.json    | 16 +++++-----
 .../problems/2_data_flow/recruiting-1.yaml    | 16 +++++-----
 .../problems/2_data_flow/recruiting-2.json    | 16 +++++-----
 .../problems/2_data_flow/recruiting-2.yaml    | 16 +++++-----
 .../dataloader+repeater.json                  | 12 +++----
 .../5_author_firetask/dataloader.json         | 12 +++----
 .../solutions/2_data_flow/recruiting.json     | 16 +++++-----
 .../solutions/2_data_flow/recruiting.yaml     | 16 +++++-----
 .../4_wflow_append/image_swirl_montaged.json  |  4 +--
 .../4_wflow_append/image_swirl_montaged.yaml  |  4 +--
 24 files changed, 177 insertions(+), 167 deletions(-)

diff --git a/docs/agenda.rst b/docs/agenda.rst
index 032d5e8..ce4d5a5 100644
--- a/docs/agenda.rst
+++ b/docs/agenda.rst
@@ -2,39 +2,49 @@ Basic procedures
 ================
 
  * Compose Fireworks and workflows
- * Validate workflows
- * View workflows
  * Add fireworks to LaunchPad: ``lpad add``
+ * Validate workflows ``lpad add -c``, ``lpad check_wflow``
+ * View workflows ``lpad check_wflow -g``
  * Execution: ``rlaunch``
- * Monitoring: ``lpad get_*``, ``lpad webgui``
+ * Query fireworks and workflows: ``lpad get_fws``, ``lpad get_wflows``
+ * Monitoring: ``lpad report``, ``lpad track_fws``
 
 Exercise 1: Managing control flow 
 =================================
 
  * Dependencies and concurrency
- * Use standard Firetasks: ``ScriptTask``
+ * Use built-in Firetasks: ``ScriptTask``
  * Example: F1 pitstop
 
 Exercise 2: Managing data flow
 ==============================
 
  * Data flow dependencies 
- * Use custom Firetasks: ``PythonFunctionTask``
+ * Use built-in Firetasks: ``PyTask``
  * Example: Recruiting
 
 Exercise 3: Manage data in files and command line input
 =======================================================
 
- * Use custom Firetasks: ``CommandLineTask``
+ * Use built-in Firetasks: ``CommandLineTask``
  * Example: Image reconstruction
 
 Exercise 4: Extending a workflow
 ================================
 
+ * Use built-in command ``lpad append_wflow``
  * Extension of example from Exercise 3
  * Example: Image swirl
 
-Exercise 5: Writing a Firetask
+Exercise 5: Productive use
+ * Best practices: separate configs, launches, templates, inputs
+ * Using FireWorks with a batch system on HPC clusters
+ * Recovery from failure
+ * Duplicates
+ * Heterogeneous and distributed computing: _category, _fworker, etc.
+ * ...
+ 
+Exercise 6: Writing a Firetask
 ==============================
  * Extension of example from Exercise 2
 
diff --git a/docs/basics.rst b/docs/basics.rst
index 5de87b2..c5bce57 100644
--- a/docs/basics.rst
+++ b/docs/basics.rst
@@ -45,26 +45,26 @@ another in the order of their specification and share the same job working
 directory and the files in it.
 
 Here is a short example for a workflow demonstrating the usage of the 
-``PythonFunctionTask``::
+``PyTask``::
 
     fws:
     - fw_id: 1
       name: Grind coffee
       spec:
         _tasks:
-        - _fw_name: PythonFunctionTask
-          function: auxiliary.print_func
+        - _fw_name: PyTask
+          func: auxiliary.print_func
           inputs: [coffee beans]
-          outputs: coffee powder
+          outputs: [coffee powder]
         coffee beans: best selection
     - fw_id: 2
       name: Brew coffee
       spec:
         _tasks:
-        - _fw_name: PythonFunctionTask
-          function: auxiliary.print_func
+        - _fw_name: PyTask
+          func: auxiliary.print_func
           inputs: [coffee powder, water]
-          outputs: pure coffee
+          outputs: [pure coffee]
         water: workflowing water
     links:
       '1': [2]
@@ -84,7 +84,7 @@ Add Fireworks to LaunchPad
 The LaunchPad is a database where the workflows are stored during their full 
 life cycle. It is hosted on a resource named FireServer.
 
-**NOTE:** For simplicity, in this tutorial the FireServer is the same host on 
+**NOTE:** In tutorial settings the FireServer is sometimes on the same host on 
 which you are logged on.
 
 When used productively the LaunchPad contains many workflows in different states. 
@@ -127,7 +127,7 @@ Visualize workflows
 
 Already added workflows can be converted into DOT format and viewed graphically::
 
-    lpad check_wflow -i <firework ID> [--view_control_flow] [--view_data_flow] [-f <DOT_FILE>]
+    lpad check_wflow -i <firework ID> [-g <controlflow | dataflow | combined>] [-f <filename>]
 
 After the dot file is produced it can be converted to PDF and the workflow graph 
 can be viewed::
@@ -146,8 +146,8 @@ running on different resources where individual Fireworks can be executed by the
 rocket launcher ``rlaunch`` which has three modes of operation: *singleshot*, 
 *rapidfire* and *multi*. 
 
-**NOTE:** For simplicity, in this tutorial the FireWorker is the same host as 
-the FireServer.
+**NOTE:** In tutorial settings the FireWorker is sometimes on the same host as 
+the FireServer and/or on the host where you are logged in.
 
 To only execute one Firework from the LaunchPad which is in *READY* state the 
 following command is used::
diff --git a/docs/exercise2.rst b/docs/exercise2.rst
index d937d1d..97c2c61 100644
--- a/docs/exercise2.rst
+++ b/docs/exercise2.rst
@@ -2,10 +2,10 @@ Exercise 2: Managing data flow
 ==============================
 
 The purpose of this exercise is to learn how to pass data between Fireworks and 
-describe data dependencies using the custom Firetask ``PythonFunctionTask``::
+describe data dependencies using the custom Firetask ``PyTask``::
 
-    - _fw_name: PythonFunctionTask
-      function: any_module.any_function
+    - _fw_name: PyTask
+      func: any_module.any_function
       inputs:
       - first argument
       - second argument
diff --git a/docs/exercise4.rst b/docs/exercise4.rst
index d3072b5..a90afad 100644
--- a/docs/exercise4.rst
+++ b/docs/exercise4.rst
@@ -27,8 +27,8 @@ latter workflow. For this, first copy the workflow **image_swirl.json** from
       name: Pass filename
       spec:
         _tasks:
-        - _fw_name: PythonFunctionTask
-          function: auxiliary.print_func
+        - _fw_name: PyTask
+          func: auxiliary.print_func
           inputs: [montaged image]
           outputs: [montaged image]
   and::
diff --git a/exercises/demos/2_data_flow/foreach_task.json b/exercises/demos/2_data_flow/foreach_task.json
index f23ce76..10e250a 100644
--- a/exercises/demos/2_data_flow/foreach_task.json
+++ b/exercises/demos/2_data_flow/foreach_task.json
@@ -8,10 +8,10 @@
           {
             "_fw_name": "ForeachTask",
             "task": {
-                "_fw_name": "PythonFunctionTask",
-                "function": "auxiliary.print_func",
+                "_fw_name": "PyTask",
+                "func": "auxiliary.print_func",
                 "inputs": ["coffee beans"],
-                "outputs": "coffee powder"
+                "outputs": ["coffee powder"]
             },
             "split": "coffee beans"
           }
@@ -27,10 +27,10 @@
           {
             "_fw_name": "ForeachTask",
             "task": {
-                "_fw_name": "PythonFunctionTask",
-                "function": "auxiliary.print_func",
+                "_fw_name": "PyTask",
+                "func": "auxiliary.print_func",
                 "inputs": ["coffee powder", "water"],
-                "outputs": "pure coffee"
+                "outputs": ["pure coffee"]
             },
             "split": "coffee powder"
           }
@@ -44,8 +44,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["pure coffee"]
           }
         ]
diff --git a/exercises/demos/2_data_flow/foreach_task.yaml b/exercises/demos/2_data_flow/foreach_task.yaml
index acdfa18..35cd172 100644
--- a/exercises/demos/2_data_flow/foreach_task.yaml
+++ b/exercises/demos/2_data_flow/foreach_task.yaml
@@ -6,10 +6,10 @@ fws:
     - _fw_name: ForeachTask
       split: coffee beans
       task:
-        _fw_name: PythonFunctionTask
-        function: auxiliary.print_func
+        _fw_name: PyTask
+        func: auxiliary.print_func
         inputs: [coffee beans]
-        outputs: coffee powder
+        outputs: [coffee powder]
     coffee beans: [arabica, robusta, liberica]
 - fw_id: 2
   name: Brew coffee
@@ -18,17 +18,17 @@ fws:
     - _fw_name: ForeachTask
       split: coffee powder
       task:
-        _fw_name: PythonFunctionTask
-        function: auxiliary.print_func
+        _fw_name: PyTask
+        func: auxiliary.print_func
         inputs: [coffee powder, water]
-        outputs: pure coffee
+        outputs: [pure coffee]
     water: workflowing water
 - fw_id: 3
   name: Serve coffee
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [pure coffee]
 links:
   '1': [2]
diff --git a/exercises/demos/2_data_flow/python_function_task.json b/exercises/demos/2_data_flow/python_function_task.json
index fcb92ed..e3abe0c 100644
--- a/exercises/demos/2_data_flow/python_function_task.json
+++ b/exercises/demos/2_data_flow/python_function_task.json
@@ -6,10 +6,10 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["fresh coffee beans"],
-            "outputs": "roasted coffee beans"
+            "outputs": ["roasted coffee beans"]
           }
         ],
         "fresh coffee beans": "top coffee selection"
@@ -21,10 +21,10 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["roasted coffee beans"],
-            "outputs": "coffee powder"
+            "outputs": ["coffee powder"]
           }
         ]
       }
@@ -35,10 +35,10 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["coffee powder", "water"],
-            "outputs": "pure coffee"
+            "outputs": ["pure coffee"]
           }
         ],
         "water": "workflowing water"
@@ -50,10 +50,10 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["pure coffee", "milk"],
-            "outputs": "cappuccino"
+            "outputs": ["cappuccino"]
           }
         ],
         "milk": "milky way milk"
diff --git a/exercises/demos/2_data_flow/python_function_task.yaml b/exercises/demos/2_data_flow/python_function_task.yaml
index 5798cfb..be2e609 100644
--- a/exercises/demos/2_data_flow/python_function_task.yaml
+++ b/exercises/demos/2_data_flow/python_function_task.yaml
@@ -3,36 +3,36 @@ fws:
   name: Roast coffee
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [fresh coffee beans]
-      outputs: roasted coffee beans
+      outputs: [roasted coffee beans]
     fresh coffee beans: top coffee selection
 - fw_id: 1
   name: Grind coffee
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [roasted coffee beans]
-      outputs: coffee powder
+      outputs: [coffee powder]
 - fw_id: 2
   name: Brew coffee
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [coffee powder, water]
-      outputs: pure coffee
+      outputs: [pure coffee]
     water: workflowing water
 - fw_id: 3
   name: Add extras
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [pure coffee, milk]
-      outputs: cappuccino
+      outputs: [cappuccino]
     milk: milky way milk
 links:
   '0': [1]
diff --git a/exercises/demos/3_files_and_commands/foreach_task_cmd.json b/exercises/demos/3_files_and_commands/foreach_task_cmd.json
index 3a702a7..17bb663 100644
--- a/exercises/demos/3_files_and_commands/foreach_task_cmd.json
+++ b/exercises/demos/3_files_and_commands/foreach_task_cmd.json
@@ -50,8 +50,8 @@
       "spec": {
          "_tasks": [
             {
-                "_fw_name": "PythonFunctionTask", 
-                "function": "auxiliary.print_func", 
+                "_fw_name": "PyTask", 
+                "func": "auxiliary.print_func", 
                 "inputs": [
                     "file set"
                 ]
@@ -77,8 +77,8 @@
                 }
             },
             {
-                "_fw_name": "PythonFunctionTask", 
-                "function": "auxiliary.print_func", 
+                "_fw_name": "PyTask", 
+                "func": "auxiliary.print_func", 
                 "inputs": [
                     "stdout dump"
                 ]
diff --git a/exercises/demos/3_files_and_commands/foreach_task_cmd.yaml b/exercises/demos/3_files_and_commands/foreach_task_cmd.yaml
index 9992448..efd7419 100644
--- a/exercises/demos/3_files_and_commands/foreach_task_cmd.yaml
+++ b/exercises/demos/3_files_and_commands/foreach_task_cmd.yaml
@@ -22,8 +22,8 @@ fws:
   name: Concatenate the files into a string
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [file set]
     - _fw_name: CommandLineTask
       command_spec:
@@ -34,8 +34,8 @@ fws:
           target: {type: data, value: stdout dump}
       inputs: [file set]
       outputs: [stdout dump]
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [stdout dump]
 links:
   '1': [2]
diff --git a/exercises/inputs/2_data_flow/template.json b/exercises/inputs/2_data_flow/template.json
index 1cf1a51..1abb580 100644
--- a/exercises/inputs/2_data_flow/template.json
+++ b/exercises/inputs/2_data_flow/template.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["job description"],
             "outputs": [""]
           }
@@ -21,8 +21,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [
                 "",
                 ""
@@ -40,8 +40,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [
                 "",
                 "",
@@ -61,8 +61,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [
                 "",
                 "",
diff --git a/exercises/inputs/2_data_flow/template.yaml b/exercises/inputs/2_data_flow/template.yaml
index d0b247c..7db2bf2 100644
--- a/exercises/inputs/2_data_flow/template.yaml
+++ b/exercises/inputs/2_data_flow/template.yaml
@@ -3,40 +3,40 @@ fws:
   name: Post the job
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [job description]
-      outputs: ['']
+      outputs: [' ']
     job description: {}
 - fw_id: 2
   name: Candidates apply
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
-      inputs: ['', '']
-      outputs: ['']
+    - _fw_name: PyTask
+      func: ' '
+      inputs: [' ', ' ']
+      outputs: [' ']
     application template: {}
     maximum applications: 50
 - fw_id: 3
   name: Screen candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
-      inputs: ['', '', '', '']
-      outputs: ['']
+    - _fw_name: PyTask
+      func: ' '
+      inputs: [' ', ' ', ' ', ' ']
+      outputs: [' ']
     minimum score: 2
     number to invite: 4
 - fw_id: 4
   name: Interview candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
-      inputs: ['', '', '']
-      outputs: ['']
+    - _fw_name: PyTask
+      func: ' '
+      inputs: [' ', ' ', ' ']
+      outputs: [' ']
     number to fill: 2
 links: {}
 metadata: {}
-name: ''
+name: ' '
diff --git a/exercises/problems/2_data_flow/recruiting-0.json b/exercises/problems/2_data_flow/recruiting-0.json
index e2cefec..ef8d65d 100644
--- a/exercises/problems/2_data_flow/recruiting-0.json
+++ b/exercises/problems/2_data_flow/recruiting-0.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [],
             "outputs": []
           }
@@ -20,8 +20,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "",
+            "_fw_name": "PyTask",
+            "func": "",
             "inputs": [],
             "outputs": []
           }
diff --git a/exercises/problems/2_data_flow/recruiting-0.yaml b/exercises/problems/2_data_flow/recruiting-0.yaml
index 6b69a6d..43038e8 100644
--- a/exercises/problems/2_data_flow/recruiting-0.yaml
+++ b/exercises/problems/2_data_flow/recruiting-0.yaml
@@ -3,16 +3,16 @@ fws:
   name: ''
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
+    - _fw_name: PyTask
+      func: ''
       inputs: []
       outputs: []
 - fw_id: 2
   name: ''
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: ''
+    - _fw_name: PyTask
+      func: ''
       inputs: []
       outputs: []
 links:
diff --git a/exercises/problems/2_data_flow/recruiting-1.json b/exercises/problems/2_data_flow/recruiting-1.json
index 14c7e7d..a514189 100644
--- a/exercises/problems/2_data_flow/recruiting-1.json
+++ b/exercises/problems/2_data_flow/recruiting-1.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["job description"],
             "outputs": ["job description"]
           }
@@ -35,8 +35,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           }
@@ -71,8 +71,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -92,8 +92,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
diff --git a/exercises/problems/2_data_flow/recruiting-1.yaml b/exercises/problems/2_data_flow/recruiting-1.yaml
index deadbff..c41093d 100644
--- a/exercises/problems/2_data_flow/recruiting-1.yaml
+++ b/exercises/problems/2_data_flow/recruiting-1.yaml
@@ -3,8 +3,8 @@ fws:
   name: Post the job
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [job description]
       outputs: [job description]
     job description:
@@ -17,8 +17,8 @@ fws:
   name: Candidates apply
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.candidates_apply
+    - _fw_name: PyTask
+      func: recruiting.candidates_apply
       inputs: [application template, maximum applications]
       outputs: [applicant profiles]
     application template:
@@ -36,8 +36,8 @@ fws:
   name: Screen candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.screen_candidates
+    - _fw_name: PyTask
+      func: recruiting.screen_candidates
       inputs: [job description, applicant profiles, minimum score, number to invite]
       outputs: [invited applicants]
     minimum score: 2
@@ -46,8 +46,8 @@ fws:
   name: Interview candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.interview_candidates
+    - _fw_name: PyTask
+      func: recruiting.interview_candidates
       inputs: [job description, applicant profiles, number to fill]
       outputs: [selected applicants]
     number to fill: 2
diff --git a/exercises/problems/2_data_flow/recruiting-2.json b/exercises/problems/2_data_flow/recruiting-2.json
index c5d213e..c88c620 100644
--- a/exercises/problems/2_data_flow/recruiting-2.json
+++ b/exercises/problems/2_data_flow/recruiting-2.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["job description"],
             "outputs": ["job description"]
           }
@@ -35,8 +35,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           }
@@ -71,8 +71,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -92,8 +92,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "invited applicants",
diff --git a/exercises/problems/2_data_flow/recruiting-2.yaml b/exercises/problems/2_data_flow/recruiting-2.yaml
index c3e55cb..7e7c6af 100644
--- a/exercises/problems/2_data_flow/recruiting-2.yaml
+++ b/exercises/problems/2_data_flow/recruiting-2.yaml
@@ -3,8 +3,8 @@ fws:
   name: Post the job
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [job description]
       outputs: [job description]
     job description:
@@ -17,8 +17,8 @@ fws:
   name: Candidates apply
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.candidates_apply
+    - _fw_name: PyTask
+      func: recruiting.candidates_apply
       inputs: [application template, maximum applications]
       outputs: [applicant profiles]
     application template:
@@ -36,8 +36,8 @@ fws:
   name: Screen candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.screen_candidates
+    - _fw_name: PyTask
+      func: recruiting.screen_candidates
       inputs: [job description, applicant profiles, minimum score, number to invite]
       outputs: [invited applicants]
     minimum score: 2
@@ -46,8 +46,8 @@ fws:
   name: Interview candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.interview_candidates
+    - _fw_name: PyTask
+      func: recruiting.interview_candidates
       inputs: [job description, invited applicants, number to fill]
       outputs: [selected applicants]
     number to fill: 2
diff --git a/exercises/problems/5_author_firetask/dataloader+repeater.json b/exercises/problems/5_author_firetask/dataloader+repeater.json
index 3382947..400eb2e 100644
--- a/exercises/problems/5_author_firetask/dataloader+repeater.json
+++ b/exercises/problems/5_author_firetask/dataloader+repeater.json
@@ -24,8 +24,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           },
@@ -45,8 +45,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -71,8 +71,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "invited applicants",
diff --git a/exercises/problems/5_author_firetask/dataloader.json b/exercises/problems/5_author_firetask/dataloader.json
index 3585d28..cd4e3d3 100644
--- a/exercises/problems/5_author_firetask/dataloader.json
+++ b/exercises/problems/5_author_firetask/dataloader.json
@@ -24,8 +24,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           }
@@ -39,8 +39,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -60,8 +60,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "invited applicants",
diff --git a/exercises/solutions/2_data_flow/recruiting.json b/exercises/solutions/2_data_flow/recruiting.json
index a49ba05..ffd67fd 100644
--- a/exercises/solutions/2_data_flow/recruiting.json
+++ b/exercises/solutions/2_data_flow/recruiting.json
@@ -6,8 +6,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["job description"],
             "outputs": ["job description"]
           }
@@ -35,8 +35,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.candidates_apply",
+            "_fw_name": "PyTask",
+            "func": "recruiting.candidates_apply",
             "inputs": ["application template", "maximum applications"],
             "outputs": ["applicant profiles"]
           }
@@ -71,8 +71,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.screen_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.screen_candidates",
             "inputs": [
                 "job description",
                 "applicant profiles",
@@ -92,8 +92,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "recruiting.interview_candidates",
+            "_fw_name": "PyTask",
+            "func": "recruiting.interview_candidates",
             "inputs": [
                 "job description",
                 "invited applicants",
diff --git a/exercises/solutions/2_data_flow/recruiting.yaml b/exercises/solutions/2_data_flow/recruiting.yaml
index 3510e17..e1127af 100644
--- a/exercises/solutions/2_data_flow/recruiting.yaml
+++ b/exercises/solutions/2_data_flow/recruiting.yaml
@@ -3,8 +3,8 @@ fws:
   name: Post the job
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [job description]
       outputs: [job description]
     job description:
@@ -17,8 +17,8 @@ fws:
   name: Candidates apply
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.candidates_apply
+    - _fw_name: PyTask
+      func: recruiting.candidates_apply
       inputs: [application template, maximum applications]
       outputs: [applicant profiles]
     application template:
@@ -36,8 +36,8 @@ fws:
   name: Screen candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.screen_candidates
+    - _fw_name: PyTask
+      func: recruiting.screen_candidates
       inputs: [job description, applicant profiles, minimum score, number to invite]
       outputs: [invited applicants]
     minimum score: 2
@@ -46,8 +46,8 @@ fws:
   name: Interview candidates
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: recruiting.interview_candidates
+    - _fw_name: PyTask
+      func: recruiting.interview_candidates
       inputs: [job description, invited applicants, number to fill]
       outputs: [selected applicants]
     number to fill: 2
diff --git a/exercises/solutions/4_wflow_append/image_swirl_montaged.json b/exercises/solutions/4_wflow_append/image_swirl_montaged.json
index 014d8df..a764f90 100644
--- a/exercises/solutions/4_wflow_append/image_swirl_montaged.json
+++ b/exercises/solutions/4_wflow_append/image_swirl_montaged.json
@@ -7,8 +7,8 @@
       "spec": {
         "_tasks": [
           {
-            "_fw_name": "PythonFunctionTask",
-            "function": "auxiliary.print_func",
+            "_fw_name": "PyTask",
+            "func": "auxiliary.print_func",
             "inputs": ["montaged image"],
             "outputs": ["montaged image"]
           }
diff --git a/exercises/solutions/4_wflow_append/image_swirl_montaged.yaml b/exercises/solutions/4_wflow_append/image_swirl_montaged.yaml
index 6a151c8..f32f822 100644
--- a/exercises/solutions/4_wflow_append/image_swirl_montaged.yaml
+++ b/exercises/solutions/4_wflow_append/image_swirl_montaged.yaml
@@ -3,8 +3,8 @@ fws:
   name: Pass filename
   spec:
     _tasks:
-    - _fw_name: PythonFunctionTask
-      function: auxiliary.print_func
+    - _fw_name: PyTask
+      func: auxiliary.print_func
       inputs: [montaged image]
       outputs: [montaged image]
 - fw_id: -1
-- 
GitLab