From bac33736ad819fce8ae0d5d96362c4ecb6da529c Mon Sep 17 00:00:00 2001 From: Amir MOHAMMADI Date: Thu, 1 Feb 2018 12:23:31 +0100 Subject: [PATCH] Fix sort errors that happen in Python 3 --- gridtk/generator.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/gridtk/generator.py b/gridtk/generator.py index b82ea60..a1a744c 100644 --- a/gridtk/generator.py +++ b/gridtk/generator.py @@ -11,9 +11,17 @@ import yaml import jinja2 +class _OrderedDict(collections.OrderedDict): + """An OrderedDict class that can be compared. + This is to avoid sort errors (in Python 3) that happen in jinja internally. + """ + def __lt__(self, other): + return id(self) < id(other) + + def _ordered_load(stream, Loader=yaml.Loader, - object_pairs_hook=collections.OrderedDict): - '''Loads the contents of the YAML stream into :py:class:`collection.OrderedDict`'s + object_pairs_hook=_OrderedDict): + '''Loads the contents of the YAML stream into :py:class:`collections.OrderedDict`'s See: https://stackoverflow.com/questions/5121931/in-python-how-can-you-load-yaml-mappings-as-ordereddicts @@ -123,8 +131,8 @@ def expand(data): # separates "unique" objects from the ones we have to iterate # pre-assemble return dictionary - iterables = collections.OrderedDict() - unique = collections.OrderedDict() + iterables = _OrderedDict() + unique = _OrderedDict() for key, value in data.items(): if isinstance(value, list) and not key.startswith('_'): iterables[key] = value @@ -133,7 +141,7 @@ def expand(data): # generates all possible combinations of iterables for values in itertools.product(*iterables.values()): - retval = collections.OrderedDict(unique) + retval = _OrderedDict(unique) keys = list(iterables.keys()) retval.update(dict(zip(keys, values))) yield retval -- 2.21.0