Mercurial > repos > shellac > guppy_basecaller
comparison 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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:26e78fe6e8c4 |
|---|---|
| 1 from bioblend.toolshed import ToolShedInstance | |
| 2 | |
| 3 | |
| 4 VALID_KEYS = [ | |
| 5 "name", | |
| 6 "owner", | |
| 7 "changeset_revision", | |
| 8 "tool_panel_section_id", | |
| 9 "tool_panel_section_label", | |
| 10 "tool_shed_url", | |
| 11 "install_repository_dependencies", | |
| 12 "install_resolver_dependencies", | |
| 13 "install_tool_dependencies" | |
| 14 ] | |
| 15 | |
| 16 | |
| 17 def complete_repo_information(tool, | |
| 18 default_toolshed_url, | |
| 19 require_tool_panel_info, | |
| 20 default_install_tool_dependencies, | |
| 21 default_install_repository_dependencies, | |
| 22 default_install_resolver_dependencies, | |
| 23 force_latest_revision): | |
| 24 repo = dict() | |
| 25 # We need those values. Throw a KeyError when not present | |
| 26 repo['name'] = tool['name'] | |
| 27 repo['owner'] = tool['owner'] | |
| 28 repo['tool_panel_section_id'] = tool.get('tool_panel_section_id') | |
| 29 repo['tool_panel_section_label'] = tool.get('tool_panel_section_label') | |
| 30 if require_tool_panel_info and repo['tool_panel_section_id'] is None and repo[ | |
| 31 'tool_panel_section_label'] is None and 'data_manager' not in repo.get('name'): | |
| 32 raise KeyError("Either tool_panel_section_id or tool_panel_section_name must be defined for tool '{0}'.".format( | |
| 33 repo.get('name'))) | |
| 34 repo['tool_shed_url'] = format_tool_shed_url(tool.get('tool_shed_url', default_toolshed_url)) | |
| 35 repo['changeset_revision'] = tool.get('changeset_revision') | |
| 36 repo = get_changeset_revisions(repo, force_latest_revision) | |
| 37 repo['install_repository_dependencies'] = tool.get('install_repository_dependencies', | |
| 38 default_install_repository_dependencies) | |
| 39 repo['install_resolver_dependencies'] = tool.get('install_resolver_dependencies', | |
| 40 default_install_resolver_dependencies) | |
| 41 repo['install_tool_dependencies'] = tool.get('install_tool_dependencies', default_install_tool_dependencies) | |
| 42 return repo | |
| 43 | |
| 44 | |
| 45 def format_tool_shed_url(tool_shed_url): | |
| 46 formatted_tool_shed_url = tool_shed_url | |
| 47 if not formatted_tool_shed_url.endswith('/'): | |
| 48 formatted_tool_shed_url += '/' | |
| 49 if not formatted_tool_shed_url.startswith('http'): | |
| 50 formatted_tool_shed_url = 'https://' + formatted_tool_shed_url | |
| 51 return formatted_tool_shed_url | |
| 52 | |
| 53 | |
| 54 def get_changeset_revisions(repository, force_latest_revision=False): | |
| 55 """ | |
| 56 Select the correct changeset revision for a repository, | |
| 57 and make sure the repository exists | |
| 58 (i.e a request to the tool shed with name and owner returns a list of revisions). | |
| 59 Return repository or None, if the repository could not be found on the specified tool shed. | |
| 60 """ | |
| 61 # Do not connect to the internet when not necessary | |
| 62 if repository.get('changeset_revision') is None or force_latest_revision: | |
| 63 ts = ToolShedInstance(url=repository['tool_shed_url']) | |
| 64 # Get the set revision or set it to the latest installable revision | |
| 65 installable_revisions = ts.repositories.get_ordered_installable_revisions(repository['name'], | |
| 66 repository['owner']) | |
| 67 if not installable_revisions: # | |
| 68 raise LookupError("Repo does not exist in tool shed: {0}".format(repository)) | |
| 69 repository['changeset_revision'] = installable_revisions[-1] | |
| 70 | |
| 71 return repository | |
| 72 | |
| 73 | |
| 74 def flatten_repo_info(repositories): | |
| 75 """ | |
| 76 Flatten the dict containing info about what tools to install. | |
| 77 The tool definition YAML file allows multiple revisions to be listed for | |
| 78 the same tool. To enable simple, iterative processing of the info in this | |
| 79 script, flatten the `tools_info` list to include one entry per tool revision. | |
| 80 | |
| 81 :type repositories: list of dicts | |
| 82 :param repositories: Each dict in this list should contain info about a tool. | |
| 83 :rtype: list of dicts | |
| 84 :return: Return a list of dicts that correspond to the input argument such | |
| 85 that if an input element contained `revisions` key with multiple | |
| 86 values, those will be returned as separate list items. | |
| 87 """ | |
| 88 | |
| 89 flattened_list = [] | |
| 90 for repo_info in repositories: | |
| 91 new_repo_info = dict() | |
| 92 for key, value in repo_info.items(): | |
| 93 if key in VALID_KEYS: | |
| 94 new_repo_info[key] = value | |
| 95 if 'revisions' in repo_info: | |
| 96 revisions = repo_info.get('revisions', []) | |
| 97 if not revisions: # Revisions are empty list or None | |
| 98 flattened_list.append(new_repo_info) | |
| 99 else: | |
| 100 for revision in revisions: | |
| 101 # A new dictionary must be created, otherwise there will | |
| 102 # be aliasing of dictionaries. Which leads to multiple | |
| 103 # repos with the same revision in the end result. | |
| 104 new_revision_dict = dict(**new_repo_info) | |
| 105 new_revision_dict['changeset_revision'] = revision | |
| 106 flattened_list.append(new_revision_dict) | |
| 107 else: # Revision was not defined at all | |
| 108 flattened_list.append(new_repo_info) | |
| 109 return flattened_list |
