Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/galaxy/util/dictifiable.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/galaxy/util/dictifiable.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,68 @@ +import datetime +import uuid + + +def dict_for(obj, **kwds): + # Create dict to represent item. + return dict( + model_class=obj.__class__.__name__, + **kwds + ) + + +class Dictifiable: + """ Mixin that enables objects to be converted to dictionaries. This is useful + when for sharing objects across boundaries, such as the API, tool scripts, + and JavaScript code. """ + + def to_dict(self, view='collection', value_mapper=None): + """ + Return item dictionary. + """ + + if not value_mapper: + value_mapper = {} + + def get_value(key, item): + """ + Recursive helper function to get item values. + """ + # FIXME: why use exception here? Why not look for key in value_mapper + # first and then default to to_dict? + try: + return item.to_dict(view=view, value_mapper=value_mapper) + except Exception: + if key in value_mapper: + return value_mapper.get(key)(item) + if type(item) == datetime.datetime: + return item.isoformat() + elif type(item) == uuid.UUID: + return str(item) + # Leaving this for future reference, though we may want a more + # generic way to handle special type mappings going forward. + # If the item is of a class that needs to be 'stringified' before being put into a JSON data structure + # elif type(item) in []: + # return str(item) + return item + + # Create dict to represent item. + rval = dict_for(self) + + # Fill item dict with visible keys. + try: + visible_keys = self.__getattribute__('dict_' + view + '_visible_keys') + except AttributeError: + raise Exception('Unknown Dictifiable view: %s' % view) + for key in visible_keys: + try: + item = self.__getattribute__(key) + if isinstance(item, list): + rval[key] = [] + for i in item: + rval[key].append(get_value(key, i)) + else: + rval[key] = get_value(key, item) + except AttributeError: + rval[key] = None + + return rval