Source code for jasy.core.Permutation

#
# Jasy - Web Tooling Framework
# Copyright 2010-2012 Zynga Inc.
# Copyright 2013-2014 Sebastian Werner
#

import jasy
import jasy.core.Util as Util

__all__ = ("Permutation", "getPermutation")


"""Central cache for all permutations"""
registry = {}


[docs]def getPermutation(combination): """ Small wrapper to omit double creation of identical permutations in filter() method As these instances don't have any reference to session etc. they are actually cacheable globally. """ key = str(combination) if key in registry: return registry[key] registry[key] = Permutation(combination) return registry[key]
[docs]class Permutation: """Object to store a single kind of permutation.""" def __init__(self, combination): self.__combination = combination self.__key = self.__buildKey(combination) self.__checksum = Util.generateChecksum(self.__key) def __buildKey(self, combination): """Computes the permutations' key based on the given combination.""" result = [] for key in sorted(combination): value = combination[key] # Basic translation like in JavaScript frontend # We don't have a special threadment for strings, numbers, etc. if value is True: value = "true" elif value is False: value = "false" elif value is None: value = "null" result.append("%s:%s" % (key, value)) return ";".join(result)
[docs] def has(self, key): """Whether the permutation holds a value for the given key.""" return key in self.__combination
[docs] def get(self, key): """Returns the value of the given key in the permutation.""" if key in self.__combination: return self.__combination[key] return None
[docs] def getKey(self): """Returns the computed key from this permutation.""" return self.__key
[docs] def getChecksum(self): """Returns the computed (SHA1) checksum based on the key of this permutation.""" return self.__checksum
[docs] def filter(self, available): """Returns a variant of that permutation which only holds values for the available keys.""" filtered = {} for key in self.__combination: if key in available: filtered[key] = self.__combination[key] if not filtered: return None return getPermutation(filtered)
# Map Python built-ins __repr__ = getKey __str__ = getKey