From 0dce5dae26eed4c7de0e59d455fc7550a3f211b4 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Sun, 25 May 2014 13:10:33 -0400 Subject: [PATCH 1/3] set theory v2, now can handle non hashable items like dicts --- lib/ansible/runner/filter_plugins/core.py | 31 +++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/lib/ansible/runner/filter_plugins/core.py b/lib/ansible/runner/filter_plugins/core.py index 293ebc4ae36..57dd9debebb 100644 --- a/lib/ansible/runner/filter_plugins/core.py +++ b/lib/ansible/runner/filter_plugins/core.py @@ -140,19 +140,40 @@ def regex_replace(value='', pattern='', replacement='', ignorecase=False): return _re.sub(replacement, value) def unique(a): - return set(a) + try: + c = set(a) + except TypeError, e: + c = [] + c = filter(lambda x: x not in c, a) + return c def intersect(a, b): - return set(a).intersection(b) + try: + c = set(a) & set(b) + except TypeError, e: + c = filter(lambda x: x in b, a) + return c def difference(a, b): - return set(a).difference(b) + try: + c = set(a) - set(b) + except TypeError, e: + c = filter(lambda x: x not in b, a) + return c def symmetric_difference(a, b): - return set(a).symmetric_difference(b) + try: + c = set(a) ^ set(b) + except TypeError, e: + c = filter(lambda x: x not in intersect(a,b), union(a,b)) + return c def union(a, b): - return set(a).union(b) + try: + c = set(a) | set(b) + except TypeError, e: + c = a + b + return c def version_compare(value, version, operator='eq', strict=False): ''' Perform a version comparison on a value ''' From 8f58ae3305e3e48f6544ab43edde7dc0f775120b Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Mon, 26 May 2014 08:52:57 -0400 Subject: [PATCH 2/3] changed exception handling for hashable test --- lib/ansible/runner/filter_plugins/core.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/ansible/runner/filter_plugins/core.py b/lib/ansible/runner/filter_plugins/core.py index 57dd9debebb..ca2e8b02d2e 100644 --- a/lib/ansible/runner/filter_plugins/core.py +++ b/lib/ansible/runner/filter_plugins/core.py @@ -23,6 +23,7 @@ import types import pipes import glob import re +import collections import operator as py_operator from ansible import errors from ansible.utils import md5s @@ -140,38 +141,38 @@ def regex_replace(value='', pattern='', replacement='', ignorecase=False): return _re.sub(replacement, value) def unique(a): - try: + if isinstance(a,collections.Hashable): c = set(a) - except TypeError, e: + else: c = [] c = filter(lambda x: x not in c, a) return c def intersect(a, b): - try: + if isinstance(a,collections.Hashable) and isinstance(b,collections.Hashable): c = set(a) & set(b) - except TypeError, e: + else: c = filter(lambda x: x in b, a) return c def difference(a, b): - try: + if isinstance(a,collections.Hashable) and isinstance(b,collections.Hashable): c = set(a) - set(b) - except TypeError, e: + else: c = filter(lambda x: x not in b, a) return c def symmetric_difference(a, b): - try: + if isinstance(a,collections.Hashable) and isinstance(b,collections.Hashable): c = set(a) ^ set(b) - except TypeError, e: + else: c = filter(lambda x: x not in intersect(a,b), union(a,b)) return c def union(a, b): - try: + if isinstance(a,collections.Hashable) and isinstance(b,collections.Hashable): c = set(a) | set(b) - except TypeError, e: + else: c = a + b return c From ce8c8ab146a6e3f84ab55eaf63d1ba77630733f6 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Sun, 1 Jun 2014 16:32:48 -0400 Subject: [PATCH 3/3] now unique actually works, all operations also now use it to return unique lists. --- lib/ansible/runner/filter_plugins/core.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/ansible/runner/filter_plugins/core.py b/lib/ansible/runner/filter_plugins/core.py index ca2e8b02d2e..a60d0878933 100644 --- a/lib/ansible/runner/filter_plugins/core.py +++ b/lib/ansible/runner/filter_plugins/core.py @@ -145,35 +145,37 @@ def unique(a): c = set(a) else: c = [] - c = filter(lambda x: x not in c, a) + for x in a: + if x not in c: + c.append(x) return c def intersect(a, b): if isinstance(a,collections.Hashable) and isinstance(b,collections.Hashable): c = set(a) & set(b) else: - c = filter(lambda x: x in b, a) + c = unique(filter(lambda x: x in b, a)) return c def difference(a, b): if isinstance(a,collections.Hashable) and isinstance(b,collections.Hashable): c = set(a) - set(b) else: - c = filter(lambda x: x not in b, a) + c = unique(filter(lambda x: x not in b, a)) return c def symmetric_difference(a, b): if isinstance(a,collections.Hashable) and isinstance(b,collections.Hashable): c = set(a) ^ set(b) else: - c = filter(lambda x: x not in intersect(a,b), union(a,b)) + c = unique(filter(lambda x: x not in intersect(a,b), union(a,b))) return c def union(a, b): if isinstance(a,collections.Hashable) and isinstance(b,collections.Hashable): c = set(a) | set(b) else: - c = a + b + c = unique(a + b) return c def version_compare(value, version, operator='eq', strict=False):