diff --git a/docs/source/asking_questions.rst b/docs/source/asking_questions.rst index e5113893a..4c00e45c2 100644 --- a/docs/source/asking_questions.rst +++ b/docs/source/asking_questions.rst @@ -70,6 +70,13 @@ You can also set the following options when you call :mod:`Child.ask `) - ``timeout`` - how long in seconds to wait for an answer (``None`` by default - i.e. don't time out) +If the question fails: +- If ``raise_errors=False``, the unraised error is returned +- If ``raise_errors=False`` and ``max_retries > 0``, the question is retried up to this number of times +- If ``raise_errors=False``, ``max_retries > 0``, and ``prevent_retries_when`` is a list of exception types, the question is retried unless the error type is in the list +- If ``raise_errors=False``, ``log_errors=True``, and the question fails after its final retry, the error is logged + + Exceptions raised by a child ---------------------------- If a child raises an exception while processing your question, the exception will always be forwarded and re-raised in @@ -185,8 +192,8 @@ access the event store and run: Asking multiple questions in parallel ===================================== -You can also ask multiple questions to a service in parallel. By default, if any of the questions fail, an error is -raised and no answers are returned. +You can also ask multiple questions to a service in parallel - just provide questions as dictionaries of `Child.ask` +arguments: .. code-block:: python @@ -203,18 +210,11 @@ raised and no answers are returned. This method uses multithreading, allowing all the questions to be asked at once instead of one after another. -**Options** +.. hint:: -- If ``raise_errors=False`` is provided, answers are returned for all successful questions while unraised errors are - logged and returned for unsuccessful ones -- If ``raise_errors=False`` is provided with ``max_retries > 0``, failed questions are retried up to this number of - times -- If ``raise_errors=False`` is provided with ``max_retries > 0`` and ``prevent_retries_when`` is set to a list of - exception types, failed questions are retried except for those whose exception types are in the list -- ``max_workers``: The maximum number of threads that can be used to ask questions in parallel can be set via this - argument. It has no effect on the total number of questions that can be asked via ``Child.ask_multiple``. -- ``log_errors``: If `True` and ``raise_errors=False``, any errors remaining once retries are exhausted are logged in - addition to being returned + The maximum number of threads that can be used to ask questions in parallel can be set via the ``max_workers`` + argument. It has no effect on the total number of questions that can be asked, just how many can be in progress at + once. Asking a question within a service diff --git a/docs/source/inter_service_compatibility.rst b/docs/source/inter_service_compatibility.rst index 707bcb993..c5e6057ac 100644 --- a/docs/source/inter_service_compatibility.rst +++ b/docs/source/inter_service_compatibility.rst @@ -18,86 +18,88 @@ the parent, just that a child is able to accept a question. - ``0`` = incompatible - ``1`` = compatible -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| | 0.57.1 | 0.57.0 | 0.56.0 | 0.55.0 | 0.54.0 | 0.53.0 | 0.52.2 | 0.52.1 | 0.52.0 | 0.51.0 | 0.50.1 | 0.50.0 | 0.49.2 | 0.49.1 | 0.49.0 | 0.48.0 | 0.47.2 | 0.47.1 | 0.47.0 | 0.46.3 | 0.46.2 | 0.46.1 | 0.46.0 | 0.45.0 | 0.44.0 | 0.43.7 | 0.43.6 | 0.43.5 | 0.43.4 | 0.43.3 | 0.43.2 | 0.43.1 | 0.43.0 | 0.42.1 | 0.42.0 | 0.41.1 | 0.41.0 | 0.40.2 | 0.40.1 | 0.40.0 | -+========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+ -| 0.57.1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.57.0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.56.0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.55.0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.54.0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.53.0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.52.2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.52.1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.52.0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.51.0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.50.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.50.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.49.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.49.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.49.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.48.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.47.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.47.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.47.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.46.3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.46.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.46.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.46.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.45.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.44.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.43.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.42.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.42.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.41.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.41.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.40.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.40.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ -| 0.40.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -+--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| | 0.57.2 | 0.57.1 | 0.57.0 | 0.56.0 | 0.55.0 | 0.54.0 | 0.53.0 | 0.52.2 | 0.52.1 | 0.52.0 | 0.51.0 | 0.50.1 | 0.50.0 | 0.49.2 | 0.49.1 | 0.49.0 | 0.48.0 | 0.47.2 | 0.47.1 | 0.47.0 | 0.46.3 | 0.46.2 | 0.46.1 | 0.46.0 | 0.45.0 | 0.44.0 | 0.43.7 | 0.43.6 | 0.43.5 | 0.43.4 | 0.43.3 | 0.43.2 | 0.43.1 | 0.43.0 | 0.42.1 | 0.42.0 | 0.41.1 | 0.41.0 | 0.40.2 | 0.40.1 | 0.40.0 | ++========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+ +| 0.57.2 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.57.1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.57.0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.56.0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.55.0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.54.0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.53.0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.52.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.52.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.52.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.51.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.50.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.50.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.49.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.49.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.49.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.48.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.47.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.47.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.47.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.46.3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.46.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.46.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.46.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.45.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.44.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.43.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.42.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.42.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.41.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.41.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.40.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.40.1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| 0.40.0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++--------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ diff --git a/octue/__init__.py b/octue/__init__.py index 4a64cdffe..2e9ae9f5c 100644 --- a/octue/__init__.py +++ b/octue/__init__.py @@ -8,7 +8,6 @@ logger = logging.getLogger(__name__) -PYTHONUNBUFFERED = "PYTHONUNBUFFERED" __all__ = ("Runner",) @@ -22,9 +21,3 @@ include_process_name=bool(int(os.environ.get("INCLUDE_PROCESS_NAME_IN_LOGS", 0))), include_thread_name=bool(int(os.environ.get("INCLUDE_THREAD_NAME_IN_LOGS", 0))), ) - - if not os.environ.get(PYTHONUNBUFFERED): - logger.warning( - f"The {PYTHONUNBUFFERED!r} environment variable isn't set - logs may not appear in real time. Set " - f"{PYTHONUNBUFFERED}=1 to fix this." - ) diff --git a/octue/metadata/version_compatibilities.json b/octue/metadata/version_compatibilities.json index a0fd06b35..28772adb7 100644 --- a/octue/metadata/version_compatibilities.json +++ b/octue/metadata/version_compatibilities.json @@ -39,7 +39,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.40.1": { "0.40.1": true, @@ -81,7 +82,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.40.2": { "0.41.0": true, @@ -123,7 +125,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.41.0": { "0.41.0": true, @@ -165,7 +168,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.41.1": { "0.41.1": true, @@ -207,7 +211,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.42.0": { "0.42.0": true, @@ -249,7 +254,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.42.1": { "0.43.2": true, @@ -291,7 +297,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.43.0": { "0.43.2": true, @@ -333,7 +340,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.43.1": { "0.43.2": true, @@ -375,7 +383,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.43.2": { "0.43.2": true, @@ -417,7 +426,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.43.3": { "0.43.3": true, @@ -459,7 +469,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.43.4": { "0.43.4": true, @@ -501,7 +512,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.43.5": { "0.43.5": true, @@ -543,7 +555,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.43.6": { "0.43.6": true, @@ -585,7 +598,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.43.7": { "0.43.7": true, @@ -627,7 +641,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.44.0": { "0.44.0": true, @@ -669,7 +684,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.45.0": { "0.45.0": true, @@ -711,7 +727,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.46.0": { "0.46.0": true, @@ -753,7 +770,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.46.1": { "0.46.1": true, @@ -795,7 +813,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.46.2": { "0.46.2": true, @@ -837,7 +856,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.46.3": { "0.46.3": true, @@ -879,7 +899,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.47.0": { "0.47.0": true, @@ -921,7 +942,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.47.1": { "0.47.1": true, @@ -963,7 +985,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.47.2": { "0.47.2": true, @@ -1005,7 +1028,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.48.0": { "0.48.0": true, @@ -1047,7 +1071,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.49.0": { "0.49.1": true, @@ -1089,7 +1114,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.49.1": { "0.49.1": true, @@ -1131,7 +1157,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.49.2": { "0.49.2": true, @@ -1173,7 +1200,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.50.0": { "0.50.0": true, @@ -1215,7 +1243,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.50.1": { "0.51.0": false, @@ -1257,7 +1286,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.51.0": { "0.51.0": true, @@ -1299,7 +1329,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.52.0": { "0.51.0": true, @@ -1341,7 +1372,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.52.1": { "0.51.0": true, @@ -1383,7 +1415,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.52.2": { "0.51.0": true, @@ -1425,7 +1458,8 @@ "0.55.0": false, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.53.0": { "0.51.0": false, @@ -1467,7 +1501,8 @@ "0.55.0": true, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.54.0": { "0.51.0": false, @@ -1509,7 +1544,8 @@ "0.55.0": true, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.55.0": { "0.51.0": false, @@ -1551,7 +1587,8 @@ "0.55.0": true, "0.56.0": false, "0.57.0": false, - "0.57.1": false + "0.57.1": false, + "0.57.2": false }, "0.56.0": { "0.51.0": false, @@ -1593,7 +1630,8 @@ "0.55.0": false, "0.56.0": true, "0.57.0": true, - "0.57.1": true + "0.57.1": true, + "0.57.2": true }, "0.57.0": { "0.51.0": false, @@ -1635,7 +1673,8 @@ "0.55.0": false, "0.56.0": true, "0.57.0": true, - "0.57.1": true + "0.57.1": true, + "0.57.2": true }, "0.57.1": { "0.51.0": false, @@ -1677,6 +1716,50 @@ "0.55.0": false, "0.56.0": true, "0.57.0": true, - "0.57.1": true + "0.57.1": true, + "0.57.2": true + }, + "0.57.2": { + "0.51.0": false, + "0.50.1": false, + "0.50.0": false, + "0.49.2": false, + "0.49.1": false, + "0.49.0": false, + "0.48.0": false, + "0.47.2": false, + "0.47.1": false, + "0.47.0": false, + "0.46.3": false, + "0.46.2": false, + "0.46.1": false, + "0.46.0": false, + "0.45.0": false, + "0.44.0": false, + "0.43.7": false, + "0.43.6": false, + "0.43.5": false, + "0.43.4": false, + "0.43.3": false, + "0.43.2": false, + "0.43.1": false, + "0.43.0": false, + "0.42.1": false, + "0.42.0": false, + "0.41.1": false, + "0.41.0": false, + "0.40.2": false, + "0.40.1": false, + "0.40.0": false, + "0.52.0": false, + "0.52.1": false, + "0.52.2": false, + "0.53.0": false, + "0.54.0": false, + "0.55.0": false, + "0.56.0": true, + "0.57.0": true, + "0.57.1": true, + "0.57.2": true } } diff --git a/octue/resources/child.py b/octue/resources/child.py index 4169c568b..c06917e40 100644 --- a/octue/resources/child.py +++ b/octue/resources/child.py @@ -2,7 +2,6 @@ import copy import logging import os -import uuid from octue.cloud.pub_sub.service import Service from octue.resources import service_backends @@ -70,6 +69,10 @@ def ask( push_endpoint=None, asynchronous=False, retry_count=0, + raise_errors=True, + max_retries=0, + prevent_retries_when=None, + log_errors=True, timeout=86400, maximum_heartbeat_interval=300, ): @@ -94,41 +97,86 @@ def ask( :param str|None push_endpoint: if answers to the question should be pushed to an endpoint, provide its URL here (the returned subscription will be a push subscription); if not, leave this as `None` :param bool asynchronous: if `True`, don't wait for an answer or create an answer subscription (the result and other events can be retrieved from the event store later) :param int retry_count: the retry count of the question (this is zero if it's the first attempt at the question) + :param bool raise_errors: if `True` and the question fails, raise the error; if False, return the error in place of the answer + :param int max_retries: if `raise_errors=False` and the question fails, retry the question up to this number of times + :param list(type)|None prevent_retries_when: if `raise_errors=False` and the question fails, prevent retrying the question if it fails with an exception type in this list + :param bool log_errors: if `True`, `raise_errors=False`, and the question fails after its final retry, log the error :param float timeout: time in seconds to wait for an answer before raising a timeout error :param float|int maximum_heartbeat_interval: the maximum amount of time (in seconds) allowed between child heartbeats before an error is raised :raise TimeoutError: if the timeout is exceeded while waiting for an answer - :return dict|octue.cloud.pub_sub.subscription.Subscription|None, str: for a synchronous question, a dictionary containing the keys "output_values" and "output_manifest" from the result, and the question UUID; for a question with a push endpoint, the push subscription and the question UUID; for an asynchronous question, `None` and the question UUID + :raise Exception: if the question raises an error and `raise_errors=True` + :return dict|octue.cloud.pub_sub.subscription.Subscription|Exception|None, str: for a synchronous question, a dictionary containing the keys "output_values" and "output_manifest" from the result (or just an exception if the question fails), and the question UUID; for a question with a push endpoint, the push subscription and the question UUID; for an asynchronous question, `None` and the question UUID """ - subscription, question_uuid = self._service.ask( - service_id=self.id, - input_values=input_values, - input_manifest=input_manifest, - children=children, - subscribe_to_logs=subscribe_to_logs, - allow_local_files=allow_local_files, - save_diagnostics=save_diagnostics, - question_uuid=question_uuid, - parent_question_uuid=parent_question_uuid, - originator_question_uuid=originator_question_uuid, - originator=originator, - push_endpoint=push_endpoint, - asynchronous=asynchronous, - retry_count=retry_count, - timeout=timeout, - ) + prevent_retries_when = prevent_retries_when or [] + + inputs = { + "input_values": input_values, + "input_manifest": input_manifest, + "children": children, + "subscribe_to_logs": subscribe_to_logs, + "allow_local_files": allow_local_files, + "save_diagnostics": save_diagnostics, + "question_uuid": question_uuid, + "parent_question_uuid": parent_question_uuid, + "originator_question_uuid": originator_question_uuid, + "originator": originator, + "push_endpoint": push_endpoint, + "asynchronous": asynchronous, + "retry_count": retry_count, + "timeout": timeout, + } + + subscription, question_uuid = self._service.ask(service_id=self.id, **inputs) if push_endpoint or asynchronous: return subscription, question_uuid - answer = self._service.wait_for_answer( - subscription=subscription, - handle_monitor_message=handle_monitor_message, - record_events=record_events, - timeout=timeout, - maximum_heartbeat_interval=maximum_heartbeat_interval, - ) + try: + answer = self._service.wait_for_answer( + subscription=subscription, + handle_monitor_message=handle_monitor_message, + record_events=record_events, + timeout=timeout, + maximum_heartbeat_interval=maximum_heartbeat_interval, + ) + + return answer, question_uuid + + except Exception as e: + logger.error( + "Question %r failed. Run 'octue get-diagnostics gs:///%s " + "--download-datasets' to get the crash diagnostics.", + question_uuid, + question_uuid, + ) + + if raise_errors: + raise e + + if type(e) in prevent_retries_when: + logger.info("Skipping retries for exceptions of type %r.", type(e)) + return e, question_uuid + + for retry in range(max_retries): + logger.info("Retrying question %r %d of %d times.", question_uuid, retry + 1, max_retries) + + inputs["retry_count"] += 1 + answer, question_uuid = self.ask(**inputs, raise_errors=False, log_errors=False) + + if not isinstance(answer, Exception) or type(answer) in prevent_retries_when: + return answer, question_uuid + + e = answer + + if log_errors: + logger.error( + "Question %r failed after %d retries (see below for error).", + question_uuid, + max_retries, + exc_info=e, + ) - return answer, question_uuid + return e, question_uuid def ask_multiple( self, @@ -140,9 +188,9 @@ def ask_multiple( log_errors=True, ): """Ask the child multiple questions in parallel and wait for the answers. Each question should be provided as a - dictionary of `Child.ask` keyword arguments. If `raise_errors` is `True`, an error is raised and no answers are - returned if any of the individual questions raise an error; if it's `False`, answers are returned for all - successful questions while errors are returned unraised for any failed ones. + dictionary of `Child.ask` keyword arguments. The `raise_errors`, `max_retries`, `prevent_retries_when`, and + `log_errors` arguments have the same effect as in `Child.ask`, applied to all questions. These values may be + overridden on a per-question basis by specifying them in the question dictionary. :param questions: any number of questions provided as dictionaries of arguments to the `Child.ask` method :param bool raise_errors: if `True`, an error is raised and no answers are returned if any of the individual questions raise an error; if `False`, answers are returned for all successful questions while errors are returned unraised for any failed ones @@ -150,12 +198,8 @@ def ask_multiple( :param list(type)|None prevent_retries_when: prevent retrying any questions that fail with an exception type in this list (note: this will have no effect unless `raise_errors=False`) :param int|None max_workers: the maximum number of questions that can be asked at once; defaults to the lowest of {32, no. of CPUs + 4, and no. of questions} (see `concurrent.futures.ThreadPoolExecutor`) :param bool log_errors: if `True` and `raise_errors=False`, log any errors remaining once retries are exhausted - :raise ValueError: if the maximum number of parallel questions is set too high - :raise Exception: if any question raises an error if `raise_errors` is `True` - :return list(dict|Exception, str): the answers or caught errors of the questions, and the question UUIDs (in the same order as asked) + :return list((dict|octue.cloud.pub_sub.subscription.Subscription|Exception|None, str)): the answers to the questions and the question UUIDs (in the same order as asked) """ - prevent_retries_when = prevent_retries_when or [] - # Answers will come out of order, so use a dictionary to store them against their questions' original index. answers = {} n_questions = len(questions) @@ -166,9 +210,11 @@ def ask_multiple( future_to_question_index_mapping = {} for i, question in enumerate(questions): - # Add a question UUID if not set so retries have the same one. - if "question_uuid" not in question: - question["question_uuid"] = str(uuid.uuid4()) + # Set retry/error parameters if they're not given in the individual questions. + question["raise_errors"] = question.get("raise_errors", raise_errors) + question["max_retries"] = question.get("max_retries", max_retries) + question["prevent_retries_when"] = question.get("prevent_retries_when", prevent_retries_when) + question["log_errors"] = question.get("log_errors", log_errors) future = executor.submit(self.ask, **question) future_to_question_index_mapping[future] = i @@ -176,73 +222,7 @@ def ask_multiple( for i, future in enumerate(concurrent.futures.as_completed(future_to_question_index_mapping)): logger.info("%d of %d answers received.", i + 1, n_questions) question_index = future_to_question_index_mapping[future] - - try: - answers[question_index] = future.result() - except Exception as e: - if raise_errors: - raise e - - question_uuid = questions[question_index]["question_uuid"] - answers[question_index] = (e, question_uuid) - - logger.error( - "Question %s failed. Run 'octue get-diagnostics gs:///%s " - "--download-datasets' to get the crash diagnostics.", - question_uuid, - question_uuid, - ) - - for retry in range(max_retries): - failed_questions = self._get_failed_questions( - questions, - answers, - prevent_retries_when, - increment_retry_count=True, - ) - - if not failed_questions: - break - - logger.info("%d questions failed - retrying %d of %d times.", len(failed_questions), retry + 1, max_retries) - retried_answers = self.ask_multiple(*failed_questions.values(), raise_errors=False, log_errors=False) - - for question_index, answer in zip(failed_questions.keys(), retried_answers): - answers[question_index] = answer - - if log_errors: - # Check for failed questions after retries completed. - failed_questions = self._get_failed_questions(questions, answers, prevent_retries_when) - - for question_index, question in failed_questions.items(): - logger.error( - "Question %s failed after %d retries (see below for error).", - question["question_uuid"], - max_retries, - exc_info=answers[question_index][0], - ) + answers[question_index] = future.result() # Convert dictionary to list in asking order. return [answer[1] for answer in sorted(answers.items(), key=lambda item: item[0])] - - def _get_failed_questions(self, questions, answers, prevent_retries_when, increment_retry_count=False): - """Get the questions that failed. - - :param list(dict) questions: the list of questions that were asked - :param dict answers: a mapping of question index (i.e. position in the original list of questions) to question answer - :param list(type)|None prevent_retries_when: prevent retrying any questions that fail with an exception type in this list (note: this will have no effect unless `raise_errors=False`) - :param bool increment_retry_count: if `True`, increment the question retry count by 1 - :return dict: a mapping of failed question index (i.e. position in the original list of questions) to failed question - """ - failed_questions = {} - - for question_index, answer in answers.items(): - if isinstance(answer[0], Exception) and type(answer[0]) not in prevent_retries_when: - question = questions[question_index] - - if increment_retry_count: - question["retry_count"] = question.get("retry_count", 0) + 1 - - failed_questions[question_index] = question - - return failed_questions diff --git a/pyproject.toml b/pyproject.toml index 4d8eeac14..f30b96b7e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "octue" -version = "0.57.1" +version = "0.57.2" description = "A package providing template applications for data services, and a python SDK to the Octue API." readme = "README.md" authors = ["Marcus Lugg ", "Thomas Clark "] diff --git a/tests/resources/test_child.py b/tests/resources/test_child.py index f35ced5f0..035610dfa 100644 --- a/tests/resources/test_child.py +++ b/tests/resources/test_child.py @@ -20,13 +20,18 @@ lock = threading.Lock() +def mock_run_function_that_fails(analysis_id, input_values, *args, **kwargs): + """A run function that always fails.""" + raise ValueError("Deliberately raised for `Child.ask` test.") + + def mock_run_function_that_fails_every_other_time(analysis_id, input_values, *args, **kwargs): + """A run function that always fails every other time, starting with the first time.""" with lock: - kwargs["runs"].value += 1 - # Every other question will fail. if kwargs["runs"].value % 2 == 0: - raise ValueError("Deliberately raised for `Child.ask_multiple` test.") + kwargs["runs"].value += 1 + raise ValueError("Deliberately raised for `Child.ask` test.") time.sleep(random.random() * 0.1) return MockAnalysis(output_values=input_values) @@ -82,8 +87,8 @@ def test_child_cannot_be_asked_question_without_credentials(self): with self.assertRaises(DefaultCredentialsError): child.ask({"some": "input"}) - def test_child_can_be_asked_multiple_questions(self): - """Test that a child can be asked multiple questions.""" + def test_child_can_be_asked_multiple_questions_in_serial(self): + """Test that a child can be asked multiple questions in serial.""" def mock_run_function(analysis_id, input_values, *args, **kwargs): return MockAnalysis(output_values=input_values) @@ -99,34 +104,12 @@ def mock_run_function(analysis_id, input_values, *args, **kwargs): self.assertEqual(child.ask([1, 2, 3, 4])[0]["output_values"], [1, 2, 3, 4]) self.assertEqual(child.ask([5, 6, 7, 8])[0]["output_values"], [5, 6, 7, 8]) - -class TestAskMultiple(BaseTestCase): - service_patcher = ServicePatcher() - - @classmethod - def setUpClass(cls): - """Start the service patcher. - - :return None: - """ - cls.service_patcher.start() - - @classmethod - def tearDownClass(cls): - """Stop the service patcher. - - :return None: - """ - cls.service_patcher.stop() - - def test_ask_multiple(self): - """Test that a child can be asked multiple questions in parallel and return the answers in the correct order.""" - - def mock_run_function(analysis_id, input_values, *args, **kwargs): - time.sleep(random.randint(0, 2)) - return MockAnalysis(output_values=input_values) - - responding_service = MockService(backend=GCPPubSubBackend(project_name="blah"), run_function=mock_run_function) + def test_error_raised_if_question_fails_when_raise_errors_is_true(self): + """Test that an error is raised if the question fails when `raise_errors` is `True`.""" + responding_service = MockService( + backend=GCPPubSubBackend(project_name="blah"), + run_function=mock_run_function_that_fails, + ) with patch("octue.resources.child.BACKEND_TO_SERVICE_MAPPING", {"GCPPubSubBackend": MockService}): responding_service.serve() @@ -136,57 +119,48 @@ def mock_run_function(analysis_id, input_values, *args, **kwargs): # Make sure the child's underlying mock service knows how to access the mock responding service. child._service.children[responding_service.id] = responding_service - answers = child.ask_multiple( - {"input_values": [1, 2, 3, 4]}, - {"input_values": [5, 6, 7, 8]}, - ) + with self.assertRaises(ValueError): + child.ask(input_values=[1, 2, 3, 4]) - self.assertEqual( - [answer[0] for answer in answers], - [ - {"output_values": [1, 2, 3, 4], "output_manifest": None}, - {"output_values": [5, 6, 7, 8], "output_manifest": None}, - ], - ) + def test_error_not_raised_if_question_fails_when_raise_errors_is_false(self): + """Test that an error is not raised if the question fails when `raise_errors` is `False`.""" + responding_service = MockService( + backend=GCPPubSubBackend(project_name="blah"), + run_function=mock_run_function_that_fails, + ) - def test_error_raised_if_one_question_fails_when_raise_errors_is_true(self): - """Test that an error is raised if any of the questions given to `Child.ask_multiple` fail when `raise_errors` - is `True`. - """ + with patch("octue.resources.child.BACKEND_TO_SERVICE_MAPPING", {"GCPPubSubBackend": MockService}): + responding_service.serve() - def mock_run_function_that_sometimes_fails(analysis_id, input_values, *args, **kwargs): - kwargs["runs"].value += 1 + child = Child(id=responding_service.id, backend={"name": "GCPPubSubBackend", "project_name": "blah"}) - if kwargs["runs"].value % 2 == 0: - raise ValueError("Deliberately raised for `Child.ask_multiple` test.") + # Make sure the child's underlying mock service knows how to access the mock responding service. + child._service.children[responding_service.id] = responding_service + answer, _ = child.ask(input_values=[1, 2, 3, 4], raise_errors=False) - time.sleep(random.randint(0, 2)) - return MockAnalysis(output_values=input_values) + self.assertTrue(isinstance(answer, ValueError)) + self.assertIn("Deliberately raised for `Child.ask` test.", answer.args[0]) + def test_with_failed_question_retry(self): + """Test that a failed question can be automatically retried.""" responding_service = MockService( backend=GCPPubSubBackend(project_name="blah"), - run_function=functools.partial(mock_run_function_that_sometimes_fails, runs=Value("d", 0)), + run_function=functools.partial(mock_run_function_that_fails_every_other_time, runs=Value("d", 0)), ) with patch("octue.resources.child.BACKEND_TO_SERVICE_MAPPING", {"GCPPubSubBackend": MockService}): responding_service.serve() - child = Child(id=responding_service.id, backend={"name": "GCPPubSubBackend", "project_name": "blah"}) # Make sure the child's underlying mock service knows how to access the mock responding service. child._service.children[responding_service.id] = responding_service + answer, _ = child.ask(input_values=[1, 2, 3, 4], raise_errors=False, max_retries=1) - with self.assertRaises(ValueError): - child.ask_multiple( - {"input_values": [1, 2, 3, 4]}, - {"input_values": [5, 6, 7, 8]}, - {"input_values": [9, 10, 11, 12]}, - ) + # Check that the question succeeds. + self.assertEqual(answer, {"output_manifest": None, "output_values": [1, 2, 3, 4]}) - def test_error_not_raised_by_if_one_question_fails_when_raise_errors_is_false(self): - """Test that an error is not raised if one of the questions given to `Child.ask_multiple` fail when - `raise_errors` is `False`. - """ + def test_errors_logged_when_not_raised(self): + """Test that errors from a question still failing after retries are exhausted are logged by default.""" responding_service = MockService( backend=GCPPubSubBackend(project_name="blah"), run_function=functools.partial(mock_run_function_that_fails_every_other_time, runs=Value("d", 0)), @@ -194,40 +168,19 @@ def test_error_not_raised_by_if_one_question_fails_when_raise_errors_is_false(se with patch("octue.resources.child.BACKEND_TO_SERVICE_MAPPING", {"GCPPubSubBackend": MockService}): responding_service.serve() - child = Child(id=responding_service.id, backend={"name": "GCPPubSubBackend", "project_name": "blah"}) # Make sure the child's underlying mock service knows how to access the mock responding service. child._service.children[responding_service.id] = responding_service - answers = child.ask_multiple( - {"input_values": [1, 2, 3, 4]}, - {"input_values": [5, 6, 7, 8]}, - {"input_values": [9, 10, 11, 12]}, - raise_errors=False, - ) - - successful_answers = [] - failed_answers = [] - - for answer in answers: - if isinstance(answer[0], Exception): - failed_answers.append(answer) - else: - successful_answers.append(answer) + with self.assertLogs(level=logging.ERROR) as logging_context: + child.ask(input_values=[1, 2, 3, 4], raise_errors=False, max_retries=0) - self.assertEqual(len(successful_answers), 2) - self.assertEqual(len(failed_answers), 1) - self.assertIn("Deliberately raised for `Child.ask_multiple` test.", failed_answers[0][0].args[0]) + self.assertIn("failed after 0 retries (see below for error).", logging_context.output[2]) + self.assertIn('raise ValueError("Deliberately raised for `Child.ask` test.")', logging_context.output[2]) - def test_with_failed_question_retry(self): - """Test that failed questions can be automatically retried. We use a lock in the run function so that the - questions always succeed/fail in this order (which is the order the questions end up being asked by the thread - pool, not necessarily the order they're asked by the caller of `Child.ask_multiple`): - 1. First question succeeds - 2. Second question fails - 3. Second question is retried and succeeds - """ + def test_with_prevented_retries(self): + """Test that retries can be prevented for specified exception types.""" responding_service = MockService( backend=GCPPubSubBackend(project_name="blah"), run_function=functools.partial(mock_run_function_that_fails_every_other_time, runs=Value("d", 0)), @@ -241,29 +194,46 @@ def test_with_failed_question_retry(self): # Make sure the child's underlying mock service knows how to access the mock responding service. child._service.children[responding_service.id] = responding_service - # Only ask two questions so the question success/failure order plays out as desired. - answers = child.ask_multiple( - {"input_values": [1, 2, 3, 4]}, - {"input_values": [5, 6, 7, 8]}, - raise_errors=False, - max_retries=1, - ) + with self.assertLogs() as logging_context: + answer, _ = child.ask( + input_values=[1, 2, 3, 4], + raise_errors=False, + max_retries=1, + prevent_retries_when=[ValueError], + ) - # Check that both questions succeeded. - self.assertEqual( - [answer[0] for answer in answers], - [ - {"output_manifest": None, "output_values": [1, 2, 3, 4]}, - {"output_manifest": None, "output_values": [5, 6, 7, 8]}, - ], - ) + self.assertTrue(isinstance(answer, ValueError)) + self.assertIn("Deliberately raised for `Child.ask` test.", answer.args[0]) + self.assertIn("Skipping retries for exceptions of type .", logging_context.output[-1]) - def test_with_failed_question_retry_with_prepared_question_uuid(self): - """Test that questions with prepared question UUIDs can be retried.""" - responding_service = MockService( - backend=GCPPubSubBackend(project_name="blah"), - run_function=functools.partial(mock_run_function_that_fails_every_other_time, runs=Value("d", 0)), - ) + +class TestAskMultiple(BaseTestCase): + service_patcher = ServicePatcher() + + @classmethod + def setUpClass(cls): + """Start the service patcher. + + :return None: + """ + cls.service_patcher.start() + + @classmethod + def tearDownClass(cls): + """Stop the service patcher. + + :return None: + """ + cls.service_patcher.stop() + + def test_ask_multiple(self): + """Test that a child can be asked multiple questions in parallel and return the answers in the correct order.""" + + def mock_run_function(analysis_id, input_values, *args, **kwargs): + time.sleep(random.randint(0, 2)) + return MockAnalysis(output_values=input_values) + + responding_service = MockService(backend=GCPPubSubBackend(project_name="blah"), run_function=mock_run_function) with patch("octue.resources.child.BACKEND_TO_SERVICE_MAPPING", {"GCPPubSubBackend": MockService}): responding_service.serve() @@ -273,22 +243,18 @@ def test_with_failed_question_retry_with_prepared_question_uuid(self): # Make sure the child's underlying mock service knows how to access the mock responding service. child._service.children[responding_service.id] = responding_service - # Only ask two questions so the question success/failure order plays out as desired. answers = child.ask_multiple( - {"input_values": [1, 2, 3, 4], "question_uuid": "b2af87f1-a893-415f-85d8-b5c4385c18f6"}, - {"input_values": [5, 6, 7, 8], "question_uuid": "77763a5e-352c-48c0-8c64-bd09a82eb869"}, - raise_errors=False, - max_retries=1, + {"input_values": [1, 2, 3, 4]}, + {"input_values": [5, 6, 7, 8]}, ) - # Check that both questions succeeded. - self.assertEqual( - [answer[0] for answer in answers], - [ - {"output_manifest": None, "output_values": [1, 2, 3, 4]}, - {"output_manifest": None, "output_values": [5, 6, 7, 8]}, - ], - ) + self.assertEqual( + [answer[0] for answer in answers], + [ + {"output_values": [1, 2, 3, 4], "output_manifest": None}, + {"output_values": [5, 6, 7, 8], "output_manifest": None}, + ], + ) def test_with_multiple_failed_question_retries(self): """Test that repeatedly failed questions can be automatically retried more than once. We use a lock in the run @@ -317,12 +283,10 @@ def test_with_multiple_failed_question_retries(self): # Only ask two questions so the question success/failure order plays out as desired. answers = child.ask_multiple( - {"input_values": [1, 2, 3, 4]}, - {"input_values": [5, 6, 7, 8]}, - {"input_values": [9, 10, 11, 12]}, - {"input_values": [13, 14, 15, 16]}, - raise_errors=False, - max_retries=2, + {"input_values": [1, 2, 3, 4], "raise_errors": False, "max_retries": 2}, + {"input_values": [5, 6, 7, 8], "raise_errors": False, "max_retries": 2}, + {"input_values": [9, 10, 11, 12], "raise_errors": False, "max_retries": 2}, + {"input_values": [13, 14, 15, 16], "raise_errors": False, "max_retries": 2}, ) # Check that all four questions succeeded. @@ -335,71 +299,3 @@ def test_with_multiple_failed_question_retries(self): {"output_manifest": None, "output_values": [13, 14, 15, 16]}, ], ) - - def test_errors_logged_when_not_raised(self): - """Test that errors from any questions still failing after retries are exhausted are logged.""" - responding_service = MockService( - backend=GCPPubSubBackend(project_name="blah"), - run_function=functools.partial(mock_run_function_that_fails_every_other_time, runs=Value("d", 0)), - ) - - with patch("octue.resources.child.BACKEND_TO_SERVICE_MAPPING", {"GCPPubSubBackend": MockService}): - responding_service.serve() - - child = Child(id=responding_service.id, backend={"name": "GCPPubSubBackend", "project_name": "blah"}) - - # Make sure the child's underlying mock service knows how to access the mock responding service. - child._service.children[responding_service.id] = responding_service - - # Only ask two questions so the question success/failure order plays out as desired. - with self.assertLogs(level=logging.ERROR) as logging_context: - child.ask_multiple( - {"input_values": [1, 2, 3, 4]}, - {"input_values": [5, 6, 7, 8]}, - raise_errors=False, - max_retries=0, - ) - - self.assertIn("failed after 0 retries (see below for error).", logging_context.output[2]) - - self.assertIn( - 'raise ValueError("Deliberately raised for `Child.ask_multiple` test.")', - logging_context.output[2], - ) - - def test_with_prevented_retries(self): - """Test that retries can be prevented for specified exception types.""" - responding_service = MockService( - backend=GCPPubSubBackend(project_name="blah"), - run_function=functools.partial(mock_run_function_that_fails_every_other_time, runs=Value("d", 0)), - ) - - with patch("octue.resources.child.BACKEND_TO_SERVICE_MAPPING", {"GCPPubSubBackend": MockService}): - responding_service.serve() - - child = Child(id=responding_service.id, backend={"name": "GCPPubSubBackend", "project_name": "blah"}) - - # Make sure the child's underlying mock service knows how to access the mock responding service. - child._service.children[responding_service.id] = responding_service - - # Only ask two questions so the question success/failure order plays out as desired. - answers = child.ask_multiple( - {"input_values": [1, 2, 3, 4]}, - {"input_values": [5, 6, 7, 8]}, - raise_errors=False, - max_retries=1, - prevent_retries_when=[ValueError], - ) - - successful_answers = [] - failed_answers = [] - - for answer in answers: - if isinstance(answer[0], Exception): - failed_answers.append(answer) - else: - successful_answers.append(answer) - - self.assertEqual(len(successful_answers), 1) - self.assertEqual(len(failed_answers), 1) - self.assertIn("Deliberately raised for `Child.ask_multiple` test.", failed_answers[0][0].args[0])