prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Missing `f` prefix on f-strings
  Some strings looks like they're meant to be f-strings but are missing the `f` prefix meaning variable interpolation won't happen.
  
  https://github.com/ansible-community/molecule/blob/19381a8a564f8013453b8dfb08b677fd81c2e358/src/molecule/scenarios.py#L85
  
  I found this issue automatically. I'm a bot. Beep Boop 🦊. See other issues I found in your repo [here](https://codereview.doctor/ansible-community/molecule)
  
  </issue>
  <code>
  [start of src/molecule/scenarios.py]
  1 #  Copyright (c) 2015-2018 Cisco Systems, Inc.
  2 #
  3 #  Permission is hereby granted, free of charge, to any person obtaining a copy
  4 #  of this software and associated documentation files (the "Software"), to
  5 #  deal in the Software without restriction, including without limitation the
  6 #  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  7 #  sell copies of the Software, and to permit persons to whom the Software is
  8 #  furnished to do so, subject to the following conditions:
  9 #
  10 #  The above copyright notice and this permission notice shall be included in
  11 #  all copies or substantial portions of the Software.
  12 #
  13 #  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14 #  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15 #  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16 #  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17 #  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  18 #  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  19 #  DEALINGS IN THE SOFTWARE.
  20 """Scenarios Module."""
  21 import logging
  22 from typing import List
  23 
  24 from molecule import util
  25 
  26 LOG = logging.getLogger(__name__)
  27 
  28 
  29 class Scenarios(object):
  30     """The Scenarios groups one or more scenario objects Molecule will execute."""
  31 
  32     def __init__(self, configs, scenario_name=None):
  33         """
  34         Initialize a new scenarios class and returns None.
  35 
  36         :param configs: A list containing Molecule config instances.
  37         :param scenario_name: A string containing the name of the scenario.
  38         :return: None
  39         """
  40         self._configs = configs
  41         self._scenario_name = scenario_name
  42         self._scenarios = self.all
  43 
  44     def next(self):
  45         if not self._scenarios:
  46             raise StopIteration
  47         return self._scenarios.pop(0)
  48 
  49     def __iter__(self):
  50         """Make object iterable."""
  51         return self
  52 
  53     __next__ = next  # Python 3.X compatibility
  54 
  55     @property
  56     def all(self):
  57         """
  58         Return a list containing all scenario objects.
  59 
  60         :return: list
  61         """
  62         if self._scenario_name:
  63             scenarios = self._filter_for_scenario()
  64             self._verify()
  65 
  66             return scenarios
  67 
  68         scenarios = [c.scenario for c in self._configs]
  69         scenarios.sort(key=lambda x: x.directory)
  70         return scenarios
  71 
  72     def print_matrix(self):
  73         msg = "Test matrix"
  74         LOG.info(msg)
  75 
  76         tree = {}
  77         for scenario in self.all:
  78             tree[scenario.name] = [action for action in scenario.sequence]
  79         util.print_as_yaml(tree)
  80 
  81     def sequence(self, scenario_name: str) -> List[str]:
  82         for scenario in self.all:
  83             if scenario.name == scenario_name:
  84                 return [action for action in scenario.sequence]
  85         raise RuntimeError("Unable to find sequence for {scenario_name} scenario.")
  86 
  87     def _verify(self):
  88         """
  89         Verify the specified scenario was found and returns None.
  90 
  91         :return: None
  92         """
  93         scenario_names = [c.scenario.name for c in self._configs]
  94         if self._scenario_name not in scenario_names:
  95             msg = f"Scenario '{self._scenario_name}' not found.  Exiting."
  96             util.sysexit_with_message(msg)
  97 
  98     def _filter_for_scenario(self):
  99         """
  100         Find the scenario matching the provided scenario name and returns a \
  101         list.
  102 
  103         :return: list
  104         """
  105         return [
  106             c.scenario for c in self._configs if c.scenario.name == self._scenario_name
  107         ]
  108 
  109     def _get_matrix(self):
  110         """
  111         Build a matrix of scenarios with sequence to include and returns a \
  112         dict.
  113 
  114         {
  115             scenario_1: {
  116                 'subcommand': [
  117                     'action-1',
  118                     'action-2',
  119                 ],
  120             },
  121             scenario_2: {
  122                 'subcommand': [
  123                     'action-1',
  124                 ],
  125             },
  126         }
  127 
  128         :returns: dict
  129         """
  130         return dict(
  131             {
  132                 scenario.name: {
  133                     "check": scenario.check_sequence,
  134                     "cleanup": scenario.cleanup_sequence,
  135                     "converge": scenario.converge_sequence,
  136                     "create": scenario.create_sequence,
  137                     "dependency": scenario.dependency_sequence,
  138                     "destroy": scenario.destroy_sequence,
  139                     "idempotence": scenario.idempotence_sequence,
  140                     "lint": scenario.lint_sequence,
  141                     "prepare": scenario.prepare_sequence,
  142                     "side_effect": scenario.side_effect_sequence,
  143                     "syntax": scenario.syntax_sequence,
  144                     "test": scenario.test_sequence,
  145                     "verify": scenario.verify_sequence,
  146                 }
  147                 for scenario in self.all
  148             }
  149         )
  150
  [end of src/molecule/scenarios.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/src/molecule/scenarios.py b/src/molecule/scenarios.py
  --- a/src/molecule/scenarios.py
  +++ b/src/molecule/scenarios.py
  @@ -82,7 +82,7 @@
           for scenario in self.all:
               if scenario.name == scenario_name:
                   return [action for action in scenario.sequence]
  -        raise RuntimeError("Unable to find sequence for {scenario_name} scenario.")
  +        raise RuntimeError(f"Unable to find sequence for {scenario_name} scenario.")
   
       def _verify(self):
           """
  
verification_info: {"golden_diff": "diff --git a/src/molecule/scenarios.py b/src/molecule/scenarios.py\n--- a/src/molecule/scenarios.py\n+++ b/src/molecule/scenarios.py\n@@ -82,7 +82,7 @@\n         for scenario in self.all:\n             if scenario.name == scenario_name:\n                 return [action for action in scenario.sequence]\n-        raise RuntimeError(\"Unable to find sequence for {scenario_name} scenario.\")\n+        raise RuntimeError(f\"Unable to find sequence for {scenario_name} scenario.\")\n \n     def _verify(self):\n         \"\"\"\n", "issue": "Missing `f` prefix on f-strings\nSome strings looks like they're meant to be f-strings but are missing the `f` prefix meaning variable interpolation won't happen.\n\nhttps://github.com/ansible-community/molecule/blob/19381a8a564f8013453b8dfb08b677fd81c2e358/src/molecule/scenarios.py#L85\n\nI found this issue automatically. I'm a bot. Beep Boop \ud83e\udd8a. See other issues I found in your repo [here](https://codereview.doctor/ansible-community/molecule)\n", "before_files": [{"content": "#  Copyright (c) 2015-2018 Cisco Systems, Inc.\n#\n#  Permission is hereby granted, free of charge, to any person obtaining a copy\n#  of this software and associated documentation files (the \"Software\"), to\n#  deal in the Software without restriction, including without limitation the\n#  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n#  sell copies of the Software, and to permit persons to whom the Software is\n#  furnished to do so, subject to the following conditions:\n#\n#  The above copyright notice and this permission notice shall be included in\n#  all copies or substantial portions of the Software.\n#\n#  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n#  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n#  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n#  DEALINGS IN THE SOFTWARE.\n\"\"\"Scenarios Module.\"\"\"\nimport logging\nfrom typing import List\n\nfrom molecule import util\n\nLOG = logging.getLogger(__name__)\n\n\nclass Scenarios(object):\n    \"\"\"The Scenarios groups one or more scenario objects Molecule will execute.\"\"\"\n\n    def __init__(self, configs, scenario_name=None):\n        \"\"\"\n        Initialize a new scenarios class and returns None.\n\n        :param configs: A list containing Molecule config instances.\n        :param scenario_name: A string containing the name of the scenario.\n        :return: None\n        \"\"\"\n        self._configs = configs\n        self._scenario_name = scenario_name\n        self._scenarios = self.all\n\n    def next(self):\n        if not self._scenarios:\n            raise StopIteration\n        return self._scenarios.pop(0)\n\n    def __iter__(self):\n        \"\"\"Make object iterable.\"\"\"\n        return self\n\n    __next__ = next  # Python 3.X compatibility\n\n    @property\n    def all(self):\n        \"\"\"\n        Return a list containing all scenario objects.\n\n        :return: list\n        \"\"\"\n        if self._scenario_name:\n            scenarios = self._filter_for_scenario()\n            self._verify()\n\n            return scenarios\n\n        scenarios = [c.scenario for c in self._configs]\n        scenarios.sort(key=lambda x: x.directory)\n        return scenarios\n\n    def print_matrix(self):\n        msg = \"Test matrix\"\n        LOG.info(msg)\n\n        tree = {}\n        for scenario in self.all:\n            tree[scenario.name] = [action for action in scenario.sequence]\n        util.print_as_yaml(tree)\n\n    def sequence(self, scenario_name: str) -> List[str]:\n        for scenario in self.all:\n            if scenario.name == scenario_name:\n                return [action for action in scenario.sequence]\n        raise RuntimeError(\"Unable to find sequence for {scenario_name} scenario.\")\n\n    def _verify(self):\n        \"\"\"\n        Verify the specified scenario was found and returns None.\n\n        :return: None\n        \"\"\"\n        scenario_names = [c.scenario.name for c in self._configs]\n        if self._scenario_name not in scenario_names:\n            msg = f\"Scenario '{self._scenario_name}' not found.  Exiting.\"\n            util.sysexit_with_message(msg)\n\n    def _filter_for_scenario(self):\n        \"\"\"\n        Find the scenario matching the provided scenario name and returns a \\\n        list.\n\n        :return: list\n        \"\"\"\n        return [\n            c.scenario for c in self._configs if c.scenario.name == self._scenario_name\n        ]\n\n    def _get_matrix(self):\n        \"\"\"\n        Build a matrix of scenarios with sequence to include and returns a \\\n        dict.\n\n        {\n            scenario_1: {\n                'subcommand': [\n                    'action-1',\n                    'action-2',\n                ],\n            },\n            scenario_2: {\n                'subcommand': [\n                    'action-1',\n                ],\n            },\n        }\n\n        :returns: dict\n        \"\"\"\n        return dict(\n            {\n                scenario.name: {\n                    \"check\": scenario.check_sequence,\n                    \"cleanup\": scenario.cleanup_sequence,\n                    \"converge\": scenario.converge_sequence,\n                    \"create\": scenario.create_sequence,\n                    \"dependency\": scenario.dependency_sequence,\n                    \"destroy\": scenario.destroy_sequence,\n                    \"idempotence\": scenario.idempotence_sequence,\n                    \"lint\": scenario.lint_sequence,\n                    \"prepare\": scenario.prepare_sequence,\n                    \"side_effect\": scenario.side_effect_sequence,\n                    \"syntax\": scenario.syntax_sequence,\n                    \"test\": scenario.test_sequence,\n                    \"verify\": scenario.verify_sequence,\n                }\n                for scenario in self.all\n            }\n        )\n", "path": "src/molecule/scenarios.py"}]}