more mypy coverage

This commit is contained in:
Manuel Barkhau 2019-01-07 18:47:04 +01:00
parent e32448ea8c
commit b7f2eeb091
2 changed files with 133 additions and 8 deletions

View file

@ -147,7 +147,7 @@ OptionVal = typ.Union[str, bool, None]
BOOL_OPTIONS: typ.Mapping[str, OptionVal] = {'commit': False, 'tag': None, 'push': None} BOOL_OPTIONS: typ.Mapping[str, OptionVal] = {'commit': False, 'tag': None, 'push': None}
def _parse_cfg(cfg_buffer: typ.TextIO) -> RawConfig: def _parse_cfg(cfg_buffer: typ.IO[str]) -> RawConfig:
cfg_parser = _ConfigParser() cfg_parser = _ConfigParser()
if hasattr(cfg_parser, 'read_file'): if hasattr(cfg_parser, 'read_file'):
@ -171,7 +171,7 @@ def _parse_cfg(cfg_buffer: typ.TextIO) -> RawConfig:
return raw_cfg return raw_cfg
def _parse_toml(cfg_buffer: typ.TextIO) -> RawConfig: def _parse_toml(cfg_buffer: typ.IO[str]) -> RawConfig:
raw_full_cfg = toml.load(cfg_buffer) raw_full_cfg = toml.load(cfg_buffer)
raw_cfg = raw_full_cfg.get('pycalver', {}) raw_cfg = raw_full_cfg.get('pycalver', {})
@ -182,10 +182,11 @@ def _parse_toml(cfg_buffer: typ.TextIO) -> RawConfig:
def _normalize_file_patterns(raw_cfg: RawConfig) -> FilePatterns: def _normalize_file_patterns(raw_cfg: RawConfig) -> FilePatterns:
version_str = raw_cfg['current_version'] version_str : str = raw_cfg['current_version']
version_pattern = raw_cfg['version_pattern'] version_pattern: str = raw_cfg['version_pattern']
pep440_version = version.to_pep440(version_str) pep440_version : str = version.to_pep440(version_str)
file_patterns = raw_cfg['file_patterns']
file_patterns: FilePatterns = raw_cfg['file_patterns']
for filepath, patterns in list(file_patterns.items()): for filepath, patterns in list(file_patterns.items()):
if not os.path.exists(filepath): if not os.path.exists(filepath):
@ -216,10 +217,10 @@ def _parse_config(raw_cfg: RawConfig) -> Config:
if 'current_version' not in raw_cfg: if 'current_version' not in raw_cfg:
raise ValueError("Missing 'pycalver.current_version'") raise ValueError("Missing 'pycalver.current_version'")
version_str = raw_cfg['current_version'] version_str: str = raw_cfg['current_version']
version_str = raw_cfg['current_version'] = version_str.strip("'\" ") version_str = raw_cfg['current_version'] = version_str.strip("'\" ")
version_pattern = raw_cfg.get('version_pattern', "{pycalver}") version_pattern: str = raw_cfg.get('version_pattern', "{pycalver}")
version_pattern = raw_cfg['version_pattern'] = version_pattern.strip("'\" ") version_pattern = raw_cfg['version_pattern'] = version_pattern.strip("'\" ")
# NOTE (mb 2019-01-05): Provoke ValueError if version_pattern # NOTE (mb 2019-01-05): Provoke ValueError if version_pattern
@ -264,6 +265,8 @@ def parse(ctx: ProjectContext) -> MaybeConfig:
log.warning(f"File not found: {ctx.config_filepath}") log.warning(f"File not found: {ctx.config_filepath}")
return None return None
fh : typ.IO[str]
try: try:
with ctx.config_filepath.open(mode="rt", encoding="utf-8") as fh: with ctx.config_filepath.open(mode="rt", encoding="utf-8") as fh:
if ctx.config_format == 'toml': if ctx.config_format == 'toml':
@ -428,6 +431,8 @@ def write_content(ctx: ProjectContext) -> None:
# config_format : str # config_format : str
# vcs_type : typ.Optional[str] # vcs_type : typ.Optional[str]
fh: typ.IO[str]
cfg_content = default_config(ctx) cfg_content = default_config(ctx)
if os.path.exists("pyproject.toml"): if os.path.exists("pyproject.toml"):
with io.open("pyproject.toml", mode="at", encoding="utf-8") as fh: with io.open("pyproject.toml", mode="at", encoding="utf-8") as fh:

120
stubs/pathlib2.pyi Normal file
View file

@ -0,0 +1,120 @@
# Stubs for pathlib2 (adapted for Python 2 from Python 3.4 typeshed)
from typing import Any, Generator, IO, Optional, Sequence, Tuple, Type, TypeVar, Union, List
import os
import sys
_P = TypeVar('_P', bound='PurePath')
if sys.version_info >= (3, 6):
_PurePathBase = os.PathLike[str]
else:
_PurePathBase = object
class PurePath(_PurePathBase):
parts = ... # type: Tuple[str, ...]
drive = ... # type: str
root = ... # type: str
anchor = ... # type: str
name = ... # type: str
suffix = ... # type: str
suffixes = ... # type: List[str]
stem = ... # type: str
if sys.version_info < (3, 5):
def __init__(self, *pathsegments: str) -> None: ...
elif sys.version_info < (3, 6):
def __new__(cls: Type[_P], *args: Union[str, PurePath]) -> _P: ...
else:
def __new__(cls: Type[_P], *args: Union[str, os.PathLike[str]]) -> _P: ...
def __hash__(self) -> int: ...
def __lt__(self, other: PurePath) -> bool: ...
def __le__(self, other: PurePath) -> bool: ...
def __gt__(self, other: PurePath) -> bool: ...
def __div__(self: _P, key: Union[str, PurePath]) -> _P: ...
def __rdiv__(self: _P, key: Union[str, PurePath]) -> _P: ...
def __truediv__(self: _P, key: Union[str, PurePath]) -> _P: ...
def __rtruediv__(self: _P, key: Union[str, PurePath]) -> _P: ...
def __ge__(self, other: PurePath) -> bool: ...
def __bytes__(self) -> bytes: ...
def as_posix(self) -> str: ...
def as_uri(self) -> str: ...
def is_absolute(self) -> bool: ...
def is_reserved(self) -> bool: ...
def match(self, path_pattern: str) -> bool: ...
def relative_to(self: _P, *other: Union[str, PurePath]) -> _P: ...
def with_name(self: _P, name: str) -> _P: ...
def with_suffix(self: _P, suffix: str) -> _P: ...
def joinpath(self: _P, *other: Union[str, PurePath]) -> _P: ...
@property
def parents(self: _P) -> Sequence[_P]: ...
@property
def parent(self: _P) -> _P: ...
class PurePosixPath(PurePath): ...
class PureWindowsPath(PurePath): ...
class Path(PurePath):
@classmethod
def cwd(cls: Type[_P]) -> _P: ...
def stat(self) -> os.stat_result: ...
def chmod(self, mode: int) -> None: ...
def exists(self) -> bool: ...
def glob(self, pattern: str) -> Generator[Path, None, None]: ...
def group(self) -> str: ...
def is_dir(self) -> bool: ...
def is_file(self) -> bool: ...
def is_symlink(self) -> bool: ...
def is_socket(self) -> bool: ...
def is_fifo(self) -> bool: ...
def is_block_device(self) -> bool: ...
def is_char_device(self) -> bool: ...
def iterdir(self) -> Generator[Path, None, None]: ...
def lchmod(self, mode: int) -> None: ...
def lstat(self) -> os.stat_result: ...
if sys.version_info < (3, 5):
def mkdir(self, mode: int = ...,
parents: bool = ...) -> None: ...
else:
def mkdir(self, mode: int = ..., parents: bool = ...,
exist_ok: bool = ...) -> None: ...
def open(self, mode: str = ..., buffering: int = ...,
encoding: Optional[str] = ..., errors: Optional[str] = ...,
newline: Optional[str] = ...) -> IO[Any]: ...
def owner(self) -> str: ...
def rename(self, target: Union[str, PurePath]) -> None: ...
def replace(self, target: Union[str, PurePath]) -> None: ...
if sys.version_info < (3, 6):
def resolve(self: _P) -> _P: ...
else:
def resolve(self: _P, strict: bool = ...) -> _P: ...
def rglob(self, pattern: str) -> Generator[Path, None, None]: ...
def rmdir(self) -> None: ...
def symlink_to(self, target: Union[str, Path],
target_is_directory: bool = ...) -> None: ...
def touch(self, mode: int = ..., exist_ok: bool = ...) -> None: ...
def unlink(self) -> None: ...
if sys.version_info >= (3, 5):
@classmethod
def home(cls: Type[_P]) -> _P: ...
if sys.version_info < (3, 6):
def __new__(cls: Type[_P], *args: Union[str, PurePath],
**kwargs: Any) -> _P: ...
else:
def __new__(cls: Type[_P], *args: Union[str, os.PathLike[str]],
**kwargs: Any) -> _P: ...
def absolute(self: _P) -> _P: ...
def expanduser(self: _P) -> _P: ...
def read_bytes(self) -> bytes: ...
def read_text(self, encoding: Optional[str] = ...,
errors: Optional[str] = ...) -> str: ...
def samefile(self, other_path: Union[str, bytes, int, Path]) -> bool: ...
def write_bytes(self, data: bytes) -> int: ...
def write_text(self, data: str, encoding: Optional[str] = ...,
errors: Optional[str] = ...) -> int: ...
class PosixPath(Path, PurePosixPath): ...
class WindowsPath(Path, PureWindowsPath): ...