changeset 45:668c37cc8962 draft

trying to get a workflow to do something interesting
author fubar
date Sun, 16 Aug 2020 20:05:19 -0400
parents 23ad2924bf78
children f8700bed1e17
files TF_example_wf.ga toolfactory/.github/workflows/commit.yml toolfactory/.gitignore toolfactory/.shed.yml toolfactory/TF_example_wf.ga toolfactory/html_dir.py toolfactory/testtf.sh
diffstat 7 files changed, 850 insertions(+), 458 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TF_example_wf.ga	Sun Aug 16 20:05:19 2020 -0400
@@ -0,0 +1,458 @@
+{
+    "a_galaxy_workflow": "true",
+    "annotation": "",
+    "format-version": "0.1",
+    "name": "TF examples",
+    "steps": {
+        "0": {
+            "annotation": "a fasta file - gc ratio will be estimated",
+            "content_id": null,
+            "errors": null,
+            "id": 0,
+            "input_connections": {},
+            "inputs": [
+                {
+                    "description": "a fasta file - gc ratio will be estimated",
+                    "name": "phiX.fasta"
+                }
+            ],
+            "label": "phiX.fasta",
+            "name": "Input dataset",
+            "outputs": [],
+            "position": {
+                "bottom": 231,
+                "height": 61,
+                "left": 393,
+                "right": 593,
+                "top": 170,
+                "width": 200,
+                "x": 393,
+                "y": 170
+            },
+            "tool_id": null,
+            "tool_state": "{\"optional\": false}",
+            "tool_version": null,
+            "type": "data_input",
+            "uuid": "7e2e24c8-2327-4893-a5b3-6b696a6ecd33",
+            "workflow_outputs": [
+                {
+                    "label": null,
+                    "output_name": "output",
+                    "uuid": "f5ce2386-b80c-4691-a0a7-abeec8854461"
+                }
+            ]
+        },
+        "1": {
+            "annotation": "Any text file to be reversed lots of times and bjorked once.",
+            "content_id": null,
+            "errors": null,
+            "id": 1,
+            "input_connections": {},
+            "inputs": [
+                {
+                    "description": "Any text file to be reversed lots of times and bjorked once.",
+                    "name": "rgToolFactory2.py"
+                }
+            ],
+            "label": "rgToolFactory2.py",
+            "name": "Input dataset",
+            "outputs": [],
+            "position": {
+                "bottom": 371,
+                "height": 81,
+                "left": 393,
+                "right": 593,
+                "top": 290,
+                "width": 200,
+                "x": 393,
+                "y": 290
+            },
+            "tool_id": null,
+            "tool_state": "{\"optional\": false}",
+            "tool_version": null,
+            "type": "data_input",
+            "uuid": "f530b390-2424-4aae-8bd9-dd9d30277561",
+            "workflow_outputs": [
+                {
+                    "label": null,
+                    "output_name": "output",
+                    "uuid": "3d2a1699-50af-46e1-8981-dc6c3de2cf6c"
+                }
+            ]
+        },
+        "2": {
+            "annotation": "",
+            "content_id": "rgTF2",
+            "errors": null,
+            "id": 2,
+            "input_connections": {
+                "ppass|history_inputs_0|input_files": {
+                    "id": 0,
+                    "output_name": "output"
+                }
+            },
+            "inputs": [],
+            "label": null,
+            "name": "toolfactory",
+            "outputs": [
+                {
+                    "name": "TF_run_report",
+                    "type": "input"
+                },
+                {
+                    "name": "new_tool",
+                    "type": "tgz"
+                }
+            ],
+            "position": {
+                "bottom": 372,
+                "height": 202,
+                "left": 613,
+                "right": 813,
+                "top": 170,
+                "width": 200,
+                "x": 613,
+                "y": 170
+            },
+            "post_job_actions": {},
+            "tool_id": "rgTF2",
+            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"perl\", \"__current_case__\": 4, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"\\n# usage : perl toolExample.pl <FASTA file> <output file>\\n\\nopen (IN, \\\"<$ARGV[0]\\\");\\nopen (OUT, \\\">$ARGV[1]\\\");\\nwhile (<IN>) {\\n    chop;\\n    if (m/^>/) {\\n        s/^>//;\\n        if ($. > 1) {\\n            print OUT sprintf(\\\"%.3f\\\", $gc/$length) . \\\"\\\\n\\\";\\n        }\\n        $gc = 0;\\n        $length = 0;\\n    } else {\\n        ++$gc while m/[gc]/ig;\\n        $length += length $_;\\n    }\\n}\\nprint OUT sprintf(\\\"%.3f\\\", $gc/$length) . \\\"\\\\n\\\";\\nclose( IN );\\nclose( OUT );\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"perl version of gc counter from planemo example\", \"help_text\": \"**What it Does**\\ncounts gc using, ugh, perl...\\n\", \"citations\": []}, \"ppass\": {\"parampass\": \"positional\", \"__current_case__\": 1, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"fasta\"], \"input_label\": \"input fasta file\", \"input_help\": \"parameter_help\", \"input_CL\": \"1\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"output\", \"history_format\": \"tsv\", \"history_CL\": \"2\"}], \"edit_params\": \"no\", \"additional_parameters\": []}, \"tool_name\": \"perlgc\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
+            "tool_version": "2.00",
+            "type": "tool",
+            "uuid": "3b6aab01-4759-4df6-801f-626678639e51",
+            "workflow_outputs": [
+                {
+                    "label": null,
+                    "output_name": "TF_run_report",
+                    "uuid": "7aea56bd-4f39-4d3b-8254-a6675161d059"
+                },
+                {
+                    "label": null,
+                    "output_name": "new_tool",
+                    "uuid": "f964e779-2f92-4c81-9819-3e1ebc156664"
+                }
+            ]
+        },
+        "3": {
+            "annotation": "",
+            "content_id": "rgTF2",
+            "errors": null,
+            "id": 3,
+            "input_connections": {
+                "ppass|history_inputs_0|input_files": {
+                    "id": 1,
+                    "output_name": "output"
+                }
+            },
+            "inputs": [],
+            "label": null,
+            "name": "toolfactory",
+            "outputs": [
+                {
+                    "name": "TF_run_report",
+                    "type": "input"
+                },
+                {
+                    "name": "new_tool",
+                    "type": "tgz"
+                }
+            ],
+            "position": {
+                "bottom": 492,
+                "height": 202,
+                "left": 613,
+                "right": 813,
+                "top": 290,
+                "width": 200,
+                "x": 613,
+                "y": 290
+            },
+            "post_job_actions": {},
+            "tool_id": "rgTF2",
+            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"system\", \"__current_case__\": 1, \"exe_package\": \"sed\", \"exe_package_version\": \"\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"sed runner\", \"help_text\": \"sed '/old/new/g input.txt\", \"citations\": []}, \"ppass\": {\"parampass\": \"positional\", \"__current_case__\": 1, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"input text\", \"input_help\": \"parameter_help\", \"input_CL\": \"3\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"output\", \"history_format\": \"txt\", \"history_CL\": \"STDOUT\"}], \"edit_params\": \"yes\", \"additional_parameters\": [{\"__index__\": 0, \"param_name\": \"sedstring\", \"param_type\": \"text\", \"param_value\": \"s/def/bjork!bjorkdef/g\", \"param_label\": \"parameter_label\", \"param_help\": \"parameter_help\", \"param_CL\": \"1\", \"param_CLprefixed\": \"\"}]}, \"tool_name\": \"sedtest\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
+            "tool_version": "2.00",
+            "type": "tool",
+            "uuid": "2138c717-5128-4c4b-bc22-4809cd001c34",
+            "workflow_outputs": [
+                {
+                    "label": null,
+                    "output_name": "TF_run_report",
+                    "uuid": "b0be8c95-7380-42b8-a16d-8e08578d4dd7"
+                },
+                {
+                    "label": null,
+                    "output_name": "new_tool",
+                    "uuid": "56635519-a9a0-49eb-8305-59cc1fcef99f"
+                }
+            ]
+        },
+        "4": {
+            "annotation": "",
+            "content_id": "rgTF2",
+            "errors": null,
+            "id": 4,
+            "input_connections": {
+                "ppass|history_inputs_0|input_files": {
+                    "id": 1,
+                    "output_name": "output"
+                }
+            },
+            "inputs": [],
+            "label": null,
+            "name": "toolfactory",
+            "outputs": [
+                {
+                    "name": "TF_run_report",
+                    "type": "input"
+                },
+                {
+                    "name": "new_tool",
+                    "type": "tgz"
+                }
+            ],
+            "position": {
+                "bottom": 652,
+                "height": 242,
+                "left": 613,
+                "right": 813,
+                "top": 410,
+                "width": 200,
+                "x": 613,
+                "y": 410
+            },
+            "post_job_actions": {},
+            "tool_id": "rgTF2",
+            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"python\", \"__current_case__\": 2, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"# reverse order of text by row\\nimport sys\\ninp = sys.argv[1]\\noutp = sys.argv[2]\\nappendme = sys.argv[3]\\ni = open(inp,'r').readlines()\\no = open(outp,'w')\\nfor row in i:\\n  rs = row.rstrip()\\n  rs = list(rs)\\n  rs.reverse()\\n  o.write(''.join(rs))\\n  o.write(appendme)\\n  o.write('\\\\n')\\no.close()\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"pyrevpos\", \"help_text\": \"**What it Does**\", \"citations\": []}, \"ppass\": {\"parampass\": \"positional\", \"__current_case__\": 1, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"inputfile\", \"input_help\": \"parameter_help\", \"input_CL\": \"1\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"output\", \"history_format\": \"txt\", \"history_CL\": \"2\"}], \"edit_params\": \"yes\", \"additional_parameters\": [{\"__index__\": 0, \"param_name\": \"appendme\", \"param_type\": \"text\", \"param_value\": \"added at the end\", \"param_label\": \"append string\", \"param_help\": \"parameter_help\", \"param_CL\": \"3\", \"param_CLprefixed\": \"\"}]}, \"tool_name\": \"pyrevaddpos\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
+            "tool_version": "2.00",
+            "type": "tool",
+            "uuid": "30dbe033-30c4-4228-b0cb-854df30f5594",
+            "workflow_outputs": [
+                {
+                    "label": null,
+                    "output_name": "TF_run_report",
+                    "uuid": "37fdd905-471d-4479-a98a-4dfbaa6314be"
+                },
+                {
+                    "label": null,
+                    "output_name": "new_tool",
+                    "uuid": "7c8a8dba-1e8c-49d5-b51d-a0ab09931932"
+                }
+            ]
+        },
+        "5": {
+            "annotation": "",
+            "content_id": "rgTF2",
+            "errors": null,
+            "id": 5,
+            "input_connections": {
+                "ppass|history_inputs_0|input_files": {
+                    "id": 1,
+                    "output_name": "output"
+                }
+            },
+            "inputs": [],
+            "label": null,
+            "name": "toolfactory",
+            "outputs": [
+                {
+                    "name": "TF_run_report",
+                    "type": "input"
+                },
+                {
+                    "name": "new_tool",
+                    "type": "tgz"
+                }
+            ],
+            "position": {
+                "bottom": 772,
+                "height": 242,
+                "left": 613,
+                "right": 813,
+                "top": 530,
+                "width": 200,
+                "x": 613,
+                "y": 530
+            },
+            "post_job_actions": {},
+            "tool_id": "rgTF2",
+            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"python\", \"__current_case__\": 2, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"# reverse order of text by row\\nimport sys\\nimport argparse\\nparser = argparse.ArgumentParser()\\na = parser.add_argument\\na('--infile',default='')\\na('--outfile',default=None)\\nargs = parser.parse_args()\\ninp = args.infile\\noutp = args.outfile\\ni = open(inp,'r').readlines()\\no = open(outp,'w')\\nfor row in i:\\n  rs = row.rstrip()\\n  rs = list(rs)\\n  rs.reverse()\\n  o.write(''.join(rs))\\n  o.write('\\\\n')\\no.close()\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"reverse argparse\", \"help_text\": \"**What it Does**\", \"citations\": []}, \"ppass\": {\"parampass\": \"argparse\", \"__current_case__\": 0, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"infile\", \"input_help\": \"parameter_help\", \"input_CL\": \"infile\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"outfile\", \"history_format\": \"txt\", \"history_CL\": \"outfile\"}], \"edit_params\": \"yes\", \"additional_parameters\": []}, \"tool_name\": \"pyrevargparse\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
+            "tool_version": "2.00",
+            "type": "tool",
+            "uuid": "91a0dccf-384c-491a-ae08-f426888d26cf",
+            "workflow_outputs": [
+                {
+                    "label": null,
+                    "output_name": "TF_run_report",
+                    "uuid": "61a5271d-3940-4855-9093-a0710dc3fe08"
+                },
+                {
+                    "label": null,
+                    "output_name": "new_tool",
+                    "uuid": "a6602e23-dc1c-44b7-8ed7-cd9971ff9d30"
+                }
+            ]
+        },
+        "6": {
+            "annotation": "",
+            "content_id": "rgTF2",
+            "errors": null,
+            "id": 6,
+            "input_connections": {
+                "ppass|history_inputs_0|input_files": {
+                    "id": 1,
+                    "output_name": "output"
+                }
+            },
+            "inputs": [],
+            "label": null,
+            "name": "toolfactory",
+            "outputs": [
+                {
+                    "name": "TF_run_report",
+                    "type": "input"
+                },
+                {
+                    "name": "new_tool",
+                    "type": "tgz"
+                }
+            ],
+            "position": {
+                "bottom": 852,
+                "height": 202,
+                "left": 613,
+                "right": 813,
+                "top": 650,
+                "width": 200,
+                "x": 613,
+                "y": 650
+            },
+            "post_job_actions": {},
+            "tool_id": "rgTF2",
+            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"bash\", \"__current_case__\": 5, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"rev | tac\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"tacrev\", \"help_text\": \"**What it Does**\", \"citations\": []}, \"ppass\": {\"parampass\": \"0\", \"__current_case__\": 2, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"input file\", \"input_help\": \"parameter_help\", \"input_CL\": \"1\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"outfile\", \"history_format\": \"txt\", \"history_CL\": \"2\"}]}, \"tool_name\": \"tacrev\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
+            "tool_version": "2.00",
+            "type": "tool",
+            "uuid": "edb5d852-908b-45bf-8892-e0e8c337c31d",
+            "workflow_outputs": [
+                {
+                    "label": null,
+                    "output_name": "TF_run_report",
+                    "uuid": "c1394cf9-bb03-4ac3-8466-8ee0cc30c0a0"
+                },
+                {
+                    "label": null,
+                    "output_name": "new_tool",
+                    "uuid": "e45566f4-d40e-4ad0-ad27-72ce814b13da"
+                }
+            ]
+        },
+        "7": {
+            "annotation": "",
+            "content_id": "rgTF2",
+            "errors": null,
+            "id": 7,
+            "input_connections": {
+                "ppass|history_inputs_0|input_files": {
+                    "id": 1,
+                    "output_name": "output"
+                }
+            },
+            "inputs": [],
+            "label": null,
+            "name": "toolfactory",
+            "outputs": [
+                {
+                    "name": "TF_run_report",
+                    "type": "input"
+                },
+                {
+                    "name": "new_tool",
+                    "type": "tgz"
+                }
+            ],
+            "position": {
+                "bottom": 992,
+                "height": 222,
+                "left": 613,
+                "right": 813,
+                "top": 770,
+                "width": 200,
+                "x": 613,
+                "y": 770
+            },
+            "post_job_actions": {},
+            "tool_id": "rgTF2",
+            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"python\", \"__current_case__\": 2, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"# reverse order of text by row\\nimport sys\\ninp = sys.argv[1]\\noutp = sys.argv[2]\\ni = open(inp,'r').readlines()\\no = open(outp,'w')\\nfor row in i:\\n  rs = row.rstrip()\\n  rs = list(rs)\\n  rs.reverse()\\n  o.write(''.join(rs))\\n  o.write('\\\\n')\\no.close()\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"pyrevpos\", \"help_text\": \"**What it Does**\", \"citations\": []}, \"ppass\": {\"parampass\": \"positional\", \"__current_case__\": 1, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"inputfile\", \"input_help\": \"parameter_help\", \"input_CL\": \"1\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"output\", \"history_format\": \"txt\", \"history_CL\": \"2\"}], \"edit_params\": \"yes\", \"additional_parameters\": []}, \"tool_name\": \"pyrevpos\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
+            "tool_version": "2.00",
+            "type": "tool",
+            "uuid": "08a48555-8700-4652-a76b-df1f54197049",
+            "workflow_outputs": [
+                {
+                    "label": null,
+                    "output_name": "TF_run_report",
+                    "uuid": "b5bd73bb-1ddc-4161-be2e-370bab9aebbe"
+                },
+                {
+                    "label": null,
+                    "output_name": "new_tool",
+                    "uuid": "e96ae086-a92a-4018-8f07-ebf4974807e6"
+                }
+            ]
+        },
+        "8": {
+            "annotation": "",
+            "content_id": "rgTF2",
+            "errors": null,
+            "id": 8,
+            "input_connections": {
+                "ppass|history_inputs_0|input_files": {
+                    "id": 7,
+                    "output_name": "new_tool"
+                }
+            },
+            "inputs": [],
+            "label": null,
+            "name": "toolfactory",
+            "outputs": [
+                {
+                    "name": "TF_run_report",
+                    "type": "input"
+                },
+                {
+                    "name": "new_tool",
+                    "type": "tgz"
+                }
+            ],
+            "position": {
+                "bottom": 412,
+                "height": 242,
+                "left": 833,
+                "right": 1033,
+                "top": 170,
+                "width": 200,
+                "x": 833,
+                "y": 170
+            },
+            "post_job_actions": {},
+            "tool_id": "rgTF2",
+            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"python\", \"__current_case__\": 2, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"import argparse\\nimport tarfile\\nimport os\\nimport tempfile\\nimport subprocess\\n\\n\\\"\\\"\\\"\\nplanemo test --no_cleanup --no_dependency_resolution --skip_venv --galaxy_root ~/galaxy ~/galaxy/tools/tool_makers/pyrevargparse/ &> pyrevargparse\\n\\\"\\\"\\\"\\n\\nparser = argparse.ArgumentParser()\\na = parser.add_argument\\na('--tooltgz',default='')\\na('--report',default=None)\\na('--toolout',default=None)\\na('--galaxy_root',default=None)\\nargs = parser.parse_args()\\ntoolname = args.toolout.split(os.sep)[-1]\\ntoolpath = os.path.join(args.galaxy_root,args.toolout)\\ntf = tarfile.open(args.tooltgz,\\\"r:gz\\\")\\ntf.extractall(toolpath)\\ncl = \\\"planemo test --skip_venv --galaxy_root %s %s\\\" % (args.galaxy_root,toolpath)\\ncll = cl.split(' ')\\nsto = open(args.report, 'w')\\np = subprocess.run(cll, shell=False, stdout=sto)\\nretval = p.returncode\\nsto.close()\\n\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"Tool to test toolshed tool archives generated by the tool factory.\", \"help_text\": \"**What it Does**\\n\\nGiven a toolshed tgz file generated by a tool factory run, this will unpack it and run planemo test, returning the planemo stdout as a report\\nIt was generated using the tool factory.\", \"citations\": []}, \"ppass\": {\"parampass\": \"argparse\", \"__current_case__\": 0, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"tgz\"], \"input_label\": \"tool toolshed tgz archive from history\", \"input_help\": \"Run planemo test on a tool shed tool archive tgz format file generated by the ToolFactory or Planemo\", \"input_CL\": \"tooltgz\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"report\", \"history_format\": \"txt\", \"history_CL\": \"report\"}], \"edit_params\": \"yes\", \"additional_parameters\": [{\"__index__\": 0, \"param_name\": \"toolout\", \"param_type\": \"text\", \"param_value\": \"tools/toolmakers/planemotest\", \"param_label\": \"output path under galaxy root\", \"param_help\": \"This is where the tgz file will be extracted and tested by planemo\", \"param_CL\": \"toolout\", \"param_CLprefixed\": \"\"}, {\"__index__\": 1, \"param_name\": \"galaxy_root\", \"param_type\": \"text\", \"param_value\": \"/home/ross/galaxy\", \"param_label\": \"Galaxy source root directory to use for running planemo\", \"param_help\": \"This will form the galaxy_root parameter for rnning planemo using an existing Galaxy source tree, and the tgz will be extracted at a path relative to that rootu\", \"param_CL\": \"galaxy_root\", \"param_CLprefixed\": \"\"}]}, \"tool_name\": \"planemotest\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
+            "tool_version": "2.00",
+            "type": "tool",
+            "uuid": "b9bfb1a4-4c0c-4d39-9e74-223da72f8abc",
+            "workflow_outputs": [
+                {
+                    "label": null,
+                    "output_name": "TF_run_report",
+                    "uuid": "09ba44ea-4da8-46f5-a411-ca054ccedd3b"
+                },
+                {
+                    "label": null,
+                    "output_name": "new_tool",
+                    "uuid": "50a8ff4a-702a-4983-8202-8a79c0a3c978"
+                }
+            ]
+        }
+    },
+    "tags": [],
+    "uuid": "321a7f9f-c287-453c-807a-43afd948770e",
+    "version": 1
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/.github/workflows/commit.yml	Sun Aug 16 20:05:19 2020 -0400
@@ -0,0 +1,68 @@
+name: Galaxy Tool Linting and Tests for PR
+# run planemo on a git repository containing a single tool
+# as a github action. Does NOT run flake8. So, bite me.
+# ross lazarus august 2020
+on: [pull_request,push]
+env:
+  GALAXY_REPO: https://github.com/galaxyproject/galaxy
+  GALAXY_RELEASE: release_20.05
+jobs:
+  setup:
+    name: setup environment and python
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python-version: [3.7]
+    steps:
+    - name: Print github context properties
+      run: |
+        echo 'event: ${{ github.event_name }}'
+        echo 'sha: ${{ github.sha }}'
+        echo 'ref: ${{ github.ref }}'
+        echo 'head_ref: ${{ github.head_ref }}'
+        echo 'base_ref: ${{ github.base_ref }}'
+        echo 'event.before: ${{ github.event.before }}'
+        echo 'event.after: ${{ github.event.after }}'
+    - uses: actions/setup-python@v1
+      with:
+        python-version: ${{ matrix.python-version }}
+    - uses: actions/checkout@v2
+      with:
+    # planemo does not seem to want to install the requirement galaxyxml 
+    # into the venv it manages at tool testing so do it the old skool way
+        repository: 'galaxyproject/galaxy'
+        path: 'galaxy'
+    - name: make venv ready for this galaxy and planemo 
+      run:  |
+        python3 -m venv $GITHUB_WORKSPACE/galaxy/.venv
+        . $GITHUB_WORKSPACE/galaxy/.venv/bin/activate
+        pip install --upgrade pip
+        pip install wheel
+        pip install -r $GITHUB_WORKSPACE/galaxy/requirements.txt
+        # pip install galaxyxml # currently includes a patched working version awaiting PR merge
+    - name: Upgrade pip
+      run: pip install --upgrade pip
+    # Install the `wheel` package so that when installing other packages which
+    # are not available as wheels, pip will build a wheel for them, which can be cached.
+    - name: Install wheel
+      run: pip install wheel
+    - name: Install Planemo and flake8
+      run: pip install planemo flake8 flake8-import-order
+    # galaxyxml temporarily removed until PR accepted
+    - uses: actions/checkout@v2
+      with:
+        fetch-depth: 1
+    - name: flake8
+      run: flake8 --ignore=E2,E3,E4,E5,W3,W505
+    - name: Planemo lint
+      run: planemo lint .
+    - name: Planemo test tool
+      run: planemo test --galaxy_root $GITHUB_WORKSPACE/galaxy --test_output tool_test_output.html --skip_venv --test_output_json tool_test_output.json --galaxy_python_version ${{ matrix.python-version }}  .
+    - name: Copy artifacts into place
+      run: |
+        mkdir upload
+        mv tool_test_output.json tool_test_output.html upload/
+    - uses: actions/upload-artifact@v2.0.1
+      with:
+        name: 'All tool test results'
+        path: upload
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/.gitignore	Sun Aug 16 20:05:19 2020 -0400
@@ -0,0 +1,129 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/.shed.yml	Sun Aug 16 20:05:19 2020 -0400
@@ -0,0 +1,13 @@
+name: toolfactory
+owner: fubar
+description: ToolFactory - tool to make Galaxy tools ready for the toolshed
+homepage_url: https://github.com/fubar2/toolfactory
+long_description: |
+    ToolFactory - turn executable packages and R/python/perl/bash scripts into ordinary Galaxy tools
+
+    Creating re-usable tools from scripts: The Galaxy Tool Factory Ross Lazarus; Antony Kaspi; Mark Ziemann; The Galaxy Team 
+    Bioinformatics 2012; doi: 10.1093/bioinformatics/bts573
+remote_repository_url: https://github.com/fubar2/toolfactory
+type: tool_dependency_definition
+categories:
+- Tool Generators
--- a/toolfactory/TF_example_wf.ga	Sun Aug 16 08:51:49 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,458 +0,0 @@
-{
-    "a_galaxy_workflow": "true",
-    "annotation": "",
-    "format-version": "0.1",
-    "name": "TF examples",
-    "steps": {
-        "0": {
-            "annotation": "a fasta file - gc ratio will be estimated",
-            "content_id": null,
-            "errors": null,
-            "id": 0,
-            "input_connections": {},
-            "inputs": [
-                {
-                    "description": "a fasta file - gc ratio will be estimated",
-                    "name": "phiX.fasta"
-                }
-            ],
-            "label": "phiX.fasta",
-            "name": "Input dataset",
-            "outputs": [],
-            "position": {
-                "bottom": 231,
-                "height": 61,
-                "left": 393,
-                "right": 593,
-                "top": 170,
-                "width": 200,
-                "x": 393,
-                "y": 170
-            },
-            "tool_id": null,
-            "tool_state": "{\"optional\": false}",
-            "tool_version": null,
-            "type": "data_input",
-            "uuid": "7e2e24c8-2327-4893-a5b3-6b696a6ecd33",
-            "workflow_outputs": [
-                {
-                    "label": null,
-                    "output_name": "output",
-                    "uuid": "f5ce2386-b80c-4691-a0a7-abeec8854461"
-                }
-            ]
-        },
-        "1": {
-            "annotation": "Any text file to be reversed lots of times and bjorked once.",
-            "content_id": null,
-            "errors": null,
-            "id": 1,
-            "input_connections": {},
-            "inputs": [
-                {
-                    "description": "Any text file to be reversed lots of times and bjorked once.",
-                    "name": "rgToolFactory2.py"
-                }
-            ],
-            "label": "rgToolFactory2.py",
-            "name": "Input dataset",
-            "outputs": [],
-            "position": {
-                "bottom": 371,
-                "height": 81,
-                "left": 393,
-                "right": 593,
-                "top": 290,
-                "width": 200,
-                "x": 393,
-                "y": 290
-            },
-            "tool_id": null,
-            "tool_state": "{\"optional\": false}",
-            "tool_version": null,
-            "type": "data_input",
-            "uuid": "f530b390-2424-4aae-8bd9-dd9d30277561",
-            "workflow_outputs": [
-                {
-                    "label": null,
-                    "output_name": "output",
-                    "uuid": "3d2a1699-50af-46e1-8981-dc6c3de2cf6c"
-                }
-            ]
-        },
-        "2": {
-            "annotation": "",
-            "content_id": "rgTF2",
-            "errors": null,
-            "id": 2,
-            "input_connections": {
-                "ppass|history_inputs_0|input_files": {
-                    "id": 0,
-                    "output_name": "output"
-                }
-            },
-            "inputs": [],
-            "label": null,
-            "name": "toolfactory",
-            "outputs": [
-                {
-                    "name": "TF_run_report",
-                    "type": "input"
-                },
-                {
-                    "name": "new_tool",
-                    "type": "tgz"
-                }
-            ],
-            "position": {
-                "bottom": 372,
-                "height": 202,
-                "left": 613,
-                "right": 813,
-                "top": 170,
-                "width": 200,
-                "x": 613,
-                "y": 170
-            },
-            "post_job_actions": {},
-            "tool_id": "rgTF2",
-            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"perl\", \"__current_case__\": 4, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"\\n# usage : perl toolExample.pl <FASTA file> <output file>\\n\\nopen (IN, \\\"<$ARGV[0]\\\");\\nopen (OUT, \\\">$ARGV[1]\\\");\\nwhile (<IN>) {\\n    chop;\\n    if (m/^>/) {\\n        s/^>//;\\n        if ($. > 1) {\\n            print OUT sprintf(\\\"%.3f\\\", $gc/$length) . \\\"\\\\n\\\";\\n        }\\n        $gc = 0;\\n        $length = 0;\\n    } else {\\n        ++$gc while m/[gc]/ig;\\n        $length += length $_;\\n    }\\n}\\nprint OUT sprintf(\\\"%.3f\\\", $gc/$length) . \\\"\\\\n\\\";\\nclose( IN );\\nclose( OUT );\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"perl version of gc counter from planemo example\", \"help_text\": \"**What it Does**\\ncounts gc using, ugh, perl...\\n\", \"citations\": []}, \"ppass\": {\"parampass\": \"positional\", \"__current_case__\": 1, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"fasta\"], \"input_label\": \"input fasta file\", \"input_help\": \"parameter_help\", \"input_CL\": \"1\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"output\", \"history_format\": \"tsv\", \"history_CL\": \"2\"}], \"edit_params\": \"no\", \"additional_parameters\": []}, \"tool_name\": \"perlgc\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
-            "tool_version": "2.00",
-            "type": "tool",
-            "uuid": "3b6aab01-4759-4df6-801f-626678639e51",
-            "workflow_outputs": [
-                {
-                    "label": null,
-                    "output_name": "TF_run_report",
-                    "uuid": "7aea56bd-4f39-4d3b-8254-a6675161d059"
-                },
-                {
-                    "label": null,
-                    "output_name": "new_tool",
-                    "uuid": "f964e779-2f92-4c81-9819-3e1ebc156664"
-                }
-            ]
-        },
-        "3": {
-            "annotation": "",
-            "content_id": "rgTF2",
-            "errors": null,
-            "id": 3,
-            "input_connections": {
-                "ppass|history_inputs_0|input_files": {
-                    "id": 1,
-                    "output_name": "output"
-                }
-            },
-            "inputs": [],
-            "label": null,
-            "name": "toolfactory",
-            "outputs": [
-                {
-                    "name": "TF_run_report",
-                    "type": "input"
-                },
-                {
-                    "name": "new_tool",
-                    "type": "tgz"
-                }
-            ],
-            "position": {
-                "bottom": 492,
-                "height": 202,
-                "left": 613,
-                "right": 813,
-                "top": 290,
-                "width": 200,
-                "x": 613,
-                "y": 290
-            },
-            "post_job_actions": {},
-            "tool_id": "rgTF2",
-            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"system\", \"__current_case__\": 1, \"exe_package\": \"sed\", \"exe_package_version\": \"\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"sed runner\", \"help_text\": \"sed '/old/new/g input.txt\", \"citations\": []}, \"ppass\": {\"parampass\": \"positional\", \"__current_case__\": 1, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"input text\", \"input_help\": \"parameter_help\", \"input_CL\": \"3\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"output\", \"history_format\": \"txt\", \"history_CL\": \"STDOUT\"}], \"edit_params\": \"yes\", \"additional_parameters\": [{\"__index__\": 0, \"param_name\": \"sedstring\", \"param_type\": \"text\", \"param_value\": \"s/def/bjork!bjorkdef/g\", \"param_label\": \"parameter_label\", \"param_help\": \"parameter_help\", \"param_CL\": \"1\", \"param_CLprefixed\": \"\"}]}, \"tool_name\": \"sedtest\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
-            "tool_version": "2.00",
-            "type": "tool",
-            "uuid": "2138c717-5128-4c4b-bc22-4809cd001c34",
-            "workflow_outputs": [
-                {
-                    "label": null,
-                    "output_name": "TF_run_report",
-                    "uuid": "b0be8c95-7380-42b8-a16d-8e08578d4dd7"
-                },
-                {
-                    "label": null,
-                    "output_name": "new_tool",
-                    "uuid": "56635519-a9a0-49eb-8305-59cc1fcef99f"
-                }
-            ]
-        },
-        "4": {
-            "annotation": "",
-            "content_id": "rgTF2",
-            "errors": null,
-            "id": 4,
-            "input_connections": {
-                "ppass|history_inputs_0|input_files": {
-                    "id": 1,
-                    "output_name": "output"
-                }
-            },
-            "inputs": [],
-            "label": null,
-            "name": "toolfactory",
-            "outputs": [
-                {
-                    "name": "TF_run_report",
-                    "type": "input"
-                },
-                {
-                    "name": "new_tool",
-                    "type": "tgz"
-                }
-            ],
-            "position": {
-                "bottom": 652,
-                "height": 242,
-                "left": 613,
-                "right": 813,
-                "top": 410,
-                "width": 200,
-                "x": 613,
-                "y": 410
-            },
-            "post_job_actions": {},
-            "tool_id": "rgTF2",
-            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"python\", \"__current_case__\": 2, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"# reverse order of text by row\\nimport sys\\ninp = sys.argv[1]\\noutp = sys.argv[2]\\nappendme = sys.argv[3]\\ni = open(inp,'r').readlines()\\no = open(outp,'w')\\nfor row in i:\\n  rs = row.rstrip()\\n  rs = list(rs)\\n  rs.reverse()\\n  o.write(''.join(rs))\\n  o.write(appendme)\\n  o.write('\\\\n')\\no.close()\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"pyrevpos\", \"help_text\": \"**What it Does**\", \"citations\": []}, \"ppass\": {\"parampass\": \"positional\", \"__current_case__\": 1, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"inputfile\", \"input_help\": \"parameter_help\", \"input_CL\": \"1\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"output\", \"history_format\": \"txt\", \"history_CL\": \"2\"}], \"edit_params\": \"yes\", \"additional_parameters\": [{\"__index__\": 0, \"param_name\": \"appendme\", \"param_type\": \"text\", \"param_value\": \"added at the end\", \"param_label\": \"append string\", \"param_help\": \"parameter_help\", \"param_CL\": \"3\", \"param_CLprefixed\": \"\"}]}, \"tool_name\": \"pyrevaddpos\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
-            "tool_version": "2.00",
-            "type": "tool",
-            "uuid": "30dbe033-30c4-4228-b0cb-854df30f5594",
-            "workflow_outputs": [
-                {
-                    "label": null,
-                    "output_name": "TF_run_report",
-                    "uuid": "37fdd905-471d-4479-a98a-4dfbaa6314be"
-                },
-                {
-                    "label": null,
-                    "output_name": "new_tool",
-                    "uuid": "7c8a8dba-1e8c-49d5-b51d-a0ab09931932"
-                }
-            ]
-        },
-        "5": {
-            "annotation": "",
-            "content_id": "rgTF2",
-            "errors": null,
-            "id": 5,
-            "input_connections": {
-                "ppass|history_inputs_0|input_files": {
-                    "id": 1,
-                    "output_name": "output"
-                }
-            },
-            "inputs": [],
-            "label": null,
-            "name": "toolfactory",
-            "outputs": [
-                {
-                    "name": "TF_run_report",
-                    "type": "input"
-                },
-                {
-                    "name": "new_tool",
-                    "type": "tgz"
-                }
-            ],
-            "position": {
-                "bottom": 772,
-                "height": 242,
-                "left": 613,
-                "right": 813,
-                "top": 530,
-                "width": 200,
-                "x": 613,
-                "y": 530
-            },
-            "post_job_actions": {},
-            "tool_id": "rgTF2",
-            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"python\", \"__current_case__\": 2, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"# reverse order of text by row\\nimport sys\\nimport argparse\\nparser = argparse.ArgumentParser()\\na = parser.add_argument\\na('--infile',default='')\\na('--outfile',default=None)\\nargs = parser.parse_args()\\ninp = args.infile\\noutp = args.outfile\\ni = open(inp,'r').readlines()\\no = open(outp,'w')\\nfor row in i:\\n  rs = row.rstrip()\\n  rs = list(rs)\\n  rs.reverse()\\n  o.write(''.join(rs))\\n  o.write('\\\\n')\\no.close()\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"reverse argparse\", \"help_text\": \"**What it Does**\", \"citations\": []}, \"ppass\": {\"parampass\": \"argparse\", \"__current_case__\": 0, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"infile\", \"input_help\": \"parameter_help\", \"input_CL\": \"infile\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"outfile\", \"history_format\": \"txt\", \"history_CL\": \"outfile\"}], \"edit_params\": \"yes\", \"additional_parameters\": []}, \"tool_name\": \"pyrevargparse\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
-            "tool_version": "2.00",
-            "type": "tool",
-            "uuid": "91a0dccf-384c-491a-ae08-f426888d26cf",
-            "workflow_outputs": [
-                {
-                    "label": null,
-                    "output_name": "TF_run_report",
-                    "uuid": "61a5271d-3940-4855-9093-a0710dc3fe08"
-                },
-                {
-                    "label": null,
-                    "output_name": "new_tool",
-                    "uuid": "a6602e23-dc1c-44b7-8ed7-cd9971ff9d30"
-                }
-            ]
-        },
-        "6": {
-            "annotation": "",
-            "content_id": "rgTF2",
-            "errors": null,
-            "id": 6,
-            "input_connections": {
-                "ppass|history_inputs_0|input_files": {
-                    "id": 1,
-                    "output_name": "output"
-                }
-            },
-            "inputs": [],
-            "label": null,
-            "name": "toolfactory",
-            "outputs": [
-                {
-                    "name": "TF_run_report",
-                    "type": "input"
-                },
-                {
-                    "name": "new_tool",
-                    "type": "tgz"
-                }
-            ],
-            "position": {
-                "bottom": 852,
-                "height": 202,
-                "left": 613,
-                "right": 813,
-                "top": 650,
-                "width": 200,
-                "x": 613,
-                "y": 650
-            },
-            "post_job_actions": {},
-            "tool_id": "rgTF2",
-            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"bash\", \"__current_case__\": 5, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"rev | tac\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"tacrev\", \"help_text\": \"**What it Does**\", \"citations\": []}, \"ppass\": {\"parampass\": \"0\", \"__current_case__\": 2, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"input file\", \"input_help\": \"parameter_help\", \"input_CL\": \"1\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"outfile\", \"history_format\": \"txt\", \"history_CL\": \"2\"}]}, \"tool_name\": \"tacrev\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
-            "tool_version": "2.00",
-            "type": "tool",
-            "uuid": "edb5d852-908b-45bf-8892-e0e8c337c31d",
-            "workflow_outputs": [
-                {
-                    "label": null,
-                    "output_name": "TF_run_report",
-                    "uuid": "c1394cf9-bb03-4ac3-8466-8ee0cc30c0a0"
-                },
-                {
-                    "label": null,
-                    "output_name": "new_tool",
-                    "uuid": "e45566f4-d40e-4ad0-ad27-72ce814b13da"
-                }
-            ]
-        },
-        "7": {
-            "annotation": "",
-            "content_id": "rgTF2",
-            "errors": null,
-            "id": 7,
-            "input_connections": {
-                "ppass|history_inputs_0|input_files": {
-                    "id": 1,
-                    "output_name": "output"
-                }
-            },
-            "inputs": [],
-            "label": null,
-            "name": "toolfactory",
-            "outputs": [
-                {
-                    "name": "TF_run_report",
-                    "type": "input"
-                },
-                {
-                    "name": "new_tool",
-                    "type": "tgz"
-                }
-            ],
-            "position": {
-                "bottom": 992,
-                "height": 222,
-                "left": 613,
-                "right": 813,
-                "top": 770,
-                "width": 200,
-                "x": 613,
-                "y": 770
-            },
-            "post_job_actions": {},
-            "tool_id": "rgTF2",
-            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"python\", \"__current_case__\": 2, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"# reverse order of text by row\\nimport sys\\ninp = sys.argv[1]\\noutp = sys.argv[2]\\ni = open(inp,'r').readlines()\\no = open(outp,'w')\\nfor row in i:\\n  rs = row.rstrip()\\n  rs = list(rs)\\n  rs.reverse()\\n  o.write(''.join(rs))\\n  o.write('\\\\n')\\no.close()\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"pyrevpos\", \"help_text\": \"**What it Does**\", \"citations\": []}, \"ppass\": {\"parampass\": \"positional\", \"__current_case__\": 1, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"txt\"], \"input_label\": \"inputfile\", \"input_help\": \"parameter_help\", \"input_CL\": \"1\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"output\", \"history_format\": \"txt\", \"history_CL\": \"2\"}], \"edit_params\": \"yes\", \"additional_parameters\": []}, \"tool_name\": \"pyrevpos\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
-            "tool_version": "2.00",
-            "type": "tool",
-            "uuid": "08a48555-8700-4652-a76b-df1f54197049",
-            "workflow_outputs": [
-                {
-                    "label": null,
-                    "output_name": "TF_run_report",
-                    "uuid": "b5bd73bb-1ddc-4161-be2e-370bab9aebbe"
-                },
-                {
-                    "label": null,
-                    "output_name": "new_tool",
-                    "uuid": "e96ae086-a92a-4018-8f07-ebf4974807e6"
-                }
-            ]
-        },
-        "8": {
-            "annotation": "",
-            "content_id": "rgTF2",
-            "errors": null,
-            "id": 8,
-            "input_connections": {
-                "ppass|history_inputs_0|input_files": {
-                    "id": 7,
-                    "output_name": "new_tool"
-                }
-            },
-            "inputs": [],
-            "label": null,
-            "name": "toolfactory",
-            "outputs": [
-                {
-                    "name": "TF_run_report",
-                    "type": "input"
-                },
-                {
-                    "name": "new_tool",
-                    "type": "tgz"
-                }
-            ],
-            "position": {
-                "bottom": 412,
-                "height": 242,
-                "left": 833,
-                "right": 1033,
-                "top": 170,
-                "width": 200,
-                "x": 833,
-                "y": 170
-            },
-            "post_job_actions": {},
-            "tool_id": "rgTF2",
-            "tool_state": "{\"__input_ext\": \"input\", \"chromInfo\": \"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\", \"interexe\": {\"interpreter\": \"python\", \"__current_case__\": 2, \"interpreter_version\": \"\", \"exe_package_version\": \"\", \"dynScript\": \"import argparse\\nimport tarfile\\nimport os\\nimport tempfile\\nimport subprocess\\n\\n\\\"\\\"\\\"\\nplanemo test --no_cleanup --no_dependency_resolution --skip_venv --galaxy_root ~/galaxy ~/galaxy/tools/tool_makers/pyrevargparse/ &> pyrevargparse\\n\\\"\\\"\\\"\\n\\nparser = argparse.ArgumentParser()\\na = parser.add_argument\\na('--tooltgz',default='')\\na('--report',default=None)\\na('--toolout',default=None)\\na('--galaxy_root',default=None)\\nargs = parser.parse_args()\\ntoolname = args.toolout.split(os.sep)[-1]\\ntoolpath = os.path.join(args.galaxy_root,args.toolout)\\ntf = tarfile.open(args.tooltgz,\\\"r:gz\\\")\\ntf.extractall(toolpath)\\ncl = \\\"planemo test --skip_venv --galaxy_root %s %s\\\" % (args.galaxy_root,toolpath)\\ncll = cl.split(' ')\\nsto = open(args.report, 'w')\\np = subprocess.run(cll, shell=False, stdout=sto)\\nretval = p.returncode\\nsto.close()\\n\"}, \"makeMode\": {\"make_Tool\": \"yes\", \"__current_case__\": 0, \"tool_version\": \"0.01\", \"tool_desc\": \"Tool to test toolshed tool archives generated by the tool factory.\", \"help_text\": \"**What it Does**\\n\\nGiven a toolshed tgz file generated by a tool factory run, this will unpack it and run planemo test, returning the planemo stdout as a report\\nIt was generated using the tool factory.\", \"citations\": []}, \"ppass\": {\"parampass\": \"argparse\", \"__current_case__\": 0, \"history_inputs\": [{\"__index__\": 0, \"input_files\": {\"__class__\": \"ConnectedValue\"}, \"input_formats\": [\"tgz\"], \"input_label\": \"tool toolshed tgz archive from history\", \"input_help\": \"Run planemo test on a tool shed tool archive tgz format file generated by the ToolFactory or Planemo\", \"input_CL\": \"tooltgz\"}], \"history_outputs\": [{\"__index__\": 0, \"history_name\": \"report\", \"history_format\": \"txt\", \"history_CL\": \"report\"}], \"edit_params\": \"yes\", \"additional_parameters\": [{\"__index__\": 0, \"param_name\": \"toolout\", \"param_type\": \"text\", \"param_value\": \"tools/toolmakers/planemotest\", \"param_label\": \"output path under galaxy root\", \"param_help\": \"This is where the tgz file will be extracted and tested by planemo\", \"param_CL\": \"toolout\", \"param_CLprefixed\": \"\"}, {\"__index__\": 1, \"param_name\": \"galaxy_root\", \"param_type\": \"text\", \"param_value\": \"/home/ross/galaxy\", \"param_label\": \"Galaxy source root directory to use for running planemo\", \"param_help\": \"This will form the galaxy_root parameter for rnning planemo using an existing Galaxy source tree, and the tgz will be extracted at a path relative to that rootu\", \"param_CL\": \"galaxy_root\", \"param_CLprefixed\": \"\"}]}, \"tool_name\": \"planemotest\", \"__page__\": null, \"__rerun_remap_job_id__\": null}",
-            "tool_version": "2.00",
-            "type": "tool",
-            "uuid": "b9bfb1a4-4c0c-4d39-9e74-223da72f8abc",
-            "workflow_outputs": [
-                {
-                    "label": null,
-                    "output_name": "TF_run_report",
-                    "uuid": "09ba44ea-4da8-46f5-a411-ca054ccedd3b"
-                },
-                {
-                    "label": null,
-                    "output_name": "new_tool",
-                    "uuid": "50a8ff4a-702a-4983-8202-8a79c0a3c978"
-                }
-            ]
-        }
-    },
-    "tags": [],
-    "uuid": "321a7f9f-c287-453c-807a-43afd948770e",
-    "version": 1
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/html_dir.py	Sun Aug 16 20:05:19 2020 -0400
@@ -0,0 +1,180 @@
+
+class tooloutHTMLifyer(self):
+
+    def compressPDF(self,inpdf=None,thumbformat='png'):
+        """need absolute path to pdf
+           note that GS gets confoozled if no $TMP or $TEMP
+           so we set it
+        """
+        assert os.path.isfile(inpdf), "## Input %s supplied to %s compressPDF not found" % (inpdf,self.myName)
+        hlog = os.path.join(self.opts.output_dir,"compress_%s.txt" % os.path.basename(inpdf))
+        sto = open(hlog,'a')
+        our_env = os.environ.copy()
+        our_tmp = our_env.get('TMP',None)
+        if not our_tmp:
+            our_tmp = our_env.get('TEMP',None)
+        if not (our_tmp and os.path.exists(our_tmp)):
+            newtmp = os.path.join(self.opts.output_dir,'tmp')
+            try:
+                os.mkdir(newtmp)
+            except:
+                sto.write('## WARNING - cannot make %s - it may exist or permissions need fixing\n' % newtmp)
+            our_env['TEMP'] = newtmp
+            if not self.temp_warned:
+               sto.write('## WARNING - no $TMP or $TEMP!!! Please fix - using %s temporarily\n' % newtmp)
+               self.temp_warned = True          
+        outpdf = '%s_compressed' % inpdf
+        cl = ["gs", "-sDEVICE=pdfwrite", "-dNOPAUSE", "-dUseCIEColor", "-dBATCH","-dPDFSETTINGS=/printer", "-sOutputFile=%s" % outpdf,inpdf]
+        x = subprocess.Popen(cl,stdout=sto,stderr=sto,cwd=self.opts.output_dir,env=our_env)
+        retval1 = x.wait()
+        sto.close()
+        if retval1 == 0:
+            os.unlink(inpdf)
+            shutil.move(outpdf,inpdf)
+            os.unlink(hlog)
+        hlog = os.path.join(self.opts.output_dir,"thumbnail_%s.txt" % os.path.basename(inpdf))
+        sto = open(hlog,'w')
+        outpng = '%s.%s' % (os.path.splitext(inpdf)[0],thumbformat)
+        if self.useGM:        
+            cl2 = ['gm', 'convert', inpdf, outpng]
+        else: # assume imagemagick
+            cl2 = ['convert', inpdf, outpng]
+        x = subprocess.Popen(cl2,stdout=sto,stderr=sto,cwd=self.opts.output_dir,env=our_env)
+        retval2 = x.wait()
+        sto.close()
+        if retval2 == 0:
+             os.unlink(hlog)
+        retval = retval1 or retval2
+        return retval
+
+
+    def getfSize(self,fpath,outpath):
+        """
+        format a nice file size string
+        """
+        size = ''
+        fp = os.path.join(outpath,fpath)
+        if os.path.isfile(fp):
+            size = '0 B'
+            n = float(os.path.getsize(fp))
+            if n > 2**20:
+                size = '%1.1f MB' % (n/2**20)
+            elif n > 2**10:
+                size = '%1.1f KB' % (n/2**10)
+            elif n > 0:
+                size = '%d B' % (int(n))
+        return size
+
+    def makeHtml(self):
+        """ Create an HTML file content to list all the artifacts found in the output_dir
+        """
+
+        galhtmlprefix = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
+        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
+        <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
+        <meta name="generator" content="Galaxy %s tool output - see http://g2.trac.bx.psu.edu/" /> 
+        <title></title> 
+        <link rel="stylesheet" href="/static/style/base.css" type="text/css" /> 
+        </head> 
+        <body> 
+        <div class="toolFormBody"> 
+        """ 
+        galhtmlattr = """<hr/><div class="infomessage">This tool (%s) was generated by the <a href="https://bitbucket.org/fubar/galaxytoolfactory/overview">Galaxy Tool Factory</a></div><br/>""" 
+        galhtmlpostfix = """</div></body></html>\n"""
+
+        flist = os.listdir(self.opts.output_dir)
+        flist = [x for x in flist if x != 'Rplots.pdf']
+        flist.sort()
+        html = []
+        html.append(galhtmlprefix % progname)
+        html.append('<div class="infomessage">Galaxy Tool "%s" run at %s</div><br/>' % (self.toolname,timenow()))
+        fhtml = []
+        if len(flist) > 0:
+            logfiles = [x for x in flist if x.lower().endswith('.log')] # log file names determine sections
+            logfiles.sort()
+            logfiles = [x for x in logfiles if os.path.abspath(x) != os.path.abspath(self.tlog)]
+            logfiles.append(os.path.abspath(self.tlog)) # make it the last one
+            pdflist = []
+            npdf = len([x for x in flist if os.path.splitext(x)[-1].lower() == '.pdf'])
+            for rownum,fname in enumerate(flist):
+                dname,e = os.path.splitext(fname)
+                sfsize = self.getfSize(fname,self.opts.output_dir)
+                if e.lower() == '.pdf' : # compress and make a thumbnail
+                    thumb = '%s.%s' % (dname,self.thumbformat)
+                    pdff = os.path.join(self.opts.output_dir,fname)
+                    retval = self.compressPDF(inpdf=pdff,thumbformat=self.thumbformat)
+                    if retval == 0:
+                        pdflist.append((fname,thumb))
+                    else:
+                        pdflist.append((fname,fname))
+                if (rownum+1) % 2 == 0:
+                    fhtml.append('<tr class="odd_row"><td><a href="%s">%s</a></td><td>%s</td></tr>' % (fname,fname,sfsize))
+                else:
+                    fhtml.append('<tr><td><a href="%s">%s</a></td><td>%s</td></tr>' % (fname,fname,sfsize))
+            for logfname in logfiles: # expect at least tlog - if more
+                if os.path.abspath(logfname) == os.path.abspath(self.tlog): # handled later
+                    sectionname = 'All tool run'
+                    if (len(logfiles) > 1):
+                        sectionname = 'Other'
+                    ourpdfs = pdflist
+                else:
+                    realname = os.path.basename(logfname)
+                    sectionname = os.path.splitext(realname)[0].split('_')[0] # break in case _ added to log
+                    ourpdfs = [x for x in pdflist if os.path.basename(x[0]).split('_')[0] == sectionname]
+                    pdflist = [x for x in pdflist if os.path.basename(x[0]).split('_')[0] != sectionname] # remove
+                nacross = 1
+                npdf = len(ourpdfs)
+
+                if npdf > 0:
+                    nacross = math.sqrt(npdf) ## int(round(math.log(npdf,2)))
+                    if int(nacross)**2 != npdf:
+                        nacross += 1
+                    nacross = int(nacross)
+                    width = min(400,int(1200/nacross))
+                    html.append('<div class="toolFormTitle">%s images and outputs</div>' % sectionname)
+                    html.append('(Click on a thumbnail image to download the corresponding original PDF image)<br/>')
+                    ntogo = nacross # counter for table row padding with empty cells
+                    html.append('<div><table class="simple" cellpadding="2" cellspacing="2">\n<tr>')
+                    for i,paths in enumerate(ourpdfs): 
+                        fname,thumb = paths
+                        s= """<td><a href="%s"><img src="%s" title="Click to download a PDF of %s" hspace="5" width="%d" 
+                           alt="Image called %s"/></a></td>\n""" % (fname,thumb,fname,width,fname)
+                        if ((i+1) % nacross == 0):
+                            s += '</tr>\n'
+                            ntogo = 0
+                            if i < (npdf - 1): # more to come
+                               s += '<tr>'
+                               ntogo = nacross
+                        else:
+                            ntogo -= 1
+                        html.append(s)
+                    if html[-1].strip().endswith('</tr>'):
+                        html.append('</table></div>\n')
+                    else:
+                        if ntogo > 0: # pad
+                           html.append('<td>&nbsp;</td>'*ntogo)
+                        html.append('</tr></table></div>\n')
+                logt = open(logfname,'r').readlines()
+                logtext = [x for x in logt if x.strip() > '']
+                html.append('<div class="toolFormTitle">%s log output</div>' % sectionname)
+                if len(logtext) > 1:
+                    html.append('\n<pre>\n')
+                    html += logtext
+                    html.append('\n</pre>\n')
+                else:
+                    html.append('%s is empty<br/>' % logfname)
+        if len(fhtml) > 0:
+           fhtml.insert(0,'<div><table class="colored" cellpadding="3" cellspacing="3"><tr><th>Output File Name (click to view)</th><th>Size</th></tr>\n')
+           fhtml.append('</table></div><br/>')
+           html.append('<div class="toolFormTitle">All output files available for downloading</div>\n')
+           html += fhtml # add all non-pdf files to the end of the display
+        else:
+            html.append('<div class="warningmessagelarge">### Error - %s returned no files - please confirm that parameters are sane</div>' % self.opts.interpreter)
+        html.append(galhtmlpostfix)
+        htmlf = file(self.opts.output_html,'w')
+        htmlf.write('\n'.join(html))
+        htmlf.write('\n')
+        htmlf.close()
+        self.html = html
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/testtf.sh	Sun Aug 16 20:05:19 2020 -0400
@@ -0,0 +1,2 @@
+planemo test --no_cleanup --no_dependency_resolution --skip_venv --galaxy_root ~/galaxy ~/galaxy/tools/tool_makers/toolfactory &>foo
+