virtool-workflow 7.1.0__tar.gz → 7.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/PKG-INFO +3 -2
  2. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/pyproject.toml +3 -2
  3. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/run.py +12 -27
  4. virtool_workflow-7.1.2/virtool_workflow/utils.py +83 -0
  5. virtool_workflow-7.1.0/virtool_workflow/utils.py +0 -41
  6. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/LICENSE +0 -0
  7. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/README.md +0 -0
  8. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/__init__.py +0 -0
  9. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/analysis/__init__.py +0 -0
  10. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/analysis/fastqc.py +0 -0
  11. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/analysis/skewer.py +0 -0
  12. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/analysis/trimming.py +0 -0
  13. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/analysis/utils.py +0 -0
  14. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/api/__init__.py +0 -0
  15. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/api/acquire.py +0 -0
  16. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/api/client.py +0 -0
  17. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/api/utils.py +0 -0
  18. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/cli.py +0 -0
  19. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/data/__init__.py +0 -0
  20. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/data/analyses.py +0 -0
  21. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/data/hmms.py +0 -0
  22. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/data/indexes.py +0 -0
  23. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/data/jobs.py +0 -0
  24. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/data/ml.py +0 -0
  25. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/data/samples.py +0 -0
  26. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/data/subtractions.py +0 -0
  27. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/data/uploads.py +0 -0
  28. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/decorators.py +0 -0
  29. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/errors.py +0 -0
  30. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/files.py +0 -0
  31. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/hooks.py +0 -0
  32. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/pytest_plugin/__init__.py +0 -0
  33. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/pytest_plugin/data.py +0 -0
  34. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/pytest_plugin/utils.py +0 -0
  35. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/__init__.py +0 -0
  36. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/config.py +0 -0
  37. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/discover.py +0 -0
  38. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/events.py +0 -0
  39. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/hook.py +0 -0
  40. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/path.py +0 -0
  41. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/ping.py +0 -0
  42. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/redis.py +0 -0
  43. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/run_subprocess.py +0 -0
  44. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/runtime/sentry.py +0 -0
  45. {virtool_workflow-7.1.0 → virtool_workflow-7.1.2}/virtool_workflow/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: virtool-workflow
3
- Version: 7.1.0
3
+ Version: 7.1.2
4
4
  Summary: A framework for developing bioinformatics workflows for Virtool.
5
5
  Home-page: https://github.com/virtool/virtool-workflow
6
6
  License: MIT
@@ -18,7 +18,8 @@ Requires-Dist: orjson (>=3.9.9,<4.0.0)
18
18
  Requires-Dist: pydantic-factories (>=1.17.3,<2.0.0)
19
19
  Requires-Dist: pyfixtures (>=1.0.0,<2.0.0)
20
20
  Requires-Dist: sentry-sdk (>=2.3.1,<3.0.0)
21
- Requires-Dist: virtool-core (>=14.0.0,<15.0.0)
21
+ Requires-Dist: structlog-sentry (>=2.2.1,<3.0.0)
22
+ Requires-Dist: virtool-core (>=14.0.4,<15.0.0)
22
23
  Project-URL: Repository, https://github.com/virtool/virtool-workflow
23
24
  Description-Content-Type: text/markdown
24
25
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "virtool-workflow"
3
- version = "7.1.0"
3
+ version = "7.1.2"
4
4
  description = "A framework for developing bioinformatics workflows for Virtool."
5
5
  authors = [
6
6
  "Ian Boyes",
@@ -38,7 +38,8 @@ orjson = "^3.9.9"
38
38
  pydantic-factories = "^1.17.3"
39
39
  pyfixtures = "^1.0.0"
40
40
  sentry-sdk = "^2.3.1"
41
- virtool-core = "^14.0.0"
41
+ virtool-core = "^14.0.4"
42
+ structlog-sentry = "^2.2.1"
42
43
 
43
44
  [tool.poetry.scripts]
44
45
  run-workflow = "virtool_workflow.cli:cli_main"
@@ -1,12 +1,10 @@
1
1
  import asyncio
2
- import logging
3
2
  import signal
4
3
  import sys
5
4
  from asyncio import CancelledError
5
+ from collections.abc import Callable
6
6
  from pathlib import Path
7
- from typing import Callable
8
7
 
9
- import structlog
10
8
  from pyfixtures import FixtureScope, runs_in_new_fixture_context
11
9
  from structlog import get_logger
12
10
  from virtool_core.models.job import JobState
@@ -41,7 +39,7 @@ from virtool_workflow.runtime.redis import (
41
39
  wait_for_cancellation,
42
40
  )
43
41
  from virtool_workflow.runtime.sentry import configure_sentry
44
- from virtool_workflow.utils import get_virtool_workflow_version
42
+ from virtool_workflow.utils import configure_logs, get_virtool_workflow_version
45
43
  from virtool_workflow.workflow import Workflow
46
44
 
47
45
  logger = get_logger("runtime")
@@ -161,11 +159,14 @@ async def run_workflow(
161
159
 
162
160
  job = await acquire_job_by_id(config.jobs_api_connection_string, job_id)
163
161
 
164
- async with api_client(
165
- config.jobs_api_connection_string,
166
- job.id,
167
- job.key,
168
- ) as api, FixtureScope() as scope:
162
+ async with (
163
+ api_client(
164
+ config.jobs_api_connection_string,
165
+ job.id,
166
+ job.key,
167
+ ) as api,
168
+ FixtureScope() as scope,
169
+ ):
169
170
  # These fixtures should not be used directly by the workflow. They are used
170
171
  # by other built-in fixtures.
171
172
  scope["_api"] = api
@@ -209,23 +210,7 @@ async def start_runtime(
209
210
 
210
211
  When a job ID is received, the runtime acquires the job from the jobs API and
211
212
  """
212
- # configure_logs(dev)
213
-
214
- logging.basicConfig(level=logging.INFO, format="%(message)s")
215
-
216
- structlog.configure(
217
- wrapper_class=structlog.make_filtering_bound_logger(logging.INFO),
218
- logger_factory=structlog.stdlib.LoggerFactory(),
219
- cache_logger_on_first_use=True,
220
- processors=[
221
- structlog.stdlib.filter_by_level,
222
- structlog.stdlib.add_logger_name,
223
- structlog.stdlib.add_log_level,
224
- structlog.stdlib.PositionalArgumentsFormatter(),
225
- structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M.%S"),
226
- structlog.dev.ConsoleRenderer(colors=True, sort_keys=True),
227
- ],
228
- )
213
+ configure_logs(bool(sentry_dsn))
229
214
 
230
215
  logger.info(
231
216
  "found virtool-workflow",
@@ -242,7 +227,7 @@ async def start_runtime(
242
227
  async with Redis(redis_connection_string) as redis:
243
228
  try:
244
229
  job_id = await get_next_job_with_timeout(redis_list_name, redis, timeout)
245
- except asyncio.TimeoutError:
230
+ except TimeoutError:
246
231
  # This happens due to Kubernetes scheduling issues or job cancellations. It
247
232
  # is not an error.
248
233
  logger.warning("timed out while waiting for job id")
@@ -0,0 +1,83 @@
1
+ import asyncio
2
+ import logging
3
+ import sys
4
+ import tarfile
5
+ from collections.abc import Callable
6
+ from functools import wraps
7
+ from importlib import metadata
8
+ from inspect import iscoroutinefunction
9
+ from pathlib import Path
10
+
11
+ import structlog
12
+ from structlog.processors import LogfmtRenderer
13
+ from structlog_sentry import SentryProcessor
14
+
15
+
16
+ def coerce_to_coroutine_function(func: Callable):
17
+ """Wrap a non-async function in an async function."""
18
+ if iscoroutinefunction(func):
19
+ return func
20
+
21
+ @wraps(func)
22
+ async def _func(*args, **kwargs):
23
+ return func(*args, **kwargs)
24
+
25
+ return _func
26
+
27
+
28
+ def configure_logs(use_sentry: bool):
29
+ logging.basicConfig(
30
+ format="%(message)s",
31
+ stream=sys.stdout,
32
+ level=logging.INFO,
33
+ )
34
+
35
+ processors = [
36
+ structlog.stdlib.filter_by_level,
37
+ structlog.stdlib.add_logger_name,
38
+ structlog.stdlib.add_log_level,
39
+ structlog.stdlib.PositionalArgumentsFormatter(),
40
+ structlog.processors.TimeStamper(fmt="%Y-%m-%dT%H:%M:%SZ"),
41
+ structlog.processors.StackInfoRenderer(),
42
+ structlog.processors.UnicodeDecoder(),
43
+ ]
44
+
45
+ if use_sentry:
46
+ processors.append(
47
+ SentryProcessor(event_level=logging.WARNING, level=logging.INFO),
48
+ )
49
+
50
+ processors.append(
51
+ LogfmtRenderer(
52
+ key_order=["timestamp", "level", "logger", "event"],
53
+ ),
54
+ )
55
+
56
+ structlog.configure(
57
+ cache_logger_on_first_use=True,
58
+ logger_factory=structlog.stdlib.LoggerFactory(),
59
+ processors=processors,
60
+ wrapper_class=structlog.stdlib.BoundLogger,
61
+ )
62
+
63
+
64
+ def get_virtool_workflow_version() -> str:
65
+ """Get the version of the installed virtool-workflow package."""
66
+ try:
67
+ return metadata.version("virtool-workflow")
68
+ except metadata.PackageNotFoundError:
69
+ return "0.0.0"
70
+
71
+
72
+ async def make_directory(path: Path):
73
+ await asyncio.to_thread(path.mkdir, exist_ok=True, parents=True)
74
+
75
+
76
+ def untar(path: Path, target_path: Path):
77
+ with tarfile.open(path, "r:gz") as tar:
78
+ tar.extractall(target_path)
79
+
80
+
81
+ def move_all_model_files(source_path: Path, target_path: Path):
82
+ for file in source_path.iterdir():
83
+ file.rename(target_path / file.name)
@@ -1,41 +0,0 @@
1
- import asyncio
2
- import tarfile
3
- from collections.abc import Callable
4
- from functools import wraps
5
- from importlib import metadata
6
- from inspect import iscoroutinefunction
7
- from pathlib import Path
8
-
9
-
10
- def coerce_to_coroutine_function(func: Callable):
11
- """Wrap a non-async function in an async function."""
12
- if iscoroutinefunction(func):
13
- return func
14
-
15
- @wraps(func)
16
- async def _func(*args, **kwargs):
17
- return func(*args, **kwargs)
18
-
19
- return _func
20
-
21
-
22
- def get_virtool_workflow_version() -> str:
23
- """Get the version of the installed virtool-workflow package."""
24
- try:
25
- return metadata.version("virtool-workflow")
26
- except metadata.PackageNotFoundError:
27
- return "0.0.0"
28
-
29
-
30
- async def make_directory(path: Path):
31
- await asyncio.to_thread(path.mkdir, exist_ok=True, parents=True)
32
-
33
-
34
- def untar(path: Path, target_path: Path):
35
- with tarfile.open(path, "r:gz") as tar:
36
- tar.extractall(target_path)
37
-
38
-
39
- def move_all_model_files(source_path: Path, target_path: Path):
40
- for file in source_path.iterdir():
41
- file.rename(target_path / file.name)