refactor: move inline code strings to top-level constants (#2886)

This moves all the inline triple-quote strings of generated code to be
in top-level constants.

Because they're so large and dedented, they look like regular code. This
makes it
hard to visually parse. These large inline strings of code also confuse
my
editor's syntax highlighting (it does local, partial, parsing to
highlight
tokens, which gets thrown off by the seemingly valid looking code).
diff --git a/python/private/toolchains_repo.bzl b/python/private/toolchains_repo.bzl
index 7557c9f..d00f5ae 100644
--- a/python/private/toolchains_repo.bzl
+++ b/python/private/toolchains_repo.bzl
@@ -43,6 +43,144 @@
 )
 """.lstrip()
 
+_WORKSPACE_TOOLCHAINS_BUILD_TEMPLATE = """
+# Generated by python/private/toolchains_repo.bzl
+#
+# These can be registered in the workspace file or passed to --extra_toolchains
+# flag. By default all these toolchains are registered by the
+# python_register_toolchains macro so you don't normally need to interact with
+# these targets.
+
+load("@@{rules_python}//python/private:py_toolchain_suite.bzl", "py_toolchain_suite")
+
+""".lstrip()
+
+_TOOLCHAIN_ALIASES_BUILD_TEMPLATE = """
+# Generated by python/private/toolchains_repo.bzl
+load("@rules_python//python/private:toolchain_aliases.bzl", "toolchain_aliases")
+
+package(default_visibility = ["//visibility:public"])
+
+exports_files(["defs.bzl"])
+
+PLATFORMS = [
+{loaded_platforms}
+]
+toolchain_aliases(
+    name = "{py_repository}",
+    platforms = PLATFORMS,
+)
+""".lstrip()
+
+_TOOLCHAIN_ALIASES_DEFS_TEMPLATE = """
+# Generated by python/private/toolchains_repo.bzl
+
+load("@@{rules_python}//python:pip.bzl", _compile_pip_requirements = "compile_pip_requirements")
+load("@@{rules_python}//python/private:deprecation.bzl", "with_deprecation")
+load("@@{rules_python}//python/private:text_util.bzl", "render")
+load("@@{rules_python}//python:py_binary.bzl", _py_binary = "py_binary")
+load("@@{rules_python}//python:py_test.bzl", _py_test = "py_test")
+load(
+    "@@{rules_python}//python/entry_points:py_console_script_binary.bzl",
+    _py_console_script_binary = "py_console_script_binary",
+)
+
+def _with_deprecation(kwargs, *, name):
+    kwargs["python_version"] = "{python_version}"
+    return with_deprecation.symbol(
+        kwargs,
+        symbol_name = name,
+        old_load = "@{name}//:defs.bzl",
+        new_load = "@rules_python//python:{{}}.bzl".format(name),
+        snippet = render.call(name, **{{k: repr(v) for k,v in kwargs.items()}})
+    )
+
+def py_binary(**kwargs):
+    return _py_binary(**_with_deprecation(kwargs, name = "py_binary"))
+
+def py_console_script_binary(**kwargs):
+    return _py_console_script_binary(**_with_deprecation(kwargs, name = "py_console_script_binary"))
+
+def py_test(**kwargs):
+    return _py_test(**_with_deprecation(kwargs, name = "py_test"))
+
+def compile_pip_requirements(**kwargs):
+    return _compile_pip_requirements(**_with_deprecation(kwargs, name = "compile_pip_requirements"))
+""".lstrip()
+
+_HOST_TOOLCHAIN_BUILD_CONTENT = """
+# Generated by python/private/toolchains_repo.bzl
+
+exports_files(["python"], visibility = ["//visibility:public"])
+""".lstrip()
+
+_HOST_PYTHON_TESTER_TEMPLATE = """
+from pathlib import Path
+import sys
+
+python = Path(sys.executable)
+want_python = str(Path("{python}").resolve())
+got_python = str(Path(sys.executable).resolve())
+
+assert want_python == got_python, \
+    "Expected to use a different interpreter:\\nwant: '{{}}'\\n got: '{{}}'".format(
+        want_python,
+        got_python,
+    )
+""".lstrip()
+
+_MULTI_TOOLCHAIN_ALIASES_DEFS_TEMPLATE = """
+# Generated by python/private/toolchains_repo.bzl
+
+load("@@{rules_python}//python:pip.bzl", _compile_pip_requirements = "compile_pip_requirements")
+load("@@{rules_python}//python/private:deprecation.bzl", "with_deprecation")
+load("@@{rules_python}//python/private:text_util.bzl", "render")
+load("@@{rules_python}//python:py_binary.bzl", _py_binary = "py_binary")
+load("@@{rules_python}//python:py_test.bzl", _py_test = "py_test")
+load(
+    "@@{rules_python}//python/entry_points:py_console_script_binary.bzl",
+    _py_console_script_binary = "py_console_script_binary",
+)
+
+def _with_deprecation(kwargs, *, name):
+    kwargs["python_version"] = "{python_version}"
+    return with_deprecation.symbol(
+        kwargs,
+        symbol_name = name,
+        old_load = "@{name}//{python_version}:defs.bzl",
+        new_load = "@rules_python//python:{{}}.bzl".format(name),
+        snippet = render.call(name, **{{k: repr(v) for k,v in kwargs.items()}})
+    )
+
+def py_binary(**kwargs):
+    return _py_binary(**_with_deprecation(kwargs, name = "py_binary"))
+
+def py_console_script_binary(**kwargs):
+    return _py_console_script_binary(**_with_deprecation(kwargs, name = "py_console_script_binary"))
+
+def py_test(**kwargs):
+    return _py_test(**_with_deprecation(kwargs, name = "py_test"))
+
+def compile_pip_requirements(**kwargs):
+    return _compile_pip_requirements(**_with_deprecation(kwargs, name = "compile_pip_requirements"))
+""".lstrip()
+
+_MULTI_TOOLCHAIN_ALIASES_PIP_TEMPLATE = """
+# Generated by python/private/toolchains_repo.bzl
+
+load("@@{rules_python}//python:pip.bzl", "pip_parse", _multi_pip_parse = "multi_pip_parse")
+
+def multi_pip_parse(name, requirements_lock, **kwargs):
+    return _multi_pip_parse(
+        name = name,
+        python_versions = {python_versions},
+        requirements_lock = requirements_lock,
+        minor_mapping = {minor_mapping},
+        **kwargs
+    )
+
+""".lstrip()
+
 def python_toolchain_build_file_content(
         prefix,
         python_version,
@@ -101,17 +239,7 @@
     )
 
 def _toolchains_repo_impl(rctx):
-    build_content = """\
-# Generated by python/private/toolchains_repo.bzl
-#
-# These can be registered in the workspace file or passed to --extra_toolchains
-# flag. By default all these toolchains are registered by the
-# python_register_toolchains macro so you don't normally need to interact with
-# these targets.
-
-load("@@{rules_python}//python/private:py_toolchain_suite.bzl", "py_toolchain_suite")
-
-""".format(
+    build_content = _WORKSPACE_TOOLCHAINS_BUILD_TEMPLATE.format(
         rules_python = rctx.attr._rules_python_workspace.repo_name,
     )
 
@@ -144,22 +272,7 @@
 
 def _toolchain_aliases_impl(rctx):
     # Base BUILD file for this repository.
-    build_contents = """\
-# Generated by python/private/toolchains_repo.bzl
-load("@rules_python//python/private:toolchain_aliases.bzl", "toolchain_aliases")
-
-package(default_visibility = ["//visibility:public"])
-
-exports_files(["defs.bzl"])
-
-PLATFORMS = [
-{loaded_platforms}
-]
-toolchain_aliases(
-    name = "{py_repository}",
-    platforms = PLATFORMS,
-)
-""".format(
+    build_contents = _TOOLCHAIN_ALIASES_BUILD_TEMPLATE.format(
         py_repository = rctx.attr.user_repository_name,
         loaded_platforms = "\n".join(["    \"{}\",".format(p) for p in rctx.attr.platforms]),
     )
@@ -167,41 +280,7 @@
 
     # Expose a Starlark file so rules can know what host platform we used and where to find an interpreter
     # when using repository_ctx.path, which doesn't understand aliases.
-    rctx.file("defs.bzl", content = """\
-# Generated by python/private/toolchains_repo.bzl
-
-load("@@{rules_python}//python:pip.bzl", _compile_pip_requirements = "compile_pip_requirements")
-load("@@{rules_python}//python/private:deprecation.bzl", "with_deprecation")
-load("@@{rules_python}//python/private:text_util.bzl", "render")
-load("@@{rules_python}//python:py_binary.bzl", _py_binary = "py_binary")
-load("@@{rules_python}//python:py_test.bzl", _py_test = "py_test")
-load(
-    "@@{rules_python}//python/entry_points:py_console_script_binary.bzl",
-    _py_console_script_binary = "py_console_script_binary",
-)
-
-def _with_deprecation(kwargs, *, name):
-    kwargs["python_version"] = "{python_version}"
-    return with_deprecation.symbol(
-        kwargs,
-        symbol_name = name,
-        old_load = "@{name}//:defs.bzl",
-        new_load = "@rules_python//python:{{}}.bzl".format(name),
-        snippet = render.call(name, **{{k: repr(v) for k,v in kwargs.items()}})
-    )
-
-def py_binary(**kwargs):
-    return _py_binary(**_with_deprecation(kwargs, name = "py_binary"))
-
-def py_console_script_binary(**kwargs):
-    return _py_console_script_binary(**_with_deprecation(kwargs, name = "py_console_script_binary"))
-
-def py_test(**kwargs):
-    return _py_test(**_with_deprecation(kwargs, name = "py_test"))
-
-def compile_pip_requirements(**kwargs):
-    return _compile_pip_requirements(**_with_deprecation(kwargs, name = "compile_pip_requirements"))
-""".format(
+    rctx.file("defs.bzl", content = _TOOLCHAIN_ALIASES_DEFS_TEMPLATE.format(
         name = rctx.attr.name,
         python_version = rctx.attr.python_version,
         rules_python = rctx.attr._rules_python_workspace.repo_name,
@@ -229,11 +308,7 @@
 )
 
 def _host_toolchain_impl(rctx):
-    rctx.file("BUILD.bazel", """\
-# Generated by python/private/toolchains_repo.bzl
-
-exports_files(["python"], visibility = ["//visibility:public"])
-""")
+    rctx.file("BUILD.bazel", _HOST_TOOLCHAIN_BUILD_CONTENT)
 
     os_name = repo_utils.get_platforms_os_name(rctx)
     host_platform = _get_host_platform(
@@ -279,20 +354,10 @@
 
     # Ensure that we can run the interpreter and check that we are not
     # using the host interpreter.
-    python_tester_contents = """\
-from pathlib import Path
-import sys
-
-python = Path(sys.executable)
-want_python = str(Path("{python}").resolve())
-got_python = str(Path(sys.executable).resolve())
-
-assert want_python == got_python, \
-    "Expected to use a different interpreter:\\nwant: '{{}}'\\n got: '{{}}'".format(
-        want_python,
-        got_python,
+    python_tester_contents = _HOST_PYTHON_TESTER_TEMPLATE.format(
+        repo = repo.strip("@"),
+        python = python_binary,
     )
-""".format(repo = repo.strip("@"), python = python_binary)
     python_tester = rctx.path("python_tester.py")
     rctx.file(python_tester, python_tester_contents)
     repo_utils.execute_checked(
@@ -331,41 +396,7 @@
 
     for python_version, repository_name in rctx.attr.python_versions.items():
         file = "{}/defs.bzl".format(python_version)
-        rctx.file(file, content = """\
-# Generated by python/private/toolchains_repo.bzl
-
-load("@@{rules_python}//python:pip.bzl", _compile_pip_requirements = "compile_pip_requirements")
-load("@@{rules_python}//python/private:deprecation.bzl", "with_deprecation")
-load("@@{rules_python}//python/private:text_util.bzl", "render")
-load("@@{rules_python}//python:py_binary.bzl", _py_binary = "py_binary")
-load("@@{rules_python}//python:py_test.bzl", _py_test = "py_test")
-load(
-    "@@{rules_python}//python/entry_points:py_console_script_binary.bzl",
-    _py_console_script_binary = "py_console_script_binary",
-)
-
-def _with_deprecation(kwargs, *, name):
-    kwargs["python_version"] = "{python_version}"
-    return with_deprecation.symbol(
-        kwargs,
-        symbol_name = name,
-        old_load = "@{name}//{python_version}:defs.bzl",
-        new_load = "@rules_python//python:{{}}.bzl".format(name),
-        snippet = render.call(name, **{{k: repr(v) for k,v in kwargs.items()}})
-    )
-
-def py_binary(**kwargs):
-    return _py_binary(**_with_deprecation(kwargs, name = "py_binary"))
-
-def py_console_script_binary(**kwargs):
-    return _py_console_script_binary(**_with_deprecation(kwargs, name = "py_console_script_binary"))
-
-def py_test(**kwargs):
-    return _py_test(**_with_deprecation(kwargs, name = "py_test"))
-
-def compile_pip_requirements(**kwargs):
-    return _compile_pip_requirements(**_with_deprecation(kwargs, name = "compile_pip_requirements"))
-""".format(
+        rctx.file(file, content = _MULTI_TOOLCHAIN_ALIASES_DEFS_TEMPLATE.format(
             repository_name = repository_name,
             name = rctx.attr.name,
             python_version = python_version,
@@ -373,21 +404,7 @@
         ))
         rctx.file("{}/BUILD.bazel".format(python_version), "")
 
-    pip_bzl = """\
-# Generated by python/private/toolchains_repo.bzl
-
-load("@@{rules_python}//python:pip.bzl", "pip_parse", _multi_pip_parse = "multi_pip_parse")
-
-def multi_pip_parse(name, requirements_lock, **kwargs):
-    return _multi_pip_parse(
-        name = name,
-        python_versions = {python_versions},
-        requirements_lock = requirements_lock,
-        minor_mapping = {minor_mapping},
-        **kwargs
-    )
-
-""".format(
+    pip_bzl = _MULTI_TOOLCHAIN_ALIASES_PIP_TEMPLATE.format(
         python_versions = rctx.attr.python_versions.keys(),
         minor_mapping = render.indent(render.dict(rctx.attr.minor_mapping), indent = " " * 8).lstrip(),
         rules_python = rules_python,