From 2149cf460232f8c0faad64d5113ef778c0c4d227 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Tue, 27 Feb 2024 14:47:40 +0000 Subject: [PATCH 01/14] implement recursive in search OLS --- sdrf_pipelines/sdrf/sdrf_schema.py | 2 + sdrf_pipelines/zooma/ols.py | 77 ++++++++++++++++++++++-------- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/sdrf_pipelines/sdrf/sdrf_schema.py b/sdrf_pipelines/sdrf/sdrf_schema.py index 2c3cf8b..69e37d4 100644 --- a/sdrf_pipelines/sdrf/sdrf_schema.py +++ b/sdrf_pipelines/sdrf/sdrf_schema.py @@ -135,6 +135,8 @@ def validate(self, series: pd.Series) -> pd.Series: terms = [ontology_term_parser(x) for x in series.unique()] labels = [] for term in terms: + if term['NT'] == 'clostridium perfringens': + print(term) if TERM_NAME not in term: ontology_terms = None else: diff --git a/sdrf_pipelines/zooma/ols.py b/sdrf_pipelines/zooma/ols.py index c06084a..ab9a80c 100644 --- a/sdrf_pipelines/zooma/ols.py +++ b/sdrf_pipelines/zooma/ols.py @@ -105,14 +105,17 @@ def get_ancestors(self, ont, iri): raise ex def search( - self, - name, - query_fields=None, - ontology=None, - field_list=None, - children_of=None, - exact=None, - bytype="class", + self, + name: str, + query_fields=None, + ontology: str=None, + field_list=None, + children_of=None, + exact: bool=None, + bytype: str="class", + rows: int=10, + num_retries:int=10, + start: int=0, ): """ Searches the OLS with the given term @@ -124,6 +127,8 @@ def search( @:param exact: Forces exact match if not `None` @:param bytype: restrict to terms one of {class,property,individual,ontology} @:param childrenOf: Search only under a certain term. + @:param rows: number of rows to query on each call of OLS search + @:param num_retries: Number of retries to OLS when it fails. """ params = {"q": name} if ontology is not None: @@ -135,6 +140,9 @@ def search( if bytype: params["type"] = _concat_str_or_list(bytype) + if rows: + params["rows"] = rows + if ontology: params["ontology"] = _concat_str_or_list(ontology) elif self.ontology: @@ -155,26 +163,53 @@ def search( if len(children_of) > 0: params["childrenOf"] = _concat_str_or_list(children_of) - retry_num = 0 + if start: + params["start"] = start + + docs_found = [] - while retry_num < 10: + for retry_num in range(num_retries): try: req = self.session.get(self.ontology_search, params=params) - logger.debug("Request to OLS search API: %s - %s", req.status_code, name) + logger.debug("Request to OLS search API term %s, status code %s", name, req.status_code) - req.raise_for_status() - if req.json()["response"]["numFound"]: - return req.json()["response"]["docs"] - if exact: - logger.debug("OLS exact search returned empty response for %s", name) + if req.status_code != 200: + logger.error("OLS search term %s error tried number %s", name, retry_num) + req.raise_for_status() else: - logger.debug("OLS search returned empty response for %s", name) - return None + if req.json()["response"]["numFound"] == 0: + if exact: + logger.debug("OLS exact search returned empty response for %s", name) + else: + logger.debug("OLS search returned empty response for %s", name) + return docs_found + elif len(req.json()["response"]["docs"]) < rows: + return req.json()["response"]["docs"] + else: + docs_found = req.json()["response"]["docs"] + docs_found.extend(self.search(name, query_fields=query_fields, ontology=ontology, + field_list=field_list, children_of=children_of, exact=exact, + bytype=bytype, rows=rows, num_retries=num_retries, + start=(rows + (start)))) + return docs_found + + if req.status_code == 200 and req.json()["response"]["numFound"] == 0: + if exact: + logger.debug("OLS exact search returned empty response for %s", name) + else: + logger.debug("OLS search returned empty response for %s", name) + return None + elif req.status_code != 200 and req.json()["response"]["numFound"] > 0: + if len(req.json()["response"]["docs"]) <= rows: + return req.json()["response"]["docs"] + else: + start = 0 + docs_found = req.json()["response"]["docs"] + except Exception as ex: - retry_num += 1 - logger.debug("OLS error searching the following term -- %s iteration %s.\n%e", req.url, retry_num, ex) + logger.exception("OLS error searching the following term -- %s iteration %s.\n%e", req.url, retry_num, ex) - return None + return docs_found def suggest(self, name, ontology=None): """Suggest terms from an optional list of ontologies From 2fd27a77856ce30f7de087cb05e3be4e4340dfd4 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Tue, 27 Feb 2024 16:05:12 +0000 Subject: [PATCH 02/14] check empty cells in sdrf --- sdrf_pipelines/sdrf/sdrf_schema.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/sdrf_pipelines/sdrf/sdrf_schema.py b/sdrf_pipelines/sdrf/sdrf_schema.py index 69e37d4..d79a599 100644 --- a/sdrf_pipelines/sdrf/sdrf_schema.py +++ b/sdrf_pipelines/sdrf/sdrf_schema.py @@ -3,6 +3,7 @@ import typing from typing import Any +import numpy as np import pandas as pd from pandas_schema import Column from pandas_schema import Schema @@ -135,8 +136,6 @@ def validate(self, series: pd.Series) -> pd.Series: terms = [ontology_term_parser(x) for x in series.unique()] labels = [] for term in terms: - if term['NT'] == 'clostridium perfringens': - print(term) if TERM_NAME not in term: ontology_terms = None else: @@ -181,6 +180,10 @@ def validate(self, panda_sdrf: sdrf = None) -> typing.List[LogicError]: ) errors.append(LogicError(error_message, error_type=logging.WARN)) + empty_cells_errors = self.validate_empty_cells(panda_sdrf) + if empty_cells_errors: + errors.extend(empty_cells_errors) + # Check the mandatory fields error_mandatory = self.validate_mandatory_columns(panda_sdrf) if error_mandatory is not None: @@ -312,6 +315,28 @@ def check_recommendations(self, panda_sdrf): warnings += column.validate_optional(series) return sorted(warnings, key=lambda e: e.row) + def validate_empty_cells(self, panda_sdrf): + """ + Check for empty cells in the SDRF. This method will return a list of errors if any empty cell is found. + :param panda_sdrf: SDRF dataframe + :return: List of errors + """ + errors = [] + def validate_string(string): + return len(string.strip()) > 0 + + # Apply the validation function element-wise + validation_results = panda_sdrf.map(lambda x: validate_string(x)) + + # Get the indices where the validation fails + failed_indices = [(row, col) for row in validation_results.index for col in validation_results.columns if + not validation_results.at[row, col]] + + for row, col in failed_indices: + message = f"Empty value found Row: {row}, Column: {col}" + errors.append(LogicError(message, error_type=logging.ERROR)) + return errors + default_schema = SDRFSchema( [ From d88685bd0f9d1571e63c9af142ca618e2626d991 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Tue, 27 Feb 2024 16:10:01 +0000 Subject: [PATCH 03/14] version increased --- sdrf_pipelines/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdrf_pipelines/__init__.py b/sdrf_pipelines/__init__.py index 5681085..5a6b518 100644 --- a/sdrf_pipelines/__init__.py +++ b/sdrf_pipelines/__init__.py @@ -1 +1 @@ -__version__ = "0.0.24" +__version__ = "0.0.25" From 948c0c6b63e12c763614db57a0a8e35eb3e89c61 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Tue, 27 Feb 2024 16:38:59 +0000 Subject: [PATCH 04/14] only returning exact terms. --- sdrf_pipelines/sdrf/sdrf_schema.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/sdrf_pipelines/sdrf/sdrf_schema.py b/sdrf_pipelines/sdrf/sdrf_schema.py index d79a599..f8a9456 100644 --- a/sdrf_pipelines/sdrf/sdrf_schema.py +++ b/sdrf_pipelines/sdrf/sdrf_schema.py @@ -68,12 +68,12 @@ def ontology_term_parser(cell_value: str = None): class SDRFColumn(Column): def __init__( - self, - name: str, - validations: typing.Iterable["_BaseValidation"] = None, - optional_validations: typing.Iterable["_BaseValidation"] = None, - allow_empty=False, - optional_type=True, + self, + name: str, + validations: typing.Iterable["_BaseValidation"] = None, + optional_validations: typing.Iterable["_BaseValidation"] = None, + allow_empty=False, + optional_type=True, ): if validations is None: validations = [] @@ -146,8 +146,8 @@ def validate(self, series: pd.Series) -> pd.Series: if ontology_terms is not None: query_labels = [o["label"].lower() for o in ontology_terms] - for label in query_labels: - labels.append(label) + if term[TERM_NAME] in query_labels: + labels.append(term[TERM_NAME]) if self._not_available: labels.append(NOT_AVAILABLE) if self._not_applicable: @@ -223,9 +223,9 @@ def validate_column_names(self, panda_sdrf): errors.append(cname) elif m.group().startswith("factor value"): if ( - m.group().replace("factor value", "comment") not in panda_sdrf.columns - and m.group().replace("factor value", "characteristics") not in panda_sdrf.columns - and m.group() not in panda_sdrf.columns + m.group().replace("factor value", "comment") not in panda_sdrf.columns + and m.group().replace("factor value", "characteristics") not in panda_sdrf.columns + and m.group() not in panda_sdrf.columns ): error_message = "The " + cname + " column should also be in the characteristics or comment" logerror.append(LogicError(error_message, error_type=logging.ERROR)) @@ -265,7 +265,7 @@ def validate_columns_order(panda_sdrf): error_message = "The column " + column + "cannot be before the assay name" error_columns_order.append(LogicError(error_message, error_type=logging.ERROR)) if ( - "characteristics" in column or ("material type" in column and "factor value" not in column) + "characteristics" in column or ("material type" in column and "factor value" not in column) ) and cnames.index(column) > index: error_message = "The column " + column + "cannot be after the assay name" error_columns_order.append(LogicError(error_message, error_type=logging.ERROR)) @@ -322,6 +322,7 @@ def validate_empty_cells(self, panda_sdrf): :return: List of errors """ errors = [] + def validate_string(string): return len(string.strip()) > 0 From 3649fc251ba10bc5b882095ecb35768844c02af0 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 06:15:30 +0000 Subject: [PATCH 05/14] only returning exact terms. --- sdrf_pipelines/sdrf/sdrf_schema.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sdrf_pipelines/sdrf/sdrf_schema.py b/sdrf_pipelines/sdrf/sdrf_schema.py index f8a9456..de11018 100644 --- a/sdrf_pipelines/sdrf/sdrf_schema.py +++ b/sdrf_pipelines/sdrf/sdrf_schema.py @@ -2,8 +2,6 @@ import re import typing from typing import Any - -import numpy as np import pandas as pd from pandas_schema import Column from pandas_schema import Schema From cd8bd10c5f1f1b5f5d0da02f3b367d4c3b16549a Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 06:41:09 +0000 Subject: [PATCH 06/14] only returning exact terms. --- sdrf_pipelines/sdrf/sdrf_schema.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sdrf_pipelines/sdrf/sdrf_schema.py b/sdrf_pipelines/sdrf/sdrf_schema.py index de11018..a2bb22b 100644 --- a/sdrf_pipelines/sdrf/sdrf_schema.py +++ b/sdrf_pipelines/sdrf/sdrf_schema.py @@ -2,6 +2,8 @@ import re import typing from typing import Any + +import numpy as np import pandas as pd from pandas_schema import Column from pandas_schema import Schema @@ -321,11 +323,11 @@ def validate_empty_cells(self, panda_sdrf): """ errors = [] - def validate_string(string): - return len(string.strip()) > 0 + def validate_string(cell_value): + return cell_value is not None and cell_value != "nan" and len(cell_value.strip()) > 0 # Apply the validation function element-wise - validation_results = panda_sdrf.map(lambda x: validate_string(x)) + validation_results = panda_sdrf.map(validate_string) # Get the indices where the validation fails failed_indices = [(row, col) for row in validation_results.index for col in validation_results.columns if From f5a449cb5a515a61fa170c1c002b31dc12be8e2a Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 07:18:14 +0000 Subject: [PATCH 07/14] only returning exact terms. --- sdrf_pipelines/sdrf/sdrf_schema.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sdrf_pipelines/sdrf/sdrf_schema.py b/sdrf_pipelines/sdrf/sdrf_schema.py index a2bb22b..34b5371 100644 --- a/sdrf_pipelines/sdrf/sdrf_schema.py +++ b/sdrf_pipelines/sdrf/sdrf_schema.py @@ -3,7 +3,6 @@ import typing from typing import Any -import numpy as np import pandas as pd from pandas_schema import Column from pandas_schema import Schema From 2ad03c22ffffd3ddeba6f6809e27f3f5f2b8fbff Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 13:23:05 +0000 Subject: [PATCH 08/14] PythonBlack changed --- sdrf_pipelines/zooma/ols.py | 44 +++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/sdrf_pipelines/zooma/ols.py b/sdrf_pipelines/zooma/ols.py index ab9a80c..ace77e1 100644 --- a/sdrf_pipelines/zooma/ols.py +++ b/sdrf_pipelines/zooma/ols.py @@ -105,17 +105,17 @@ def get_ancestors(self, ont, iri): raise ex def search( - self, - name: str, - query_fields=None, - ontology: str=None, - field_list=None, - children_of=None, - exact: bool=None, - bytype: str="class", - rows: int=10, - num_retries:int=10, - start: int=0, + self, + name: str, + query_fields=None, + ontology: str = None, + field_list=None, + children_of=None, + exact: bool = None, + bytype: str = "class", + rows: int = 10, + num_retries: int = 10, + start: int = 0, ): """ Searches the OLS with the given term @@ -187,10 +187,20 @@ def search( return req.json()["response"]["docs"] else: docs_found = req.json()["response"]["docs"] - docs_found.extend(self.search(name, query_fields=query_fields, ontology=ontology, - field_list=field_list, children_of=children_of, exact=exact, - bytype=bytype, rows=rows, num_retries=num_retries, - start=(rows + (start)))) + docs_found.extend( + self.search( + name, + query_fields=query_fields, + ontology=ontology, + field_list=field_list, + children_of=children_of, + exact=exact, + bytype=bytype, + rows=rows, + num_retries=num_retries, + start=(rows + (start)), + ) + ) return docs_found if req.status_code == 200 and req.json()["response"]["numFound"] == 0: @@ -207,7 +217,9 @@ def search( docs_found = req.json()["response"]["docs"] except Exception as ex: - logger.exception("OLS error searching the following term -- %s iteration %s.\n%e", req.url, retry_num, ex) + logger.exception( + "OLS error searching the following term -- %s iteration %s.\n%e", req.url, retry_num, ex + ) return docs_found From a263d9eae1d10c3ee152d22859193478faa18b84 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 13:24:42 +0000 Subject: [PATCH 09/14] PythonBlack changed --- sdrf_pipelines/sdrf/sdrf_schema.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/sdrf_pipelines/sdrf/sdrf_schema.py b/sdrf_pipelines/sdrf/sdrf_schema.py index 34b5371..0eab7be 100644 --- a/sdrf_pipelines/sdrf/sdrf_schema.py +++ b/sdrf_pipelines/sdrf/sdrf_schema.py @@ -67,12 +67,12 @@ def ontology_term_parser(cell_value: str = None): class SDRFColumn(Column): def __init__( - self, - name: str, - validations: typing.Iterable["_BaseValidation"] = None, - optional_validations: typing.Iterable["_BaseValidation"] = None, - allow_empty=False, - optional_type=True, + self, + name: str, + validations: typing.Iterable["_BaseValidation"] = None, + optional_validations: typing.Iterable["_BaseValidation"] = None, + allow_empty=False, + optional_type=True, ): if validations is None: validations = [] @@ -222,9 +222,9 @@ def validate_column_names(self, panda_sdrf): errors.append(cname) elif m.group().startswith("factor value"): if ( - m.group().replace("factor value", "comment") not in panda_sdrf.columns - and m.group().replace("factor value", "characteristics") not in panda_sdrf.columns - and m.group() not in panda_sdrf.columns + m.group().replace("factor value", "comment") not in panda_sdrf.columns + and m.group().replace("factor value", "characteristics") not in panda_sdrf.columns + and m.group() not in panda_sdrf.columns ): error_message = "The " + cname + " column should also be in the characteristics or comment" logerror.append(LogicError(error_message, error_type=logging.ERROR)) @@ -264,7 +264,7 @@ def validate_columns_order(panda_sdrf): error_message = "The column " + column + "cannot be before the assay name" error_columns_order.append(LogicError(error_message, error_type=logging.ERROR)) if ( - "characteristics" in column or ("material type" in column and "factor value" not in column) + "characteristics" in column or ("material type" in column and "factor value" not in column) ) and cnames.index(column) > index: error_message = "The column " + column + "cannot be after the assay name" error_columns_order.append(LogicError(error_message, error_type=logging.ERROR)) @@ -329,8 +329,12 @@ def validate_string(cell_value): validation_results = panda_sdrf.map(validate_string) # Get the indices where the validation fails - failed_indices = [(row, col) for row in validation_results.index for col in validation_results.columns if - not validation_results.at[row, col]] + failed_indices = [ + (row, col) + for row in validation_results.index + for col in validation_results.columns + if not validation_results.at[row, col] + ] for row, col in failed_indices: message = f"Empty value found Row: {row}, Column: {col}" From d08f67f1f06d641043a818b07e5b538b4efe1bbc Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 13:31:41 +0000 Subject: [PATCH 10/14] PythonBlack changed --- sdrf_pipelines/sdrf/sdrf.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/sdrf_pipelines/sdrf/sdrf.py b/sdrf_pipelines/sdrf/sdrf.py index e64bb56..a898808 100644 --- a/sdrf_pipelines/sdrf/sdrf.py +++ b/sdrf_pipelines/sdrf/sdrf.py @@ -1,6 +1,10 @@ +from __future__ import annotations + import logging import pandas as pd +from pandas import DataFrame +from pandas._typing import PythonFuncType from sdrf_pipelines.sdrf.sdrf_schema import CELL_LINES_TEMPLATE from sdrf_pipelines.sdrf.sdrf_schema import HUMAN_TEMPLATE @@ -75,3 +79,15 @@ def validate(self, template: str): errors = mass_spectrometry_schema.validate(self) return errors + + def map( + self, func: PythonFuncType, na_action: str | None = None, **kwargs + ) -> DataFrame: + """ + Apply a function to the DataFrame. + :param func: The function to apply to the DataFrame. + :param na_action: If 'ignore', propagate NA values, without passing them to func. + :param kwargs: Additional keyword arguments to pass as keywords arguments to func. + :return: DataFrame + """ + return super().map(func, na_action=na_action, **kwargs) From ab4866caff533e6a479bfa80091afb8ca8e75ea6 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 13:33:08 +0000 Subject: [PATCH 11/14] PythonBlack changed --- sdrf_pipelines/sdrf/sdrf.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sdrf_pipelines/sdrf/sdrf.py b/sdrf_pipelines/sdrf/sdrf.py index a898808..4eddb8a 100644 --- a/sdrf_pipelines/sdrf/sdrf.py +++ b/sdrf_pipelines/sdrf/sdrf.py @@ -80,9 +80,7 @@ def validate(self, template: str): return errors - def map( - self, func: PythonFuncType, na_action: str | None = None, **kwargs - ) -> DataFrame: + def map(self, func: PythonFuncType, na_action: str | None = None, **kwargs) -> DataFrame: """ Apply a function to the DataFrame. :param func: The function to apply to the DataFrame. From cebeb4da410e200be4f7b5446737f2ce5500ca78 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 13:42:21 +0000 Subject: [PATCH 12/14] PythonBlack changed --- sdrf_pipelines/sdrf/sdrf.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/sdrf_pipelines/sdrf/sdrf.py b/sdrf_pipelines/sdrf/sdrf.py index 4eddb8a..f4f34ab 100644 --- a/sdrf_pipelines/sdrf/sdrf.py +++ b/sdrf_pipelines/sdrf/sdrf.py @@ -79,13 +79,3 @@ def validate(self, template: str): errors = mass_spectrometry_schema.validate(self) return errors - - def map(self, func: PythonFuncType, na_action: str | None = None, **kwargs) -> DataFrame: - """ - Apply a function to the DataFrame. - :param func: The function to apply to the DataFrame. - :param na_action: If 'ignore', propagate NA values, without passing them to func. - :param kwargs: Additional keyword arguments to pass as keywords arguments to func. - :return: DataFrame - """ - return super().map(func, na_action=na_action, **kwargs) From d71719d079e5d8da3279c6f55e78b9319ab8e283 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 13:58:18 +0000 Subject: [PATCH 13/14] PythonBlack changed --- sdrf_pipelines/sdrf/sdrf_schema.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sdrf_pipelines/sdrf/sdrf_schema.py b/sdrf_pipelines/sdrf/sdrf_schema.py index 0eab7be..d37fa84 100644 --- a/sdrf_pipelines/sdrf/sdrf_schema.py +++ b/sdrf_pipelines/sdrf/sdrf_schema.py @@ -1,5 +1,6 @@ import logging import re +import sys import typing from typing import Any @@ -325,8 +326,12 @@ def validate_empty_cells(self, panda_sdrf): def validate_string(cell_value): return cell_value is not None and cell_value != "nan" and len(cell_value.strip()) > 0 - # Apply the validation function element-wise - validation_results = panda_sdrf.map(validate_string) + if sys.version_info <= (3, 8): + # Use map for Python versions less than 3.8 + validation_results = panda_sdrf.map(validate_string) + else: + # Use applymap for Python versions 3.8 and above + validation_results = panda_sdrf.applymap(validate_string) # Get the indices where the validation fails failed_indices = [ From 3954a3b6f585146a517e58053c1eb5166e596ed4 Mon Sep 17 00:00:00 2001 From: Yasset Perez-Riverol Date: Wed, 28 Feb 2024 14:05:10 +0000 Subject: [PATCH 14/14] update in the CI/CD --- .github/workflows/pythonapp.yml | 4 ++-- .github/workflows/pythonpackage.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index bd87c20..8f4a78a 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -5,9 +5,9 @@ name: Python application on: push: - branches: [ main ] + branches: [ main, dev ] pull_request: - branches: [ main ] + branches: [ main, dev ] jobs: build: diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index 5fb3c65..1a99076 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -5,9 +5,9 @@ name: Python package on: push: - branches: [ main ] + branches: [ main, dev ] pull_request: - branches: [ main ] + branches: [ main, dev ] jobs: build: