[Assorted-commits] SF.net SVN: assorted: [892] simple-zdb/trunk
Brought to you by:
yangzhang
From: <yan...@us...> - 2008-07-16 05:46:38
|
Revision: 892 http://assorted.svn.sourceforge.net/assorted/?rev=892&view=rev Author: yangzhang Date: 2008-07-15 22:46:48 -0700 (Tue, 15 Jul 2008) Log Message: ----------- can now (incorrectly - see README) parse the full set of people in my notes.txt Modified Paths: -------------- simple-zdb/trunk/README simple-zdb/trunk/src/zdb.py Modified: simple-zdb/trunk/README =================================================================== --- simple-zdb/trunk/README 2008-07-16 05:08:50 UTC (rev 891) +++ simple-zdb/trunk/README 2008-07-16 05:46:48 UTC (rev 892) @@ -9,3 +9,10 @@ queries - revision controlled wiki: history is maintained, feed of updates is provided +Todo +---- + +Bugs: + +- handle multiple values per property +- handle inheritance correctly Modified: simple-zdb/trunk/src/zdb.py =================================================================== --- simple-zdb/trunk/src/zdb.py 2008-07-16 05:08:50 UTC (rev 891) +++ simple-zdb/trunk/src/zdb.py 2008-07-16 05:46:48 UTC (rev 892) @@ -4,8 +4,10 @@ from cPickle import load, dump from cStringIO import StringIO +from commons.exceps import handle_exceptions from commons.files import soft_makedirs from commons.startup import run_main +from commons.structs import free_struct from os import rename from path import path from re import match @@ -26,8 +28,9 @@ 'The actual DB.' def __init__( self ): self.name2obj = {} + # User-facing functions (these are the console commands) def add( self, name, parents, props ): - self.name2obj[ name ] = obj( name, parents, props ) + self.addobj( obj( name, parents, props ) ) def set( self, name, field, value ): self.name2obj[ name ].props[ field ] = value def rm( self, name ): @@ -35,9 +38,13 @@ def dump( self, path ): with file( path, 'w' ) as f: f.write( 'blah' ) - def load( self, path ): + def load( self, parent, path ): with file( path ) as f: - parse( f.read() ) + for o in parse( f.read(), [parent] ): + self.addobj( o ) + # API functions + def addobj( self, o ): + self.name2obj[ o.name ] = o class obj( object ): 'An object in the ZDB object database' @@ -54,7 +61,6 @@ self.props = {} for p in props: self.props[p] = [] if name in db.name2obj: raise zdb_exception('already exists: ' + name) - db.name2obj[name] = self # # DB files management @@ -86,41 +92,49 @@ 'Initialize a new DB and set the `db` global to it.' global db db = zdb() - obj( 'concept', [], [ 'notes' ] ) + db.add( 'concept', [], [ 'notes' ] ) # some common types - obj( 'person', [ 'concept' ], [ 'cell', 'email', 'aim', 'msn', 'google', 'residence' ] ) -# obj( 'place', [ 'concept' ], [ 'yelp URL' ] ) -# obj( 'event', [ 'concept' ], [ 'date/time' ] ) -# obj( 'group', [ 'concept' ], [ 'cell' ] ) + db.add( 'person', [ 'concept' ], [ 'cell', 'email', 'aim', 'msn', 'google', 'residence' ] ) +# db.add( 'place', [ 'concept' ], [ 'yelp URL' ] ) +# db.add( 'event', [ 'concept' ], [ 'date/time' ] ) +# db.add( 'group', [ 'concept' ], [ 'cell' ] ) # # parser # def parse( s, parents ): - f = StringIO(s.strip()) - os = [] - while True: - name = f.readline().strip() - if name == '': break - o = obj( name, parents, [] ) + line = None + counter = free_struct() + counter.i = 0 + def readline( f ): + counter.i += 1 + return f.readline().rstrip() + try: + f = StringIO(s.strip()) while True: - line = f.readline().strip() - if line == '': break - m = match( '^([^:]+)::$', line ) - if m is not None: - field = m.group(1) - buf = [] - while True: - line = f.readline().rstrip() - if line == '::': break - buf.append( line ) - value = '\n'.join( buf ).rstrip() - else: - [field, value] = line.split(': ', 1) - o.props[ field ] = value - os.append( o ) - return os + name = readline(f).strip() + if name == '': break + o = obj( name, parents, [] ) + while True: + line = readline(f).strip() + if line == '': break + m = match( '^([^:]+)::$', line ) + if m is not None: + field = m.group(1) + buf = [] + while True: + line = readline(f) + if line == '::': break + buf.append( line ) + value = '\n'.join( buf ).rstrip() + else: + [field, value] = line.split(': ', 1) + o.props[ field ] = value + yield o + except: + print >> stderr, 'line %d: %s' % ( counter.i, line ) + raise # # tests @@ -130,8 +144,7 @@ def setUp( self ): createdb() def test_simple( self ): - createdb() - parsed = parse( ''' + parsed = list( parse( ''' Yang Zhang google: yaaang notes:: @@ -144,8 +157,7 @@ notes:: - loves kids :: - ''', [ 'person' ] ) - createdb() + ''', [ 'person' ] ) ) expected = [None] * 2 expected[0] = obj( 'Yang Zhang', [ 'person' ], '' ) expected[0].props[ 'google' ] = 'yaaang' @@ -169,20 +181,20 @@ stdout.write( '>>> ' ) line = stdin.readline() words = line.split() - params = words[1:] if words != []: - cmd = words[0] + cmd, params = words[0], words[1:] try: if False: pass - elif cmd == 'add': db.add( *params ) - elif cmd == 'del': db.rm( *params ) - elif cmd == 'set': db.set( *params ) - elif cmd == 'edit': db.dump( *params ) - elif cmd == 'save': db.load( *params ) + elif cmd == 'add': db.add( *params ) + elif cmd == 'del': db.rm( *params ) + elif cmd == 'set': db.set( *params ) + elif cmd == 'dump': db.dump( *params ) + elif cmd == 'load': db.load( *params ) elif cmd == 'quit': break else: raise zdb_exception( 'bad command: ' + cmd ) except BaseException, ex: - print >> stderr, ex + # print >> stderr, ex + handle_exceptions() savedb() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |