예제 #1
0
 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])
예제 #2
0
 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)
예제 #3
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()
예제 #4
0
 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')
예제 #5
0
 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)
예제 #6
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')
예제 #7
0
 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)
예제 #8
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)