From 6fc1ad8e1a11910c2a19b897fec5483a89b8fe72 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Sat, 27 Jun 2020 18:42:51 -0500 Subject: [PATCH] Release/0.10.0 (#304) * Update changelog. * Move deprecation to second minor version. * Remove update_aliases. * Remove export_job_stati. * Remove classify. * Remove next_operation. * Remove eligible_for_submission. * Fix tests that previously used next_operation. * Remove deprecated progressbar.py. * Update contributors, add Brandon to maintainer list. * Bump up to version 0.10.0. * Add Brandon to authors. * Update CONTRIBUTING.md. * Update CONTRIBUTING.md. * Remove extra line from test. * Update changelog.txt. --- .zenodo.json | 38 +++++++++++++++++++-- CITATION.cff | 7 +++- CONTRIBUTING.md | 67 ++++++++++++++++++++++++++---------- changelog.txt | 28 +++++++-------- contributors.yaml | 1 + doc/api.rst | 6 +--- doc/conf.py | 6 ++-- flow/project.py | 73 ++-------------------------------------- flow/util/progressbar.py | 44 ------------------------ flow/version.py | 2 +- setup.cfg | 8 ++--- setup.py | 2 +- tests/test_project.py | 46 ++++++++++--------------- 13 files changed, 135 insertions(+), 193 deletions(-) delete mode 100644 flow/util/progressbar.py diff --git a/.zenodo.json b/.zenodo.json index 818c39ab0..23151abee 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -32,6 +32,7 @@ { "affiliation": "University of Michigan", "name": "Yuan Zhou", + "orcid": "0000-0002-6727-0836", "type": "Other" }, { @@ -77,8 +78,34 @@ }, { "affiliation": "University of Michigan", - "name": "Brandon Butler", - "orcid": "0000-0001-7739-7796", + "name": "Tobias Dwyer", + "orcid": "0000-0001-6443-7744", + "type": "Other" + }, + { + "affiliation": "National Institute of Technology, Hamirpur", + "name": "Vishav Sharma", + "type": "Other" + }, + { + "affiliation": "Indian Institute of Technology Roorkee", + "name": "Hardik Ojha", + "type": "Other" + }, + { + "affiliation": "Birla Institute of Technology and Science, Pilani - Goa Campus", + "name": "Yash Bhardwaj", + "type": "Other" + }, + { + "affiliation": "", + "name": "Jacob Dice", + "orcid": "0000-0002-9479-1661", + "type": "Other" + }, + { + "affiliation": "Indian Institute of Technology, Gandhinagar", + "name": "Abhavya Chandra", "type": "Other" } ], @@ -103,6 +130,11 @@ "name": "Mike Henry", "orcid": "0000-0002-3870-9993" }, + { + "affiliation": "University of Michigan", + "name": "Brandon Butler", + "orcid": "0000-0001-7739-7796" + }, { "affiliation": "University of Michigan", "name": "Paul M. Dodd" @@ -129,5 +161,5 @@ }, "title": "signac-flow", "upload_type": "software", - "version": "0.9.0" + "version": "0.10.0" } \ No newline at end of file diff --git a/CITATION.cff b/CITATION.cff index b6f50a0fc..f4cd969e2 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -2,7 +2,7 @@ --- cff-version: "1.0.3" title: signac-flow -version: 0.9.0 +version: 0.10.0 abstract: | The signac-flow tool provides the basic components to set up simple to complex workflows for projects as part of the signac framework. That includes the definition of data pipelines, execution of data space operations and the submission of operations to high-performance super computers. authors: @@ -26,6 +26,11 @@ authors: given-names: Mike affiliation: "Boise State University" orcid: "https://orcid.org/0000-0002-3870-9993" + - + family-names: Butler + given-names: Brandon + affiliation: "University of Michigan" + orcid: "https://orcid.org/0000-0001-7739-7796" - family-names: Dodd given-names: "Paul M." diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a5f714143..073ac36ad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,32 +1,65 @@ -# How to contribute to the project +# How to Contribute to the Project -## Feedback +## Providing Feedback Issue reports and feature proposals are very welcome. -Please use the [GitHub issue page](https://github.com/glotzerlab/signac-flow/issues/) for this. +Please use the [GitHub issue tracker](https://github.com/glotzerlab/signac/issues/) for this. -## Contributing code +## Writing Documentation -Code contributions to the signac-flow open-source project are welcomed via pull requests on GitHub. +A general introduction in the form of tutorials, guides, and recipes is published as part of the framework documentation at [https://docs.signac.io](https://docs.signac.io). +The API of each package as part of the framework is documented in the form of doc-strings, which are published on `https://docs.signac.io/projects/$package`, where `$package` is currently one of `core`, `flow`, or `dashboard`. + +Anyone is invited to add to or edit any part of the documentation. +To fix a spelling mistake or make minor edits, click on the **Edit on GitHub** button in the top-right corner. +For more substantial edits, consider cloning the [signac-docs repository](https://github.com/glotzerlab/signac-docs) to a local computer. + +## Triaging Issues + +Any contributor is invited to triage new issues by applying any of the existing [labels](https://github.com/glotzerlab/signac/labels). + +## Contributing Code + +Code contributions to the signac open-source project are welcomed via pull requests on GitHub. Prior any work you should contact the signac developers to ensure that the planned development meshes well with the directions and standards of the project. All contributors must agree to the Contributor Agreement ([ContributorAgreement.md](ContributorAgreement.md)) before their pull request can be merged. -### General guidelines +### Guideline for Code Contributions - * Use the [OneFlow](https://www.endoflineblog.com/oneflow-a-git-branching-model-and-workflow) model of development: - - Both new features and bug fixes should be developed in branches based on `master`. - - Hotfixes (critical bugs that need to be released *fast*) should be developed in a branch based on the latest tagged release. - * Write code that is compatible with all supported versions of Python (listed in [setup.py](https://github.com/glotzerlab/signac-flow/blob/master/setup.py)). - * Avoid introducing dependencies -- especially those that might be harder to install in high-performance computing environments. - * Create [unit tests](https://en.wikipedia.org/wiki/Unit_testing) and [integration tests](https://en.wikipedia.org/wiki/Integration_testing) that cover the common cases and the corner cases of the code. - * Preserve backwards-compatibility whenever possible, and make clear if something must change. - * Document any portions of the code that might be less clear to others, especially to new developers. - * Write API documentation in this package, and put usage information, guides, and concept overviews in the [framework documentation](https://docs.signac.io/) ([source](https://github.com/glotzerlab/signac-docs/)). +* Use the [OneFlow](https://www.endoflineblog.com/oneflow-a-git-branching-model-and-workflow) model of development: + - Both new features and bug fixes should be developed in branches based on `master`. + - Hotfixes (critical bugs that need to be released *fast*) should be developed in a branch based on the latest tagged release. +* Write code that is compatible with all supported versions of Python (listed in [setup.py](https://github.com/glotzerlab/signac/blob/master/setup.py)). +* Avoid introducing dependencies -- especially those that might be harder to install in high-performance computing environments. +* Create [unit tests](https://en.wikipedia.org/wiki/Unit_testing) and [integration tests](https://en.wikipedia.org/wiki/Integration_testing) that cover the common cases and the corner cases of the code. +* Preserve backwards-compatibility whenever possible, and make clear if something must change. +* Document any portions of the code that might be less clear to others, especially to new developers. +* Write API documentation in this package, and put usage information, guides, and concept overviews in the [framework documentation](https://docs.signac.io/) ([source](https://github.com/glotzerlab/signac-docs/)). +* Use inclusive language in all documentation and code. The [Google developer documentation style guide](https://developers.google.com/style/inclusive-documentation) is a helpful reference. -Please see the [Support](https://docs.signac.io/projects/signac-flow/en/latest/support.html) section as part of the documentation for detailed development guidelines. +Please see the [Support](https://docs.signac.io/projects/signac-core/en/latest/support.html) section as part of the documentation for detailed development guidelines. ### Code Style -Code submitted to the signac-flow project must adhere to the [PEP8 style guide](https://www.python.org/dev/peps/pep-0008/) with the exception that lines may have up to 100 characters. +Code must adhere to the [PEP8 style guide](https://www.python.org/dev/peps/pep-0008/) with the exception that lines may have up to 100 characters. We recommend to use [flake8](http://flake8.pycqa.org/en/latest/) and [autopep8](https://pypi.org/project/autopep8/) to find and fix any code style issues prior to committing and pushing. + +## Reviewing Pull Requests + +Pull requests represent the standard way of contributing code to the code base. +Each pull request is assigned to one of the project committers, who is responsible for triaging it, finding at least two reviewers (one of whom can be themselves), and eventually merging or closing the pull request. +Pull requests should generally be approved by two reviewers prior to merge. + +### Guidelines for Pull Request Reviewers + +The following general guidelines should be considered during the pull request review process: + +* API breaking changes should be avoided whenever possible and require approval by a project maintainer. +* Significant performance degradations must be avoided unless the regression is necessary to fix a bug. +* Non-trivial bug fixes should be accompanied by a unit test that catches the related issue to avoid future regression. +* The code should be easy to follow and sufficiently documented to be understandable even to developers who are not highly familiar with the code. +* Code duplication should be avoided and existing classes and functions are effectively reused. +* The pull request is on-topic and does not introduce multiple independent changes (such as unrelated style fixes). +* A potential increase in code complexity introduced with a pull request is well justified by the benefits of the added feature. +* The API of a new feature is well-documented in the doc-strings and usage is documented as part of the [framework documentation](https://github.com/glotzerlab/signac-docs). diff --git a/changelog.txt b/changelog.txt index 39a82e860..90ae57997 100644 --- a/changelog.txt +++ b/changelog.txt @@ -5,37 +5,37 @@ Changes The **signac-flow** package follows `semantic versioning `_. The numbers in brackets denote the related GitHub issue and/or pull request. -next -==== +Version 0.10 +============ -next ----- +[0.10.0] -- 2020-06-27 +---------------------- Added +++++ -- Add ``FlowGroup``s (one or more operation grouping within an execution environment)(#114) +- Add ``FlowGroup`` (one or more operations can be grouped within an execution environment) (#114). - Add official support for University of Michigan Great Lakes cluster (#185). - Add official support for Bridges AI cluster (#222). -- Add IgnoreConditions option for submit(), run() and script() (#38). -- Add pytest support for Testing Framework (#227, #232). -- Add markdown and html format support for print_status() (#113, #163). +- Add ``IgnoreConditions`` option for ``submit()``, ``run()`` and ``script()`` (#38, #209). +- Add pytest support for testing framework (#227, #232). +- Add markdown and html format support for ``print_status()`` (#113, #163). - Add memory flag option for default Slurm scheduler (#256). - Add optional environment variable to specify submission script separator (#262). -- Add ``status_parallelization`` configuration to specify the parallelization nature of fetching status (#264, #271). +- Add ``status_parallelization`` configuration to specify the parallelization used for fetching status (#264, #271). Changed +++++++ - Raises ``ValueError`` when an operation function is passed to ``FlowProject.pre()`` and ``FlowProject.post()``, or a non-operation function passed to ``FlowProject.pre.after()`` (#248, #249). -- The option to provide the env argument to submit and submit_operations has been deprecated (#245). +- The option to provide the ``env`` argument to ``submit`` and ``submit_operations`` has been deprecated (#245). - The command line option ``--cmd`` for ``script`` has been deprecated and will trigger a ``DeprecationWarning`` upon use until removed (#243, #218). -- Raises ValueError when --job-name passed by the user because that interferes with status checking (#164, #241). +- Raises ``ValueError`` when ``--job-name`` is passed by the user because that interferes with status checking (#164, #241). - Submitting with ``--memory`` no longer assumes a unit of gigabytes on Bridges and Comet clusters (#257). - Buffering is enabled by default, improving the performance of status checks (#273). - Deprecate the use of ``no_parallelize`` argument while printing status (#264, #271). -- Submission via the command-line interface now calls the ``FlowProject.submit`` function instead of bypassing it for ``FlowProject.submit_operations``(#238, #286). -- Updated Great Lakes gpu request syntax (#299). +- Submission via the command-line interface now calls the ``FlowProject.submit`` function instead of bypassing it for ``FlowProject.submit_operations`` (#238, #286). +- Updated Great Lakes GPU request syntax (#299). Fixed +++++ @@ -45,7 +45,7 @@ Fixed Removed +++++++ -- Removed ENVIRONMENT global variable in the flow.environment module (#245). +- Removed ``ENVIRONMENT`` global variable in the ``flow.environment`` module (#245). - Removed vendored ``tqdm`` module and replaced it with a requirement (#247). Version 0.9 diff --git a/contributors.yaml b/contributors.yaml index 2483a54c1..cee90027e 100644 --- a/contributors.yaml +++ b/contributors.yaml @@ -119,6 +119,7 @@ contributors: family-names: Dice given-names: Jacob orcid: "https://orcid.org/0000-0002-9479-1661" + affiliation: "" - family-names: Chandra given-names: Abhavya diff --git a/doc/api.rst b/doc/api.rst index 940e54742..2b064aa8e 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -29,16 +29,13 @@ The FlowProject FlowProject.ALIASES FlowProject.add_operation - FlowProject.classify FlowProject.completed_operations - FlowProject.eligible_for_submission - FlowProject.export_job_stati + FlowProject.export_job_statuses FlowProject.get_job_status FlowProject.label FlowProject.labels FlowProject.main FlowProject.make_group - FlowProject.next_operation FlowProject.next_operations FlowProject.operation FlowProject.operations @@ -65,7 +62,6 @@ The FlowProject FlowProject.script FlowProject.submit FlowProject.submit_operations - FlowProject.update_aliases .. autoclass:: FlowProject diff --git a/doc/conf.py b/doc/conf.py index 043997423..a6dafbfe4 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -65,16 +65,16 @@ def __getattr__(cls, name): # General information about the project. project = 'signac-flow' copyright = 'The Regents of the University of Michigan' -author = 'Carl S. Adorf, Vyas Ramasubramani, Bradley D. Dice, Michael M. Henry, Paul M. Dodd, Sharon C. Glotzer' +author = 'Carl S. Adorf, Vyas Ramasubramani, Bradley D. Dice, Michael M. Henry, Brandon Butler, Paul M. Dodd, Sharon C. Glotzer' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = '0.9.0' +version = '0.10.0' # The full version, including alpha/beta/rc tags. -release = '0.9.0' +release = '0.10.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/flow/project.py b/flow/project.py index 76c90f69d..f1c0b3336 100644 --- a/flow/project.py +++ b/flow/project.py @@ -346,7 +346,7 @@ def __hash__(self): def __eq__(self, other): return self.id == other.id - @deprecated(deprecated_in="0.9", removed_in="1.0", current_version=__version__) + @deprecated(deprecated_in="0.9", removed_in="0.11", current_version=__version__) def get_id(self): return self._id @@ -1536,14 +1536,6 @@ def _alias(cls, x): except TypeError: return x - @classmethod - @deprecated( - deprecated_in="0.8", removed_in="0.10", - current_version=__version__) - def update_aliases(cls, aliases): - "Update the ALIASES table for this class." - cls.ALIASES.update(aliases) - def _fn_bundle(self, bundle_id): "Return the canonical name to store bundle information." return os.path.join(self.root_directory(), '.bundles', bundle_id) @@ -1831,8 +1823,7 @@ def print_status(self, jobs=None, overview=True, overview_max_lines=None, :type parameters: list of str :param param_max_width: - Limit the number of characters of parameter columns, - see also: :py:meth:`~.update_aliases`. + Limit the number of characters of parameter columns. :type param_max_width: int :param expand: @@ -2968,14 +2959,6 @@ def _add_direct_cmd_arg_group(cls, parser): help="Manually specify all labels that are required for the direct command " "to be considered eligible for execution.") - @deprecated( - deprecated_in="0.8", removed_in="0.10", - current_version=__version__, - details="Use export_job_statuses() instead.") - def export_job_stati(self, collection, stati): - "Export the job stati to a database collection." - self.export_job_statuses(self, collection, stati) - def export_job_statuses(self, collection, statuses): "Export the job statuses to a database collection." for status in statuses: @@ -3170,27 +3153,6 @@ def add_operation(self, name, cmd, pre=None, post=None, **kwargs): operations={name: op}, operation_directives=dict(name=kwargs)) - @deprecated( - deprecated_in="0.8", removed_in="0.10", - current_version=__version__, - details="Use labels() instead.") - def classify(self, job): - """Generator function which yields labels for job. - - By default, this method yields from the project's labels() method. - - :param job: - The signac job handle. - :type job: - :class:`~signac.contrib.job.Job` - :yields: - The labels for the provided job. - :yield type: - str - """ - for _label in self.labels(job): - yield _label - def completed_operations(self, job): """Determine which operations have been completed for job. @@ -3235,31 +3197,6 @@ def next_operations(self, *jobs, ignore_conditions=IgnoreConditions.NONE): for op in self._job_operations(job, ignore_conditions): yield op - @deprecated( - deprecated_in="0.8", removed_in="0.10", - current_version=__version__, - details="Use next_operations() instead.") - def next_operation(self, job): - """Determine the next operation for this job. - - :param job: - The signac job handle. - :type job: - :class:`~signac.contrib.job.Job` - :param default_directives: - The default directives to use for the operations. This is to allow for user specified - groups to 'inherit' directives from ``default_directives``. If no defaults are desired, - the argument can be set to an empty dictionary. This must be done explicitly, however. - :type default_directives: - :py:class:`dict` - :return: - An instance of JobOperation to execute next or `None`, if no operation is eligible. - :rtype: - `:py:class:`~.JobOperation` or `NoneType` - """ - for op in self.next_operations(job): - return op - @classmethod def operation(cls, func, name=None): """Add the function `func` as operation function to the class workflow definition. @@ -3441,12 +3378,6 @@ def _eligible_for_submission(self, flow_group, job): return False return True - @deprecated( - deprecated_in="0.8", removed_in="0.10", - current_version=__version__) - def eligible_for_submission(self, job_operation): - return self._eligible_for_submission(self, job_operation) - def _main_status(self, args): "Print status overview." jobs = self._select_jobs_from_args(args) diff --git a/flow/util/progressbar.py b/flow/util/progressbar.py deleted file mode 100644 index 2e683aec8..000000000 --- a/flow/util/progressbar.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) 2018 The Regents of the University of Michigan -# All rights reserved. -# This software is licensed under the BSD 3-Clause License. -"Simple progressbar formatting." -import sys -from deprecation import deprecated - -from .version import __version__ - - -@deprecated(deprecated_in="0.8", removed_in="0.10", current_version=__version__) -def with_progressbar(iterable, total=None, width=120, desc='', - percentage=True, file=None): - if file is None: - file = sys.stderr - if total is None: - total = len(iterable) - n = max(1, total // width) - - left = desc + '|' - right = '|{p:>4.0%}' if percentage else '|' - w = width - len(left) - len(right) - - def _draw(p): - f = int(p*w) - n = w-f - if p: - file.write('\r' * width) - bar = left + '#' * f + '-' * n + right - file.write(bar.format(p=p)) - file.flush() - - try: - for i, item in enumerate(iterable): - if i % n == 0: - _draw(i/total) - yield item - _draw(1.0) - finally: - file.write('\n') - file.flush() - - -__all__ = ['with_progressbar'] diff --git a/flow/version.py b/flow/version.py index c3ea9cb02..8c824424b 100644 --- a/flow/version.py +++ b/flow/version.py @@ -2,6 +2,6 @@ # All rights reserved. # This software is licensed under the BSD 3-Clause License. -__version__ = '0.9.0' +__version__ = '0.10.0' __all__ = ['__version__'] diff --git a/setup.cfg b/setup.cfg index 92ac1ecf8..343668f99 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.9.0 +current_version = 0.10.0 commit = True tag = False message = Bump up to version {new_version}. @@ -28,6 +28,6 @@ exclude = mistune,doc/conf.py [bumpversion:file:.zenodo.json] [tool:pytest] -filterwarnings = - ignore:.*get_id is deprecated.*:DeprecationWarning - ignore:.*The env argument is deprecated*:DeprecationWarning +filterwarnings = + ignore:.*get_id is deprecated.*:DeprecationWarning + ignore:.*The env argument is deprecated*:DeprecationWarning diff --git a/setup.py b/setup.py index 8f6900374..c12bc7ee1 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ setup( name='signac-flow', - version='0.9.0', + version='0.10.0', packages=find_packages(), include_package_data=True, zip_safe=True, diff --git a/tests/test_project.py b/tests/test_project.py index 1deb1e196..314822297 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -414,7 +414,6 @@ def test_context(job): project.run() assert os.getcwd() == starting_dir - @pytest.mark.filterwarnings("ignore:next_operation") def test_function_in_directives(self): class A(FlowProject): @@ -428,9 +427,8 @@ def test_context(job): project = self.mock_project(A) for job in project: job.doc.np = 3 - with pytest.deprecated_call(): - next_op = project.next_operation(job) - assert 'mpirun -np 3 python' in next_op.cmd + for next_op in project.next_operations(job): + assert 'mpirun -np 3 python' in next_op.cmd break def test_callable_directives(self): @@ -448,34 +446,30 @@ def a(job): # test setting neither nranks nor omp_num_threads for job in project: - with pytest.deprecated_call(): - next_op = project.next_operation(job) - assert next_op.directives['np'] == 1 + for next_op in project.next_operations(job): + assert next_op.directives['np'] == 1 # test only setting nranks for i, job in enumerate(project): job.doc.nranks = i+1 - with pytest.deprecated_call(): - next_op = project.next_operation(job) - assert next_op.directives['np'] == next_op.directives['nranks'] + for next_op in project.next_operations(job): + assert next_op.directives['np'] == next_op.directives['nranks'] del job.doc['nranks'] # test only setting omp_num_threads for i, job in enumerate(project): job.doc.omp_num_threads = i+1 - with pytest.deprecated_call(): - next_op = project.next_operation(job) - assert next_op.directives['np'] == next_op.directives['omp_num_threads'] + for next_op in project.next_operations(job): + assert next_op.directives['np'] == next_op.directives['omp_num_threads'] del job.doc['omp_num_threads'] # test setting both nranks and omp_num_threads for i, job in enumerate(project): job.doc.omp_num_threads = i+1 job.doc.nranks = i % 3 + 1 - with pytest.deprecated_call(): - next_op = project.next_operation(job) expected_np = (i + 1) * (i % 3 + 1) - assert next_op.directives['np'] == expected_np + for next_op in project.next_operations(job): + assert next_op.directives['np'] == expected_np def test_copy_conditions(self): @@ -583,11 +577,10 @@ class TestProject(TestProjectBase): def test_instance(self): assert isinstance(self.project, FlowProject) - @fail_if_not_removed def test_labels(self): project = self.mock_project() for job in project: - labels = list(project.classify(job)) + labels = list(project.labels(job)) assert len(labels) == 3 - (job.sp.b % 2) assert all(isinstance(label, str) for label in labels) assert 'default_label' in labels @@ -993,7 +986,6 @@ def test_bundles(self): project.submit(bundle_size=0) assert len(list(MockScheduler.jobs())) == 1 - @fail_if_not_removed def test_submit_status(self): MockScheduler.reset() project = self.mock_project() @@ -1002,18 +994,16 @@ def test_submit_status(self): for job in project: if job not in even_jobs: continue - list(project.classify(job)) - with pytest.deprecated_call(): - assert project.next_operation(job).name == 'op1' - assert project.next_operation(job).job == job + list(project.labels(job)) + next_op = list(project.next_operations(job))[0] + assert next_op.name == 'op1' + assert next_op.job == job with redirect_stderr(StringIO()): project.submit() assert len(list(MockScheduler.jobs())) == num_jobs_submitted for job in project: - with pytest.deprecated_call(): - next_op = project.next_operation(job) - assert next_op is not None + next_op = list(project.next_operations(job))[0] assert next_op.get_status() == JobStatus.submitted MockScheduler.step() @@ -1021,9 +1011,7 @@ def test_submit_status(self): project._fetch_scheduler_status(file=StringIO()) for job in project: - with pytest.deprecated_call(): - next_op = project.next_operation(job) - assert next_op is not None + next_op = list(project.next_operations(job))[0] assert next_op.get_status() == JobStatus.queued MockScheduler.step()