Compare commits

..

10 Commits

8 changed files with 28 additions and 30 deletions

View File

@ -597,19 +597,19 @@ def load_libraryfile(
path = pathlib.Path(filename)
stream: IO[bytes]
if is_gzipped(path):
if mmap:
if use_mmap:
logger.info('Asked to mmap a gzipped file, reading into memory instead...')
gz_stream = gzip.open(path, mode='rb')
gz_stream = gzip.open(path, mode='rb') # noqa: SIM115
stream = io.BytesIO(gz_stream.read()) # type: ignore
else:
gz_stream = gzip.open(path, mode='rb')
gz_stream = gzip.open(path, mode='rb') # noqa: SIM115
stream = io.BufferedReader(gz_stream) # type: ignore
else: # noqa: PLR5501
if mmap:
base_stream = open(path, mode='rb', buffering=0)
if use_mmap:
base_stream = path.open(mode='rb', buffering=0) # noqa: SIM115
stream = mmap.mmap(base_stream.fileno(), 0, access=mmap.ACCESS_READ) # type: ignore
else:
stream = open(path, mode='rb')
stream = path.open(mode='rb') # noqa: SIM115
return load_library(stream, full_load=full_load, postprocess=postprocess)

View File

@ -129,7 +129,7 @@ def clean_pattern_vertices(pat: Pattern) -> Pattern:
def is_gzipped(path: pathlib.Path) -> bool:
with open(path, 'rb') as stream:
with path.open('rb') as stream:
magic_bytes = stream.read(2)
return magic_bytes == b'\x1f\x8b'

View File

@ -296,7 +296,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
if not annotations_eq(self.annotations, other.annotations):
return False
if not ports_eq(self.ports, other.ports):
if not ports_eq(self.ports, other.ports): # noqa: SIM103
return False
return True
@ -595,7 +595,6 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
if (cbounds[1] < cbounds[0]).any():
return None
else:
return cbounds
def get_bounds_nonempty(
@ -617,7 +616,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
Returns:
`[[x_min, y_min], [x_max, y_max]]`
"""
bounds = self.get_bounds(library)
bounds = self.get_bounds(library, recurse=recurse)
assert bounds is not None
return bounds
@ -954,7 +953,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
Returns:
self
"""
flattened: dict[str | None, 'Pattern | None'] = {}
flattened: dict[str | None, Pattern | None] = {}
def flatten_single(name: str | None) -> None:
if name is None:

View File

@ -289,7 +289,7 @@ class Grid(Repetition):
return True
if self.b_vector is None or other.b_vector is None:
return False
if any(self.b_vector[ii] != other.b_vector[ii] for ii in range(2)):
if any(self.b_vector[ii] != other.b_vector[ii] for ii in range(2)): # noqa: SIM103
return False
return True

View File

@ -286,7 +286,7 @@ class Arc(Shape):
return thetas
wh = self.width / 2.0
if wh == r0 or wh == r1:
if wh in (r0, r1):
thetas_inner = numpy.zeros(1) # Don't generate multiple vertices if we're at the origin
else:
thetas_inner = get_thetas(inner=True)
@ -308,7 +308,7 @@ class Arc(Shape):
return [poly]
def get_bounds_single(self) -> NDArray[numpy.float64]:
'''
"""
Equation for rotated ellipse is
`x = x0 + a * cos(t) * cos(rot) - b * sin(t) * sin(phi)`
`y = y0 + a * cos(t) * sin(rot) + b * sin(t) * cos(rot)`
@ -319,7 +319,7 @@ class Arc(Shape):
where -+ is for x, y cases, so that's where the extrema are.
If the extrema are innaccessible due to arc constraints, check the arc endpoints instead.
'''
"""
a_ranges = self._angles_to_parameters()
mins = []
@ -424,13 +424,13 @@ class Arc(Shape):
))
def get_cap_edges(self) -> NDArray[numpy.float64]:
'''
"""
Returns:
```
[[[x0, y0], [x1, y1]], array of 4 points, specifying the two cuts which
[[x2, y2], [x3, y3]]], would create this arc from its corresponding ellipse.
```
'''
"""
a_ranges = self._angles_to_parameters()
mins = []
@ -454,11 +454,11 @@ class Arc(Shape):
return numpy.array([mins, maxs]) + self.offset
def _angles_to_parameters(self) -> NDArray[numpy.float64]:
'''
"""
Returns:
"Eccentric anomaly" parameter ranges for the inner and outer edges, in the form
`[[a_min_inner, a_max_inner], [a_min_outer, a_max_outer]]`
'''
"""
a = []
for sgn in (-1, +1):
wh = sgn * self.width / 2

View File

@ -431,22 +431,22 @@ class Path(Shape):
return self
def remove_duplicate_vertices(self) -> 'Path':
'''
"""
Removes all consecutive duplicate (repeated) vertices.
Returns:
self
'''
"""
self.vertices = remove_duplicate_vertices(self.vertices, closed_path=False)
return self
def remove_colinear_vertices(self) -> 'Path':
'''
"""
Removes consecutive co-linear vertices.
Returns:
self
'''
"""
self.vertices = remove_colinear_vertices(self.vertices, closed_path=False)
return self

View File

@ -415,22 +415,22 @@ class Polygon(Shape):
return self
def remove_duplicate_vertices(self) -> 'Polygon':
'''
"""
Removes all consecutive duplicate (repeated) vertices.
Returns:
self
'''
"""
self.vertices = remove_duplicate_vertices(self.vertices, closed_path=True)
return self
def remove_colinear_vertices(self) -> 'Polygon':
'''
"""
Removes consecutive co-linear vertices.
Returns:
self
'''
"""
self.vertices = remove_colinear_vertices(self.vertices, closed_path=True)
return self

View File

@ -1,9 +1,8 @@
from typing import Self
from abc import ABCMeta
import copy
class Copyable(metaclass=ABCMeta):
class Copyable:
"""
Trait class which adds .copy() and .deepcopy()
"""