Merge pull request #1376 from jmchilton/py3_0

More Python 3 fixes.
This commit is contained in:
Martin Cech
2015-12-21 12:41:24 -05:00
9 changed files with 56 additions and 30 deletions
+7 -1
View File
@@ -1,6 +1,10 @@
from __future__ import absolute_import # Need to import pulsar_client absolutely.
from ..objectstore import ObjectStore
from pulsar.client.manager import ObjectStoreClientManager
try:
from pulsar.client.manager import ObjectStoreClientManager
except ImportError:
ObjectStoreClientManager = None
class PulsarObjectStore(ObjectStore):
@@ -61,6 +65,8 @@ class PulsarObjectStore(ObjectStore):
pass
def __build_pulsar_client(self, config_xml):
if ObjectStoreClientManager is None:
raise Exception("Pulsar client code not available, cannot use this module.")
url = config_xml.get("url")
private_token = config_xml.get("private_token", None)
transport = config_xml.get("transport", None)
+1 -1
View File
@@ -2,7 +2,7 @@ from galaxy.util.dictifiable import Dictifiable
from galaxy.util.odict import odict
class ToolOutputBase( object, Dictifiable ):
class ToolOutputBase( Dictifiable, object ):
def __init__( self, name, label=None, filters=None, hidden=False ):
super( ToolOutputBase, self ).__init__()
+2 -2
View File
@@ -7,7 +7,7 @@ import tempfile
from sqlalchemy import and_
from markupsafe import escape
from urlparse import urlparse
from six.moves.urllib.parse import urlparse
from galaxy.util.dictifiable import Dictifiable
@@ -36,7 +36,7 @@ from galaxy.web.form_builder import SelectField
log = logging.getLogger( __name__ )
class AbstractToolBox( object, Dictifiable, ManagesIntegratedToolPanelMixin ):
class AbstractToolBox( Dictifiable, ManagesIntegratedToolPanelMixin, object ):
"""
Abstract container for managing a ToolPanel - containing tools and
workflows optionally in labelled sections.
+3 -3
View File
@@ -40,7 +40,7 @@ class HasPanelItems:
yield (panel_key, panel_type, panel_value)
class ToolSection( object, Dictifiable, HasPanelItems ):
class ToolSection( Dictifiable, HasPanelItems, object ):
"""
A group of tools with similar type/purpose that will be displayed as a
group in the user interface.
@@ -84,7 +84,7 @@ class ToolSection( object, Dictifiable, HasPanelItems ):
return self.elems
class ToolSectionLabel( object, Dictifiable ):
class ToolSectionLabel( Dictifiable, object ):
"""
A label for a set of tools that can be displayed above groups of tools
and sections in the user interface
@@ -104,7 +104,7 @@ class ToolSectionLabel( object, Dictifiable ):
return super( ToolSectionLabel, self ).to_dict()
class ToolPanelElements( odict, HasPanelItems ):
class ToolPanelElements( HasPanelItems, odict ):
""" Represents an ordered dictionary of tool entries - abstraction
used both by tool panel itself (normal and integrated) and its sections.
"""
+12 -3
View File
@@ -27,6 +27,7 @@ from six.moves.urllib import parse as urlparse
from galaxy.util import json
from datetime import datetime
from six import PY3
from six import string_types, text_type
from six.moves import xrange
from six.moves import email_mime_text
@@ -43,6 +44,13 @@ from xml.etree import ElementTree, ElementInclude
from .inflection import Inflector, English
inflector = Inflector(English)
if PY3:
def list_map(f, input):
return list(map(f, input))
else:
list_map = map
log = logging.getLogger(__name__)
_lock = threading.RLock()
@@ -145,7 +153,8 @@ def unique_id(KEY_SIZE=128):
>>> len(set(ids))
1000
"""
return md5(str( random.getrandbits( KEY_SIZE ) )).hexdigest()
random_bits = text_type(random.getrandbits(KEY_SIZE)).encode("UTF-8")
return md5(random_bits).hexdigest()
def parse_xml( fname ):
@@ -418,7 +427,7 @@ def sanitize_text( text, valid_characters=valid_chars, character_map=mapped_char
and lists of strings; non-string entities will be cast to strings.
"""
if isinstance( text, list ):
return map( lambda x: sanitize_text( x, valid_characters=valid_characters, character_map=character_map, invalid_character=invalid_character ), text )
return list_map( lambda x: sanitize_text( x, valid_characters=valid_characters, character_map=character_map, invalid_character=invalid_character ), text )
if not isinstance( text, string_types ):
text = smart_str( text )
return _sanitize_text_helper( text, valid_characters=valid_characters, character_map=character_map )
@@ -457,7 +466,7 @@ def sanitize_param( value, valid_characters=valid_chars, character_map=mapped_ch
if isinstance( value, string_types ):
return sanitize_text( value, valid_characters=valid_characters, character_map=character_map, invalid_character=invalid_character )
elif isinstance( value, list ):
return map( lambda x: sanitize_text( x, valid_characters=valid_characters, character_map=character_map, invalid_character=invalid_character ), value )
return list_map( lambda x: sanitize_text( x, valid_characters=valid_characters, character_map=character_map, invalid_character=invalid_character ), value )
else:
raise Exception('Unknown parameter type (%s)' % ( type( value ) ))
+15 -6
View File
@@ -5,14 +5,11 @@ For the moment this depends on python's eval. In the future it should be
replaced with a "safe" parser.
"""
try:
from UserDict import DictMixin as AbstractMapping
except ImportError:
# PY3
from collections import MutableMapping as AbstractMapping
from collections import MutableMapping
from itertools import chain
class ExpressionContext( object, AbstractMapping ):
class ExpressionContext( MutableMapping ):
def __init__( self, dict, parent=None ):
"""
Create a new expression context that looks for values in the
@@ -21,6 +18,18 @@ class ExpressionContext( object, AbstractMapping ):
self.dict = dict
self.parent = parent
def __delitem__(self, key):
if key in self.dict:
del self.dict[key]
elif self.parent is not None and key in self.parent:
del self.parent[key]
def __iter__(self):
return chain(iter(self.dict), iter(self.parent or []))
def __len__(self):
return len(self.dict) + len(self.parent or [])
def __getitem__( self, key ):
if key in self.dict:
return self.dict[key]
+1 -1
View File
@@ -74,7 +74,7 @@ __WRAP_MAPPINGS__ = ( dict, UserDict, )
# Define the set of characters that are not sanitized, and define a set of mappings for those that are.
# characters that are valid
VALID_CHARACTERS = set( string.letters + string.digits + " -=_.()/+*^,:?!@" )
VALID_CHARACTERS = set( string.ascii_letters + string.digits + " -=_.()/+*^,:?!@" )
# characters that are allowed but need to be escaped
CHARACTER_MAP = { '>': '__gt__',
+8 -3
View File
@@ -37,7 +37,12 @@ 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 exceptions import Exception
from six import PY3
if PY3:
def list_filter(f, lst):
return list(filter(f, lst))
else:
list_filter = filter
class CycleError(Exception):
@@ -159,8 +164,8 @@ def topsort(pairlist):
numpreds, successors = _numpreds_and_successors_from_pairlist(pairlist)
# suck up everything without a predecessor
answer = filter(lambda x, numpreds=numpreds: numpreds[x] == 0,
numpreds.keys())
answer = list_filter(lambda x, numpreds=numpreds: numpreds[x] == 0,
numpreds.keys())
# for everything in answer, knock down the pred count on
# its successors; note that answer grows *in* the loop
+7 -10
View File
@@ -2,10 +2,7 @@ import os
from shutil import rmtree
from string import Template
from tempfile import mkdtemp
try:
from galaxy import objectstore
except ImportError:
from lwr import objectstore
from galaxy import objectstore
from contextlib import contextmanager
DISK_TEST_CONFIG = """<?xml version="1.0"?>
@@ -26,22 +23,22 @@ def test_disk_store():
# Write empty dataset 2 in second backend, ensure it is empty and
# exists.
empty_dataset = MockDataset(2)
directory.write(b"", "files1/000/dataset_2.dat")
directory.write("", "files1/000/dataset_2.dat")
assert object_store.exists(empty_dataset)
assert object_store.empty(empty_dataset)
# Write non-empty dataset in backend 1, test it is not emtpy & exists.
hello_world_dataset = MockDataset(3)
directory.write(b"Hello World!", "files1/000/dataset_3.dat")
directory.write("Hello World!", "files1/000/dataset_3.dat")
assert object_store.exists(hello_world_dataset)
assert not object_store.empty(hello_world_dataset)
# Test get_data
data = object_store.get_data(hello_world_dataset)
assert data == b"Hello World!"
assert data == "Hello World!"
data = object_store.get_data(hello_world_dataset, start=1, count=6)
assert data == b"ello W"
assert data == "ello W"
# Test Size
@@ -60,13 +57,13 @@ def test_disk_store():
output_dataset = MockDataset(4)
output_real_path = os.path.join(directory.temp_directory, "files1", "000", "dataset_4.dat")
assert not os.path.exists(output_real_path)
output_working_path = directory.write(b"NEW CONTENTS", "job_working_directory1/example_output")
output_working_path = directory.write("NEW CONTENTS", "job_working_directory1/example_output")
object_store.update_from_file(output_dataset, file_name=output_working_path, create=True)
assert os.path.exists(output_real_path)
# Test delete
to_delete_dataset = MockDataset(5)
to_delete_real_path = directory.write(b"content to be deleted!", "files1/000/dataset_5.dat")
to_delete_real_path = directory.write("content to be deleted!", "files1/000/dataset_5.dat")
assert object_store.exists(to_delete_dataset)
assert object_store.delete(to_delete_dataset)
assert not object_store.exists(to_delete_dataset)