Markata plugin to create a pyinstrument profile if pyinstrument is installed.

The profile will be saved to <output_dir>/_profile/index.html

ProfilerConfig class

ProfilerConfig source


        class ProfilerConfig(pydantic.BaseModel):
            output_dir: pydantic.DirectoryPath = Path("markout")
            should_profile: bool = SHOULD_PROFILE
            profiler: Optional[Any] = (
                None  # No valicator for type pyinstrument.profiler.Profiler
            )
            output_file: Optional[Path] = None

            @pydantic.validator("output_file", pre=True, always=True)
            def validate_output_file(cls, v, *, values):
                if v is None:
                    output_file = values["output_dir"] / "_profile" / "index.html"
                    output_file.parent.mkdir(parents=True, exist_ok=True)
                    return output_file
                return v

Config class

Config source


        class Config(pydantic.BaseModel):
            should_profile: bool = SHOULD_PROFILE
            profiler: ProfilerConfig = ProfilerConfig()

config_model function

config_model source


        def config_model(markata: "Markata") -> None:
            markata.config_models.append(Config)

configure function

configure source


        def configure(markata: "Markata") -> None:
            # profiler must exist in the same thread and cannot be configured through pydantic validation
            if (
                markata.config.profiler.should_profile
                and markata.config.profiler.profiler is None
            ):
                markata.config.profiler.profiler = Profiler()
                markata.config.profiler.profiler.start()

save function

stop the profiler and save as late as possible

save source


        def save(markata: Markata) -> None:
            "stop the profiler and save as late as possible"
            if markata.config.profiler.should_profile:
                if markata.config.profiler.profiler is not None:
                    if markata.config.profiler.profiler.is_running:
                        try:
                            markata.config.profiler.profiler.stop()
                            html = markata.config.profiler.profiler.output_html()
                            markata.config.profiler.output_file.write_text(html)
                            markata.console.print(
                                markata.config.profiler.profiler.output_text()
                            )

                        except AttributeError:
                            markata.console.log(
                                "profiler not available, skipping save pyinstrument save",
                            )
                            markata.console.log(
                                "[red]to enable profiler [wheat1][itallic]pip install 'markata\[pyinstrument]'",
                            )

teardown function

stop the profiler on exit

teardown source


        def teardown(markata: Markata) -> None:
            "stop the profiler on exit"
            # import logging

            # logger = logging.getLogger()
            # logger.handlers.clear()
            if markata.config.profiler.should_profile:
                if markata.config.profiler.profiler is not None:
                    if markata.config.profiler.profiler.is_running:
                        markata.config.profiler.profiler.stop()

validate_output_file method

validate_output_file source


        def validate_output_file(cls, v, *, values):
                if v is None:
                    output_file = values["output_dir"] / "_profile" / "index.html"
                    output_file.parent.mkdir(parents=True, exist_ok=True)
                    return output_file
                return v