]> git.llucax.com Git - software/pymin.git/commitdiff
Add host name related validators to pymin.validation (refs #20)
authorLeandro Lucarella <llucax@gmail.com>
Tue, 24 Jun 2008 04:19:35 +0000 (01:19 -0300)
committerLeandro Lucarella <llucax@gmail.com>
Sat, 28 Jun 2008 04:54:01 +0000 (01:54 -0300)
This add classes HostName and FullyQualifiedHostName.

pymin/validation.py

index ea31c1df73f067da9920182b4be836d70d0a25d5..f2470334f411b9cecb17314d8e1ccb60028c75a6 100644 (file)
@@ -1,5 +1,6 @@
 # vim: set encoding=utf-8 et sw=4 sts=4 :
 
+import re
 from formencode import Invalid
 from formencode.validators import *
 from formencode.compound import *
@@ -7,6 +8,7 @@ from formencode.compound import *
 from pymin.item import Item
 from pymin.validatedclass import Field
 
+
 class UpOneOf(OneOf):
     """
     Same as :class:`OneOf` but values are uppercased before validation.
@@ -27,3 +29,70 @@ class UpOneOf(OneOf):
     def _to_python(self, value, state):
         return value.upper()
 
+
+class HostName(FancyValidator):
+    """
+    Formencode validator to check whether a string is a correct host name
+
+    Examples::
+
+        >>> n = HostName()
+        >>> n.to_python('host-name')
+        'hostname'
+        >>> n.to_python('host name')
+        Traceback (most recent call last):
+            ...
+        Invalid: Not a valid host name
+        >>> n.to_python('hostname' * 8)
+        Traceback (most recent call last):
+            ...
+        Invalid: Host name is too long (maximum length is 63 characters)
+    """
+
+    messages = dict(
+        empty = u'Please enter a host name',
+        bad_format = u'Not a valid host name',
+        too_long = u'Host name is too long (maximum length is '
+                         u'%(max_len)d characters)',
+    )
+
+    max_len = 63 # official limit for a label
+    hostnameRE = re.compile(r"^[a-zA-Z0-9][\w\-]*$")
+
+    def validate_python(self, value, state):
+        if len(value) > self.max_len:
+            raise Invalid(self.message('host_too_long', state, value=value,
+                                       max_len=self.max_len),
+                          value, state)
+        if not self.hostnameRE.search(value):
+            raise Invalid(self.message('bad_format', state, value=value),
+                          value, state)
+
+
+class FullyQualifiedHostName(HostName):
+    """
+    Formencode validator to check whether a string is a correct host name
+
+    Examples::
+
+        >>> n = FullyQualifiedHostName()
+        >>> n.to_python('example.com')
+        'example.com'
+        >>> n.to_python('example')
+        Traceback (most recent call last):
+            ...
+        Invalid: Not a valid host name
+        >>> n.to_python('example.' * 32 + 'com')
+        Traceback (most recent call last):
+            ...
+        Invalid: Host name is too long (maximum length is 253 characters)
+    """
+
+    messages = dict(HostName._messages,
+        empty = u'Please enter a fully qualified host name',
+        bad_format = u'Not a fully qualified host name',
+    )
+
+    max_len = 253
+    hostnameRE = re.compile(r"^[a-zA-Z0-9][\w\-\.]*\.[a-zA-Z]+$")
+