Example #1
0
def vars(cls):
	"""Like the built-in function `vars`, but also works with slotted classes"""
	if not hasattr(cls, "__slots__"):
		return _vars_(cls)
	allVars = OrderedSet()
	for cls in cls.__mro__:
		for varName in getattr(cls, "__slots__", tuple()):
			allVars.add(varName)
	return allVars
Example #2
0
	def test_insertAt(self):
		set_ = OrderedSet("bcd")
		set_.insertAt(0, "a")
		self.assertEqual(set_, OrderedSet("abcd"), "insertAt failed when inserting at the beginning of the set")
		
		set_ = OrderedSet("bcd")
		set_.insertAt(3, "e")
		self.assertEqual(set_, OrderedSet("bcde"), "insertAt failed when inserting at the end of the set")
		
		set_ = OrderedSet("abd")
		set_.insertAt(2, "c")
		self.assertEqual(set_, OrderedSet("abcd"), "insertAt failed when inserting in the middle of the set")
Example #3
0
	def __init__(self, errorOnMethodNotFound):
		"""
		@param errorOnMethodNotFound	bool:	If `True`, it is an error when a receiver doesn't implement a method. If `False`, that receiver is simply skipped. Note that if the special method `notifyException` is not implemented, no error will be raised from this class.
		"""
		self.errorOnMethodNotFound = errorOnMethodNotFound
		self._receivers = OrderedSet()
		self._tieInExceptHook()
Example #4
0
	def test_replace_byitem(self):
		set_ = OrderedSet("xyz")
		set_.replace("x", "a")
		self.assertEqual(set_, OrderedSet("ayz"), "Failed to change item at beginning of set")
		set_.replace("y", "b")
		self.assertEqual(set_, OrderedSet("abz"), "Failed to change item in middle of set")
		set_.replace("z", "c")
		self.assertEqual(set_, OrderedSet("abc"), "Failed to change item at end of set")
Example #5
0
	def test_insertBeforeMulti(self):
		set_ = OrderedSet("dgi")
		set_.insertMultiBefore("h", "i", updateOnExist=True)
		self.assertEqual(set_, OrderedSet("dghi"), "Failed to insert a single element using insertMultiBefore")
		
		set_.insertMultiBefore(("e","f"), "g", updateOnExist=True)
		self.assertEqual(set_, OrderedSet("defghi"), "Failed to insert multiple elements in the set")
		
		set_.insertMultiBefore(("a","b","c"), "d", updateOnExist=True)
		self.assertEqual(set_, OrderedSet("abcdefghi"), "Failed to insert multiple elements before the first element in the set")
Example #6
0
	def test_insertBefore_updateOnExist(self):
		set_ = OrderedSet("bdace")
		set_.insertBefore("c", "d", updateOnExist=True)
		self.assertEqual(set_, OrderedSet("bcdae"), "Failed to insert an existing element before another")
		
		set_.insertBefore("a", "b", updateOnExist=True)
		self.assertEqual(set_, OrderedSet("abcde"), "Failed to insert an existing element before the first in the set")
		
		set_.insertBefore("d", "c", updateOnExist=False)
		self.assertEqual(set_, OrderedSet("abcde"), "Set changed on single insert when updateOnExist=False")
Example #7
0
	def test_insertBeforeMulti_updateOnExist(self):
		set_ = OrderedSet("efdg")
		set_.insertMultiBefore(("e","f"), "g", updateOnExist=False)
		self.assertEqual(set_, OrderedSet("efdg"), "Set changed on multiple insert when updateOnExist=False")
		
		set_ = OrderedSet("edg")
		set_.insertMultiBefore(("e","f"), "g", updateOnExist=False)
		self.assertEqual(set_, OrderedSet("edfg"), "Incorrect set with multiple insert where some elements already exist")
Example #8
0
class EventProxy(EventReceiver):
	"""
	Any method called on this class (besides reserved functions declared in this class) will be proxied out to all
	EventReceivers registered with the class.
	This class is also an EventReceiver itself, as it receives events. Therefore, multiple EventProxy's can be tied
	together; an event proxy can be registered as an EventReceiver with another EventProxy.
	"""
	def __init__(self, errorOnMethodNotFound):
		"""
		@param errorOnMethodNotFound	bool:	If `True`, it is an error when a receiver doesn't implement a method. If `False`, that receiver is simply skipped. Note that if the special method `notifyException` is not implemented, no error will be raised from this class.
		"""
		self.errorOnMethodNotFound = errorOnMethodNotFound
		self._receivers = OrderedSet()
		self._tieInExceptHook()
	
	def _tieInExceptHook(self):
		oldFunc = sys.excepthook
		def branchHook(exceptionClass, exceptionInstance, tracebackInstance):
			oldFunc(exceptionClass, exceptionInstance, tracebackInstance)
			self.notifyException(exceptionInstance, tracebackInstance)
		sys.excepthook = branchHook
	
	def __getattr__(self, name):
		# __getattr__ (instead of __getattribute__) won't work because it doesn't work with super
# 		if hasattr(super(EventProxy, self), name):
# 			return super(EventProxy, self).__getattribute__(name)
# 		if name in self.__dict__:
# 			return self.__dict__
		
		def _run(*args, **kwargs):
			found = False
			for receiver in self._receivers:
				if hasattr(receiver, name):
					found = True
					getattr(receiver, name)(*args, **kwargs)
			if not found:
				if name != "notifyException" and self.errorOnMethodNotFound:
					raise AttributeError
		return _run
	
	def addReceiver(self, receiver, errorOnDuplicate=True):
		if self._receivers.add(receiver, updateOnExist=False) == False and errorOnDuplicate:
			raise Exception("Event receiver already added")
	def getReceivers(self):
		return self._receivers
Example #9
0
	def test_append(self):
		set_ = OrderedSet("bc")
		set_.append("d", updateOnExist=True)
		self.assertEqual(set_, OrderedSet("bcd"), "Failed to replace and append an element")
		set_.append("b", updateOnExist=False)
		self.assertEqual(set_, OrderedSet("bcd"), "Set changed on append when updateOnExist=False")
Example #10
0
	def test_index(self):
		set_ = OrderedSet("abcde")
		self.assertEqual(set_.index("a"), 0, "Failed to find element at beginning of set")
		self.assertEqual(set_.index("e"), 4, "Failed to find element at end of set")
		self.assertEqual(set_.index("c"), 2, "Failed to find element in middle of set")
Example #11
0
	def test_insertBefore(self):
		set_ = OrderedSet("bd")
		set_.insertBefore("c", "d", updateOnExist=True)
		self.assertEqual(set_, OrderedSet("bcd"), "Failed to insert an element before another")
		set_.insertBefore("a", "b", updateOnExist=True)
		self.assertEqual(set_, OrderedSet("abcd"), "Failed to insert an element before the first in the set")
Example #12
0
	def test_pop(self):
		set_ = OrderedSet("bcd")
		self.assertEqual(set_.pop(), "d")
		self.assertEqual(set_.pop(), "c")
		self.assertEqual(set_.pop(), "b")
		self.assertRaises(KeyError, set_.pop)