diff --git a/.github/workflows/NewUpdate.yml b/.github/workflows/NewUpdate.yml index 5564270d..2a082fc8 100644 --- a/.github/workflows/NewUpdate.yml +++ b/.github/workflows/NewUpdate.yml @@ -101,6 +101,9 @@ jobs: chmod +x ./client-api_r/patches/list_syntax_fix.sh ./client-api_r/patches/list_syntax_fix.sh + + chmod +x ./client-api_r/patches/insert_wait_for_job_completion_in_rsirius_api.sh + ./client-api_r/patches/insert_wait_for_job_completion_in_rsirius_api.sh - name: Remove Sirius Rest Api run: | cd .updater/api diff --git a/.updater/clientTests/CondaFeedstockMinimalTests/PythonFeedstockTest.py b/.updater/clientTests/CondaFeedstockMinimalTests/PythonFeedstockTest.py index ac0b4f28..0f85feef 100644 --- a/.updater/clientTests/CondaFeedstockMinimalTests/PythonFeedstockTest.py +++ b/.updater/clientTests/CondaFeedstockMinimalTests/PythonFeedstockTest.py @@ -19,7 +19,7 @@ jobSub.ms_novelist_params.enabled = False job = api.jobs().start_job(project_id=ps_info.project_id, job_submission=jobSub) -Helper.wait_for_job_completion(ps_info.project_id, job.id, api.jobs()) +api.wait_for_job_completion(ps_info.project_id, job.id, 60) formula_id = api.features().get_aligned_feature(ps_info.project_id, featureId, [AlignedFeatureOptField.TOPANNOTATIONS] ).top_annotations.formula_annotation.formula_id diff --git a/.updater/clientTests/CondaFeedstockMinimalTests/RFeedstockTest.R b/.updater/clientTests/CondaFeedstockMinimalTests/RFeedstockTest.R index 2cf7f2cc..bfd0692d 100644 --- a/.updater/clientTests/CondaFeedstockMinimalTests/RFeedstockTest.R +++ b/.updater/clientTests/CondaFeedstockMinimalTests/RFeedstockTest.R @@ -21,8 +21,7 @@ job_submission$canopusParams$enabled <- FALSE job_submission$msNovelistParams$enabled <- FALSE job <- sirius_api$jobs_api$StartJob(project_id, job_submission) -Helper$new()$wait_for_job_completion(project_id, job$id, sirius_api$jobs_api) - +api$wait_for_job_completion(project_id, job$id, 60) aligned_feature_id <- sirius_api$features_api$GetAlignedFeatures(project_id)[[1]]$alignedFeatureId formula_id <- sirius_api$features_api$GetAlignedFeature(project_id, aligned_feature_id, opt_fields = list("topAnnotations"))$topAnnotations$formulaAnnotation$formulaId tree <- sirius_api$features_api$GetFragTree(project_id, aligned_feature_id, formula_id) diff --git a/client-api_python/generated/PySirius/pysirius_api.py b/client-api_python/generated/PySirius/pysirius_api.py index 7a9b7a46..912ebc9c 100644 --- a/client-api_python/generated/PySirius/pysirius_api.py +++ b/client-api_python/generated/PySirius/pysirius_api.py @@ -1,6 +1,10 @@ # THIS FILE IS NOT AUTO GENERATED AND MIGHT NEED TO BE CHANGED WHEN API ENDPOINTS CHANGE import PySirius +import logging +import traceback +import time +from PySirius import Job, ProjectInfo class PySiriusAPI: @@ -62,4 +66,18 @@ def tags(self): def models(self): """returns the Superclass of all models""" - return PySirius.models \ No newline at end of file + return PySirius.models + + def wait_for_job_completion(self, project_id, job_id, timeout_in_sec=None): + if isinstance(project_id, ProjectInfo): + project_id = project_id.project_id + if isinstance(job_id, Job): + job_id = job_id.id + try: + while PySirius.JobsApi(self.api_client).get_job(project_id, job_id).progress.state not in ["CANCELED", "FAILED", "DONE"]: + time.sleep(1) + if isinstance(timeout_in_sec, int): + timeout_in_sec = timeout_in_sec - 1 + if timeout_in_sec == 0: return + except Exception as e: + logging.error(traceback.format_exc()) \ No newline at end of file diff --git a/client-api_python/generated/PySirius/pysirius_helper.py b/client-api_python/generated/PySirius/pysirius_helper.py index 0a9ce4d9..1ff5a82d 100644 --- a/client-api_python/generated/PySirius/pysirius_helper.py +++ b/client-api_python/generated/PySirius/pysirius_helper.py @@ -2,14 +2,19 @@ import time import PySirius +from warnings import warn from PySirius import PySiriusAPI, ProjectInfo, Job - class Helper: """helper methods for ease of use of the SDK""" + def __init__(self, *args, **kwargs): + warn(f'{self.__class__.__name__} will be deprecated.', DeprecationWarning, stacklevel=2) + super().__init__(*args, **kwargs) + @staticmethod def wait_for_job_completion(project_id, job_id, jobs_api): + warn("This function will be deprecated. Use PySiriusAPI.wait_for_job_completion instead!", DeprecationWarning, stacklevel=2) if isinstance(jobs_api, PySiriusAPI): jobs_api = jobs_api.jobs() if isinstance(project_id, ProjectInfo): diff --git a/client-api_python/generated/test/test_acceptance.py b/client-api_python/generated/test/test_acceptance.py index 6314e4c2..853a4003 100644 --- a/client-api_python/generated/test/test_acceptance.py +++ b/client-api_python/generated/test/test_acceptance.py @@ -33,7 +33,7 @@ def test_simple_computation(self): job_sub.ms_novelist_params.enabled = False job = api.jobs().start_job(project_id=ps_info.project_id, job_submission=job_sub) - Helper.wait_for_job_completion(ps_info, job, api) + api.wait_for_job_completion(ps_info, job, 60) formula_candidate = api.features().get_aligned_feature(ps_info.project_id, feature_id, opt_fields=["topAnnotations"]).top_annotations.formula_annotation tree = api.features().get_frag_tree(ps_info.project_id, feature_id, formula_candidate.formula_id) diff --git a/client-api_python/generated/test/test_jobs_api.py b/client-api_python/generated/test/test_jobs_api.py index 19a7fb40..400b4cf0 100644 --- a/client-api_python/generated/test/test_jobs_api.py +++ b/client-api_python/generated/test/test_jobs_api.py @@ -205,7 +205,7 @@ def test_start_job(self) -> None: job_submission = JobSubmission.from_json(json.dumps(job_submission_json)) response = self.api.jobs().start_job(self.project_id, job_submission) - Helper.wait_for_job_completion(self.project_id, response.id, self.api.jobs()) + self.api.wait_for_job_completion(self.project_id, response.id) self.assertIsInstance(response, Job) @@ -232,7 +232,7 @@ def test_start_job_from_config(self) -> None: self.api.jobs().save_job_config(config_name, job_submission, True) response = self.api.jobs().start_job_from_config(self.project_id, config_name, [aligned_feature_id]) - Helper.wait_for_job_completion(self.project_id, response.id, self.api.jobs()) + self.api.wait_for_job_completion(self.project_id, response.id) self.api.jobs().delete_job_config(config_name) self.assertIsInstance(response, Job) diff --git a/client-api_python/pysirius_api.py b/client-api_python/pysirius_api.py index 7a9b7a46..912ebc9c 100644 --- a/client-api_python/pysirius_api.py +++ b/client-api_python/pysirius_api.py @@ -1,6 +1,10 @@ # THIS FILE IS NOT AUTO GENERATED AND MIGHT NEED TO BE CHANGED WHEN API ENDPOINTS CHANGE import PySirius +import logging +import traceback +import time +from PySirius import Job, ProjectInfo class PySiriusAPI: @@ -62,4 +66,18 @@ def tags(self): def models(self): """returns the Superclass of all models""" - return PySirius.models \ No newline at end of file + return PySirius.models + + def wait_for_job_completion(self, project_id, job_id, timeout_in_sec=None): + if isinstance(project_id, ProjectInfo): + project_id = project_id.project_id + if isinstance(job_id, Job): + job_id = job_id.id + try: + while PySirius.JobsApi(self.api_client).get_job(project_id, job_id).progress.state not in ["CANCELED", "FAILED", "DONE"]: + time.sleep(1) + if isinstance(timeout_in_sec, int): + timeout_in_sec = timeout_in_sec - 1 + if timeout_in_sec == 0: return + except Exception as e: + logging.error(traceback.format_exc()) \ No newline at end of file diff --git a/client-api_python/pysirius_helper.py b/client-api_python/pysirius_helper.py index 0a9ce4d9..1ff5a82d 100644 --- a/client-api_python/pysirius_helper.py +++ b/client-api_python/pysirius_helper.py @@ -2,14 +2,19 @@ import time import PySirius +from warnings import warn from PySirius import PySiriusAPI, ProjectInfo, Job - class Helper: """helper methods for ease of use of the SDK""" + def __init__(self, *args, **kwargs): + warn(f'{self.__class__.__name__} will be deprecated.', DeprecationWarning, stacklevel=2) + super().__init__(*args, **kwargs) + @staticmethod def wait_for_job_completion(project_id, job_id, jobs_api): + warn("This function will be deprecated. Use PySiriusAPI.wait_for_job_completion instead!", DeprecationWarning, stacklevel=2) if isinstance(jobs_api, PySiriusAPI): jobs_api = jobs_api.jobs() if isinstance(project_id, ProjectInfo): diff --git a/client-api_r/generated/R/rsirius_api.R b/client-api_r/generated/R/rsirius_api.R index 93ae5024..4816da6a 100644 --- a/client-api_r/generated/R/rsirius_api.R +++ b/client-api_r/generated/R/rsirius_api.R @@ -85,6 +85,32 @@ rsirius_api <- R6::R6Class( self$tags_api <- TagsApi$new(self$api_client) + }, + + wait_for_job_completion = function(project_id, job_id, timeout_in_sec=NULL) { + if (inherits(project_id, "ProjectInfo")) { + project_id <- project_id$projectId + } + if (inherits(job_id, "Job")) { + job_id <- job_id$id + } + tryCatch({ + while (!(self$jobs_api$GetJob(project_id, job_id)$progress$state %in% c("CANCELED", "FAILED", "DONE"))) { + Sys.sleep(1) + if (inherits(timeout_in_sec, "numeric")) { + timeout_in_sec <- timeout_in_sec - 1 + if (timeout_in_sec == 0) { + return() + } + } + } + }, error = function(e){ + message('Caught an error!') + message(e) + }, warning = function(w){ + message('Caught an warning!') + message(w) + }) } ) ) diff --git a/client-api_r/generated/R/rsirius_helper.R b/client-api_r/generated/R/rsirius_helper.R index 8b4fc2d3..2ee65e9b 100644 --- a/client-api_r/generated/R/rsirius_helper.R +++ b/client-api_r/generated/R/rsirius_helper.R @@ -2,6 +2,7 @@ Helper <- R6::R6Class( "Helper", public = list( wait_for_job_completion = function(project_id, job_id, jobs_api) { + .Deprecated("rsirius_api$wait_for_job_completion") if (inherits(jobs_api, "rsirius_api")) { jobs_api <- jobs_api$jobs_api } diff --git a/client-api_r/generated/tests/testthat.R b/client-api_r/generated/tests/testthat.R index 856d9097..73d94d0d 100644 --- a/client-api_r/generated/tests/testthat.R +++ b/client-api_r/generated/tests/testthat.R @@ -1,4 +1,4 @@ library(testthat) -library(Rsirius) +library(RSirius) -test_check("Rsirius") +test_check("RSirius") diff --git a/client-api_r/generated/tests/testthat/test_acceptance.R b/client-api_r/generated/tests/testthat/test_acceptance.R index 264f3891..f7ff1012 100644 --- a/client-api_r/generated/tests/testthat/test_acceptance.R +++ b/client-api_r/generated/tests/testthat/test_acceptance.R @@ -33,7 +33,7 @@ test_that("Test Acceptance", { job_submission$alignedFeatureIds <- list(features_api$GetAlignedFeatures(project_id)[[1]]$alignedFeatureId) response <- api_instance$StartJob(project_id, job_submission) - Helper$new()$wait_for_job_completion(project_id, response$id, api_instance) + api$wait_for_job_completion(project_id, response$id, 60) formula_candidate <- features_api$GetAlignedFeature(project_id, job_submission$alignedFeatureIds[[1]], opt_fields = list("topAnnotations"))$ topAnnotations$ diff --git a/client-api_r/generated/tests/testthat/test_jobs_api.R b/client-api_r/generated/tests/testthat/test_jobs_api.R index 304c3b05..656ed669 100644 --- a/client-api_r/generated/tests/testthat/test_jobs_api.R +++ b/client-api_r/generated/tests/testthat/test_jobs_api.R @@ -324,7 +324,7 @@ test_that("StartJob", { job_submission$alignedFeatureIds <- list(features_api$GetAlignedFeatures(project_id)[[1]]$alignedFeatureId) response <- api_instance$StartJob(project_id, job_submission) - Helper$new()$wait_for_job_completion(project_id, response$id, api_instance) + api$wait_for_job_completion(project_id, response$id) expect_true(inherits(response, "Job")) @@ -366,7 +366,7 @@ test_that("StartJobFromConfig", { api_instance$SaveJobConfig(project_id, job_submission, TRUE) response <- api_instance$StartJobFromConfig(project_id, project_id, job_submission$alignedFeatureIds) - Helper$new()$wait_for_job_completion(project_id, response$id, api_instance) + api$wait_for_job_completion(project_id, response$id) expect_true(inherits(response, "Job")) diff --git a/client-api_r/patches/insert_wait_for_job_completion_in_rsirius_api.sh b/client-api_r/patches/insert_wait_for_job_completion_in_rsirius_api.sh new file mode 100644 index 00000000..08aaae2c --- /dev/null +++ b/client-api_r/patches/insert_wait_for_job_completion_in_rsirius_api.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +FILE="client-api_r/generated/R/rsirius_api.R" + +# Remove the last 3 lines (closing braces) +head -n -3 "$FILE" > "${FILE}.tmp" + +# Append the new function and closing braces +cat >> "${FILE}.tmp" << 'EOF' + }, + + wait_for_job_completion = function(project_id, job_id, timeout_in_sec=NULL) { + if (inherits(project_id, "ProjectInfo")) { + project_id <- project_id$projectId + } + if (inherits(job_id, "Job")) { + job_id <- job_id$id + } + tryCatch({ + while (!(self$jobs_api$GetJob(project_id, job_id)$progress$state %in% c("CANCELED", "FAILED", "DONE"))) { + Sys.sleep(1) + if (inherits(timeout_in_sec, "numeric")) { + timeout_in_sec <- timeout_in_sec - 1 + if (timeout_in_sec == 0) { + return() + } + } + } + }, error = function(e){ + message('Caught an error!') + message(e) + }, warning = function(w){ + message('Caught an warning!') + message(w) + }) + } + ) +) +EOF + +mv "${FILE}.tmp" "$FILE" + +echo "Function appended successfully" \ No newline at end of file diff --git a/client-api_r/rsirius_helper.R b/client-api_r/rsirius_helper.R index 8b4fc2d3..2ee65e9b 100644 --- a/client-api_r/rsirius_helper.R +++ b/client-api_r/rsirius_helper.R @@ -2,6 +2,7 @@ Helper <- R6::R6Class( "Helper", public = list( wait_for_job_completion = function(project_id, job_id, jobs_api) { + .Deprecated("rsirius_api$wait_for_job_completion") if (inherits(jobs_api, "rsirius_api")) { jobs_api <- jobs_api$jobs_api }