Repository 'tool_factory_2'
hg clone https://toolshed.g2.bx.psu.edu/repos/fubar/tool_factory_2

Changeset 45:668c37cc8962 (2020-08-16)
Previous changeset 44:23ad2924bf78 (2020-08-16) Next changeset 46:f8700bed1e17 (2020-08-18)
Commit message:
trying to get a workflow to do something interesting
added:
TF_example_wf.ga
toolfactory/.github/workflows/commit.yml
toolfactory/.gitignore
toolfactory/.shed.yml
toolfactory/html_dir.py
toolfactory/testtf.sh
removed:
toolfactory/TF_example_wf.ga
b
diff -r 23ad2924bf78 -r 668c37cc8962 TF_example_wf.ga
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/TF_example_wf.ga Sun Aug 16 20:05:19 2020 -0400
[
b'@@ -0,0 +1,458 @@\n+{\n+    "a_galaxy_workflow": "true",\n+    "annotation": "",\n+    "format-version": "0.1",\n+    "name": "TF examples",\n+    "steps": {\n+        "0": {\n+            "annotation": "a fasta file - gc ratio will be estimated",\n+            "content_id": null,\n+            "errors": null,\n+            "id": 0,\n+            "input_connections": {},\n+            "inputs": [\n+                {\n+                    "description": "a fasta file - gc ratio will be estimated",\n+                    "name": "phiX.fasta"\n+                }\n+            ],\n+            "label": "phiX.fasta",\n+            "name": "Input dataset",\n+            "outputs": [],\n+            "position": {\n+                "bottom": 231,\n+                "height": 61,\n+                "left": 393,\n+                "right": 593,\n+                "top": 170,\n+                "width": 200,\n+                "x": 393,\n+                "y": 170\n+            },\n+            "tool_id": null,\n+            "tool_state": "{\\"optional\\": false}",\n+            "tool_version": null,\n+            "type": "data_input",\n+            "uuid": "7e2e24c8-2327-4893-a5b3-6b696a6ecd33",\n+            "workflow_outputs": [\n+                {\n+                    "label": null,\n+                    "output_name": "output",\n+                    "uuid": "f5ce2386-b80c-4691-a0a7-abeec8854461"\n+                }\n+            ]\n+        },\n+        "1": {\n+            "annotation": "Any text file to be reversed lots of times and bjorked once.",\n+            "content_id": null,\n+            "errors": null,\n+            "id": 1,\n+            "input_connections": {},\n+            "inputs": [\n+                {\n+                    "description": "Any text file to be reversed lots of times and bjorked once.",\n+                    "name": "rgToolFactory2.py"\n+                }\n+            ],\n+            "label": "rgToolFactory2.py",\n+            "name": "Input dataset",\n+            "outputs": [],\n+            "position": {\n+                "bottom": 371,\n+                "height": 81,\n+                "left": 393,\n+                "right": 593,\n+                "top": 290,\n+                "width": 200,\n+                "x": 393,\n+                "y": 290\n+            },\n+            "tool_id": null,\n+            "tool_state": "{\\"optional\\": false}",\n+            "tool_version": null,\n+            "type": "data_input",\n+            "uuid": "f530b390-2424-4aae-8bd9-dd9d30277561",\n+            "workflow_outputs": [\n+                {\n+                    "label": null,\n+                    "output_name": "output",\n+                    "uuid": "3d2a1699-50af-46e1-8981-dc6c3de2cf6c"\n+                }\n+            ]\n+        },\n+        "2": {\n+            "annotation": "",\n+            "content_id": "rgTF2",\n+            "errors": null,\n+            "id": 2,\n+            "input_connections": {\n+                "ppass|history_inputs_0|input_files": {\n+                    "id": 0,\n+                    "output_name": "output"\n+                }\n+            },\n+            "inputs": [],\n+            "label": null,\n+            "name": "toolfactory",\n+            "outputs": [\n+                {\n+                    "name": "TF_run_report",\n+                    "type": "input"\n+                },\n+                {\n+                    "name": "new_tool",\n+                    "type": "tgz"\n+                }\n+            ],\n+            "position": {\n+                "bottom": 372,\n+                "height": 202,\n+                "left": 613,\n+                "right": 813,\n+                "top": 170,\n+                "width": 200,\n+                "x": 613,\n+                "y": 170\n+            },\n+            "post_job_actions": {},\n+            "tool_id": "rgTF2",\n+            "tool_state": "{\\"__input_ext\\": \\"input\\", \\"chromInfo\\": \\"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\\", \\"interexe\\": {\\"interpreter\\": \\"perl\\", \\"__current_case__\\": 4, \\"interpreter_version\\": \\"\\'..b'\n+                "height": 242,\n+                "left": 833,\n+                "right": 1033,\n+                "top": 170,\n+                "width": 200,\n+                "x": 833,\n+                "y": 170\n+            },\n+            "post_job_actions": {},\n+            "tool_id": "rgTF2",\n+            "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}",\n+            "tool_version": "2.00",\n+            "type": "tool",\n+            "uuid": "b9bfb1a4-4c0c-4d39-9e74-223da72f8abc",\n+            "workflow_outputs": [\n+                {\n+                    "label": null,\n+                    "output_name": "TF_run_report",\n+                    "uuid": "09ba44ea-4da8-46f5-a411-ca054ccedd3b"\n+                },\n+                {\n+                    "label": null,\n+                    "output_name": "new_tool",\n+                    "uuid": "50a8ff4a-702a-4983-8202-8a79c0a3c978"\n+                }\n+            ]\n+        }\n+    },\n+    "tags": [],\n+    "uuid": "321a7f9f-c287-453c-807a-43afd948770e",\n+    "version": 1\n+}\n'
b
diff -r 23ad2924bf78 -r 668c37cc8962 toolfactory/.github/workflows/commit.yml
--- /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
b
diff -r 23ad2924bf78 -r 668c37cc8962 toolfactory/.gitignore
--- /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/
b
diff -r 23ad2924bf78 -r 668c37cc8962 toolfactory/.shed.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/.shed.yml Sun Aug 16 20:05:19 2020 -0400
b
@@ -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
b
diff -r 23ad2924bf78 -r 668c37cc8962 toolfactory/TF_example_wf.ga
--- a/toolfactory/TF_example_wf.ga Sun Aug 16 08:51:49 2020 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,458 +0,0 @@\n-{\n-    "a_galaxy_workflow": "true",\n-    "annotation": "",\n-    "format-version": "0.1",\n-    "name": "TF examples",\n-    "steps": {\n-        "0": {\n-            "annotation": "a fasta file - gc ratio will be estimated",\n-            "content_id": null,\n-            "errors": null,\n-            "id": 0,\n-            "input_connections": {},\n-            "inputs": [\n-                {\n-                    "description": "a fasta file - gc ratio will be estimated",\n-                    "name": "phiX.fasta"\n-                }\n-            ],\n-            "label": "phiX.fasta",\n-            "name": "Input dataset",\n-            "outputs": [],\n-            "position": {\n-                "bottom": 231,\n-                "height": 61,\n-                "left": 393,\n-                "right": 593,\n-                "top": 170,\n-                "width": 200,\n-                "x": 393,\n-                "y": 170\n-            },\n-            "tool_id": null,\n-            "tool_state": "{\\"optional\\": false}",\n-            "tool_version": null,\n-            "type": "data_input",\n-            "uuid": "7e2e24c8-2327-4893-a5b3-6b696a6ecd33",\n-            "workflow_outputs": [\n-                {\n-                    "label": null,\n-                    "output_name": "output",\n-                    "uuid": "f5ce2386-b80c-4691-a0a7-abeec8854461"\n-                }\n-            ]\n-        },\n-        "1": {\n-            "annotation": "Any text file to be reversed lots of times and bjorked once.",\n-            "content_id": null,\n-            "errors": null,\n-            "id": 1,\n-            "input_connections": {},\n-            "inputs": [\n-                {\n-                    "description": "Any text file to be reversed lots of times and bjorked once.",\n-                    "name": "rgToolFactory2.py"\n-                }\n-            ],\n-            "label": "rgToolFactory2.py",\n-            "name": "Input dataset",\n-            "outputs": [],\n-            "position": {\n-                "bottom": 371,\n-                "height": 81,\n-                "left": 393,\n-                "right": 593,\n-                "top": 290,\n-                "width": 200,\n-                "x": 393,\n-                "y": 290\n-            },\n-            "tool_id": null,\n-            "tool_state": "{\\"optional\\": false}",\n-            "tool_version": null,\n-            "type": "data_input",\n-            "uuid": "f530b390-2424-4aae-8bd9-dd9d30277561",\n-            "workflow_outputs": [\n-                {\n-                    "label": null,\n-                    "output_name": "output",\n-                    "uuid": "3d2a1699-50af-46e1-8981-dc6c3de2cf6c"\n-                }\n-            ]\n-        },\n-        "2": {\n-            "annotation": "",\n-            "content_id": "rgTF2",\n-            "errors": null,\n-            "id": 2,\n-            "input_connections": {\n-                "ppass|history_inputs_0|input_files": {\n-                    "id": 0,\n-                    "output_name": "output"\n-                }\n-            },\n-            "inputs": [],\n-            "label": null,\n-            "name": "toolfactory",\n-            "outputs": [\n-                {\n-                    "name": "TF_run_report",\n-                    "type": "input"\n-                },\n-                {\n-                    "name": "new_tool",\n-                    "type": "tgz"\n-                }\n-            ],\n-            "position": {\n-                "bottom": 372,\n-                "height": 202,\n-                "left": 613,\n-                "right": 813,\n-                "top": 170,\n-                "width": 200,\n-                "x": 613,\n-                "y": 170\n-            },\n-            "post_job_actions": {},\n-            "tool_id": "rgTF2",\n-            "tool_state": "{\\"__input_ext\\": \\"input\\", \\"chromInfo\\": \\"/home/ross/galaxy/tool-data/shared/ucsc/chrom/?.len\\", \\"interexe\\": {\\"interpreter\\": \\"perl\\", \\"__current_case__\\": 4, \\"interpreter_version\\": \\"\\'..b'\n-                "height": 242,\n-                "left": 833,\n-                "right": 1033,\n-                "top": 170,\n-                "width": 200,\n-                "x": 833,\n-                "y": 170\n-            },\n-            "post_job_actions": {},\n-            "tool_id": "rgTF2",\n-            "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}",\n-            "tool_version": "2.00",\n-            "type": "tool",\n-            "uuid": "b9bfb1a4-4c0c-4d39-9e74-223da72f8abc",\n-            "workflow_outputs": [\n-                {\n-                    "label": null,\n-                    "output_name": "TF_run_report",\n-                    "uuid": "09ba44ea-4da8-46f5-a411-ca054ccedd3b"\n-                },\n-                {\n-                    "label": null,\n-                    "output_name": "new_tool",\n-                    "uuid": "50a8ff4a-702a-4983-8202-8a79c0a3c978"\n-                }\n-            ]\n-        }\n-    },\n-    "tags": [],\n-    "uuid": "321a7f9f-c287-453c-807a-43afd948770e",\n-    "version": 1\n-}\n'
b
diff -r 23ad2924bf78 -r 668c37cc8962 toolfactory/html_dir.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/html_dir.py Sun Aug 16 20:05:19 2020 -0400
[
b'@@ -0,0 +1,180 @@\n+\n+class tooloutHTMLifyer(self):\n+\n+    def compressPDF(self,inpdf=None,thumbformat=\'png\'):\n+        """need absolute path to pdf\n+           note that GS gets confoozled if no $TMP or $TEMP\n+           so we set it\n+        """\n+        assert os.path.isfile(inpdf), "## Input %s supplied to %s compressPDF not found" % (inpdf,self.myName)\n+        hlog = os.path.join(self.opts.output_dir,"compress_%s.txt" % os.path.basename(inpdf))\n+        sto = open(hlog,\'a\')\n+        our_env = os.environ.copy()\n+        our_tmp = our_env.get(\'TMP\',None)\n+        if not our_tmp:\n+            our_tmp = our_env.get(\'TEMP\',None)\n+        if not (our_tmp and os.path.exists(our_tmp)):\n+            newtmp = os.path.join(self.opts.output_dir,\'tmp\')\n+            try:\n+                os.mkdir(newtmp)\n+            except:\n+                sto.write(\'## WARNING - cannot make %s - it may exist or permissions need fixing\\n\' % newtmp)\n+            our_env[\'TEMP\'] = newtmp\n+            if not self.temp_warned:\n+               sto.write(\'## WARNING - no $TMP or $TEMP!!! Please fix - using %s temporarily\\n\' % newtmp)\n+               self.temp_warned = True          \n+        outpdf = \'%s_compressed\' % inpdf\n+        cl = ["gs", "-sDEVICE=pdfwrite", "-dNOPAUSE", "-dUseCIEColor", "-dBATCH","-dPDFSETTINGS=/printer", "-sOutputFile=%s" % outpdf,inpdf]\n+        x = subprocess.Popen(cl,stdout=sto,stderr=sto,cwd=self.opts.output_dir,env=our_env)\n+        retval1 = x.wait()\n+        sto.close()\n+        if retval1 == 0:\n+            os.unlink(inpdf)\n+            shutil.move(outpdf,inpdf)\n+            os.unlink(hlog)\n+        hlog = os.path.join(self.opts.output_dir,"thumbnail_%s.txt" % os.path.basename(inpdf))\n+        sto = open(hlog,\'w\')\n+        outpng = \'%s.%s\' % (os.path.splitext(inpdf)[0],thumbformat)\n+        if self.useGM:        \n+            cl2 = [\'gm\', \'convert\', inpdf, outpng]\n+        else: # assume imagemagick\n+            cl2 = [\'convert\', inpdf, outpng]\n+        x = subprocess.Popen(cl2,stdout=sto,stderr=sto,cwd=self.opts.output_dir,env=our_env)\n+        retval2 = x.wait()\n+        sto.close()\n+        if retval2 == 0:\n+             os.unlink(hlog)\n+        retval = retval1 or retval2\n+        return retval\n+\n+\n+    def getfSize(self,fpath,outpath):\n+        """\n+        format a nice file size string\n+        """\n+        size = \'\'\n+        fp = os.path.join(outpath,fpath)\n+        if os.path.isfile(fp):\n+            size = \'0 B\'\n+            n = float(os.path.getsize(fp))\n+            if n > 2**20:\n+                size = \'%1.1f MB\' % (n/2**20)\n+            elif n > 2**10:\n+                size = \'%1.1f KB\' % (n/2**10)\n+            elif n > 0:\n+                size = \'%d B\' % (int(n))\n+        return size\n+\n+    def makeHtml(self):\n+        """ Create an HTML file content to list all the artifacts found in the output_dir\n+        """\n+\n+        galhtmlprefix = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> \n+        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> \n+        <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> \n+        <meta name="generator" content="Galaxy %s tool output - see http://g2.trac.bx.psu.edu/" /> \n+        <title></title> \n+        <link rel="stylesheet" href="/static/style/base.css" type="text/css" /> \n+        </head> \n+        <body> \n+        <div class="toolFormBody"> \n+        """ \n+        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/>""" \n+        galhtmlpostfix = """</div></body></html>\\n"""\n+\n+        flist = os.listdir(self.opts.output_dir)\n+        flist = [x for x in flist if x != \'Rplots.pdf\']\n+        flist.sort()\n+        html = []\n+        html.append(galhtmlprefix % progname)\n+        html.append(\'<div class="infomessage">Galaxy T'..b'% (fname,fname,sfsize))\n+                else:\n+                    fhtml.append(\'<tr><td><a href="%s">%s</a></td><td>%s</td></tr>\' % (fname,fname,sfsize))\n+            for logfname in logfiles: # expect at least tlog - if more\n+                if os.path.abspath(logfname) == os.path.abspath(self.tlog): # handled later\n+                    sectionname = \'All tool run\'\n+                    if (len(logfiles) > 1):\n+                        sectionname = \'Other\'\n+                    ourpdfs = pdflist\n+                else:\n+                    realname = os.path.basename(logfname)\n+                    sectionname = os.path.splitext(realname)[0].split(\'_\')[0] # break in case _ added to log\n+                    ourpdfs = [x for x in pdflist if os.path.basename(x[0]).split(\'_\')[0] == sectionname]\n+                    pdflist = [x for x in pdflist if os.path.basename(x[0]).split(\'_\')[0] != sectionname] # remove\n+                nacross = 1\n+                npdf = len(ourpdfs)\n+\n+                if npdf > 0:\n+                    nacross = math.sqrt(npdf) ## int(round(math.log(npdf,2)))\n+                    if int(nacross)**2 != npdf:\n+                        nacross += 1\n+                    nacross = int(nacross)\n+                    width = min(400,int(1200/nacross))\n+                    html.append(\'<div class="toolFormTitle">%s images and outputs</div>\' % sectionname)\n+                    html.append(\'(Click on a thumbnail image to download the corresponding original PDF image)<br/>\')\n+                    ntogo = nacross # counter for table row padding with empty cells\n+                    html.append(\'<div><table class="simple" cellpadding="2" cellspacing="2">\\n<tr>\')\n+                    for i,paths in enumerate(ourpdfs): \n+                        fname,thumb = paths\n+                        s= """<td><a href="%s"><img src="%s" title="Click to download a PDF of %s" hspace="5" width="%d" \n+                           alt="Image called %s"/></a></td>\\n""" % (fname,thumb,fname,width,fname)\n+                        if ((i+1) % nacross == 0):\n+                            s += \'</tr>\\n\'\n+                            ntogo = 0\n+                            if i < (npdf - 1): # more to come\n+                               s += \'<tr>\'\n+                               ntogo = nacross\n+                        else:\n+                            ntogo -= 1\n+                        html.append(s)\n+                    if html[-1].strip().endswith(\'</tr>\'):\n+                        html.append(\'</table></div>\\n\')\n+                    else:\n+                        if ntogo > 0: # pad\n+                           html.append(\'<td>&nbsp;</td>\'*ntogo)\n+                        html.append(\'</tr></table></div>\\n\')\n+                logt = open(logfname,\'r\').readlines()\n+                logtext = [x for x in logt if x.strip() > \'\']\n+                html.append(\'<div class="toolFormTitle">%s log output</div>\' % sectionname)\n+                if len(logtext) > 1:\n+                    html.append(\'\\n<pre>\\n\')\n+                    html += logtext\n+                    html.append(\'\\n</pre>\\n\')\n+                else:\n+                    html.append(\'%s is empty<br/>\' % logfname)\n+        if len(fhtml) > 0:\n+           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\')\n+           fhtml.append(\'</table></div><br/>\')\n+           html.append(\'<div class="toolFormTitle">All output files available for downloading</div>\\n\')\n+           html += fhtml # add all non-pdf files to the end of the display\n+        else:\n+            html.append(\'<div class="warningmessagelarge">### Error - %s returned no files - please confirm that parameters are sane</div>\' % self.opts.interpreter)\n+        html.append(galhtmlpostfix)\n+        htmlf = file(self.opts.output_html,\'w\')\n+        htmlf.write(\'\\n\'.join(html))\n+        htmlf.write(\'\\n\')\n+        htmlf.close()\n+        self.html = html\n+\n+\n'
b
diff -r 23ad2924bf78 -r 668c37cc8962 toolfactory/testtf.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/testtf.sh Sun Aug 16 20:05:19 2020 -0400
b
@@ -0,0 +1,2 @@
+planemo test --no_cleanup --no_dependency_resolution --skip_venv --galaxy_root ~/galaxy ~/galaxy/tools/tool_makers/toolfactory &>foo
+