Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add mypy to CI pipeline and begin typing modules #435

Merged
8 changes: 7 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,13 @@ repos:
- [email protected]
- [email protected]
args: ["--fix"]

- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.13.0
hooks:
- id: mypy
files: ^(src/pytest_html|testing)
additional_dependencies:
- types-setuptools
- repo: local
hooks:
- id: rst
Expand Down
17 changes: 17 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,20 @@ version-file = "src/pytest_html/__version.py"

[tool.hatch.build.hooks.custom]
path = "scripts/npm.py"

[tool.mypy]
check_untyped_defs = false # TODO
disallow_any_generics = true
disallow_incomplete_defs = true
disallow_untyped_calls = true
disallow_untyped_decorators = true
disallow_untyped_defs = false # TODO
ignore_missing_imports = true
no_implicit_optional = true
no_implicit_reexport = true
show_error_codes = true
strict_equality = true
warn_redundant_casts = true
warn_return_any = true
warn_unreachable = true
warn_unused_configs = true
2 changes: 1 addition & 1 deletion src/pytest_html/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
try:
from . import __version
from . import __version # type: ignore

__version__ = __version.version
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since __version is an optioanl import at the time typecheckers run,
i usggest to typehint __version__ ala

     __version__: str = __version.version 

this makes type checkers aware that __version__ is supposed to be a sting and warn/fail if it is not

except ImportError:
Expand Down
40 changes: 29 additions & 11 deletions src/pytest_html/extras.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from typing import Dict
from typing import Optional

FORMAT_HTML = "html"
FORMAT_IMAGE = "image"
Expand All @@ -10,7 +12,13 @@
FORMAT_VIDEO = "video"


def extra(content, format_type, name=None, mime_type=None, extension=None):
def extra(
content: str,
format_type: str,
name: Optional[str] = None,
mime_type: Optional[str] = None,
extension: Optional[str] = None,
) -> Dict[str, Optional[str]]:
return {
"name": name,
"format_type": format_type,
Expand All @@ -20,41 +28,51 @@ def extra(content, format_type, name=None, mime_type=None, extension=None):
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

html(), image() etc are facades to extra().

to make this more clear, i suggest to define a variable with the return type of extra() as _ExtraResult = Dict[str, Optional[str]]
and use this _ExtraResult where needed for extra(), html() and so on


def html(content):
def html(content: str) -> Dict[str, Optional[str]]:
return extra(content, FORMAT_HTML)


def image(content, name="Image", mime_type="image/png", extension="png"):
def image(
content: str,
name: str = "Image",
mime_type: str = "image/png",
extension: str = "png",
) -> Dict[str, Optional[str]]:
return extra(content, FORMAT_IMAGE, name, mime_type, extension)


def png(content, name="Image"):
def png(content: str, name: str = "Image") -> Dict[str, Optional[str]]:
return image(content, name, mime_type="image/png", extension="png")


def jpg(content, name="Image"):
def jpg(content: str, name: str = "Image") -> Dict[str, Optional[str]]:
return image(content, name, mime_type="image/jpeg", extension="jpg")


def svg(content, name="Image"):
def svg(content: str, name: str = "Image") -> Dict[str, Optional[str]]:
return image(content, name, mime_type="image/svg+xml", extension="svg")


def json(content, name="JSON"):
def json(content: str, name: str = "JSON") -> Dict[str, Optional[str]]:
return extra(content, FORMAT_JSON, name, "application/json", "json")


def text(content, name="Text"):
def text(content: str, name: str = "Text") -> Dict[str, Optional[str]]:
return extra(content, FORMAT_TEXT, name, "text/plain", "txt")


def url(content, name="URL"):
def url(content: str, name: str = "URL") -> Dict[str, Optional[str]]:
return extra(content, FORMAT_URL, name)


def video(content, name="Video", mime_type="video/mp4", extension="mp4"):
def video(
content: str,
name: str = "Video",
mime_type: str = "video/mp4",
extension: str = "mp4",
) -> Dict[str, Optional[str]]:
return extra(content, FORMAT_VIDEO, name, mime_type, extension)


def mp4(content, name="Video"):
def mp4(content: str, name: str = "Video") -> Dict[str, Optional[str]]:
return video(content, name)
1 change: 1 addition & 0 deletions testing/legacy_test_pytest_html.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# type: ignore
import json
import os
import random
Expand Down
Loading