# Buggy code
def _render_validation_header(cls, validation_results):
    success = validation_results.success
    expectation_suite_name = validation_results.meta["expectation_suite_name"]
    expectation_suite_path_components = (
        [".." for _ in range(len(expectation_suite_name.split(".")) + 3)]
        + ["expectations"]
        + expectation_suite_name.split(".")
    )
    expectation_suite_path = os.path.join(*expectation_suite_path_components) + ".html"
    if success:
        success = "Succeeded"
        html_success_icon = (
            '<i class="fas fa-check-circle text-success" aria-hidden="true"></i>'
        )
    else:
        success = "Failed"
        html_success_icon = (
            '<i class="fas fa-times text-danger" aria-hidden="true"></i>'
        )
    return RenderedHeaderContent(
        **{
            "content_block_type": "header",
            "header": RenderedStringTemplateContent(
                **{
                    "content_block_type": "string_template",
                    "string_template": {
                        "template": "Overview",
                        "tag": "h5",
                        "styling": {"classes": ["m-0"]},
                    },
                }
            ),
            "subheader": RenderedStringTemplateContent(
                **{
                    "content_block_type": "string_template",
                    "string_template": {
                        "template": "${suite_title} ${expectation_suite_name}\n${status_title} ${html_success_icon} ${success}",
                        "params": {
                            "suite_title": "Expectation Suite:",
                            "status_title": "Status:",
                            "expectation_suite_name": expectation_suite_name,
                            "success": success,
                            "html_success_icon": html_success_icon,
                        },
                        "styling": {
                            "params": {
                                "suite_title": {"classes": ["h6"]},
                                "status_title": {"classes": ["h6"]},
                                "expectation_suite_name": {
                                    "tag": "a",
                                    "attributes": {"href": expectation_suite_path},
                                },
                            },
                            "classes": ["mb-0", "mt-1"],
                        },
                    },
                }
            ),
            "styling": {
                "classes": ["col-12", "p-0"],
                "header": {"classes": ["alert", "alert-secondary"]},
            },
        }
    )


# Traceback (TypeError)
❯ great_expectations docs build

The following Data Docs sites will be built:

- local_site: file:///Users/taylor/repos/sdap/ge/great_expectations/uncommitted/data_docs/local_site/index.html

Would you like to proceed? [Y/n]:

Building Data Docs...

--- Logging error ---
Traceback (most recent call last):
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/render/renderer/site_builder.py", line 443, in build
rendered_content = self.renderer_class.render(resource)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/render/renderer/page_renderer.py", line 210, in render
page_title += " / " + data_asset_name
TypeError: can only concatenate str (not "int") to str

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/logging/__init__.py", line 1081, in emit
msg = self.format(record)
File "/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/logging/__init__.py", line 925, in format
return fmt.format(record)
File "/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/logging/__init__.py", line 664, in format
record.message = record.getMessage()
File "/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/logging/__init__.py", line 369, in getMessage
msg = msg % self.args
TypeError: not all arguments converted during string formatting
Call stack:
File "/Users/taylor/repos/sdap/.venv/bin/great_expectations", line 8, in <module>
sys.exit(main())
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/cli/cli.py", line 73, in main
cli()
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/cli/docs.py", line 45, in docs_build
build_docs(context, site_name=site_name, view=view, assume_yes=assume_yes)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/cli/docs.py", line 146, in build_docs
index_page_locator_infos = context.build_data_docs(site_names=site_names)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/core/usage_statistics/usage_statistics.py", line 257, in usage_statistics_wrapped_method
result = func(*args, **kwargs)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/data_context/data_context.py", line 1572, in build_data_docs
index_page_resource_identifier_tuple = site_builder.build(
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/render/renderer/site_builder.py", line 290, in build
site_section_builder.build(resource_identifiers=resource_identifiers)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/render/renderer/site_builder.py", line 460, in build
logger.error(exception_message, e, exc_info=True)
Message: 'An unexpected Exception occurred during data docs rendering.  Because of this error, certain parts of data docs will not be rendered properly and/or may not appear altogether.  Please use the trace, included in this message, to diagnose and repair the underlying issue.  Detailed information follows:\n                TypeError: "can only concatenate str (not "int") to str".  Traceback: "Traceback (most recent call last):\n  File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/render/renderer/site_builder.py", line 443, in build\n    rendered_content = self.renderer_class.render(resource)\n  File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/render/renderer/page_renderer.py", line 210, in render\n    page_title += " / " + data_asset_name\nTypeError: can only concatenate str (not "int") to str\n".'
Arguments: (TypeError('can only concatenate str (not "int") to str'),)
Traceback (most recent call last):
File "/Users/taylor/repos/sdap/.venv/bin/great_expectations", line 8, in <module>
sys.exit(main())
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/cli/cli.py", line 73, in main
cli()
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/cli/docs.py", line 45, in docs_build
build_docs(context, site_name=site_name, view=view, assume_yes=assume_yes)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/cli/docs.py", line 146, in build_docs
index_page_locator_infos = context.build_data_docs(site_names=site_names)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/core/usage_statistics/usage_statistics.py", line 257, in usage_statistics_wrapped_method
result = func(*args, **kwargs)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/data_context/data_context.py", line 1572, in build_data_docs
index_page_resource_identifier_tuple = site_builder.build(
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/render/renderer/site_builder.py", line 290, in build
site_section_builder.build(resource_identifiers=resource_identifiers)
File "/Users/taylor/repos/sdap/.venv/lib/python3.8/site-packages/great_expectations/render/renderer/site_builder.py", line 466, in build
viewable_content,
UnboundLocalError: local variable 'viewable_content' referenced before assignment

# Fixed code
def _render_validation_header(cls, validation_results):
    success = validation_results.success
    expectation_suite_name = validation_results.meta["expectation_suite_name"]
    expectation_suite_path_components = (
        [".." for _ in range(len(expectation_suite_name.split(".")) + 3)]
        + ["expectations"]
        + str(expectation_suite_name).split(".")
    )
    expectation_suite_path = os.path.join(*expectation_suite_path_components) + ".html"
    if success:
        success = "Succeeded"
        html_success_icon = (
            '<i class="fas fa-check-circle text-success" aria-hidden="true"></i>'
        )
    else:
        success = "Failed"
        html_success_icon = (
            '<i class="fas fa-times text-danger" aria-hidden="true"></i>'
        )
    return RenderedHeaderContent(
        **{
            "content_block_type": "header",
            "header": RenderedStringTemplateContent(
                **{
                    "content_block_type": "string_template",
                    "string_template": {
                        "template": "Overview",
                        "tag": "h5",
                        "styling": {"classes": ["m-0"]},
                    },
                }
            ),
            "subheader": RenderedStringTemplateContent(
                **{
                    "content_block_type": "string_template",
                    "string_template": {
                        "template": "${suite_title} ${expectation_suite_name}\n${status_title} ${html_success_icon} ${success}",
                        "params": {
                            "suite_title": "Expectation Suite:",
                            "status_title": "Status:",
                            "expectation_suite_name": expectation_suite_name,
                            "success": success,
                            "html_success_icon": html_success_icon,
                        },
                        "styling": {
                            "params": {
                                "suite_title": {"classes": ["h6"]},
                                "status_title": {"classes": ["h6"]},
                                "expectation_suite_name": {
                                    "tag": "a",
                                    "attributes": {"href": expectation_suite_path},
                                },
                            },
                            "classes": ["mb-0", "mt-1"],
                        },
                    },
                }
            ),
            "styling": {
                "classes": ["col-12", "p-0"],
                "header": {"classes": ["alert", "alert-secondary"]},
            },
        }
    )