Allowed '-' inside keywords. Added an unit test for confparser module.
authorFrederic Jolliton <frederic@jolliton.com>
Thu, 30 Jun 2005 07:39:41 +0000 (07:39 +0000)
committerFrederic Jolliton <frederic@jolliton.com>
Thu, 30 Jun 2005 07:39:41 +0000 (07:39 +0000)
* Allowed '-' to be part of keywords (to use Lisp-like symbols name)

* Added an unit test for the 'parse' function of confparser module.

git-archimport-id: frederic@jolliton.com--2005-private/confparser--main--0.1--patch-14

confparser.py
test_confparser.py [new file with mode: 0644]

index b583bb3..a274f73 100644 (file)
@@ -100,12 +100,13 @@ def parseConf( p , meta = None ) :
 
 def parse( doc , filename = None ) :
 
+       kw = r'[_a-zA-Z](?:[-_a-zA-Z0-9]*[_a-zA-Z0-9])?'
        tokenMatches = {
                'eot'     : '$' ,
                'blank'   : r'\s+' ,
                'integer' : r'[0-9]+' ,
-               'keyword' : r'[_a-zA-Z][_a-zA-Z0-9]*' ,
-               'string'  : r'[_a-zA-Z][_a-zA-Z0-9]*|\'(?:[^\\\']|\\.)*\'' ,
+               'keyword' : kw ,
+               'string'  : kw + r"|'(?:[^\\']|\\.)*'" ,
                'comment' : r'#[^\n]*(?:\n|$)' ,
                '{'       : '{' ,
                '}'       : '}' ,
diff --git a/test_confparser.py b/test_confparser.py
new file mode 100644 (file)
index 0000000..ae9f95a
--- /dev/null
@@ -0,0 +1,79 @@
+#!/usr/bin/python
+# -*- coding:utf-8 -*-
+
+#
+# confparser tests
+# Copyright (C) 2005  Frédéric Jolliton <frederic@jolliton.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+
+# FIXME: Incomplete unit test.
+
+import unittest
+
+import confparser
+
+def serialize( conf ) :
+
+       if isinstance( conf , tuple ) :
+               name , values , subs = conf[ : 3 ]
+               if name == '__root__' :
+                       result = serialize( conf[ 2 ] )
+               else :
+                       result = ':'.join( [ name ] + map( repr , ( values or [] ) ) )
+                       if not subs :
+                               result += ';'
+                       else :
+                               result += '{' + serialize( conf[ 2 ] ) + '}'
+       elif isinstance( conf , list ) :
+               result = ''.join( map( serialize , conf ) )
+       elif conf is None :
+               result = ''
+       else :
+               raise Exception( 'Type of node %r unknown.' % conf )
+       return result
+
+def parseAndSerialize( text ) :
+
+       return serialize( confparser.parse( text ) )
+
+class ConfParserTestCase( unittest.TestCase ) :
+
+       def testSimple( self ) :
+
+               tests = [
+                         ( '' , ''     )
+                       , ( 'foo;' , 'foo;' )
+                       , ( '\nfoo\t;\r' , 'foo;' )
+                       , ( 'foo{}' , 'foo;' )
+                       , ( 'foo{bar;}' , 'foo{bar;}' )
+                       , ( 'foo{bar{baz;}}' , 'foo{bar{baz;}}' )
+                       , ( 'foo bar baz;' , "foo:'bar':'baz';" )
+                       , ( 'foo\n\n\nbar\t\n{ baz ; }' , "foo:'bar'{baz;}" )
+                       , ( 'foo-bar-baz;' , 'foo-bar-baz;' )
+                       , ( '_-_;' , '_-_;' ) # Ahem..
+                       , ( "foo 'bar';" , "foo:'bar';" )
+               ]
+               for text , resultSerialized in tests :
+                       self.assertEquals( parseAndSerialize( text ) , resultSerialized )
+
+if __name__ == '__main__' :
+       unittest.main()
+
+# Local Variables:
+# tab-width: 4
+# python-indent: 4
+# End: