allow annotations to be None
breaking change, but properties are seldom used by anyone afaik
This commit is contained in:
parent
4817ea1f4e
commit
b44486bd2a
@ -21,6 +21,7 @@ Notes:
|
|||||||
"""
|
"""
|
||||||
from typing import IO, cast, Any
|
from typing import IO, cast, Any
|
||||||
from collections.abc import Iterable, Mapping, Callable
|
from collections.abc import Iterable, Mapping, Callable
|
||||||
|
from types import MappingProxyType
|
||||||
import io
|
import io
|
||||||
import mmap
|
import mmap
|
||||||
import logging
|
import logging
|
||||||
@ -52,6 +53,8 @@ path_cap_map = {
|
|||||||
4: Path.Cap.SquareCustom,
|
4: Path.Cap.SquareCustom,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RO_EMPTY_DICT: Mapping[int, bytes] = MappingProxyType({})
|
||||||
|
|
||||||
|
|
||||||
def rint_cast(val: ArrayLike) -> NDArray[numpy.int32]:
|
def rint_cast(val: ArrayLike) -> NDArray[numpy.int32]:
|
||||||
return numpy.rint(val).astype(numpy.int32)
|
return numpy.rint(val).astype(numpy.int32)
|
||||||
@ -399,11 +402,15 @@ def _mrefs_to_grefs(refs: dict[str | None, list[Ref]]) -> list[klamath.library.R
|
|||||||
return grefs
|
return grefs
|
||||||
|
|
||||||
|
|
||||||
def _properties_to_annotations(properties: dict[int, bytes]) -> annotations_t:
|
def _properties_to_annotations(properties: Mapping[int, bytes]) -> annotations_t:
|
||||||
|
if not properties:
|
||||||
|
return None
|
||||||
return {str(k): [v.decode()] for k, v in properties.items()}
|
return {str(k): [v.decode()] for k, v in properties.items()}
|
||||||
|
|
||||||
|
|
||||||
def _annotations_to_properties(annotations: annotations_t, max_len: int = 126) -> dict[int, bytes]:
|
def _annotations_to_properties(annotations: annotations_t, max_len: int = 126) -> Mapping[int, bytes]:
|
||||||
|
if annotations is None:
|
||||||
|
return RO_EMPTY_DICT
|
||||||
cum_len = 0
|
cum_len = 0
|
||||||
props = {}
|
props = {}
|
||||||
for key, vals in annotations.items():
|
for key, vals in annotations.items():
|
||||||
|
@ -671,6 +671,8 @@ def repetition_masq2fata(
|
|||||||
|
|
||||||
def annotations_to_properties(annotations: annotations_t) -> list[fatrec.Property]:
|
def annotations_to_properties(annotations: annotations_t) -> list[fatrec.Property]:
|
||||||
#TODO determine is_standard based on key?
|
#TODO determine is_standard based on key?
|
||||||
|
if annotations is None:
|
||||||
|
return []
|
||||||
properties = []
|
properties = []
|
||||||
for key, values in annotations.items():
|
for key, values in annotations.items():
|
||||||
vals = [AString(v) if isinstance(v, str) else v
|
vals = [AString(v) if isinstance(v, str) else v
|
||||||
|
@ -332,7 +332,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
|
|||||||
))
|
))
|
||||||
|
|
||||||
self.ports = dict(sorted(self.ports.items()))
|
self.ports = dict(sorted(self.ports.items()))
|
||||||
self.annotations = dict(sorted(self.annotations.items()))
|
self.annotations = dict(sorted(self.annotations.items())) if self.annotations is not None else None
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
@ -354,10 +354,13 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
|
|||||||
for layer, lseq in other_pattern.labels.items():
|
for layer, lseq in other_pattern.labels.items():
|
||||||
self.labels[layer].extend(lseq)
|
self.labels[layer].extend(lseq)
|
||||||
|
|
||||||
annotation_conflicts = set(self.annotations.keys()) & set(other_pattern.annotations.keys())
|
if other_pattern.annotations is not None:
|
||||||
if annotation_conflicts:
|
if self.annotations is None:
|
||||||
raise PatternError(f'Annotation keys overlap: {annotation_conflicts}')
|
self.annotations = {}
|
||||||
self.annotations.update(other_pattern.annotations)
|
annotation_conflicts = set(self.annotations.keys()) & set(other_pattern.annotations.keys())
|
||||||
|
if annotation_conflicts:
|
||||||
|
raise PatternError(f'Annotation keys overlap: {annotation_conflicts}')
|
||||||
|
self.annotations.update(other_pattern.annotations)
|
||||||
|
|
||||||
port_conflicts = set(self.ports.keys()) & set(other_pattern.ports.keys())
|
port_conflicts = set(self.ports.keys()) & set(other_pattern.ports.keys())
|
||||||
if port_conflicts:
|
if port_conflicts:
|
||||||
@ -415,7 +418,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
|
|||||||
elif default_keep:
|
elif default_keep:
|
||||||
pat.refs = copy.copy(self.refs)
|
pat.refs = copy.copy(self.refs)
|
||||||
|
|
||||||
if annotations is not None:
|
if annotations is not None and self.annotations is not None:
|
||||||
pat.annotations = {k: v for k, v in self.annotations.items() if annotations(k, v)}
|
pat.annotations = {k: v for k, v in self.annotations.items() if annotations(k, v)}
|
||||||
elif default_keep:
|
elif default_keep:
|
||||||
pat.annotations = copy.copy(self.annotations)
|
pat.annotations = copy.copy(self.annotations)
|
||||||
|
@ -5,7 +5,7 @@ from typing import Protocol
|
|||||||
|
|
||||||
|
|
||||||
layer_t = int | tuple[int, int] | str
|
layer_t = int | tuple[int, int] | str
|
||||||
annotations_t = dict[str, list[int | float | str]]
|
annotations_t = dict[str, list[int | float | str]] | None
|
||||||
|
|
||||||
|
|
||||||
class SupportsBool(Protocol):
|
class SupportsBool(Protocol):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user