From f9abb47ebdb54fe0e01607fd076d52c229ff2ca9 Mon Sep 17 00:00:00 2001 From: guerler Date: Sun, 11 Dec 2016 23:26:34 -0500 Subject: [PATCH] Use shared safe loads to load module states --- lib/galaxy/model/__init__.py | 14 +++++--------- lib/galaxy/tools/__init__.py | 5 ++--- lib/galaxy/tools/parameters/__init__.py | 6 ++---- lib/galaxy/util/json.py | 10 ++++++++++ 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index fcfb1c9a715..49c9ad8a84f 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -34,6 +34,7 @@ from galaxy.util import (directory_hash_id, Params, ready_name_for_url, from galaxy.util.bunch import Bunch from galaxy.util.dictifiable import Dictifiable from galaxy.util.hash_util import new_secure_hash +from galaxy.util.json import safe_loads from galaxy.util.multi_byte import is_multi_byte from galaxy.util.sanitize_html import sanitize_html from galaxy.web.form_builder import (AddressField, CheckboxField, HistoryField, @@ -3757,16 +3758,11 @@ class WorkflowStep( object ): @property def name( self ): - identifier = None state = self.tool_inputs - if isinstance( self.tool_inputs, string_types ): - state = json.loads( state ) - identifier = state.get( 'name' ) - try: - identifier = json.loads( identifier ) - except: - pass - return identifier + if state: + state = safe_loads( state ) + identifier = state.get( 'name' ) + return safe_loads( identifier ) @property def input_connections_by_name(self): diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py index 2f0a1f5d39c..55b175d3461 100755 --- a/lib/galaxy/tools/__init__.py +++ b/lib/galaxy/tools/__init__.py @@ -55,6 +55,7 @@ from galaxy.tools.parameters.meta import expand_meta_parameters from galaxy.util.bunch import Bunch from galaxy.util.expressions import ExpressionContext from galaxy.util.json import json_fix +from galaxy.util.json import safe_loads from galaxy.util.odict import odict from galaxy.util.template import fill_template from galaxy.web import url_for @@ -263,9 +264,7 @@ class DefaultToolState( object ): """ Restore the state from a string """ - if isinstance( values, basestring ): - values = json_fix( json.loads( values ) ) - values = values or {} + values = json_fix( safe_loads( values ) ) or {} self.page = values.pop( "__page__" ) if "__page__" in values else None self.rerun_remap_job_id = values.pop( "__rerun_remap_job_id__" ) if "__rerun_remap_job_id__" in values else None self.inputs = params_from_strings( tool.inputs, values, app, ignore_errors=True ) diff --git a/lib/galaxy/tools/parameters/__init__.py b/lib/galaxy/tools/parameters/__init__.py index 06589e70aef..60f133f4f64 100644 --- a/lib/galaxy/tools/parameters/__init__.py +++ b/lib/galaxy/tools/parameters/__init__.py @@ -6,6 +6,7 @@ from json import dumps, loads from galaxy.util.expressions import ExpressionContext from galaxy.util.json import json_fix +from galaxy.util.json import safe_loads from .basic import DataCollectionToolParameter, DataToolParameter, RuntimeValue, SelectToolParameter from .grouping import Conditional, Repeat, Section, UploadDataset @@ -161,10 +162,7 @@ def params_from_strings( params, param_values, app, ignore_errors=False ): rval = dict() param_values = param_values or {} for key, value in param_values.items(): - try: - value = json_fix( loads( value ) ) - except ValueError: - pass + value = json_fix( safe_loads( value ) ) if key in params: value = params[ key ].value_from_basic( value, app, ignore_errors ) rval[ key ] = value diff --git a/lib/galaxy/util/json.py b/lib/galaxy/util/json.py index d172151bcb1..ac4dd0392d7 100644 --- a/lib/galaxy/util/json.py +++ b/lib/galaxy/util/json.py @@ -52,6 +52,16 @@ def swap_inf_nan( val ): else: return val +def safe_loads( arg ): + """ + This is a wrapper around loads that returns the parsed value instead of + raising a value error. + """ + try: + loaded = json.loads( arg ) + except ( TypeError, ValueError ): + loaded = arg + return loaded def safe_dumps( *args, **kwargs ): """