Swap all odicts for OrderedDicts, remove galaxy.util.odict

This commit is contained in:
Dannon Baker
2019-08-18 19:25:44 +01:00
committed by Nicola Soranzo
parent 95ff5ac381
commit d6cf262ffe
54 changed files with 538 additions and 266 deletions
+6 -6
View File
@@ -8,6 +8,7 @@ import shutil
import string
import tempfile
import zipfile
from collections import OrderedDict
from inspect import isclass
import six
@@ -25,7 +26,6 @@ from galaxy.util import (
unicodify
)
from galaxy.util.bunch import Bunch
from galaxy.util.odict import odict
from galaxy.util.sanitize_html import sanitize_html
from . import (
dataproviders,
@@ -100,7 +100,7 @@ class Data(object):
allow_datatype_change = True
# Composite datatypes
composite_type = None
composite_files = odict()
composite_files = OrderedDict()
primary_file_name = 'index'
# A per datatype setting (inherited): max file size (in bytes) for setting optional metadata
_max_optional_metadata_filesize = None
@@ -116,7 +116,7 @@ class Data(object):
object.__init__(self, **kwd)
self.supported_display_apps = self.supported_display_apps.copy()
self.composite_files = self.composite_files.copy()
self.display_applications = odict()
self.display_applications = OrderedDict()
def get_raw_data(self, dataset):
"""Returns the full data. To stream it open the file_name and read/write as needed"""
@@ -546,7 +546,7 @@ class Data(object):
return self.display_applications.get(key, default)
def get_display_applications_by_dataset(self, dataset, trans):
rval = odict()
rval = OrderedDict()
for key, value in self.display_applications.items():
value = value.filter_by_dataset(dataset, trans)
if value.links:
@@ -666,7 +666,7 @@ class Data(object):
@property
def writable_files(self, dataset=None):
files = odict()
files = OrderedDict()
if self.composite_type != 'auto_primary_file':
files[self.primary_file_name] = self.__new_composite_file(self.primary_file_name)
for key, value in self.get_composite_files(dataset=dataset).items():
@@ -682,7 +682,7 @@ class Data(object):
meta_value = self.metadata_spec[composite_file.substitute_name_with_metadata].default
return key % meta_value
return key
files = odict()
files = OrderedDict()
for key, value in self.composite_files.items():
files[substitute_composite_key(key, value)] = value
return files
+5 -5
View File
@@ -6,7 +6,7 @@ from __future__ import absolute_import
import imp
import logging
import os
from collections import OrderedDict as odict
from collections import OrderedDict
from string import Template
from xml.etree.ElementTree import Element
@@ -42,7 +42,7 @@ class Registry(object):
self.config = config
self.datatypes_by_extension = {}
self.mimetypes_by_extension = {}
self.datatype_converters = odict()
self.datatype_converters = OrderedDict()
# Converters defined in local datatypes_conf.xml
self.converters = []
# Converters defined in datatypes_conf.xml included in installed tool shed repositories.
@@ -58,7 +58,7 @@ class Registry(object):
# tool shed repositories that contain display applications.
self.proprietary_display_app_containers = []
# Map a display application id to a display application
self.display_applications = odict()
self.display_applications = OrderedDict()
# The following 2 attributes are used in the to_xml_file()
# method to persist the current state into an xml file.
self.display_path_attr = None
@@ -636,7 +636,7 @@ class Registry(object):
else:
toolbox.register_tool(converter)
if source_datatype not in self.datatype_converters:
self.datatype_converters[source_datatype] = odict()
self.datatype_converters[source_datatype] = OrderedDict()
self.datatype_converters[source_datatype][target_datatype] = converter
if not hasattr(toolbox.app, 'tool_cache') or converter.id in toolbox.app.tool_cache._new_tool_ids:
self.log.debug("Loaded converter: %s", converter.id)
@@ -874,7 +874,7 @@ class Registry(object):
def get_converters_by_datatype(self, ext):
"""Returns available converters by source type"""
if ext not in self._converters_by_datatype:
converters = odict()
converters = OrderedDict()
source_datatype = type(self.get_datatype_by_extension(ext))
for ext2, converters_dict in self.datatype_converters.items():
converter_datatype = type(self.get_datatype_by_extension(ext2))
+2 -2
View File
@@ -2,12 +2,12 @@
Provides utilities for working with GFF files.
"""
import copy
from collections import OrderedDict
from bx.intervals.io import GenomicInterval, GenomicIntervalReader, MissingFieldError, NiceReaderWrapper, ParseError
from bx.tabular.io import Comment, Header
from galaxy.util import unicodify
from galaxy.util.odict import odict
FASTA_DIRECTIVE = '##FASTA'
@@ -427,7 +427,7 @@ def read_unordered_gtf(iterator, strict=False):
return fields[0] + '_' + get_transcript_id(fields)
# Aggregate intervals by transcript_id and collect comments.
feature_intervals = odict()
feature_intervals = OrderedDict()
comments = []
for count, line in enumerate(iterator):
if line.startswith('#'):
+4 -4
View File
@@ -4,6 +4,7 @@ import logging
import operator
import os
import re
from collections import OrderedDict
from tempfile import NamedTemporaryFile
import galaxy.model
@@ -27,7 +28,6 @@ from galaxy.tool_util.parser.output_collection_def import (
ToolProvidedMetadataDatasetCollection,
)
from galaxy.util import (
odict,
unicodify
)
@@ -194,7 +194,7 @@ class JobContext(ModelPersistenceContext):
return self.app.tag_handler
def find_files(self, output_name, collection, dataset_collectors):
filenames = odict.odict()
filenames = OrderedDict()
for discovered_file in discover_files(output_name, self.tool_provided_metadata, dataset_collectors, self.job_working_directory, collection):
filenames[discovered_file.path] = discovered_file
return filenames
@@ -267,7 +267,7 @@ def collect_primary_datasets(job_context, output, input_ext):
dataset_collectors = [DEFAULT_DATASET_COLLECTOR]
if name in tool.outputs:
dataset_collectors = [dataset_collector(description) for description in tool.outputs[name].dataset_collector_descriptions]
filenames = odict.odict()
filenames = OrderedDict()
for discovered_file in discover_files(name, job_context.tool_provided_metadata, dataset_collectors, job_working_directory, outdata):
filenames[discovered_file.path] = discovered_file
for filename_index, (filename, discovered_file) in enumerate(filenames.items()):
@@ -284,7 +284,7 @@ def collect_primary_datasets(job_context, output, input_ext):
primary_output_assigned = True
continue
if name not in primary_datasets:
primary_datasets[name] = odict.odict()
primary_datasets[name] = OrderedDict()
visible = fields_match.visible
ext = fields_match.ext
if ext == "input":
+6 -6
View File
@@ -1,4 +1,5 @@
import logging
from collections import OrderedDict
from galaxy import model
from galaxy.exceptions import (
@@ -18,7 +19,6 @@ from galaxy.model.dataset_collections.matching import MatchingCollections
from galaxy.model.dataset_collections.registry import DATASET_COLLECTION_TYPES_REGISTRY
from galaxy.model.dataset_collections.type_description import COLLECTION_TYPE_DESCRIPTION_FACTORY
from galaxy.util import (
odict,
validation
)
@@ -358,7 +358,7 @@ class DatasetCollectionManager(object):
if elements is self.ELEMENTS_UNINITIALIZED:
return
new_elements = odict.odict()
new_elements = OrderedDict()
for key, element in elements.items():
if isinstance(element, model.DatasetCollection):
continue
@@ -367,7 +367,7 @@ class DatasetCollectionManager(object):
continue
# element is a dict with src new_collection and
# and odict of named elements
# and OrderedDict of named elements
collection_type = element.get("collection_type", None)
sub_elements = element["elements"]
collection = self.create_dataset_collection(
@@ -381,7 +381,7 @@ class DatasetCollectionManager(object):
elements.update(new_elements)
def __load_elements(self, trans, element_identifiers, hide_source_items=False, copy_elements=False):
elements = odict.odict()
elements = OrderedDict()
for element_identifier in element_identifiers:
elements[element_identifier["name"]] = self.__load_element(trans,
element_identifier=element_identifier,
@@ -477,7 +477,7 @@ class DatasetCollectionManager(object):
def _build_elements_from_rule_data(self, collection_type_description, rule_set, data, sources, handle_dataset):
identifier_columns = rule_set.identifier_columns
elements = odict.odict()
elements = OrderedDict()
for data_index, row_data in enumerate(data):
# For each row, find place in depth for this element.
collection_type_at_depth = collection_type_description
@@ -508,7 +508,7 @@ class DatasetCollectionManager(object):
sub_collection = {}
sub_collection["src"] = "new_collection"
sub_collection["collection_type"] = collection_type_at_depth.collection_type
sub_collection["elements"] = odict.odict()
sub_collection["elements"] = OrderedDict()
elements_at_depth[identifier] = sub_collection
elements_at_depth = sub_collection["elements"]
@@ -1,5 +1,6 @@
from collections import OrderedDict
from galaxy import model
from galaxy.util.odict import odict
from .type_description import COLLECTION_TYPE_DESCRIPTION_FACTORY
@@ -34,7 +35,7 @@ class CollectionBuilder(object):
def __init__(self, collection_type_description):
self._collection_type_description = collection_type_description
self._current_elements = odict()
self._current_elements = OrderedDict()
def replace_elements_in_collection(self, template_collection, replacement_dict):
self._current_elements = self._replace_elements_in_collection(
@@ -43,7 +44,7 @@ class CollectionBuilder(object):
)
def _replace_elements_in_collection(self, template_collection, replacement_dict):
elements = odict()
elements = OrderedDict()
for element in template_collection.elements:
if element.is_collection:
collection_builder = CollectionBuilder(
@@ -77,7 +78,7 @@ class CollectionBuilder(object):
def build_elements(self):
elements = self._current_elements
if self._nested_collection:
new_elements = odict()
new_elements = OrderedDict()
for identifier, element in elements.items():
new_elements[identifier] = element.build()
elements = new_elements
+3 -3
View File
@@ -11,6 +11,7 @@ import shutil
import sys
import tempfile
import weakref
from collections import OrderedDict
from os.path import abspath
from six import string_types
@@ -26,7 +27,6 @@ from galaxy.util import (
)
from galaxy.util.json import safe_dumps
from galaxy.util.object_wrapper import sanitize_lists_to_string
from galaxy.util.odict import odict
log = logging.getLogger(__name__)
@@ -214,7 +214,7 @@ class MetadataCollection(object):
return None
class MetadataSpecCollection(odict):
class MetadataSpecCollection(OrderedDict):
"""
A simple extension of dict which allows cleaner access to items
and allows the values to be iterated over directly as if it were a
@@ -223,7 +223,7 @@ class MetadataSpecCollection(odict):
"""
def __init__(self, dict=None):
odict.__init__(self, dict=None)
OrderedDict.__init__(self, dict=None)
def append(self, item):
self[item.name] = item
+6 -4
View File
@@ -8,7 +8,10 @@ corresponding to files in other contexts.
import abc
import logging
import os
from collections import namedtuple
from collections import (
namedtuple,
OrderedDict
)
import six
@@ -19,8 +22,7 @@ from galaxy.exceptions import (
)
from galaxy.model.dataset_collections import builder
from galaxy.util import (
ExecutionTimer,
odict
ExecutionTimer
)
from galaxy.util.hash_util import HASH_NAME_MAP
@@ -436,7 +438,7 @@ def persist_target_to_export_store(target_dict, export_store, object_store, work
def persist_elements_to_hdca(model_persistence_context, elements, hdca, collector=None):
filenames = odict.odict()
filenames = OrderedDict()
def add_to_discovered_files(elements, parent_identifiers=[]):
for element in elements:
+2 -2
View File
@@ -11,6 +11,7 @@ import random
import shutil
import threading
import time
from collections import OrderedDict
from xml.etree import ElementTree
import yaml
@@ -26,7 +27,6 @@ from galaxy.util import (
umask_fix_perms,
)
from galaxy.util.bunch import Bunch
from galaxy.util.odict import odict
from galaxy.util.path import (
safe_makedirs,
safe_relpath,
@@ -804,7 +804,7 @@ class HierarchicalObjectStore(NestedObjectStore):
"""The default contructor. Extends `NestedObjectStore`."""
super(HierarchicalObjectStore, self).__init__(config, config_dict)
backends = odict()
backends = OrderedDict()
for order, backend_def in enumerate(config_dict["backends"]):
backends[order] = build_object_store_from_config(config, config_dict=backend_def, fsmon=fsmon)
+3 -3
View File
@@ -3,11 +3,11 @@ Contains OpenID provider functionality
"""
import logging
import os
from collections import OrderedDict
import six
from galaxy.util import parse_xml, string_as_bool
from galaxy.util.odict import odict
log = logging.getLogger(__name__)
@@ -116,7 +116,7 @@ class OpenIDProviders(object):
@classmethod
def from_elem(cls, xml_root):
oid_elem = xml_root
providers = odict()
providers = OrderedDict()
for elem in oid_elem.findall('provider'):
try:
provider = OpenIDProvider.from_file(os.path.join('lib/galaxy/openid', elem.get('file')))
@@ -130,7 +130,7 @@ class OpenIDProviders(object):
if providers:
self.providers = providers
else:
self.providers = odict()
self.providers = OrderedDict()
self._banned_identifiers = [provider.op_endpoint_url for provider in self.providers.values() if provider.never_associate_with_user]
def __iter__(self):
+2 -2
View File
@@ -11,13 +11,13 @@ import logging
import os
import pickle
from abc import ABCMeta, abstractmethod
from collections import OrderedDict
import six
from galaxy.exceptions import MessageException
from galaxy.util import listify, safe_makedirs
from galaxy.util.bunch import Bunch
from galaxy.util.odict import odict
from .cwltool_deps import (
ensure_cwltool_available,
pathmapper,
@@ -1091,7 +1091,7 @@ class ConditionalInstance(object):
name=self.name,
type=INPUT_TYPE.CONDITIONAL,
test=self.case.to_dict(),
when=odict(),
when=OrderedDict(),
)
for value, block in self.whens:
as_dict["when"][value] = [i.to_dict() for i in block]
+3 -3
View File
@@ -1,9 +1,9 @@
import logging
import os
from collections import OrderedDict
from galaxy.tool_util.cwl import tool_proxy
from galaxy.tool_util.deps import requirements
from galaxy.util.odict import odict
from .error_level import StdioErrorLevel
from .interface import (
PageSource,
@@ -104,14 +104,14 @@ class CwlToolSource(ToolSource):
def parse_outputs(self, tool):
output_instances = self.tool_proxy.output_instances()
outputs = odict()
outputs = OrderedDict()
output_defs = []
for output_instance in output_instances:
output_defs.append(self._parse_output(tool, output_instance))
# TODO: parse outputs collections
for output_def in output_defs:
outputs[output_def.name] = output_def
return outputs, odict()
return outputs, OrderedDict()
def _parse_output(self, tool, output_instance):
name = output_instance.name
+2 -2
View File
@@ -2,11 +2,11 @@
from __future__ import absolute_import
import logging
from collections import OrderedDict
import yaml
from galaxy.tool_util.loader import load_tool_with_refereces
from galaxy.util.odict import odict
from .cwl import CwlToolSource
from .interface import InputSource
from .xml import XmlInputSource, XmlToolSource
@@ -54,7 +54,7 @@ def ordered_load(stream):
def construct_mapping(loader, node):
loader.flatten_mapping(node)
return odict(loader.construct_pairs(node))
return OrderedDict(loader.construct_pairs(node))
OrderedLoader.add_constructor(
yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
@@ -1,5 +1,6 @@
from collections import OrderedDict
from galaxy.util.dictifiable import Dictifiable
from galaxy.util.odict import odict
from .output_actions import ToolOutputActionGroup
from .output_collection_def import dataset_collector_descriptions_from_output_dict
@@ -152,7 +153,7 @@ class ToolOutputCollection(ToolOutputBase):
self.collection = True
self.default_format = default_format
self.structure = structure
self.outputs = odict()
self.outputs = OrderedDict()
self.inherit_format = inherit_format
self.inherit_metadata = inherit_metadata
+3 -2
View File
@@ -1,11 +1,12 @@
from galaxy.util.odict import odict
from collections import OrderedDict
from .error_level import StdioErrorLevel
from .interface import ToolStdioExitCode
from .interface import ToolStdioRegex
def is_dict(item):
return isinstance(item, dict) or isinstance(item, odict)
return isinstance(item, dict) or isinstance(item, OrderedDict)
def error_on_exit_code(out_of_memory_exit_code=None):
+4 -4
View File
@@ -3,13 +3,13 @@ import re
import sys
import traceback
import uuid
from collections import OrderedDict
from math import isinf
import packaging.version
from galaxy.tool_util.deps import requirements
from galaxy.util import string_as_bool, xml_text, xml_to_string
from galaxy.util.odict import odict
from .error_level import StdioErrorLevel
from .interface import (
InputSource,
@@ -261,12 +261,12 @@ class XmlToolSource(ToolSource):
def parse_outputs(self, tool):
out_elem = self.root.find("outputs")
outputs = odict()
output_collections = odict()
outputs = OrderedDict()
output_collections = OrderedDict()
if out_elem is None:
return outputs, output_collections
data_dict = odict()
data_dict = OrderedDict()
def _parse(data_elem, **kwds):
output_def = self._parse_output(data_elem, tool, **kwds)
+4 -3
View File
@@ -1,7 +1,8 @@
from collections import OrderedDict
import packaging.version
from galaxy.tool_util.deps import requirements
from galaxy.util.odict import odict
from .interface import InputSource
from .interface import PageSource
from .interface import PagesSource
@@ -105,10 +106,10 @@ class YamlToolSource(ToolSource):
else:
message = "Unknown output_type [%s] encountered." % output_type
raise Exception(message)
outputs = odict()
outputs = OrderedDict()
for output in output_defs:
outputs[output.name] = output
output_collections = odict()
output_collections = OrderedDict()
for output in output_collection_defs:
output_collections[output.name] = output
+17 -18
View File
@@ -91,7 +91,6 @@ from galaxy.util.dictifiable import Dictifiable
from galaxy.util.expressions import ExpressionContext
from galaxy.util.form_builder import SelectField
from galaxy.util.json import safe_loads
from galaxy.util.odict import odict
from galaxy.util.rules_dsl import RuleSet
from galaxy.util.template import fill_template
from galaxy.version import VERSION_MAJOR
@@ -422,7 +421,7 @@ class Tool(Dictifiable):
self.repository_id = repository_id
self._allow_code_files = allow_code_files
# setup initial attribute values
self.inputs = odict()
self.inputs = OrderedDict()
self.stdio_exit_codes = list()
self.stdio_regexes = list()
self.inputs_by_page = list()
@@ -1084,7 +1083,7 @@ class Tool(Dictifiable):
groups (repeat, conditional) or param elements. Groups will be parsed
recursively.
"""
rval = odict()
rval = OrderedDict()
context = ExpressionContext(rval, context)
for input_source in page_source.parse_input_sources():
# Repeat group
@@ -1125,7 +1124,7 @@ class Tool(Dictifiable):
page_source = XmlPageSource(ElementTree.XML("<when>%s</when>" % case_inputs))
case.inputs = self.parse_input_elem(page_source, enctypes, context)
else:
case.inputs = odict()
case.inputs = OrderedDict()
group.cases.append(case)
else:
# Should have one child "input" which determines the case
@@ -1153,7 +1152,7 @@ class Tool(Dictifiable):
(self.id, group.name, group.test_param.name, unspecified_case))
case = ConditionalWhen()
case.value = unspecified_case
case.inputs = odict()
case.inputs = OrderedDict()
group.cases.append(case)
rval[group.name] = group
elif input_type == "section":
@@ -1494,7 +1493,7 @@ class Tool(Dictifiable):
log.exception('Exception caught while attempting tool execution:')
message = 'Error executing tool: %s' % unicodify(e)
return False, message
if isinstance(out_data, odict):
if isinstance(out_data, OrderedDict):
return job, list(out_data.items())
else:
if isinstance(out_data, string_types):
@@ -2567,7 +2566,7 @@ class DatabaseOperationTool(Tool):
return self._outputs_dict()
def _outputs_dict(self):
return odict()
return OrderedDict()
class UnzipCollectionTool(DatabaseOperationTool):
@@ -2599,7 +2598,7 @@ class ZipCollectionTool(DatabaseOperationTool):
reverse_o = incoming["input_reverse"]
forward, reverse = forward_o.copy(), reverse_o.copy()
new_elements = odict()
new_elements = OrderedDict()
new_elements["forward"] = forward
new_elements["reverse"] = reverse
self._add_datasets_to_history(history, [forward, reverse])
@@ -2612,7 +2611,7 @@ class BuildListCollectionTool(DatabaseOperationTool):
tool_type = 'build_list'
def produce_outputs(self, trans, out_data, output_collections, incoming, history, tags=None):
new_elements = odict()
new_elements = OrderedDict()
for i, incoming_repeat in enumerate(incoming["datasets"]):
new_dataset = incoming_repeat["input"].copy(copy_tags=tags)
@@ -2672,7 +2671,7 @@ class MergeCollectionTool(DatabaseOperationTool):
if dupl_actions in ['suffix_conflict', 'suffix_every', 'suffix_conflict_rest']:
suffix_pattern = advanced['conflict']['suffix_pattern']
new_element_structure = odict()
new_element_structure = OrderedDict()
# Which inputs does the identifier appear in.
identifiers_map = {}
@@ -2724,7 +2723,7 @@ class MergeCollectionTool(DatabaseOperationTool):
new_element_structure[effective_identifer] = element
# Don't copy until we know everything is fine and we have the structure of the list ready to go.
new_elements = odict()
new_elements = OrderedDict()
for key, value in new_element_structure.items():
if getattr(value, "history_content_type", None) == "dataset":
copied_value = value.copy(force_flush=False)
@@ -2741,7 +2740,7 @@ class MergeCollectionTool(DatabaseOperationTool):
class FilterDatasetsTool(DatabaseOperationTool):
def _get_new_elements(self, history, elements_to_copy):
new_elements = odict()
new_elements = OrderedDict()
for dce in elements_to_copy:
element_identifier = dce.element_identifier
if getattr(dce.element_object, "history_content_type", None) == "dataset":
@@ -2809,7 +2808,7 @@ class FlattenTool(DatabaseOperationTool):
def produce_outputs(self, trans, out_data, output_collections, incoming, history, **kwds):
hdca = incoming["input"]
join_identifier = incoming["join_identifier"]
new_elements = odict()
new_elements = OrderedDict()
copied_datasets = []
def add_elements(collection, prefix=""):
@@ -2837,7 +2836,7 @@ class SortTool(DatabaseOperationTool):
def produce_outputs(self, trans, out_data, output_collections, incoming, history, **kwds):
hdca = incoming["input"]
sorttype = incoming["sort_type"]["sort_type"]
new_elements = odict()
new_elements = OrderedDict()
elements = hdca.collection.elements
presort_elements = []
if sorttype == 'alpha':
@@ -2882,7 +2881,7 @@ class RelabelFromFileTool(DatabaseOperationTool):
how_type = incoming["how"]["how_select"]
new_labels_dataset_assoc = incoming["how"]["labels"]
strict = string_as_bool(incoming["how"]["strict"])
new_elements = odict()
new_elements = OrderedDict()
def add_copied_value_to_new_elements(new_label, dce_object):
new_label = new_label.strip()
@@ -2954,7 +2953,7 @@ class TagFromFileTool(DatabaseOperationTool):
hdca = incoming["input"]
how = incoming['how']
new_tags_dataset_assoc = incoming["tags"]
new_elements = odict()
new_elements = OrderedDict()
tags_manager = GalaxyTagHandler(trans.app.model.context)
new_datasets = []
@@ -3015,8 +3014,8 @@ class FilterFromFileTool(DatabaseOperationTool):
hdca = incoming["input"]
how_filter = incoming["how"]["how_filter"]
filter_dataset_assoc = incoming["how"]["filter_source"]
filtered_elements = odict()
discarded_elements = odict()
filtered_elements = OrderedDict()
discarded_elements = OrderedDict()
filtered_path = filter_dataset_assoc.file_name
filtered_identifiers_raw = open(filtered_path, "r").readlines(1024 * 1000000)
+4 -4
View File
@@ -2,6 +2,7 @@ import json
import logging
import os
import re
from collections import OrderedDict
from json import dumps
from six import string_types
@@ -16,7 +17,6 @@ from galaxy.tools.parameters import update_dataset_ids
from galaxy.tools.parameters.basic import DataCollectionToolParameter, DataToolParameter, RuntimeValue
from galaxy.tools.parameters.wrapped import WrappedParameters
from galaxy.util import ExecutionTimer
from galaxy.util.odict import odict
from galaxy.util.template import fill_template
from galaxy.web import url_for
@@ -68,7 +68,7 @@ class DefaultToolAction(object):
"""
if current_user_roles is None:
current_user_roles = trans.get_current_user_roles()
input_datasets = odict()
input_datasets = OrderedDict()
all_permissions = {}
def record_permission(action, role_id):
@@ -337,7 +337,7 @@ class DefaultToolAction(object):
# wrapped params are used by change_format action and by output.label; only perform this wrapping once, as needed
wrapped_params = self._wrapped_params(trans, tool, incoming, inp_data)
out_data = odict()
out_data = OrderedDict()
input_collections = dict((k, v[0][0]) for k, v in inp_dataset_collections.items())
output_collections = OutputCollections(
trans,
@@ -824,7 +824,7 @@ class OutputCollections(object):
# We don't care about the repeat index, we just need to find the correct DataCollectionToolParameter
else:
key = group
if isinstance(data_param, odict):
if isinstance(data_param, OrderedDict):
data_param = data_param.get(key)
else:
data_param = data_param.inputs.get(key)
+3 -3
View File
@@ -1,10 +1,10 @@
import logging
import os
import tempfile
from collections import OrderedDict
from galaxy.tools.actions import ToolAction
from galaxy.tools.imp_exp import JobExportHistoryArchiveWrapper
from galaxy.util.odict import odict
log = logging.getLogger(__name__)
@@ -62,7 +62,7 @@ class ImportHistoryToolAction(ToolAction):
trans.app.job_manager.enqueue(job, tool=tool)
trans.log_event("Added import history job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id)
return job, odict()
return job, OrderedDict()
class ExportHistoryToolAction(ToolAction):
@@ -141,4 +141,4 @@ class ExportHistoryToolAction(ToolAction):
trans.app.job_manager.enqueue(job, tool=tool)
trans.log_event("Added export history job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id)
return job, odict()
return job, OrderedDict()
+2 -2
View File
@@ -1,10 +1,10 @@
import logging
import os
from collections import OrderedDict
from json import dumps
from galaxy.job_execution.datasets import DatasetPath
from galaxy.metadata import get_metadata_compute_strategy
from galaxy.util.odict import odict
from . import ToolAction
log = logging.getLogger(__name__)
@@ -118,4 +118,4 @@ class SetMetadataToolAction(ToolAction):
# clear e.g. converted files
dataset.datatype.before_setting_metadata(dataset)
return job, odict()
return job, OrderedDict()
+2 -2
View File
@@ -1,11 +1,11 @@
import logging
from collections import OrderedDict
from galaxy.tools.actions import (
DefaultToolAction,
OutputCollections,
ToolExecutionCache,
)
from galaxy.util.odict import odict
log = logging.getLogger(__name__)
@@ -36,7 +36,7 @@ class ModelOperationToolAction(DefaultToolAction):
# wrapped params are used by change_format action and by output.label; only perform this wrapping once, as needed
wrapped_params = self._wrapped_params(trans, tool, incoming)
out_data = odict()
out_data = OrderedDict()
input_collections = dict((k, v[0][0]) for k, v in inp_dataset_collections.items())
output_collections = OutputCollections(
trans,
+2 -2
View File
@@ -5,6 +5,7 @@ import shlex
import socket
import subprocess
import tempfile
from collections import OrderedDict
from json import dump, dumps
from six import StringIO
@@ -16,7 +17,6 @@ from galaxy import datatypes, util
from galaxy.exceptions import ConfigDoesNotAllowException, ObjectInvalid
from galaxy.model import tags
from galaxy.util import unicodify
from galaxy.util.odict import odict
log = logging.getLogger(__name__)
@@ -442,7 +442,7 @@ def create_job(trans, params, tool, json_file_path, outputs, folder=None, histor
# Queue the job for execution
trans.app.job_manager.enqueue(job, tool=tool)
trans.log_event("Added job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id)
output = odict()
output = OrderedDict()
for i, v in enumerate(outputs):
if not hasattr(output_object, "collection_type"):
output['output%i' % i] = v
+2 -2
View File
@@ -14,6 +14,7 @@ import os.path
import re
import string
import time
from collections import OrderedDict
from glob import glob
from tempfile import NamedTemporaryFile
from xml.etree import ElementTree
@@ -22,7 +23,6 @@ import requests
from galaxy import util
from galaxy.util.dictifiable import Dictifiable
from galaxy.util.odict import odict
from galaxy.util.renamed_temporary_file import RenamedTemporaryFile
log = logging.getLogger(__name__)
@@ -251,7 +251,7 @@ class ToolDataTable(object):
self.empty_field_values = {}
self.allow_duplicate_entries = util.asbool(config_element.get('allow_duplicate_entries', True))
self.here = filename and os.path.dirname(filename)
self.filenames = odict()
self.filenames = OrderedDict()
self.tool_data_path = tool_data_path
self.tool_data_path_files = tool_data_path_files
self.missing_index_file = None
+5 -5
View File
@@ -2,6 +2,7 @@ import errno
import json
import logging
import os
from collections import OrderedDict
from six import string_types
@@ -10,7 +11,6 @@ from galaxy.queue_worker import (
send_control_task
)
from galaxy.tools.data import TabularToolDataTable
from galaxy.util.odict import odict
from galaxy.util.template import fill_template
from tool_shed.util import (
common_util,
@@ -27,8 +27,8 @@ DEFAULT_VALUE_TRANSLATION_TYPE = 'template'
class DataManagers(object):
def __init__(self, app, xml_filename=None):
self.app = app
self.data_managers = odict()
self.managed_data_tables = odict()
self.data_managers = OrderedDict()
self.managed_data_tables = OrderedDict()
self.tool_path = None
self._reload_count = 0
self.filename = xml_filename or self.app.config.data_manager_config_file
@@ -131,7 +131,7 @@ class DataManager(object):
self.version = self.DEFAULT_VERSION
self.guid = None
self.tool = None
self.data_tables = odict()
self.data_tables = OrderedDict()
self.output_ref_by_data_table = {}
self.move_by_data_table_column = {}
self.value_translation_by_data_table_column = {}
@@ -213,7 +213,7 @@ class DataManager(object):
data_table_name = data_table_elem.get("name")
assert data_table_name is not None, "A name is required for a data table entry"
if data_table_name not in self.data_tables:
self.data_tables[data_table_name] = odict()
self.data_tables[data_table_name] = OrderedDict()
output_elem = data_table_elem.find('output')
if output_elem is not None:
for column_elem in output_elem.findall('column'):
+12 -12
View File
@@ -30,7 +30,7 @@ def visit_input_values(inputs, input_values, callback, name_prefix='', label_pre
>>> from xml.etree.ElementTree import XML
>>> from galaxy.util.bunch import Bunch
>>> from galaxy.util.odict import odict
>>> from collections import OrderedDict
>>> from galaxy.tools.parameters.basic import TextToolParameter, BooleanToolParameter
>>> from galaxy.tools.parameters.grouping import Repeat
>>> a = TextToolParameter(None, XML('<param name="a"/>'))
@@ -44,9 +44,9 @@ def visit_input_values(inputs, input_values, callback, name_prefix='', label_pre
>>> i = TextToolParameter(None, XML('<param name="i"/>'))
>>> j = TextToolParameter(None, XML('<param name="j"/>'))
>>> b.name = b.title = 'b'
>>> b.inputs = odict([ ('c', c), ('d', d) ])
>>> b.inputs = OrderedDict([ ('c', c), ('d', d) ])
>>> d.name = d.title = 'd'
>>> d.inputs = odict([ ('e', e), ('f', f) ])
>>> d.inputs = OrderedDict([ ('e', e), ('f', f) ])
>>> f.test_param = g
>>> f.name = 'f'
>>> f.cases = [Bunch(value='true', inputs= {'h': h}), Bunch(value='false', inputs= { 'i': i })]
@@ -55,8 +55,8 @@ def visit_input_values(inputs, input_values, callback, name_prefix='', label_pre
... print('name=%s, prefix=%s, prefixed_name=%s, prefixed_label=%s, value=%s' % (input.name, prefix, prefixed_name, prefixed_label, value))
... if error:
... print(error)
>>> inputs = odict([('a', a),('b', b)])
>>> nested = odict([('a', 1), ('b', [odict([('c', 3), ('d', [odict([ ('e', 5), ('f', odict([ ('g', True), ('h', 7)]))])])])])])
>>> inputs = OrderedDict([('a', a),('b', b)])
>>> nested = OrderedDict([('a', 1), ('b', [OrderedDict([('c', 3), ('d', [OrderedDict([ ('e', 5), ('f', OrderedDict([ ('g', True), ('h', 7)]))])])])])])
>>> visit_input_values(inputs, nested, visitor)
name=a, prefix=, prefixed_name=a, prefixed_label=a, value=1
name=c, prefix=b_0|, prefixed_name=b_0|c, prefixed_label=b 1 > c, value=3
@@ -104,7 +104,7 @@ def visit_input_values(inputs, input_values, callback, name_prefix='', label_pre
No value found for 'b 1 > d 1 > j'.
>>> # Other parameters are missing in state
>>> nested = odict([('b', [odict([( 'd', [odict([('f', odict([('g', True), ('h', 7)]))])])])])])
>>> nested = OrderedDict([('b', [OrderedDict([( 'd', [OrderedDict([('f', OrderedDict([('g', True), ('h', 7)]))])])])])])
>>> visit_input_values(inputs, nested, visitor)
name=a, prefix=, prefixed_name=a, prefixed_label=a, value=None
No value found for 'a'.
@@ -271,7 +271,7 @@ def populate_state(request_context, inputs, incoming, state, errors={}, prefix='
Populates nested state dict from incoming parameter values.
>>> from xml.etree.ElementTree import XML
>>> from galaxy.util.bunch import Bunch
>>> from galaxy.util.odict import odict
>>> from collections import OrderedDict
>>> from galaxy.tools.parameters.basic import TextToolParameter, BooleanToolParameter
>>> from galaxy.tools.parameters.grouping import Repeat
>>> trans = Bunch(workflow_building_mode=False)
@@ -289,15 +289,15 @@ def populate_state(request_context, inputs, incoming, state, errors={}, prefix='
>>> h = TextToolParameter(None, XML('<param name="h"/>'))
>>> i = TextToolParameter(None, XML('<param name="i"/>'))
>>> b.name = 'b'
>>> b.inputs = odict([('c', c), ('d', d)])
>>> b.inputs = OrderedDict([('c', c), ('d', d)])
>>> d.name = 'd'
>>> d.inputs = odict([('e', e), ('f', f)])
>>> d.inputs = OrderedDict([('e', e), ('f', f)])
>>> f.test_param = g
>>> f.name = 'f'
>>> f.cases = [Bunch(value='true', inputs= { 'h': h }), Bunch(value='false', inputs= { 'i': i })]
>>> inputs = odict([('a',a),('b',b)])
>>> flat = odict([('a', 1), ('b_0|c', 2), ('b_0|d_0|e', 3), ('b_0|d_0|f|h', 4), ('b_0|d_0|f|g', True)])
>>> state = odict()
>>> inputs = OrderedDict([('a',a),('b',b)])
>>> flat = OrderedDict([('a', 1), ('b_0|c', 2), ('b_0|d_0|e', 3), ('b_0|d_0|f|h', 4), ('b_0|d_0|f|g', True)])
>>> state = OrderedDict()
>>> populate_state(trans, inputs, flat, state, check=False)
>>> print(state['a'])
1
+5 -3
View File
@@ -3,7 +3,10 @@ import logging
import os
import string
import time
from collections import namedtuple
from collections import (
namedtuple,
OrderedDict
)
from errno import ENOENT
from xml.etree.ElementTree import ParseError
@@ -23,7 +26,6 @@ from galaxy.util import (
)
from galaxy.util.bunch import Bunch
from galaxy.util.dictifiable import Dictifiable
from galaxy.util.odict import odict
from .filters import FilterFactory
from .integrated_panel import ManagesIntegratedToolPanelMixin
from .lineages import LineageMap
@@ -82,7 +84,7 @@ class AbstractToolBox(Dictifiable, ManagesIntegratedToolPanelMixin):
# In-memory dictionary that defines the layout of the tool panel.
self._tool_panel = ToolPanelElements()
self._index = 0
self.data_manager_tools = odict()
self.data_manager_tools = OrderedDict()
self._lineage_map = LineageMap(app)
# Sets self._integrated_tool_panel and self._integrated_tool_panel_config_has_contents
self._init_integrated_tool_panel(app.config)
+2 -2
View File
@@ -1,10 +1,10 @@
from abc import abstractmethod
from collections import OrderedDict
from six import iteritems
from galaxy.util import bunch
from galaxy.util.dictifiable import Dictifiable
from galaxy.util.odict import odict
from .parser import ensure_tool_conf_item
@@ -112,7 +112,7 @@ class ToolSectionLabel(Dictifiable):
return super(ToolSectionLabel, self).to_dict()
class ToolPanelElements(odict, HasPanelItems):
class ToolPanelElements(OrderedDict, HasPanelItems):
""" Represents an ordered dictionary of tool entries - abstraction
used both by tool panel itself (normal and integrated) and its sections.
"""
+2 -2
View File
@@ -1,5 +1,6 @@
import logging
import tempfile
from collections import OrderedDict
from functools import total_ordering
from six import string_types, text_type
@@ -7,7 +8,6 @@ from six.moves import shlex_quote
from galaxy import exceptions
from galaxy.model.none_like import NoneDataset
from galaxy.util import odict
from galaxy.util.object_wrapper import wrap_with_safe_string
log = logging.getLogger(__name__)
@@ -419,7 +419,7 @@ class DatasetCollectionWrapper(ToolParameterValueWrapper, HasDatasets):
self.collection = collection
elements = collection.elements
element_instances = odict.odict()
element_instances = OrderedDict()
element_instance_list = []
for dataset_collection_element in elements:
-95
View File
@@ -1,95 +0,0 @@
"""
Ordered dictionary implementation.
"""
from six.moves import UserDict
dict_alias = dict
class odict(UserDict):
"""
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
This dictionary class extends UserDict to record the order in which items are
added. Calling keys(), values(), items(), etc. will return results in this
order.
"""
def __init__(self, dict=None):
item = dict
self._keys = []
if isinstance(item, dict_alias):
UserDict.__init__(self, item)
else:
UserDict.__init__(self, None)
if isinstance(item, list):
for (key, value) in item:
self[key] = value
def __delitem__(self, key):
UserDict.__delitem__(self, key)
self._keys.remove(key)
def __setitem__(self, key, item):
UserDict.__setitem__(self, key, item)
if key not in self._keys:
self._keys.append(key)
def clear(self):
UserDict.clear(self)
self._keys = []
def copy(self):
new = odict()
new.update(self)
return new
def items(self):
return zip(self._keys, self.values())
def keys(self):
return self._keys[:]
def popitem(self):
try:
key = self._keys[-1]
except IndexError:
raise KeyError('dictionary is empty')
val = self[key]
del self[key]
return (key, val)
def setdefault(self, key, failobj=None):
if key not in self._keys:
self._keys.append(key)
return UserDict.setdefault(self, key, failobj)
def update(self, dict):
for (key, val) in dict.items():
self.__setitem__(key, val)
def values(self):
return map(self.get, self._keys)
def iterkeys(self):
return iter(self._keys)
def itervalues(self):
for key in self._keys:
yield self.get(key)
def iteritems(self):
for key in self._keys:
yield key, self.get(key)
def __iter__(self):
for key in self._keys:
yield key
def reverse(self):
self._keys.reverse()
def insert(self, index, key, item):
if key not in self._keys:
self._keys.insert(index, key)
UserDict.__setitem__(self, key, item)
+2 -2
View File
@@ -3,7 +3,7 @@ Fencepost-simple graph structure implementation.
"""
# Currently (2013.7.12) only used in easing the parsing of graph datatype data.
from galaxy.util.odict import odict
from collections import OrderedDict
class SimpleGraphNode(object):
@@ -58,7 +58,7 @@ class SimpleGraph(object):
def __init__(self, nodes=None, edges=None):
# use an odict so that edge indeces actually match the final node list indeces
self.nodes = nodes or odict()
self.nodes = nodes or OrderedDict()
self.edges = edges or []
def add_node(self, node_id, **data):
+1 -1
View File
@@ -36,7 +36,7 @@ then CycleError is raised, and the exception object supports
many methods to help analyze and break the cycles. This requires
a good deal more code than topsort itself!
"""
from galaxy.util.odict import odict as OrderedDict
from collections import OrderedDict as OrderedDict
class CycleError(Exception):
+3 -3
View File
@@ -7,11 +7,11 @@ Lower level of visualization framework which does three main things:
import logging
import os
import weakref
from collections import OrderedDict
from galaxy.exceptions import ObjectNotFound
from galaxy.util import (
config_directories_from_setting,
odict,
parse_xml
)
from galaxy.visualization.plugins import (
@@ -66,7 +66,7 @@ class VisualizationsRegistry(object):
self.additional_template_paths = []
self.directories = []
self.skip_bad_plugins = skip_bad_plugins
self.plugins = odict.odict()
self.plugins = OrderedDict()
self.directories = config_directories_from_setting(directories_setting, app.config.root)
self._load_configuration()
self._load_plugins()
@@ -107,7 +107,7 @@ class VisualizationsRegistry(object):
"""
Search ``self.directories`` for potential plugins, load them, and cache
in ``self.plugins``.
:rtype: odict
:rtype: OrderedDict
:returns: ``self.plugins``
"""
for plugin_path in self._find_plugins():
+2 -2
View File
@@ -1,5 +1,6 @@
import logging
import math
from collections import OrderedDict
from json import dumps, loads
from markupsafe import escape
@@ -8,7 +9,6 @@ from sqlalchemy.sql.expression import and_, false, func, null, or_, true
from galaxy.model.item_attrs import get_foreign_key, UsesAnnotations, UsesItemRatings
from galaxy.util import restore_text, sanitize_text, unicodify
from galaxy.util.odict import odict
from galaxy.web.framework import decorators, url_for
@@ -873,7 +873,7 @@ class SharingStatusColumn(GridColumn):
def get_accepted_filters(self):
""" Returns a list of accepted filters for this column. """
accepted_filter_labels_and_vals = odict()
accepted_filter_labels_and_vals = OrderedDict()
accepted_filter_labels_and_vals["private"] = "private"
accepted_filter_labels_and_vals["shared"] = "shared"
accepted_filter_labels_and_vals["accessible"] = "accessible"
+3 -3
View File
@@ -1,5 +1,6 @@
import logging
import os
from collections import OrderedDict
from json import dumps, loads
import galaxy.queue_worker
@@ -7,7 +8,6 @@ from galaxy import exceptions, managers, util, web
from galaxy.managers.collections_util import dictify_dataset_collection_instance
from galaxy.tools import global_tool_errors
from galaxy.util.json import safe_dumps
from galaxy.util.odict import odict
from galaxy.web import (
expose_api,
expose_api_anonymous,
@@ -201,9 +201,9 @@ class ToolsController(BaseAPIController, UsesVisualizationMixin):
tool_version = kwd.get('tool_version', None)
tool = self._get_tool(id, tool_version=tool_version, user=trans.user)
# Encode in this method to handle odict objects in tool representation.
# Encode in this method to handle OrderedDict objects in tool representation.
def json_encodeify(obj):
if isinstance(obj, odict):
if isinstance(obj, OrderedDict):
return dict(obj)
elif isinstance(obj, map):
return list(obj)
+2 -2
View File
@@ -4,6 +4,7 @@ API operations on User objects.
import json
import logging
import re
from collections import OrderedDict
import six
from markupsafe import escape
@@ -30,7 +31,6 @@ from galaxy.util import (
docstring_trim,
listify
)
from galaxy.util.odict import odict
from galaxy.web import (
expose_api,
expose_api_anonymous
@@ -689,7 +689,7 @@ class UserAPIController(BaseAPIController, UsesTagsMixin, CreatesApiKeysMixin, B
inputs.append({'type': 'section', 'title': filter_title, 'name': filter_type, 'expanded': True, 'inputs': filter_inputs})
def _get_filter_types(self, trans):
return odict([('toolbox_tool_filters', {'title': 'Tools', 'config': trans.app.config.user_tool_filters}),
return OrderedDict([('toolbox_tool_filters', {'title': 'Tools', 'config': trans.app.config.user_tool_filters}),
('toolbox_section_filters', {'title': 'Sections', 'config': trans.app.config.user_tool_section_filters}),
('toolbox_label_filters', {'title': 'Labels', 'config': trans.app.config.user_tool_label_filters})])
@@ -2,6 +2,7 @@ import imp
import logging
import os
import time
from collections import OrderedDict
from datetime import datetime, timedelta
from string import punctuation as PUNCTUATION
@@ -23,7 +24,6 @@ from galaxy.util import (
url_get
)
from galaxy.util.hash_util import new_secure_hash
from galaxy.util.odict import odict
from galaxy.web import url_for
from galaxy.web.framework.helpers import grids, time_ago
from galaxy.web.params import QuotaParamParser
@@ -886,7 +886,7 @@ class AdminGalaxy(controller.JSAppLauncher, AdminActions, UsesQuotaMixin, QuotaP
def review_tool_migration_stages(self, trans, **kwd):
message = escape(util.restore_text(kwd.get('message', '')))
status = util.restore_text(kwd.get('status', 'done'))
migration_stages_dict = odict()
migration_stages_dict = OrderedDict()
# FIXME: this isn't valid in an installed context
migration_scripts_dir = os.path.abspath(os.path.join(trans.app.config.root, 'lib', 'tool_shed', 'galaxy_install', 'migrate', 'versions'))
modules = os.listdir(migration_scripts_dir)
@@ -1,4 +1,5 @@
import logging
from collections import OrderedDict
from markupsafe import escape
from six import string_types
@@ -15,7 +16,6 @@ from galaxy.model.item_attrs import (
UsesItemRatings
)
from galaxy.util import listify, Params, parse_int, sanitize_text
from galaxy.util.odict import odict
from galaxy.web import url_for
from galaxy.web.framework.helpers import grids, iff, time_ago
from galaxy.webapps.base.controller import (
@@ -501,7 +501,7 @@ class HistoryController(BaseUIController, SharableMixin, UsesAnnotations, UsesIt
items = []
# First go through and group hdas by job, if there is no job they get
# added directly to items
jobs = odict()
jobs = OrderedDict()
for hda in history.active_datasets:
if hda.visible is False:
continue
@@ -525,7 +525,7 @@ class HistoryController(BaseUIController, SharableMixin, UsesAnnotations, UsesIt
else:
jobs[job] = [(hda, None)]
# Second, go through the jobs and connect to workflows
wf_invocations = odict()
wf_invocations = OrderedDict()
for job, hdas in jobs.items():
# Job is attached to a workflow step, follow it to the
# workflow_invocation and group
@@ -1,5 +1,6 @@
import logging
import math
from collections import OrderedDict
from json import dumps, loads
from markupsafe import escape
@@ -8,7 +9,6 @@ from sqlalchemy.sql.expression import and_, false, func, null, or_, true
from galaxy.model.item_attrs import get_foreign_key, UsesAnnotations, UsesItemRatings
from galaxy.util import sanitize_text, unicodify
from galaxy.util.odict import odict
from galaxy.web.framework import decorators, url_for
from galaxy.web.framework.helpers import iff
@@ -765,7 +765,7 @@ class SharingStatusColumn(GridColumn):
def get_accepted_filters(self):
""" Returns a list of accepted filters for this column. """
accepted_filter_labels_and_vals = odict()
accepted_filter_labels_and_vals = OrderedDict()
accepted_filter_labels_and_vals["private"] = "private"
accepted_filter_labels_and_vals["shared"] = "shared"
accepted_filter_labels_and_vals["accessible"] = "accessible"
@@ -1,4 +1,5 @@
import logging
from collections import OrderedDict
from sqlalchemy import (
and_,
@@ -12,7 +13,6 @@ from galaxy import (
util,
web
)
from galaxy.util.odict import odict
from galaxy.web.form_builder import CheckboxField
from galaxy.webapps.base.controller import BaseUIController
from galaxy.webapps.tool_shed.util import ratings_util
@@ -240,7 +240,7 @@ class RepositoryReviewController(BaseUIController, ratings_util.ItemRatings):
status = kwd.get('status', 'done')
review_id = kwd.get('id', None)
review = review_util.get_review(trans.app, review_id)
components_dict = odict()
components_dict = OrderedDict()
for component in review_util.get_components(trans.app):
components_dict[component.name] = dict(component=component, component_review=None)
repository = review.repository
@@ -486,7 +486,7 @@ class RepositoryReviewController(BaseUIController, ratings_util.ItemRatings):
repo = hg_util.get_repo_for_repository(trans.app, repository=repository)
metadata_revision_hashes = [metadata_revision.changeset_revision for metadata_revision in repository.metadata_revisions]
reviewed_revision_hashes = [review.changeset_revision for review in repository.reviews]
reviews_dict = odict()
reviews_dict = OrderedDict()
for changeset in hg_util.get_reversed_changelog_changesets(repo):
ctx = repo.changectx(changeset)
changeset_revision = str(ctx)
+2 -2
View File
@@ -2,6 +2,7 @@
histories.
"""
import logging
from collections import OrderedDict
from galaxy import exceptions, model
from galaxy.tool_util.parser import ToolOutputCollectionPart
@@ -14,7 +15,6 @@ from galaxy.tools.parameters.grouping import (
Repeat,
Section
)
from galaxy.util.odict import odict
from .steps import (
attach_ordered_steps,
order_workflow_steps_with_levels
@@ -199,7 +199,7 @@ class WorkflowSummary(object):
history = trans.get_history()
self.history = history
self.warnings = set()
self.jobs = odict()
self.jobs = OrderedDict()
self.job_id2representative_job = {} # map a non-fake job id to its representative job
self.implicit_map_jobs = []
self.collection_types = {}
+2 -2
View File
@@ -4,6 +4,7 @@ Modules used in building workflows
import json
import logging
import re
from collections import OrderedDict
from xml.etree.ElementTree import (
Element,
XML
@@ -50,7 +51,6 @@ from galaxy.tools.parameters.wrapped import make_dict_copy
from galaxy.util import unicodify
from galaxy.util.bunch import Bunch
from galaxy.util.json import safe_loads
from galaxy.util.odict import odict
from galaxy.util.rules_dsl import RuleSet
from galaxy.util.template import fill_template
from tool_shed.util import common_util
@@ -681,7 +681,7 @@ class InputParameterModule(WorkflowModule):
# item 0 is option description, item 1 is value, item 2 is "selected"
option[2] = True
input_parameter_type.static_options[i] = tuple(option)
return odict([("parameter_type", input_parameter_type),
return OrderedDict([("parameter_type", input_parameter_type),
("optional", BooleanToolParameter(None, Element("param", name="optional", label="Optional", type="boolean", value=optional)))])
def get_runtime_inputs(self, **kwds):
+2 -2
View File
@@ -1,9 +1,9 @@
import logging
import uuid
from collections import OrderedDict
from galaxy import model
from galaxy.util import ExecutionTimer
from galaxy.util.odict import odict
from galaxy.workflow import modules
from galaxy.workflow.run_request import (
workflow_request_to_run_config,
@@ -273,7 +273,7 @@ STEP_OUTPUT_DELAYED = object()
class WorkflowProgress(object):
def __init__(self, workflow_invocation, inputs_by_step_id, module_injector, param_map, jobs_per_scheduling_iteration=-1):
self.outputs = odict()
self.outputs = OrderedDict()
self.module_injector = module_injector
self.workflow_invocation = workflow_invocation
self.inputs_by_step_id = inputs_by_step_id
+4 -4
View File
@@ -4,6 +4,7 @@ import os
import shutil
import tarfile
import tempfile
from collections import OrderedDict
from time import gmtime, strftime
import requests
@@ -12,7 +13,6 @@ from sqlalchemy import and_, false
import tool_shed.repository_types.util as rt_util
from galaxy import web
from galaxy.util import asbool, build_url, CHUNK_SIZE
from galaxy.util.odict import odict
from galaxy.util.path import safe_relpath
from tool_shed.dependencies import attribute_handlers
from tool_shed.dependencies.repository.relation_builder import RelationBuilder
@@ -115,7 +115,7 @@ class ExportRepositoryManager(object):
return repositories_archive, error_messages
def generate_export_elem(self):
sub_elements = odict()
sub_elements = OrderedDict()
sub_elements['export_time'] = strftime('%a, %d %b %Y %H:%M:%S +0000', gmtime())
sub_elements['tool_shed'] = str(self.tool_shed_url.rstrip('/'))
sub_elements['repository_name'] = str(self.repository.name)
@@ -261,8 +261,8 @@ class ExportRepositoryManager(object):
generated attributes will be contained within the <repository> tag, while the sub_elements
will be tag sets contained within the <repository> tag set.
"""
attributes = odict()
sub_elements = odict()
attributes = OrderedDict()
sub_elements = OrderedDict()
attributes['name'] = str(repository.name)
attributes['type'] = str(repository.type)
# We have to associate the public username since the user_id will be different between tool sheds.
@@ -1,8 +1,8 @@
import copy
import logging
from collections import OrderedDict
from galaxy.util import asbool
from galaxy.util.odict import odict
from galaxy.web import url_for
from tool_shed.dependencies.tool import tag_attribute_handler
from tool_shed.repository_types.util import REPOSITORY_DEPENDENCY_DEFINITION_FILENAME
@@ -71,8 +71,8 @@ class RepositoryDependencyAttributeHandler(object):
if len(sub_elems) > 0:
# At this point, a <repository> tag will point only to a package.
# <package name="xorg_macros" version="1.17.1" />
# Coerce the list to an odict().
sub_elements = odict()
# Coerce the list to an OrderedDict().
sub_elements = OrderedDict()
packages = []
for sub_elem in sub_elems:
sub_elem_type = sub_elem.tag
@@ -88,7 +88,7 @@ class RepositoryDependencyAttributeHandler(object):
# We're exporting the repository, so eliminate all toolshed and changeset_revision attributes
# from the <repository> tag.
if toolshed or changeset_revision:
attributes = odict()
attributes = OrderedDict()
attributes['name'] = name
attributes['owner'] = owner
prior_installation_required = elem.get('prior_installation_required')
@@ -2,12 +2,12 @@ import logging
import os
import subprocess
import sys
from collections import OrderedDict
from migrate.versioning import repository, schema
from sqlalchemy import create_engine, MetaData, Table
from galaxy.util import get_executable
from galaxy.util.odict import odict
from tool_shed.util import common_util
log = logging.getLogger(__name__)
@@ -33,7 +33,7 @@ def verify_tools(app, url, galaxy_config_file=None, engine_options={}):
tool_shed_accessible = False
if app.new_installation:
# New installations will not be missing tools, so we don't need to worry about them.
missing_tool_configs_dict = odict()
missing_tool_configs_dict = OrderedDict()
else:
tool_panel_configs = common_util.get_non_shed_tool_panel_configs(app)
if tool_panel_configs:
@@ -47,7 +47,7 @@ def verify_tools(app, url, galaxy_config_file=None, engine_options={}):
# we have to set the value of tool_shed_accessible to True so that the value of migrate_tools.version can be correctly set in
# the database.
tool_shed_accessible = True
missing_tool_configs_dict = odict()
missing_tool_configs_dict = OrderedDict()
have_tool_dependencies = False
for k, v in missing_tool_configs_dict.items():
if v:
@@ -8,11 +8,11 @@ import os
import shutil
import tempfile
import threading
from collections import OrderedDict
from galaxy import util
from galaxy.tools.toolbox import ToolSection
from galaxy.tools.toolbox.parser import ensure_tool_conf_item
from galaxy.util.odict import odict
from tool_shed.galaxy_install import install_manager
from tool_shed.galaxy_install.datatypes import custom_datatype_manager
from tool_shed.galaxy_install.metadata.installed_repository_metadata_manager import InstalledRepositoryMetadataManager
@@ -112,7 +112,7 @@ class ToolMigrationManager(object):
# tool_shed_accessible to True so that the value of migrate_tools.version can
# be correctly set in the database.
tool_shed_accessible = True
missing_tool_configs_dict = odict()
missing_tool_configs_dict = OrderedDict()
if tool_shed_accessible:
if len(self.proprietary_tool_confs) == 1:
plural = ''
@@ -386,7 +386,7 @@ class ToolMigrationManager(object):
entries are automatically added to the reserved migrated_tools_conf.xml file as part of the migration process.
"""
tool_configs_to_filter = []
tool_panel_dict_for_display = odict()
tool_panel_dict_for_display = OrderedDict()
if self.tool_path:
repo_install_dir = os.path.join(self.tool_path, relative_install_dir)
else:
+2 -2
View File
@@ -1,6 +1,6 @@
import logging
from collections import OrderedDict
from galaxy.util.odict import odict
from . import (
repository_suite_definition,
tool_dependency_definition,
@@ -13,7 +13,7 @@ log = logging.getLogger(__name__)
class Registry(object):
def __init__(self):
self.repository_types_by_label = odict()
self.repository_types_by_label = OrderedDict()
self.repository_types_by_label['unrestricted'] = unrestricted.Unrestricted()
self.repository_types_by_label['repository_suite_definition'] = repository_suite_definition.RepositorySuiteDefinition()
self.repository_types_by_label['tool_dependency_definition'] = tool_dependency_definition.ToolDependencyDefinition()
+3 -3
View File
@@ -1,9 +1,9 @@
import logging
import xml.etree.ElementTree
from collections import OrderedDict
from six.moves.urllib import request as urlrequest
from galaxy.util.odict import odict
from tool_shed.util import common_util, xml_util
log = logging.getLogger(__name__)
@@ -18,8 +18,8 @@ DEFAULT_TOOL_SHEDS_CONF_XML = """<?xml version="1.0"?>
class Registry(object):
def __init__(self, config=None):
self.tool_sheds = odict()
self.tool_sheds_auth = odict()
self.tool_sheds = OrderedDict()
self.tool_sheds_auth = OrderedDict()
if config:
# Parse tool_sheds_conf.xml
tree, error_message = xml_util.parse_xml(config)
-1
View File
@@ -1 +0,0 @@
../../galaxy/util/tool_shed/common_util.py
+362
View File
@@ -0,0 +1,362 @@
import json
import logging
import os
from collections import OrderedDict
from six.moves.urllib.parse import urljoin
from galaxy import util
from galaxy.web import url_for
from tool_shed.util import encoding_util, xml_util
log = logging.getLogger(__name__)
REPOSITORY_OWNER = 'devteam'
def accumulate_tool_dependencies(tool_shed_accessible, tool_dependencies, all_tool_dependencies):
if tool_shed_accessible:
if tool_dependencies:
for tool_dependency in tool_dependencies:
if tool_dependency not in all_tool_dependencies:
all_tool_dependencies.append(tool_dependency)
return all_tool_dependencies
def check_for_missing_tools(app, tool_panel_configs, latest_tool_migration_script_number):
# Get the 000x_tools.xml file associated with the current migrate_tools version number.
tools_xml_file_path = os.path.abspath(os.path.join('scripts', 'migrate_tools', '%04d_tools.xml' % latest_tool_migration_script_number))
# Parse the XML and load the file attributes for later checking against the proprietary tool_panel_config.
migrated_tool_configs_dict = OrderedDict()
tree, error_message = xml_util.parse_xml(tools_xml_file_path)
if tree is None:
return False, OrderedDict()
root = tree.getroot()
tool_shed = root.get('name')
tool_shed_url = get_tool_shed_url_from_tool_shed_registry(app, tool_shed)
# The default behavior is that the tool shed is down.
tool_shed_accessible = False
missing_tool_configs_dict = OrderedDict()
if tool_shed_url:
for elem in root:
if elem.tag == 'repository':
repository_dependencies = []
all_tool_dependencies = []
repository_name = elem.get('name')
changeset_revision = elem.get('changeset_revision')
tool_shed_accessible, repository_dependencies_dict = get_repository_dependencies(app,
tool_shed_url,
repository_name,
REPOSITORY_OWNER,
changeset_revision)
if tool_shed_accessible:
# Accumulate all tool dependencies defined for repository dependencies for display to the user.
for rd_key, rd_tups in repository_dependencies_dict.items():
if rd_key in ['root_key', 'description']:
continue
for rd_tup in rd_tups:
tool_shed, name, owner, changeset_revision, prior_installation_required, only_if_compiling_contained_td = \
parse_repository_dependency_tuple(rd_tup)
tool_shed_accessible, tool_dependencies = get_tool_dependencies(app,
tool_shed_url,
name,
owner,
changeset_revision)
all_tool_dependencies = accumulate_tool_dependencies(tool_shed_accessible, tool_dependencies, all_tool_dependencies)
tool_shed_accessible, tool_dependencies = get_tool_dependencies(app,
tool_shed_url,
repository_name,
REPOSITORY_OWNER,
changeset_revision)
all_tool_dependencies = accumulate_tool_dependencies(tool_shed_accessible, tool_dependencies, all_tool_dependencies)
for tool_elem in elem.findall('tool'):
tool_config_file_name = tool_elem.get('file')
if tool_config_file_name:
# We currently do nothing with repository dependencies except install them (we do not display repositories that will be
# installed to the user). However, we'll store them in the following dictionary in case we choose to display them in the
# future.
dependencies_dict = dict(tool_dependencies=all_tool_dependencies,
repository_dependencies=repository_dependencies)
migrated_tool_configs_dict[tool_config_file_name] = dependencies_dict
else:
break
if tool_shed_accessible:
# Parse the proprietary tool_panel_configs (the default is tool_conf.xml) and generate the list of missing tool config file names.
for tool_panel_config in tool_panel_configs:
tree, error_message = xml_util.parse_xml(tool_panel_config)
if tree:
root = tree.getroot()
for elem in root:
if elem.tag == 'tool':
missing_tool_configs_dict = check_tool_tag_set(elem, migrated_tool_configs_dict, missing_tool_configs_dict)
elif elem.tag == 'section':
for section_elem in elem:
if section_elem.tag == 'tool':
missing_tool_configs_dict = check_tool_tag_set(section_elem, migrated_tool_configs_dict, missing_tool_configs_dict)
else:
exception_msg = '\n\nThe entry for the main Galaxy tool shed at %s is missing from the %s file. ' % (tool_shed, app.config.tool_sheds_config)
exception_msg += 'The entry for this tool shed must always be available in this file, so re-add it before attempting to start your Galaxy server.\n'
raise Exception(exception_msg)
return tool_shed_accessible, missing_tool_configs_dict
def check_tool_tag_set(elem, migrated_tool_configs_dict, missing_tool_configs_dict):
file_path = elem.get('file', None)
if file_path:
name = os.path.basename(file_path)
for migrated_tool_config in migrated_tool_configs_dict.keys():
if migrated_tool_config in [file_path, name]:
missing_tool_configs_dict[name] = migrated_tool_configs_dict[migrated_tool_config]
return missing_tool_configs_dict
def generate_clone_url_for_installed_repository(app, repository):
"""Generate the URL for cloning a repository that has been installed into a Galaxy instance."""
tool_shed_url = get_tool_shed_url_from_tool_shed_registry(app, str(repository.tool_shed))
return util.build_url(tool_shed_url, pathspec=['repos', str(repository.owner), str(repository.name)])
def generate_clone_url_for_repository_in_tool_shed(user, repository):
"""Generate the URL for cloning a repository that is in the tool shed."""
base_url = url_for('/', qualified=True).rstrip('/')
if user:
protocol, base = base_url.split('://')
username = '%s@' % user.username
return '%s://%s%s/repos/%s/%s' % (protocol, username, base, repository.user.username, repository.name)
else:
return '%s/repos/%s/%s' % (base_url, repository.user.username, repository.name)
def generate_clone_url_from_repo_info_tup(app, repo_info_tup):
"""Generate the URL for cloning a repository given a tuple of toolshed, name, owner, changeset_revision."""
# Example tuple: ['http://localhost:9009', 'blast_datatypes', 'test', '461a4216e8ab', False]
toolshed, name, owner, changeset_revision, prior_installation_required, only_if_compiling_contained_td = \
parse_repository_dependency_tuple(repo_info_tup)
tool_shed_url = get_tool_shed_url_from_tool_shed_registry(app, toolshed)
# Don't include the changeset_revision in clone urls.
return util.build_url(tool_shed_url, pathspec=['repos', owner, name])
def get_non_shed_tool_panel_configs(app):
"""Get the non-shed related tool panel configs - there can be more than one, and the default is tool_conf.xml."""
config_filenames = []
for config_filename in app.config.tool_configs:
# Any config file that includes a tool_path attribute in the root tag set like the following is shed-related.
# <toolbox tool_path="database/shed_tools">
tree, error_message = xml_util.parse_xml(config_filename)
if tree is None:
continue
root = tree.getroot()
tool_path = root.get('tool_path', None)
if tool_path is None:
config_filenames.append(config_filename)
return config_filenames
def get_repository_dependencies(app, tool_shed_url, repository_name, repository_owner, changeset_revision):
repository_dependencies_dict = {}
tool_shed_accessible = True
params = dict(name=repository_name, owner=repository_owner, changeset_revision=changeset_revision)
pathspec = ['repository', 'get_repository_dependencies']
try:
raw_text = util.url_get(tool_shed_url, password_mgr=app.tool_shed_registry.url_auth(tool_shed_url), pathspec=pathspec, params=params)
tool_shed_accessible = True
except Exception as e:
tool_shed_accessible = False
log.warning("The URL\n%s\nraised the exception:\n%s\n", util.build_url(tool_shed_url, pathspec=pathspec, params=params), e)
if tool_shed_accessible:
if len(raw_text) > 2:
encoded_text = json.loads(util.unicodify(raw_text))
repository_dependencies_dict = encoding_util.tool_shed_decode(encoded_text)
return tool_shed_accessible, repository_dependencies_dict
def get_protocol_from_tool_shed_url(tool_shed_url):
"""Return the protocol from the received tool_shed_url if it exists."""
try:
if tool_shed_url.find('://') > 0:
return tool_shed_url.split('://')[0].lower()
except Exception:
# We receive a lot of calls here where the tool_shed_url is None. The container_util uses
# that value when creating a header row. If the tool_shed_url is not None, we have a problem.
if tool_shed_url is not None:
log.exception("Handled exception getting the protocol from Tool Shed URL %s", str(tool_shed_url))
# Default to HTTP protocol.
return 'http'
def get_tool_dependencies(app, tool_shed_url, repository_name, repository_owner, changeset_revision):
tool_dependencies = []
tool_shed_accessible = True
params = dict(name=repository_name, owner=repository_owner, changeset_revision=changeset_revision)
pathspec = ['repository', 'get_tool_dependencies']
try:
text = util.url_get(tool_shed_url, password_mgr=app.tool_shed_registry.url_auth(tool_shed_url), pathspec=pathspec, params=params)
tool_shed_accessible = True
except Exception as e:
tool_shed_accessible = False
log.warning("The URL\n%s\nraised the exception:\n%s\n", util.build_url(tool_shed_url, pathspec=pathspec, params=params), e)
if tool_shed_accessible:
if text:
tool_dependencies_dict = encoding_util.tool_shed_decode(text)
for requirements_dict in tool_dependencies_dict.values():
tool_dependency_name = requirements_dict['name']
tool_dependency_version = requirements_dict['version']
tool_dependency_type = requirements_dict['type']
tool_dependencies.append((tool_dependency_name, tool_dependency_version, tool_dependency_type))
return tool_shed_accessible, tool_dependencies
def get_tool_shed_repository_ids(as_string=False, **kwd):
tsrid = kwd.get('tool_shed_repository_id', None)
tsridslist = util.listify(kwd.get('tool_shed_repository_ids', None))
if not tsridslist:
tsridslist = util.listify(kwd.get('id', None))
if tsridslist is not None:
if tsrid is not None and tsrid not in tsridslist:
tsridslist.append(tsrid)
if as_string:
return ','.join(tsridslist)
return tsridslist
else:
tsridslist = util.listify(kwd.get('ordered_tsr_ids', None))
if tsridslist is not None:
if as_string:
return ','.join(tsridslist)
return tsridslist
if as_string:
return ''
return []
def get_tool_shed_url_from_tool_shed_registry(app, tool_shed):
"""
The value of tool_shed is something like: toolshed.g2.bx.psu.edu. We need the URL to this tool shed, which is
something like: http://toolshed.g2.bx.psu.edu/
"""
cleaned_tool_shed = remove_protocol_from_tool_shed_url(tool_shed)
for shed_url in app.tool_shed_registry.tool_sheds.values():
if shed_url.find(cleaned_tool_shed) >= 0:
if shed_url.endswith('/'):
shed_url = shed_url.rstrip('/')
return shed_url
# The tool shed from which the repository was originally installed must no longer be configured in tool_sheds_conf.xml.
return None
def get_tool_shed_repository_url(app, tool_shed, owner, name):
tool_shed_url = get_tool_shed_url_from_tool_shed_registry(app, tool_shed)
if tool_shed_url:
# Append a slash to the tool shed URL, because urlparse.urljoin will eliminate
# the last part of a URL if it does not end with a forward slash.
tool_shed_url = '%s/' % tool_shed_url
return urljoin(tool_shed_url, 'view/%s/%s' % (owner, name))
return tool_shed_url
def get_user_by_username(app, username):
"""Get a user from the database by username."""
sa_session = app.model.context.current
try:
user = sa_session.query(app.model.User) \
.filter(app.model.User.table.c.username == username) \
.one()
return user
except Exception:
return None
def handle_galaxy_url(trans, **kwd):
galaxy_url = kwd.get('galaxy_url', None)
if galaxy_url:
trans.set_cookie(galaxy_url, name='toolshedgalaxyurl')
else:
galaxy_url = trans.get_cookie(name='toolshedgalaxyurl')
return galaxy_url
def handle_tool_shed_url_protocol(app, shed_url):
"""Handle secure and insecure HTTP protocol since they may change over time."""
try:
if app.name == 'galaxy':
url = remove_protocol_from_tool_shed_url(shed_url)
tool_shed_url = get_tool_shed_url_from_tool_shed_registry(app, url)
else:
tool_shed_url = str(url_for('/', qualified=True)).rstrip('/')
return tool_shed_url
except Exception:
# We receive a lot of calls here where the tool_shed_url is None. The container_util uses
# that value when creating a header row. If the tool_shed_url is not None, we have a problem.
if shed_url is not None:
log.exception("Handled exception removing protocol from URL %s", str(shed_url))
return shed_url
def parse_repository_dependency_tuple(repository_dependency_tuple, contains_error=False):
# Default both prior_installation_required and only_if_compiling_contained_td to False in cases where metadata should be reset on the
# repository containing the repository_dependency definition.
prior_installation_required = 'False'
only_if_compiling_contained_td = 'False'
if contains_error:
if len(repository_dependency_tuple) == 5:
tool_shed, name, owner, changeset_revision, error = repository_dependency_tuple
elif len(repository_dependency_tuple) == 6:
tool_shed, name, owner, changeset_revision, prior_installation_required, error = repository_dependency_tuple
elif len(repository_dependency_tuple) == 7:
tool_shed, name, owner, changeset_revision, prior_installation_required, only_if_compiling_contained_td, error = \
repository_dependency_tuple
return tool_shed, name, owner, changeset_revision, prior_installation_required, only_if_compiling_contained_td, error
else:
if len(repository_dependency_tuple) == 4:
tool_shed, name, owner, changeset_revision = repository_dependency_tuple
elif len(repository_dependency_tuple) == 5:
tool_shed, name, owner, changeset_revision, prior_installation_required = repository_dependency_tuple
elif len(repository_dependency_tuple) == 6:
tool_shed, name, owner, changeset_revision, prior_installation_required, only_if_compiling_contained_td = repository_dependency_tuple
return tool_shed, name, owner, changeset_revision, prior_installation_required, only_if_compiling_contained_td
def remove_port_from_tool_shed_url(tool_shed_url):
"""Return a partial Tool Shed URL, eliminating the port if it exists."""
try:
if tool_shed_url.find(':') > 0:
# Eliminate the port, if any, since it will result in an invalid directory name.
new_tool_shed_url = tool_shed_url.split(':')[0]
else:
new_tool_shed_url = tool_shed_url
return new_tool_shed_url.rstrip('/')
except Exception:
# We receive a lot of calls here where the tool_shed_url is None. The container_util uses
# that value when creating a header row. If the tool_shed_url is not None, we have a problem.
if tool_shed_url is not None:
log.exception("Handled exception removing the port from Tool Shed URL %s", str(tool_shed_url))
return tool_shed_url
def remove_protocol_and_port_from_tool_shed_url(tool_shed_url):
"""Return a partial Tool Shed URL, eliminating the protocol and/or port if either exists."""
tool_shed = remove_protocol_from_tool_shed_url(tool_shed_url)
tool_shed = remove_port_from_tool_shed_url(tool_shed)
return tool_shed
def remove_protocol_and_user_from_clone_url(repository_clone_url):
"""Return a URL that can be used to clone a repository, eliminating the protocol and user if either exists."""
if repository_clone_url.find('@') > 0:
# We have an url that includes an authenticated user, something like:
# http://test@bx.psu.edu:9009/repos/some_username/column
items = repository_clone_url.split('@')
tmp_url = items[1]
elif repository_clone_url.find('//') > 0:
# We have an url that includes only a protocol, something like:
# http://bx.psu.edu:9009/repos/some_username/column
items = repository_clone_url.split('//')
tmp_url = items[1]
else:
tmp_url = repository_clone_url
return tmp_url.rstrip('/')
def remove_protocol_from_tool_shed_url(tool_shed_url):
"""Return a partial Tool Shed URL, eliminating the protocol if it exists."""
return util.remove_protocol_from_url(tool_shed_url)
+2 -2
View File
@@ -1,8 +1,8 @@
import logging
from collections import OrderedDict
from sqlalchemy import and_
from galaxy.util.odict import odict
from tool_shed.util import hg_util
log = logging.getLogger(__name__)
@@ -74,7 +74,7 @@ def get_previous_repository_reviews(app, repository, changeset_revision):
"""
repo = hg_util.get_repo_for_repository(app, repository=repository)
reviewed_revision_hashes = [review.changeset_revision for review in repository.reviews]
previous_reviews_dict = odict()
previous_reviews_dict = OrderedDict()
for changeset in hg_util.reversed_upper_bounded_changelog(repo, changeset_revision):
previous_changeset_revision = str(repo.changectx(changeset))
if previous_changeset_revision in reviewed_revision_hashes:
@@ -850,7 +850,7 @@ class UtilityContainerManager(object):
def prune_repository_dependencies(self, folder):
"""
Since the object used to generate a repository dependencies container is a dictionary
and not an odict() (it must be json-serialize-able), the order in which the dictionary
and not an OrderedDict() (it must be json-serialize-able), the order in which the dictionary
is processed to create the container sometimes results in repository dependency entries
in a folder that also includes the repository dependency as a sub-folder (if the repository
dependency has its own repository dependency). This method will remove all repository
+2 -2
View File
@@ -1,5 +1,6 @@
""" Test Tool execution and state handling logic.
"""
from collections import OrderedDict
from unittest import TestCase
import webob.exc
@@ -7,7 +8,6 @@ import webob.exc
import galaxy.model
from galaxy.tools.parameters import params_to_incoming
from galaxy.util.bunch import Bunch
from galaxy.util.odict import odict
from .. import tools_support
BASE_REPEAT_TOOL_CONTENTS = '''<tool id="test_tool" name="Test Tool">
@@ -185,7 +185,7 @@ class MockAction(object):
if num_calls > self.error_message_after_excution:
return None, "Test Error Message"
return galaxy.model.Job(), odict(dict(out1="1"))
return galaxy.model.Job(), OrderedDict(dict(out1="1"))
def raise_exception(self, after_execution=0):
self.exception_after_exection = after_execution
+2 -3
View File
@@ -5,8 +5,7 @@ A script for calculating secure hashes / message digests.
"""
import hashlib
import optparse
from galaxy.util.odict import odict
from collections import OrderedDict
HASH_ALGORITHMS = ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512']
CHUNK_SIZE = 2 ** 20 # 1mb
@@ -20,7 +19,7 @@ def __main__():
parser.add_option('-o', '--output', dest='output', action='store', type="string", help='Output filename')
(options, args) = parser.parse_args()
algorithms = odict()
algorithms = OrderedDict()
for algorithm in options.algorithms:
assert algorithm in HASH_ALGORITHMS, "Invalid algorithm specified: %s" % (algorithm)
assert algorithm not in algorithms, "Specify each algorithm only once."