We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN 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/plotly/dash/blob/f6b51a841e7deddebfbada374e7de4c297bb2ce8/dash/development/update_components.py#L48

I found this issue automatically. I'm a bot. Beep Boop 🦊. See other issues I found in your repo [here](https://codereview.doctor/plotly/dash)

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `dash/development/update_components.py`
Content:
```
1 import sys
2 import subprocess
3 import shlex
4 import os
5 import argparse
6 import shutil
7 import logging
8 import coloredlogs
9 
10 
11 class _CombinedFormatter(
12     argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter
13 ):
14     pass
15 
16 
17 logger = logging.getLogger(__name__)
18 coloredlogs.install(
19     fmt="%(asctime)s,%(msecs)03d %(levelname)s - %(message)s", datefmt="%H:%M:%S"
20 )
21 
22 
23 def bootstrap_components(components_source, concurrency, install_type):
24 
25     is_windows = sys.platform == "win32"
26 
27     source_glob = (
28         components_source
29         if components_source != "all"
30         else "dash-core-components|dash-html-components|dash-table"
31     )
32 
33     cmdstr = f"npx lerna exec --concurrency {concurrency} --scope *@({source_glob})* -- npm {install_type}"
34     cmd = shlex.split(cmdstr, posix=not is_windows)
35     print(cmdstr)
36 
37     with subprocess.Popen(
38         cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=is_windows
39     ) as proc:
40         out, err = proc.communicate()
41         status = proc.poll()
42 
43     if err:
44         print(("🛑 " if status else "") + err.decode(), file=sys.stderr)
45 
46     if status or not out:
47         print(
48             "🚨 Failed installing npm dependencies for component packages: {source_glob} (status={status}) 🚨",
49             file=sys.stderr,
50         )
51         sys.exit(1)
52     else:
53         print(
54             f"🟢 Finished installing npm dependencies for component packages: {source_glob} 🟢",
55             file=sys.stderr,
56         )
57 
58 
59 def build_components(components_source, concurrency):
60 
61     is_windows = sys.platform == "win32"
62 
63     source_glob = (
64         components_source
65         if components_source != "all"
66         else "dash-core-components|dash-html-components|dash-table"
67     )
68 
69     cmdstr = f"npx lerna exec --concurrency {concurrency} --scope *@({source_glob})* -- npm run build"
70     cmd = shlex.split(cmdstr, posix=not is_windows)
71     print(cmdstr)
72 
73     with subprocess.Popen(
74         cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=is_windows
75     ) as proc:
76         out, err = proc.communicate()
77         status = proc.poll()
78 
79     if err:
80         print(("🛑 " if status else "") + err.decode(), file=sys.stderr)
81 
82     if status or not out:
83         print(
84             f"🚨 Finished updating component packages: {source_glob} (status={status}) 🚨",
85             file=sys.stderr,
86         )
87         sys.exit(1)
88 
89     for package in source_glob.split("|"):
90         build_directory = os.path.join(
91             "components", package, package.replace("-", "_").rstrip("/\\")
92         )
93 
94         dest_dir = (
95             "dcc"
96             if package == "dash-core-components"
97             else "html"
98             if package == "dash-html-components"
99             else "dash_table"
100         )
101 
102         dest_path = os.path.join("dash", dest_dir)
103 
104         if not os.path.exists(dest_path):
105             try:
106                 os.makedirs(dest_path)
107             except OSError:
108                 logger.exception("🚨 Having issues manipulating %s", dest_path)
109                 sys.exit(1)
110 
111         if not os.path.exists(build_directory):
112             print(
113                 "🚨 Could not locate build artifacts."
114                 + " Check that the npm build process completed"
115                 + f" successfully for package: {package} 🚨"
116             )
117             sys.exit(1)
118         else:
119             print(f"🚚 Moving build artifacts from {build_directory} to Dash 🚚")
120             shutil.rmtree(dest_path)
121             shutil.copytree(build_directory, dest_path)
122             with open(os.path.join(dest_path, ".gitkeep"), "w"):
123                 pass
124             print(f"🟢 Finished moving build artifacts from {build_directory} to Dash 🟢")
125 
126 
127 def cli():
128     parser = argparse.ArgumentParser(
129         prog="dash-update-components",
130         formatter_class=_CombinedFormatter,
131         description="Update the specified subcomponent libraries within Dash"
132         " by copying over build artifacts, dependencies, and dependency metadata.",
133     )
134     parser.add_argument(
135         "components_source",
136         help="A glob string that matches the Dash component libraries to be updated"
137         " (eg.'dash-table' // 'dash-core-components|dash-html-components' // 'all')."
138         " The default argument is 'all'.",
139         default="all",
140     )
141     parser.add_argument(
142         "--concurrency",
143         type=int,
144         default=3,
145         help="Maximum concurrent steps, up to 3 (ie all components in parallel)",
146     )
147     parser.add_argument(
148         "--ci",
149         help="For clean-install use '--ci True'",
150         default="False",
151     )
152 
153     args = parser.parse_args()
154 
155     bootstrap_components(
156         args.components_source, args.concurrency, "ci" if args.ci == "True" else "i"
157     )
158     build_components(args.components_source, args.concurrency)
159 
160 
161 if __name__ == "__main__":
162     cli()
163
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/dash/development/update_components.py b/dash/development/update_components.py
--- a/dash/development/update_components.py
+++ b/dash/development/update_components.py
@@ -45,7 +45,7 @@
 
     if status or not out:
         print(
-            "🚨 Failed installing npm dependencies for component packages: {source_glob} (status={status}) 🚨",
+            f"🚨 Failed installing npm dependencies for component packages: {source_glob} (status={status}) 🚨",
             file=sys.stderr,
         )
         sys.exit(1)

{"golden_diff": "diff --git a/dash/development/update_components.py b/dash/development/update_components.py\n--- a/dash/development/update_components.py\n+++ b/dash/development/update_components.py\n@@ -45,7 +45,7 @@\n \n     if status or not out:\n         print(\n-            \"\ud83d\udea8 Failed installing npm dependencies for component packages: {source_glob} (status={status}) \ud83d\udea8\",\n+            f\"\ud83d\udea8 Failed installing npm dependencies for component packages: {source_glob} (status={status}) \ud83d\udea8\",\n             file=sys.stderr,\n         )\n         sys.exit(1)\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/plotly/dash/blob/f6b51a841e7deddebfbada374e7de4c297bb2ce8/dash/development/update_components.py#L48\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/plotly/dash)\n", "before_files": [{"content": "import sys\nimport subprocess\nimport shlex\nimport os\nimport argparse\nimport shutil\nimport logging\nimport coloredlogs\n\n\nclass _CombinedFormatter(\n    argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter\n):\n    pass\n\n\nlogger = logging.getLogger(__name__)\ncoloredlogs.install(\n    fmt=\"%(asctime)s,%(msecs)03d %(levelname)s - %(message)s\", datefmt=\"%H:%M:%S\"\n)\n\n\ndef bootstrap_components(components_source, concurrency, install_type):\n\n    is_windows = sys.platform == \"win32\"\n\n    source_glob = (\n        components_source\n        if components_source != \"all\"\n        else \"dash-core-components|dash-html-components|dash-table\"\n    )\n\n    cmdstr = f\"npx lerna exec --concurrency {concurrency} --scope *@({source_glob})* -- npm {install_type}\"\n    cmd = shlex.split(cmdstr, posix=not is_windows)\n    print(cmdstr)\n\n    with subprocess.Popen(\n        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=is_windows\n    ) as proc:\n        out, err = proc.communicate()\n        status = proc.poll()\n\n    if err:\n        print((\"\ud83d\uded1 \" if status else \"\") + err.decode(), file=sys.stderr)\n\n    if status or not out:\n        print(\n            \"\ud83d\udea8 Failed installing npm dependencies for component packages: {source_glob} (status={status}) \ud83d\udea8\",\n            file=sys.stderr,\n        )\n        sys.exit(1)\n    else:\n        print(\n            f\"\ud83d\udfe2 Finished installing npm dependencies for component packages: {source_glob} \ud83d\udfe2\",\n            file=sys.stderr,\n        )\n\n\ndef build_components(components_source, concurrency):\n\n    is_windows = sys.platform == \"win32\"\n\n    source_glob = (\n        components_source\n        if components_source != \"all\"\n        else \"dash-core-components|dash-html-components|dash-table\"\n    )\n\n    cmdstr = f\"npx lerna exec --concurrency {concurrency} --scope *@({source_glob})* -- npm run build\"\n    cmd = shlex.split(cmdstr, posix=not is_windows)\n    print(cmdstr)\n\n    with subprocess.Popen(\n        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=is_windows\n    ) as proc:\n        out, err = proc.communicate()\n        status = proc.poll()\n\n    if err:\n        print((\"\ud83d\uded1 \" if status else \"\") + err.decode(), file=sys.stderr)\n\n    if status or not out:\n        print(\n            f\"\ud83d\udea8 Finished updating component packages: {source_glob} (status={status}) \ud83d\udea8\",\n            file=sys.stderr,\n        )\n        sys.exit(1)\n\n    for package in source_glob.split(\"|\"):\n        build_directory = os.path.join(\n            \"components\", package, package.replace(\"-\", \"_\").rstrip(\"/\\\\\")\n        )\n\n        dest_dir = (\n            \"dcc\"\n            if package == \"dash-core-components\"\n            else \"html\"\n            if package == \"dash-html-components\"\n            else \"dash_table\"\n        )\n\n        dest_path = os.path.join(\"dash\", dest_dir)\n\n        if not os.path.exists(dest_path):\n            try:\n                os.makedirs(dest_path)\n            except OSError:\n                logger.exception(\"\ud83d\udea8 Having issues manipulating %s\", dest_path)\n                sys.exit(1)\n\n        if not os.path.exists(build_directory):\n            print(\n                \"\ud83d\udea8 Could not locate build artifacts.\"\n                + \" Check that the npm build process completed\"\n                + f\" successfully for package: {package} \ud83d\udea8\"\n            )\n            sys.exit(1)\n        else:\n            print(f\"\ud83d\ude9a Moving build artifacts from {build_directory} to Dash \ud83d\ude9a\")\n            shutil.rmtree(dest_path)\n            shutil.copytree(build_directory, dest_path)\n            with open(os.path.join(dest_path, \".gitkeep\"), \"w\"):\n                pass\n            print(f\"\ud83d\udfe2 Finished moving build artifacts from {build_directory} to Dash \ud83d\udfe2\")\n\n\ndef cli():\n    parser = argparse.ArgumentParser(\n        prog=\"dash-update-components\",\n        formatter_class=_CombinedFormatter,\n        description=\"Update the specified subcomponent libraries within Dash\"\n        \" by copying over build artifacts, dependencies, and dependency metadata.\",\n    )\n    parser.add_argument(\n        \"components_source\",\n        help=\"A glob string that matches the Dash component libraries to be updated\"\n        \" (eg.'dash-table' // 'dash-core-components|dash-html-components' // 'all').\"\n        \" The default argument is 'all'.\",\n        default=\"all\",\n    )\n    parser.add_argument(\n        \"--concurrency\",\n        type=int,\n        default=3,\n        help=\"Maximum concurrent steps, up to 3 (ie all components in parallel)\",\n    )\n    parser.add_argument(\n        \"--ci\",\n        help=\"For clean-install use '--ci True'\",\n        default=\"False\",\n    )\n\n    args = parser.parse_args()\n\n    bootstrap_components(\n        args.components_source, args.concurrency, \"ci\" if args.ci == \"True\" else \"i\"\n    )\n    build_components(args.components_source, args.concurrency)\n\n\nif __name__ == \"__main__\":\n    cli()\n", "path": "dash/development/update_components.py"}], "after_files": [{"content": "import sys\nimport subprocess\nimport shlex\nimport os\nimport argparse\nimport shutil\nimport logging\nimport coloredlogs\n\n\nclass _CombinedFormatter(\n    argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter\n):\n    pass\n\n\nlogger = logging.getLogger(__name__)\ncoloredlogs.install(\n    fmt=\"%(asctime)s,%(msecs)03d %(levelname)s - %(message)s\", datefmt=\"%H:%M:%S\"\n)\n\n\ndef bootstrap_components(components_source, concurrency, install_type):\n\n    is_windows = sys.platform == \"win32\"\n\n    source_glob = (\n        components_source\n        if components_source != \"all\"\n        else \"dash-core-components|dash-html-components|dash-table\"\n    )\n\n    cmdstr = f\"npx lerna exec --concurrency {concurrency} --scope *@({source_glob})* -- npm {install_type}\"\n    cmd = shlex.split(cmdstr, posix=not is_windows)\n    print(cmdstr)\n\n    with subprocess.Popen(\n        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=is_windows\n    ) as proc:\n        out, err = proc.communicate()\n        status = proc.poll()\n\n    if err:\n        print((\"\ud83d\uded1 \" if status else \"\") + err.decode(), file=sys.stderr)\n\n    if status or not out:\n        print(\n            f\"\ud83d\udea8 Failed installing npm dependencies for component packages: {source_glob} (status={status}) \ud83d\udea8\",\n            file=sys.stderr,\n        )\n        sys.exit(1)\n    else:\n        print(\n            f\"\ud83d\udfe2 Finished installing npm dependencies for component packages: {source_glob} \ud83d\udfe2\",\n            file=sys.stderr,\n        )\n\n\ndef build_components(components_source, concurrency):\n\n    is_windows = sys.platform == \"win32\"\n\n    source_glob = (\n        components_source\n        if components_source != \"all\"\n        else \"dash-core-components|dash-html-components|dash-table\"\n    )\n\n    cmdstr = f\"npx lerna exec --concurrency {concurrency} --scope *@({source_glob})* -- npm run build\"\n    cmd = shlex.split(cmdstr, posix=not is_windows)\n    print(cmdstr)\n\n    with subprocess.Popen(\n        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=is_windows\n    ) as proc:\n        out, err = proc.communicate()\n        status = proc.poll()\n\n    if err:\n        print((\"\ud83d\uded1 \" if status else \"\") + err.decode(), file=sys.stderr)\n\n    if status or not out:\n        print(\n            f\"\ud83d\udea8 Finished updating component packages: {source_glob} (status={status}) \ud83d\udea8\",\n            file=sys.stderr,\n        )\n        sys.exit(1)\n\n    for package in source_glob.split(\"|\"):\n        build_directory = os.path.join(\n            \"components\", package, package.replace(\"-\", \"_\").rstrip(\"/\\\\\")\n        )\n\n        dest_dir = (\n            \"dcc\"\n            if package == \"dash-core-components\"\n            else \"html\"\n            if package == \"dash-html-components\"\n            else \"dash_table\"\n        )\n\n        dest_path = os.path.join(\"dash\", dest_dir)\n\n        if not os.path.exists(dest_path):\n            try:\n                os.makedirs(dest_path)\n            except OSError:\n                logger.exception(\"\ud83d\udea8 Having issues manipulating %s\", dest_path)\n                sys.exit(1)\n\n        if not os.path.exists(build_directory):\n            print(\n                \"\ud83d\udea8 Could not locate build artifacts.\"\n                + \" Check that the npm build process completed\"\n                + f\" successfully for package: {package} \ud83d\udea8\"\n            )\n            sys.exit(1)\n        else:\n            print(f\"\ud83d\ude9a Moving build artifacts from {build_directory} to Dash \ud83d\ude9a\")\n            shutil.rmtree(dest_path)\n            shutil.copytree(build_directory, dest_path)\n            with open(os.path.join(dest_path, \".gitkeep\"), \"w\"):\n                pass\n            print(f\"\ud83d\udfe2 Finished moving build artifacts from {build_directory} to Dash \ud83d\udfe2\")\n\n\ndef cli():\n    parser = argparse.ArgumentParser(\n        prog=\"dash-update-components\",\n        formatter_class=_CombinedFormatter,\n        description=\"Update the specified subcomponent libraries within Dash\"\n        \" by copying over build artifacts, dependencies, and dependency metadata.\",\n    )\n    parser.add_argument(\n        \"components_source\",\n        help=\"A glob string that matches the Dash component libraries to be updated\"\n        \" (eg.'dash-table' // 'dash-core-components|dash-html-components' // 'all').\"\n        \" The default argument is 'all'.\",\n        default=\"all\",\n    )\n    parser.add_argument(\n        \"--concurrency\",\n        type=int,\n        default=3,\n        help=\"Maximum concurrent steps, up to 3 (ie all components in parallel)\",\n    )\n    parser.add_argument(\n        \"--ci\",\n        help=\"For clean-install use '--ci True'\",\n        default=\"False\",\n    )\n\n    args = parser.parse_args()\n\n    bootstrap_components(\n        args.components_source, args.concurrency, \"ci\" if args.ci == \"True\" else \"i\"\n    )\n    build_components(args.components_source, args.concurrency)\n\n\nif __name__ == \"__main__\":\n    cli()\n", "path": "dash/development/update_components.py"}]}