From 9db4433e0194a67b8762fad880d38799e98058cb Mon Sep 17 00:00:00 2001 From: manon blanco <blanco@teklia.com> Date: Tue, 10 Nov 2020 14:49:36 +0000 Subject: [PATCH] Create a fake worker version --- .../commands/fake_worker_version.py | 69 +++++++++++ arkindex/dataimport/models.py | 3 +- .../tests/test_fake_worker_version.py | 116 ++++++++++++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 arkindex/dataimport/management/commands/fake_worker_version.py create mode 100644 arkindex/dataimport/tests/test_fake_worker_version.py diff --git a/arkindex/dataimport/management/commands/fake_worker_version.py b/arkindex/dataimport/management/commands/fake_worker_version.py new file mode 100644 index 0000000000..1efe887bae --- /dev/null +++ b/arkindex/dataimport/management/commands/fake_worker_version.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +import logging +import uuid + +from django.core.management.base import BaseCommand + +from arkindex.dataimport.models import Repository, RepositoryType, Revision, Worker, WorkerVersion +from arkindex_common.ml_tool import MLToolType + +logging.basicConfig( + level=logging.INFO, + format='[%(levelname)s] %(message)s', +) +logger = logging.getLogger(__name__) + + +class Command(BaseCommand): + help = 'Create a fake worker version' + + def add_arguments(self, parser): + parser.add_argument( + "--url", + help="URL of the repository", + required=True + ) + parser.add_argument( + "--name", + help="Name of the worker", + required=True + ) + parser.add_argument( + "--slug", + help="Slug of the worker", + required=True + ) + + def handle(self, url, name, slug, *args, **options): + versions = WorkerVersion.objects.filter(worker__slug=slug) + if versions.exists(): + versions_id = list(versions.values_list('id', flat=True).distinct()) + logger.info(f"This worker already has versions: {versions_id}") + return + + repo, _ = Repository.objects.get_or_create( + url=url, + type=RepositoryType.Worker, + ) + + worker, _ = Worker.objects.get_or_create( + name=name, + slug=slug, + type=MLToolType.Classifier, + repository=repo + ) + + revision = Revision.objects.create( + repo_id=repo.id, + hash=uuid.uuid4().hex, + message="Fake revision", + author="Teklia Bot" + ) + + version = WorkerVersion.objects.create( + worker=worker, + revision=revision, + configuration="", + ) + + logger.info(f"Created a worker version: {version.id}") diff --git a/arkindex/dataimport/models.py b/arkindex/dataimport/models.py index 21449e3f3a..01dfc88346 100644 --- a/arkindex/dataimport/models.py +++ b/arkindex/dataimport/models.py @@ -349,7 +349,8 @@ class Revision(IndexableModel): return '{}/commit/{}'.format(self.repo.url.rstrip('/'), self.hash) def __str__(self): - return '{} "{}" by {}'.format(self.hash[:8], self.message.splitlines()[0], self.author) + message = ' "{}"'.format(self.message.splitlines()[0]) if self.message else '' + return '{}{} by {}'.format(self.hash[:8], message, self.author) @property def state(self): diff --git a/arkindex/dataimport/tests/test_fake_worker_version.py b/arkindex/dataimport/tests/test_fake_worker_version.py new file mode 100644 index 0000000000..41d6735f86 --- /dev/null +++ b/arkindex/dataimport/tests/test_fake_worker_version.py @@ -0,0 +1,116 @@ +from django.core.management import call_command + +from arkindex.dataimport.models import Repository, RepositoryType, Revision, Worker, WorkerVersion, WorkerVersionState +from arkindex.project.tests import FixtureTestCase +from arkindex_common.ml_tool import MLToolType + + +class TestFakeWorker(FixtureTestCase): + + def test_create_version(self): + slug = 'myslug' + name = 'My name' + url = 'http://fake' + + self.assertFalse(WorkerVersion.objects.filter(worker__slug=slug).exists()) + + call_command( + 'fake_worker_version', + slug=slug, + name=name, + url=url, + ) + + worker = Worker.objects.get(slug=slug) + version = WorkerVersion.objects.get(worker__slug=slug) + repo = worker.repository + revision = Revision.objects.get(repo_id=repo.id) + + self.assertEqual(repo.url, url) + self.assertEqual(repo.type, RepositoryType.Worker) + + self.assertEqual(worker.name, name) + self.assertEqual(worker.slug, slug) + self.assertEqual(worker.type, MLToolType.Classifier) + + self.assertIsNotNone(revision.hash) + self.assertEqual(revision.message, "Fake revision") + self.assertEqual(revision.author, "Teklia Bot") + + self.assertEqual(version.worker, worker) + self.assertEqual(version.revision, revision) + self.assertEqual(version.state, WorkerVersionState.Created) + + def test_version_already_exists(self): + slug = 'myslug' + name = 'My name' + url = 'http://fake' + call_command( + 'fake_worker_version', + slug=slug, + name=name, + url=url, + ) + + old_versions = WorkerVersion.objects.filter(worker__slug=slug) + old_versions_id = list(old_versions.values_list('id', flat=True).distinct()) + self.assertTrue(old_versions.exists()) + + call_command( + 'fake_worker_version', + slug=slug, + name=name, + url=url, + ) + + new_versions = WorkerVersion.objects.filter(worker__slug=slug) + new_versions_id = list(new_versions.values_list('id', flat=True).distinct()) + self.assertEqual(old_versions_id, new_versions_id) + + def test_repository_already_exists(self): + slug = 'myslug' + name = 'My name' + url = 'http://fake' + + repo = Repository.objects.create( + url=url, + type=RepositoryType.Worker, + ) + + call_command( + 'fake_worker_version', + slug=slug, + name=name, + url=url, + ) + + version = WorkerVersion.objects.get(worker__slug=slug) + self.assertEqual(version.worker.repository.id, repo.id) + + def test_worker_already_exists(self): + slug = 'myslug' + name = 'My name' + url = 'http://fake' + + repo = Repository.objects.create( + url=url, + type=RepositoryType.Worker, + ) + + worker = Worker.objects.create( + name=name, + slug=slug, + type=MLToolType.Classifier, + repository=repo + ) + + call_command( + 'fake_worker_version', + slug=slug, + name=name, + url=url, + ) + + version = WorkerVersion.objects.get(worker__slug=slug) + self.assertEqual(version.worker.repository.id, repo.id) + self.assertEqual(version.worker.id, worker.id) -- GitLab