From: Torsten Werner Date: Tue, 22 Mar 2011 22:02:25 +0000 (+0100) Subject: Add Metadata classes + tests. X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=b2429767aa02b1e02def623875fdd6a942c4a44f;p=dak.git Add Metadata classes + tests. + some cleanup of dbconn.py Signed-off-by: Torsten Werner --- diff --git a/daklib/dbconn.py b/daklib/dbconn.py index bf77b2a7..038c014b 100755 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -2802,6 +2802,52 @@ __all__.append('UploadBlock') ################################################################################ +class MetadataKey(ORMObject): + def __init__(self, key = None): + self.key = key + + def properties(self): + return ['key'] + + def not_null_constraints(self): + return ['key'] + +__all__.append('MetadataKey') + +################################################################################ + +class BinaryMetadata(ORMObject): + def __init__(self, binary = None, key = None, value = None): + self.binary = binary + self.key = key + self.value = value + + def properties(self): + return ['binary', 'key', 'value'] + + def not_null_constraints(self): + return ['value'] + +__all__.append('BinaryMetadata') + +################################################################################ + +class SourceMetadata(ORMObject): + def __init__(self, source = None, key = None, value = None): + self.source = source + self.key = key + self.value = value + + def properties(self): + return ['source', 'key', 'value'] + + def not_null_constraints(self): + return ['value'] + +__all__.append('SourceMetadata') + +################################################################################ + class DBConn(object): """ database module init. @@ -2817,11 +2863,13 @@ class DBConn(object): self.__createconn() def __setuptables(self): - tables_with_primary = ( + tables = ( 'architecture', 'archive', 'bin_associations', + 'bin_contents', 'binaries', + 'binaries_metadata', 'binary_acl', 'binary_acl_map', 'build_queue', @@ -2833,38 +2881,37 @@ class DBConn(object): 'changes_pending_binaries', 'changes_pending_files', 'changes_pending_source', + 'changes_pending_files_map', + 'changes_pending_source_files', + 'changes_pool_files', 'dsc_files', + 'extra_src_references', 'files', 'fingerprint', 'keyrings', 'keyring_acl_map', 'location', 'maintainer', + 'metadata_keys', 'new_comments', + # TODO: the maintainer column in table override should be removed. + 'override', 'override_type', 'policy_queue', 'priority', 'section', 'source', 'source_acl', + 'source_metadata', 'src_associations', 'src_format', 'src_uploaders', 'suite', - 'uid', - 'upload_blocks', - ) - - tables_no_primary = ( - 'changes_pending_files_map', - 'changes_pending_source_files', - 'changes_pool_files', - 'extra_src_references', - # TODO: the maintainer column in table override should be removed. - 'override', 'suite_architectures', - 'suite_src_formats', 'suite_build_queue_copy', + 'suite_src_formats', + 'uid', + 'upload_blocks', ) views = ( @@ -2891,28 +2938,11 @@ class DBConn(object): 'suite_arch_by_name', ) - # Sqlalchemy version 0.5 fails to reflect the SERIAL type - # correctly and that is why we have to use a workaround. It can - # be removed as soon as we switch to version 0.6. - for table_name in tables_with_primary: + for table_name in tables: table = Table(table_name, self.db_meta, \ - Column('id', Integer, primary_key = True), \ autoload=True, useexisting=True) setattr(self, 'tbl_%s' % table_name, table) - for table_name in tables_no_primary: - table = Table(table_name, self.db_meta, autoload=True) - setattr(self, 'tbl_%s' % table_name, table) - - # bin_contents needs special attention until the SERIAL type is - # correctly detected and the workaround has been removed; see comment - # above - self.tbl_bin_contents = Table('bin_contents', self.db_meta, \ - Column('file', Text, primary_key = True), - Column('binary_id', Integer, ForeignKey('binaries.id'), \ - primary_key = True), - autoload=True, useexisting=True) - for view_name in views: view = Table(view_name, self.db_meta, autoload=True) setattr(self, 'view_%s' % view_name, view) @@ -3173,6 +3203,27 @@ class DBConn(object): backref=backref('contents', lazy='dynamic', cascade='all')), file = self.tbl_bin_contents.c.file)) + mapper(MetadataKey, self.tbl_metadata_keys, + properties = dict( + key_id = self.tbl_metadata_keys.c.key_id, + key = self.tbl_metadata_keys.c.key)) + + mapper(BinaryMetadata, self.tbl_binaries_metadata, + properties = dict( + binary_id = self.tbl_binaries_metadata.c.bin_id, + binary = relation(DBBinary), + key_id = self.tbl_binaries_metadata.c.key_id, + key = relation(MetadataKey), + value = self.tbl_binaries_metadata.c.value)) + + mapper(SourceMetadata, self.tbl_source_metadata, + properties = dict( + source_id = self.tbl_source_metadata.c.src_id, + source = relation(DBSource), + key_id = self.tbl_source_metadata.c.key_id, + key = relation(MetadataKey), + value = self.tbl_source_metadata.c.value)) + ## Connection functions def __createconn(self): from config import Config diff --git a/tests/dbtest_metadata.py b/tests/dbtest_metadata.py new file mode 100755 index 00000000..f1f30098 --- /dev/null +++ b/tests/dbtest_metadata.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +from db_test import DBDakTestCase + +from daklib.dbconn import DBConn, MetadataKey, BinaryMetadata, SourceMetadata + +import unittest + +class MetadataTestCase(DBDakTestCase): + """ + This TestCase checks the metadata handling. + """ + + def test_mappers(self): + ''' + Tests the mapper configuration. + ''' + self.setup_binaries() + # MetadataKey + depends = MetadataKey(key = 'Depends') + self.session.add(depends) + self.session.flush() + self.assertTrue(depends.key_id is not None) + # BinaryMetadata + hello_dep = BinaryMetadata(binary = self.binary['hello_2.2-1_i386'], + key = depends, value = 'foobar (>= 1.0)') + self.session.add(hello_dep) + self.session.flush() + self.assertEqual('hello', hello_dep.binary.package) + self.assertEqual('Depends', hello_dep.key.key) + self.assertEqual('foobar (>= 1.0)', hello_dep.value) + # SourceMetadata + build_dep = MetadataKey(key = 'Build-Depends') + hello_bd = SourceMetadata(source = self.binary['hello_2.2-1_i386'].source, + key = build_dep, value = 'foobar-dev') + self.session.add(hello_bd) + self.session.flush() + self.assertEqual('hello', hello_bd.source.source) + self.assertEqual('Build-Depends', hello_bd.key.key) + self.assertEqual('foobar-dev', hello_bd.value) + +if __name__ == '__main__': + unittest.main()