diff env/lib/python3.7/site-packages/ephemeris/shed_tools_methods.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.7/site-packages/ephemeris/shed_tools_methods.py	Sat May 02 07:14:21 2020 -0400
@@ -0,0 +1,109 @@
+from bioblend.toolshed import ToolShedInstance
+
+
+VALID_KEYS = [
+    "name",
+    "owner",
+    "changeset_revision",
+    "tool_panel_section_id",
+    "tool_panel_section_label",
+    "tool_shed_url",
+    "install_repository_dependencies",
+    "install_resolver_dependencies",
+    "install_tool_dependencies"
+]
+
+
+def complete_repo_information(tool,
+                              default_toolshed_url,
+                              require_tool_panel_info,
+                              default_install_tool_dependencies,
+                              default_install_repository_dependencies,
+                              default_install_resolver_dependencies,
+                              force_latest_revision):
+    repo = dict()
+    # We need those values. Throw a KeyError when not present
+    repo['name'] = tool['name']
+    repo['owner'] = tool['owner']
+    repo['tool_panel_section_id'] = tool.get('tool_panel_section_id')
+    repo['tool_panel_section_label'] = tool.get('tool_panel_section_label')
+    if require_tool_panel_info and repo['tool_panel_section_id'] is None and repo[
+            'tool_panel_section_label'] is None and 'data_manager' not in repo.get('name'):
+        raise KeyError("Either tool_panel_section_id or tool_panel_section_name must be defined for tool '{0}'.".format(
+            repo.get('name')))
+    repo['tool_shed_url'] = format_tool_shed_url(tool.get('tool_shed_url', default_toolshed_url))
+    repo['changeset_revision'] = tool.get('changeset_revision')
+    repo = get_changeset_revisions(repo, force_latest_revision)
+    repo['install_repository_dependencies'] = tool.get('install_repository_dependencies',
+                                                       default_install_repository_dependencies)
+    repo['install_resolver_dependencies'] = tool.get('install_resolver_dependencies',
+                                                     default_install_resolver_dependencies)
+    repo['install_tool_dependencies'] = tool.get('install_tool_dependencies', default_install_tool_dependencies)
+    return repo
+
+
+def format_tool_shed_url(tool_shed_url):
+    formatted_tool_shed_url = tool_shed_url
+    if not formatted_tool_shed_url.endswith('/'):
+        formatted_tool_shed_url += '/'
+    if not formatted_tool_shed_url.startswith('http'):
+        formatted_tool_shed_url = 'https://' + formatted_tool_shed_url
+    return formatted_tool_shed_url
+
+
+def get_changeset_revisions(repository, force_latest_revision=False):
+    """
+    Select the correct changeset revision for a repository,
+    and make sure the repository exists
+    (i.e a request to the tool shed with name and owner returns a list of revisions).
+    Return repository or None, if the repository could not be found on the specified tool shed.
+    """
+    # Do not connect to the internet when not necessary
+    if repository.get('changeset_revision') is None or force_latest_revision:
+        ts = ToolShedInstance(url=repository['tool_shed_url'])
+        # Get the set revision or set it to the latest installable revision
+        installable_revisions = ts.repositories.get_ordered_installable_revisions(repository['name'],
+                                                                                  repository['owner'])
+        if not installable_revisions:  #
+            raise LookupError("Repo does not exist in tool shed: {0}".format(repository))
+        repository['changeset_revision'] = installable_revisions[-1]
+
+    return repository
+
+
+def flatten_repo_info(repositories):
+    """
+    Flatten the dict containing info about what tools to install.
+    The tool definition YAML file allows multiple revisions to be listed for
+    the same tool. To enable simple, iterative processing of the info in this
+    script, flatten the `tools_info` list to include one entry per tool revision.
+
+    :type repositories: list of dicts
+    :param repositories: Each dict in this list should contain info about a tool.
+    :rtype: list of dicts
+    :return: Return a list of dicts that correspond to the input argument such
+             that if an input element contained `revisions` key with multiple
+             values, those will be returned as separate list items.
+    """
+
+    flattened_list = []
+    for repo_info in repositories:
+        new_repo_info = dict()
+        for key, value in repo_info.items():
+            if key in VALID_KEYS:
+                new_repo_info[key] = value
+        if 'revisions' in repo_info:
+            revisions = repo_info.get('revisions', [])
+            if not revisions:  # Revisions are empty list or None
+                flattened_list.append(new_repo_info)
+            else:
+                for revision in revisions:
+                    # A new dictionary must be created, otherwise there will
+                    # be aliasing of dictionaries. Which leads to multiple
+                    # repos with the same revision in the end result.
+                    new_revision_dict = dict(**new_repo_info)
+                    new_revision_dict['changeset_revision'] = revision
+                    flattened_list.append(new_revision_dict)
+        else:  # Revision was not defined at all
+            flattened_list.append(new_repo_info)
+    return flattened_list