diff engine/extensions/pychan/attrs.py @ 0:4a0efb7baf70

* Datasets becomes the new trunk and retires after that :-)
author mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222
date Sun, 29 Jun 2008 18:44:17 +0000
parents
children ec653fde64d3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/engine/extensions/pychan/attrs.py	Sun Jun 29 18:44:17 2008 +0000
@@ -0,0 +1,80 @@
+# coding: utf-8
+
+"""
+Simple error checking attributes.
+
+This module defines a set of Attribute classes
+which you can use to define possible values
+an attribute of an object accepts.
+
+Usage::
+  class SomeObject:
+      nameAttr, posAttr = [ Attr("name"), PointAttr("pos") ]
+  
+  obj =  SomeObject()
+  obj.nameAttr.set(obj,"newName")
+  obj.posAttr.set(obj,"89,89")
+
+This is most useful for error checking parsing and defining
+accepted attributes in classes and is used by pychan internally.
+
+"""
+
+from exceptions import ParserError
+
+class Attr(object):
+	"""
+	A simple text attribute.
+	"""
+	def __init__(self,name):
+		self.name = name
+	
+	def set(self,obj,value):
+		"""
+		Parses the given value with the L{parse} method
+		and sets it on the given instance with C{setattr}.
+		"""
+		value = self.parse(value)
+		setattr(obj,self.name,value)
+
+	def parse(self,value):
+		"""
+		Parses a value and checks for errors.
+		Override with specialiced behaviour.
+		"""
+		return str(value)
+
+class PointAttr(Attr):
+	def parse(self,value):
+		try:
+			x,y = tuple(map(int,str(value).split(',')))
+			return x,y
+		except:
+			raise ParserError("Expected a comma separated list of two integers.")
+
+class ColorAttr(Attr):
+	def parse(self,value):
+		try:
+			r,g,b = tuple(map(int,str(value).split(',')))
+		except:
+			raise ParserError("Expected an color.")
+		for c in (r,g,b):
+			if not 0 <= c < 256: raise ParserError("Expected a color (Failed: 0 <= %d <= 255)" %c)
+		return r,g,b
+
+class IntAttr(Attr):
+	def parse(self,value):
+		try:
+			return int(value)
+		except:
+			raise ParserError("Expected a single integer.")
+
+class BoolAttr(Attr):
+	def parse(self,value):
+		try:
+			value = int(value)
+			if value not in (0,1):
+				raise ParserError("Expected a 0 or 1.")
+			return value
+		except:
+			raise ParserError("Expected a 0 or 1.")