diff --git a/README.md b/README.md index 8dc93e1..d0a8815 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,6 @@ Requirements: * python >= 3.10 (written and tested with 3.11) -* numpy Install with pip: diff --git a/g85/__init__.py b/g85/__init__.py index 8df75f7..69c0e4b 100644 --- a/g85/__init__.py +++ b/g85/__init__.py @@ -1,6 +1,9 @@ -from .main import Map, Device -from .read import read -from .write import write +from .main import ( + Map as Map, + Device as Device, + ) +from .read import read as read +from .write import write as write __author__ = 'Jan Petykiewicz' -__version__ = '0.6' +__version__ = '0.7' diff --git a/g85/read.py b/g85/read.py index 9fd2317..8c4a924 100644 --- a/g85/read.py +++ b/g85/read.py @@ -58,22 +58,24 @@ def read_devices(el_map: ElementTree.Element) -> list[Device]: device = Device(BinType=bin_type, NullBin=null_bin) - val: Any for key, val in el_device.attrib.items(): if key in ('BinType', 'NullBin'): continue + parsed_val: Any if key in ('WaferSize', 'DeviceSizeX', 'DeviceSizeY', 'Orientation'): - val = float(val) + parsed_val = float(val) elif key in ('OriginLocation',): - val = int(val) + parsed_val = int(val) elif key == 'CreateDate': - val = datetime.datetime.strptime(val + '000', '%Y%m%d%H%M%S%f') + parsed_val = datetime.datetime.strptime(val + '000', '%Y%m%d%H%M%S%f') + else: + parsed_val = val if key in dev_fields and key[0].isupper(): - setattr(device, key, val) + setattr(device, key, parsed_val) else: - device.misc[key] = val + device.misc[key] = parsed_val for el_entry in el_device: tag = _tag(el_entry) @@ -137,7 +139,7 @@ def read_row(el_row: ElementTree.Element) -> list[str]: def _tag(element: ElementTree.Element) -> str: - ''' + """ Get the element's tag, excluding any namespaces. - ''' + """ return element.tag.split('}')[-1] diff --git a/g85/write.py b/g85/write.py index 06d4726..e0c0bd3 100644 --- a/g85/write.py +++ b/g85/write.py @@ -1,4 +1,5 @@ -from typing import Sequence, TextIO, cast +from typing import TextIO, cast +from collections.abc import Sequence import logging import math from dataclasses import fields @@ -10,12 +11,15 @@ from .main import Map, Device logger = logging.getLogger(__name__) +class G85Error(Exception): + pass + + # Hack to directly pass through -def _escape_cdata(text): +def _escape_cdata(text: str) -> str: if text.startswith(''): return text - else: - return _original_escape_cdata(text) + return _original_escape_cdata(text) _original_escape_cdata = ElementTree._escape_cdata # type: ignore @@ -64,7 +68,7 @@ def write_devices(devices: Sequence[Device], el_map: ElementTree.Element) -> Non # Row data prep if device.map is None: - raise Exception(f'No _data for device pformat({device})') + raise G85Error(f'No _data for device pformat({device})') is_decimal = device.BinType == 'Decimal' row_texts, bin_length = prepare_data(device.map, decimal=is_decimal) @@ -136,7 +140,7 @@ def prepare_data(data: list[list[str]] | list[list[int]], decimal: bool) -> tupl row_text = ' '.join(srow) + ' ' row_texts.append(row_text) return row_texts, char_len - else: + else: # noqa: RET505 data = cast(list[list[int]], data) max_value = max(max(rr) for rr in data) max_digits = math.ceil(math.log10(max_value)) diff --git a/pyproject.toml b/pyproject.toml index 3d9e1e2..3aef2fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,8 +38,41 @@ classifiers = [ requires-python = ">=3.10" dynamic = ["version"] dependencies = [ - "numpy~=1.21", ] [tool.hatch.version] path = "g85/__init__.py" + + +[tool.ruff] +exclude = [ + ".git", + "dist", + ] +line-length = 145 +indent-width = 4 +lint.dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" +lint.select = [ + "NPY", "E", "F", "W", "B", "ANN", "UP", "SLOT", "SIM", "LOG", + "C4", "ISC", "PIE", "PT", "RET", "TCH", "PTH", "INT", + "ARG", "PL", "R", "TRY", + "G010", "G101", "G201", "G202", + "Q002", "Q003", "Q004", + ] +lint.ignore = [ + #"ANN001", # No annotation + "ANN002", # *args + "ANN003", # **kwargs + "ANN401", # Any + "ANN101", # self: Self + "SIM108", # single-line if / else assignment + "RET504", # x=y+z; return x + "PIE790", # unnecessary pass + "ISC003", # non-implicit string concatenation + "C408", # dict(x=y) instead of {'x': y} + "PLR09", # Too many xxx + "PLR2004", # magic number + "PLC0414", # import x as x + "TRY003", # Long exception message + ] +