fix more type issues

libcentric
Jan Petykiewicz 1 year ago
parent 6565b8baa3
commit 8484628f2f

@ -127,7 +127,7 @@ def readfile(
filename: Union[str, pathlib.Path], filename: Union[str, pathlib.Path],
*args, *args,
**kwargs, **kwargs,
) -> Tuple[Pattern, Dict[str, Any]]: ) -> Tuple[Dict[str, Pattern], Dict[str, Any]]:
""" """
Wrapper for `dxf.read()` that takes a filename or path instead of a stream. Wrapper for `dxf.read()` that takes a filename or path instead of a stream.

@ -19,7 +19,7 @@ Notes:
* Creation/modification/access times are set to 1900-01-01 for reproducibility. * Creation/modification/access times are set to 1900-01-01 for reproducibility.
""" """
from typing import List, Any, Dict, Tuple, Callable, Union, Iterable, Optional from typing import List, Any, Dict, Tuple, Callable, Union, Iterable, Optional
from typing import Sequence, BinaryIO, Mapping from typing import Sequence, BinaryIO, Mapping, cast
import re import re
import io import io
import mmap import mmap
@ -298,7 +298,7 @@ def _gref_to_mref(ref: klamath.library.Reference) -> Ref:
repetition = Grid(a_vector=a_vector, b_vector=b_vector, repetition = Grid(a_vector=a_vector, b_vector=b_vector,
a_count=a_count, b_count=b_count) a_count=a_count, b_count=b_count)
ref = Ref( mref = Ref(
target=ref.struct_name.decode('ASCII'), target=ref.struct_name.decode('ASCII'),
offset=offset, offset=offset,
rotation=numpy.deg2rad(ref.angle_deg), rotation=numpy.deg2rad(ref.angle_deg),
@ -307,7 +307,7 @@ def _gref_to_mref(ref: klamath.library.Reference) -> Ref:
annotations=_properties_to_annotations(ref.properties), annotations=_properties_to_annotations(ref.properties),
repetition=repetition, repetition=repetition,
) )
return ref return mref
def _gpath_to_mpath(gpath: klamath.library.Path, raw_mode: bool) -> Path: def _gpath_to_mpath(gpath: klamath.library.Path, raw_mode: bool) -> Path:
@ -341,7 +341,7 @@ def _boundary_to_polygon(boundary: klamath.library.Boundary, raw_mode: bool) ->
def _mrefs_to_grefs(refs: List[Ref]) -> List[klamath.library.Reference]: def _mrefs_to_grefs(refs: List[Ref]) -> List[klamath.library.Reference]:
refs = [] grefs = []
for ref in refs: for ref in refs:
if ref.target is None: if ref.target is None:
continue continue
@ -370,9 +370,9 @@ def _mrefs_to_grefs(refs: List[Ref]) -> List[klamath.library.Reference]:
mag=ref.scale, mag=ref.scale,
properties=properties, properties=properties,
) )
refs.append(aref) grefs.append(aref)
elif rep is None: elif rep is None:
ref = klamath.library.Reference( sref = klamath.library.Reference(
struct_name=encoded_name, struct_name=encoded_name,
xy=rint_cast([ref.offset]), xy=rint_cast([ref.offset]),
colrow=None, colrow=None,
@ -381,7 +381,7 @@ def _mrefs_to_grefs(refs: List[Ref]) -> List[klamath.library.Reference]:
mag=ref.scale, mag=ref.scale,
properties=properties, properties=properties,
) )
refs.append(ref) grefs.append(sref)
else: else:
new_srefs = [ new_srefs = [
klamath.library.Reference( klamath.library.Reference(
@ -394,8 +394,8 @@ def _mrefs_to_grefs(refs: List[Ref]) -> List[klamath.library.Reference]:
properties=properties, properties=properties,
) )
for dd in rep.displacements] for dd in rep.displacements]
refs += new_srefs grefs += new_srefs
return refs return grefs
def _properties_to_annotations(properties: Dict[int, bytes]) -> annotations_t: def _properties_to_annotations(properties: Dict[int, bytes]) -> annotations_t:
@ -635,17 +635,17 @@ def load_libraryfile(
if is_gzipped(path): if is_gzipped(path):
if mmap: if mmap:
logger.info('Asked to mmap a gzipped file, reading into memory instead...') logger.info('Asked to mmap a gzipped file, reading into memory instead...')
base_stream = gzip.open(path, mode='rb') gz_stream = gzip.open(path, mode='rb')
stream = io.BytesIO(base_stream.read()) stream = io.BytesIO(gz_stream.read()) # type: ignore
else: else:
base_stream = gzip.open(path, mode='rb') gz_stream = gzip.open(path, mode='rb')
stream = io.BufferedReader(base_stream) stream = io.BufferedReader(gz_stream) # type: ignore
else: else:
base_stream = open(path, mode='rb')
if mmap: if mmap:
stream = mmap.mmap(base_stream.fileno(), 0, access=mmap.ACCESS_READ) base_stream = open(path, mode='rb', buffering=0)
stream = mmap.mmap(base_stream.fileno(), 0, access=mmap.ACCESS_READ) # type: ignore
else: else:
stream = io.BufferedReader(base_stream) stream = open(path, mode='rb')
return load_library(stream, full_load=full_load) return load_library(stream, full_load=full_load)

@ -481,8 +481,10 @@ def _placement_to_ref(placement: fatrec.Placement, lib: fatamorgana.OasisLayout)
assert(not isinstance(placement.repetition, fatamorgana.ReuseRepetition)) assert(not isinstance(placement.repetition, fatamorgana.ReuseRepetition))
xy = numpy.array((placement.x, placement.y)) xy = numpy.array((placement.x, placement.y))
mag = placement.magnification if placement.magnification is not None else 1 mag = placement.magnification if placement.magnification is not None else 1
pname = placement.get_name() pname = placement.get_name()
name = pname if isinstance(pname, int) else pname.string name: Union[int, str] = pname if isinstance(pname, int) else pname.string # TODO deal with referenced names
annotations = properties_to_annotations(placement.properties, lib.propnames, lib.propstrings) annotations = properties_to_annotations(placement.properties, lib.propnames, lib.propstrings)
if placement.angle is None: if placement.angle is None:
rotation = 0 rotation = 0
@ -503,7 +505,7 @@ def _placement_to_ref(placement: fatrec.Placement, lib: fatamorgana.OasisLayout)
def _refs_to_placements( def _refs_to_placements(
refs: List[Ref], refs: List[Ref],
) -> List[fatrec.Placement]: ) -> List[fatrec.Placement]:
refs = [] placements = []
for ref in refs: for ref in refs:
if ref.target is None: if ref.target is None:
continue continue
@ -514,7 +516,7 @@ def _refs_to_placements(
offset = rint_cast(ref.offset + rep_offset) offset = rint_cast(ref.offset + rep_offset)
angle = numpy.rad2deg(ref.rotation + extra_angle) % 360 angle = numpy.rad2deg(ref.rotation + extra_angle) % 360
ref = fatrec.Placement( placement = fatrec.Placement(
name=ref.target, name=ref.target,
flip=mirror_across_x, flip=mirror_across_x,
angle=angle, angle=angle,
@ -525,8 +527,8 @@ def _refs_to_placements(
repetition=frep, repetition=frep,
) )
refs.append(ref) placements.append(placement)
return refs return placements
def _shapes_to_elements( def _shapes_to_elements(

@ -1,4 +1,4 @@
from typing import List, Tuple, Dict, Optional, Sequence, Any from typing import List, Tuple, Dict, Optional, Sequence, Any, cast
import copy import copy
from enum import Enum from enum import Enum
@ -365,7 +365,7 @@ class Path(Shape, metaclass=AutoSlots):
x_min = rotated_vertices[:, 0].argmin() x_min = rotated_vertices[:, 0].argmin()
if not is_scalar(x_min): if not is_scalar(x_min):
y_min = rotated_vertices[x_min, 1].argmin() y_min = rotated_vertices[x_min, 1].argmin()
x_min = x_min[y_min] x_min = cast(Sequence, x_min)[y_min]
reordered_vertices = numpy.roll(rotated_vertices, -x_min, axis=0) reordered_vertices = numpy.roll(rotated_vertices, -x_min, axis=0)
width0 = self.width / norm_value width0 = self.width / norm_value

@ -1,4 +1,4 @@
from typing import List, Dict, Optional, Sequence, Any from typing import List, Dict, Optional, Sequence, Any, cast
import copy import copy
import numpy import numpy
@ -374,7 +374,7 @@ class Polygon(Shape, metaclass=AutoSlots):
x_min = rotated_vertices[:, 0].argmin() x_min = rotated_vertices[:, 0].argmin()
if not is_scalar(x_min): if not is_scalar(x_min):
y_min = rotated_vertices[x_min, 1].argmin() y_min = rotated_vertices[x_min, 1].argmin()
x_min = x_min[y_min] x_min = cast(Sequence, x_min)[y_min]
reordered_vertices = numpy.roll(rotated_vertices, -x_min, axis=0) reordered_vertices = numpy.roll(rotated_vertices, -x_min, axis=0)
# TODO: normalize mirroring? # TODO: normalize mirroring?

@ -6,6 +6,9 @@ from ..utils import annotations_t
from ..error import MasqueError from ..error import MasqueError
_empty_slots = () # Workaround to get mypy to ignore intentionally empty slots for superclass
T = TypeVar('T', bound='Annotatable') T = TypeVar('T', bound='Annotatable')
I = TypeVar('I', bound='AnnotatableImpl') I = TypeVar('I', bound='AnnotatableImpl')
@ -33,7 +36,7 @@ class AnnotatableImpl(Annotatable, metaclass=ABCMeta):
""" """
Simple implementation of `Annotatable`. Simple implementation of `Annotatable`.
""" """
__slots__ = () __slots__ = _empty_slots
_annotations: annotations_t _annotations: annotations_t
""" Dictionary storing annotation name/value pairs """ """ Dictionary storing annotation name/value pairs """
@ -46,7 +49,7 @@ class AnnotatableImpl(Annotatable, metaclass=ABCMeta):
return self._annotations return self._annotations
@annotations.setter @annotations.setter
def annotations(self, annotations: annotations_t): def annotations(self, annotations: annotations_t) -> None:
if not isinstance(annotations, dict): if not isinstance(annotations, dict):
raise MasqueError(f'annotations expected dict, got {type(annotations)}') raise MasqueError(f'annotations expected dict, got {type(annotations)}')
self._annotations = annotations self._annotations = annotations

@ -4,6 +4,9 @@ from abc import ABCMeta, abstractmethod
from ..utils import layer_t from ..utils import layer_t
_empty_slots = () # Workaround to get mypy to ignore intentionally empty slots for superclass
T = TypeVar('T', bound='Layerable') T = TypeVar('T', bound='Layerable')
I = TypeVar('I', bound='LayerableImpl') I = TypeVar('I', bound='LayerableImpl')
@ -50,7 +53,7 @@ class LayerableImpl(Layerable, metaclass=ABCMeta):
""" """
Simple implementation of Layerable Simple implementation of Layerable
""" """
__slots__ = () __slots__ = _empty_slots
_layer: layer_t _layer: layer_t
""" Layer number, pair, or name """ """ Layer number, pair, or name """

@ -9,6 +9,9 @@ from numpy.typing import NDArray, ArrayLike
from ..error import MasqueError from ..error import MasqueError
_empty_slots = () # Workaround to get mypy to ignore intentionally empty slots for superclass
T = TypeVar('T', bound='Positionable') T = TypeVar('T', bound='Positionable')
I = TypeVar('I', bound='PositionableImpl') I = TypeVar('I', bound='PositionableImpl')
@ -85,7 +88,7 @@ class PositionableImpl(Positionable, metaclass=ABCMeta):
""" """
Simple implementation of Positionable Simple implementation of Positionable
""" """
__slots__ = () __slots__ = _empty_slots
_offset: NDArray[numpy.float64] _offset: NDArray[numpy.float64]
""" `[x_offset, y_offset]` """ """ `[x_offset, y_offset]` """
@ -108,7 +111,7 @@ class PositionableImpl(Positionable, metaclass=ABCMeta):
if val.size != 2: if val.size != 2:
raise MasqueError('Offset must be convertible to size-2 ndarray') raise MasqueError('Offset must be convertible to size-2 ndarray')
self._offset = val.flatten() self._offset = val.flatten() # type: ignore
''' '''
---- Methods ---- Methods

@ -4,6 +4,9 @@ from abc import ABCMeta, abstractmethod
from ..error import MasqueError from ..error import MasqueError
_empty_slots = () # Workaround to get mypy to ignore intentionally empty slots for superclass
if TYPE_CHECKING: if TYPE_CHECKING:
from ..repetition import Repetition from ..repetition import Repetition
@ -55,7 +58,7 @@ class RepeatableImpl(Repeatable, metaclass=ABCMeta):
""" """
Simple implementation of `Repeatable` Simple implementation of `Repeatable`
""" """
__slots__ = () __slots__ = _empty_slots
_repetition: Optional['Repetition'] _repetition: Optional['Repetition']
""" Repetition object, or None (single instance only) """ """ Repetition object, or None (single instance only) """

@ -10,6 +10,9 @@ from ..error import MasqueError
from ..utils import is_scalar, rotation_matrix_2d from ..utils import is_scalar, rotation_matrix_2d
_empty_slots = () # Workaround to get mypy to ignore intentionally empty slots for superclass
T = TypeVar('T', bound='Rotatable') T = TypeVar('T', bound='Rotatable')
I = TypeVar('I', bound='RotatableImpl') I = TypeVar('I', bound='RotatableImpl')
P = TypeVar('P', bound='Pivotable') P = TypeVar('P', bound='Pivotable')
@ -43,7 +46,7 @@ class RotatableImpl(Rotatable, metaclass=ABCMeta):
""" """
Simple implementation of `Rotatable` Simple implementation of `Rotatable`
""" """
__slots__ = () __slots__ = _empty_slots
_rotation: float _rotation: float
""" rotation for the object, radians counterclockwise """ """ rotation for the object, radians counterclockwise """

@ -5,6 +5,9 @@ from ..error import MasqueError
from ..utils import is_scalar from ..utils import is_scalar
_empty_slots = () # Workaround to get mypy to ignore intentionally empty slots for superclass
T = TypeVar('T', bound='Scalable') T = TypeVar('T', bound='Scalable')
I = TypeVar('I', bound='ScalableImpl') I = TypeVar('I', bound='ScalableImpl')
@ -36,7 +39,7 @@ class ScalableImpl(Scalable, metaclass=ABCMeta):
""" """
Simple implementation of Scalable Simple implementation of Scalable
""" """
__slots__ = () __slots__ = _empty_slots
_scale: float _scale: float
""" scale factor for the entity """ """ scale factor for the entity """

Loading…
Cancel
Save