def test_relation_creation(self): logger = Logger(path=TEST_LOG_PATH) operation = { 'method': 'create_document', 'id': 456, 'name': 'first.txt', 'type': 'txt', 'path': '/tmp/first.txt' } logger.save_operation(operation) operation = {'method': 'create_tag', 'id': 123, 'name': 'python'} logger.save_operation(operation) operation = { 'method': 'create_relation', 'document_id': 456, 'tag_id': 123 } logger.save_operation(operation) context = Context() logger.restore_context(context) self.assertEqual(context.count_documents(), 1) self.assertEqual(context.count_tags(), 1) self.assertEqual(context.count_relations(), 1) self.assertEqual(context.find_document_ids([123]), [456]) self.assertEqual(context.find_tag_ids([456]), [123])
def test_empty_context(self): logger = Logger(path=TEST_LOG_PATH) context = Context() logger.restore_context(context) self.assertEqual(context.count_documents(), 0) self.assertEqual(context.count_tags(), 0) self.assertEqual(context.count_relations(), 0)
def __init__(self, path='/tmp/grimoire.log'): super(Database, self).__init__() self._logger = Logger(path) self._logger.disable_logging() self._last_document_id = 0 self._last_tag_id = 0 self._logger.restore_context(self) self._last_document_id = self.calc_last_document_id() self._last_tag_id = self.calc_last_tag_id() self._logger.enable_logging()
def test_document_path_and_type_update(self): logger = Logger(path=TEST_LOG_PATH) operation = { 'method': 'create_document', 'id': 456, 'name': 'first.txt', 'type': 'txt', 'path': '/tmp/first.txt' } logger.save_operation(operation) operation = { 'method': 'update_document', 'id': 456, 'path': '/tmp/new.rst', 'type': 'rst' } logger.save_operation(operation) context = Context() logger.restore_context(context) self.assertEqual(context.count_documents(), 1) document = context.get_document(456) self.assertEqual(document.id, 456) self.assertEqual(document.name, 'first.txt') self.assertEqual(document.type, 'rst') self.assertEqual(document.path, '/tmp/new.rst')
def test_tag_creation_and_remove(self): logger = Logger(path=TEST_LOG_PATH) operation = {'method': 'create_tag', 'id': 123, 'name': 'python'} logger.save_operation(operation) operation = {'method': 'destroy_tag', 'id': 123} logger.save_operation(operation) context = Context() logger.restore_context(context) self.assertEqual(context.count_tags(), 0)
def test_tag_name_update(self): logger = Logger(path=TEST_LOG_PATH) operation = {'method': 'create_tag', 'id': 123, 'name': 'python'} logger.save_operation(operation) operation = {'method': 'update_tag', 'id': 123, 'name': 'lua'} logger.save_operation(operation) context = Context() logger.restore_context(context) self.assertEqual(context.count_tags(), 1) tag = context.get_tag(123) self.assertEqual(tag.id, 123) self.assertEqual(tag.name, 'lua')
def test_document_creation_and_remove(self): logger = Logger(path=TEST_LOG_PATH) operation = { 'method': 'create_document', 'id': 1, 'name': 'first.txt', 'type': 'txt', 'path': '/tmp/first.txt' } logger.save_operation(operation) operation = {'method': 'destroy_document', 'id': 1} logger.save_operation(operation) context = Context() logger.restore_context(context) self.assertEqual(context.count_documents(), 0)
class Database(Context): """Database for tagging""" def __init__(self, path='/tmp/grimoire.log'): super(Database, self).__init__() self._logger = Logger(path) self._logger.disable_logging() self._last_document_id = 0 self._last_tag_id = 0 self._logger.restore_context(self) self._last_document_id = self.calc_last_document_id() self._last_tag_id = self.calc_last_tag_id() self._logger.enable_logging() def generate_document_id(self): """ Generate new document identifier. :return: a positive integer value """ self._last_document_id += 1 return self._last_document_id def generate_tag_id(self): """ Generate a new tag identifier. :return: a positive integer value """ self._last_tag_id += 1 return self._last_tag_id def save_operation(self, method, **arguments): """ Save the operation to file via the logger. :param method: name of the called method :param arguments: arguments of the given method :return: None """ arguments['method'] = method self._logger.save_operation(arguments) def create_document(self, **arguments): """ Create a new document for the database. :return: the created document object """ document_id = self.generate_document_id() arguments['id'] = document_id document = super(Database, self).create_document(**arguments) self.save_operation('create_document', **arguments) return document def update_document(self, **arguments): """ Update an existing document. :return: None """ super(Database, self).update_document(**arguments) self.save_operation('update_document', **arguments) def destroy_document(self, **arguments): """ Destroy the given document. :return: None """ super(Database, self).destroy_document(**arguments) self.save_operation('destroy_document', **arguments) def create_tag(self, **arguments): """ Create a new tag. :return: None """ tag_id = self.generate_tag_id() arguments['id'] = tag_id tag = super(Database, self).create_tag(**arguments) self.save_operation('create_tag', **arguments) return tag def update_tag(self, **arguments): """ Update an existing tag. :return: None """ super(Database, self).update_tag(**arguments) self.save_operation('update_tag', **arguments) def destroy_tag(self, **arguments): """ Destroy the given tag. :return: None """ super(Database, self).destroy_tag(**arguments) self.save_operation('destroy_tag', **arguments) def find_similar_tags(self, tag_name, limit=20): """ Find tags with a similar name. :param tag_name: the searched tag name :param limit: the maximal number of the resulted tag names :return: the list of tag names """ name = tag_name.lower() similar_tags = [] for _, tag in self._tags.items(): if name in tag.name.lower(): similar_tags.append(tag.name) if len(similar_tags) == limit: return similar_tags return similar_tags def create_relation(self, **arguments): """ Create a new relation. :return: None """ super(Database, self).create_relation(**arguments) self.save_operation('create_relation', **arguments) def destroy_relation(self, **arguments): """ Destroy an existing relation. :return: None """ super(Database, self).destroy_relation(**arguments) self.save_operation('destroy_relation', **arguments)