home · contact · privacy
Replace awkward ATTR_DESCS global with dataclasses Field.metadata.
authorPlom Heller <plom@plomlompom.com>
Fri, 14 Aug 2026 19:38:44 +0000 (21:38 +0200)
committerPlom Heller <plom@plomlompom.com>
Fri, 14 Aug 2026 19:38:44 +0000 (21:38 +0200)
src/bricksplom/misc.py
src/run.py

index cf75d3c61f38dc36085891ef76cd0a473a21cd4b..436ffa00451ac8f04c6a2aa4c67edb252f358383 100644 (file)
@@ -2,7 +2,7 @@
 
 # standard libs
 from abc import ABC, abstractmethod
-from dataclasses import dataclass, field as dc_field
+from dataclasses import dataclass, field as dc_field, fields as dc_fields
 from pathlib import Path
 from typing import Any, Callable, Optional, Self
 # ourselves
@@ -43,15 +43,6 @@ LDRAW_MODES = {LDRAW_MODE_FILL_N_STUDS,
                LDRAW_MODE_VERIFY_N_STUDS,
                LDRAW_MODE_VERIFY_PATHS}
 
-ATTR_DESCS: dict[str, str] = {
-    'n_studs': 'number of studs',
-    'description': 'guesstimate what this be',
-    'ldraw': 'path of associated LDRAW file',
-    'x': 'size over x-axis',
-    'y': 'size over y-axis',
-    'z': 'size over z-axis',
-}
-
 BrickListing = tuple[int, str, str]  # count, ID, comment
 PageColumn = tuple[BrickListing, ...]
 Page = tuple[PageColumn, ...]
@@ -270,14 +261,31 @@ class BrickColor(Textfiled, Lookupable):
 @dataclass
 class BrickDesignData:
     'Lookupables for BrickDesign besides .id.'
-    n_studs: int = NUMBER_UNSET
-    description: str = '?'
-    ldraw: str = ''
-    x: float = NUMBER_UNSET
-    y: float = NUMBER_UNSET
-    z: float = NUMBER_UNSET
+    n_studs: int = dc_field(default=NUMBER_UNSET, metadata={
+        'usage': 'number of studs'})
+    description: str = dc_field(default='?', metadata={
+        'usage': 'guesstimate what this be'})
+    ldraw: str = dc_field(default='', metadata={
+        'usage': 'path of associated LDRAW file'})
+    x: float = dc_field(default=NUMBER_UNSET, metadata={
+        'usage': 'size over x-axis'})
+    y: float = dc_field(default=NUMBER_UNSET, metadata={
+        'usage': 'size over y-axis'})
+    z: float = dc_field(default=NUMBER_UNSET, metadata={
+        'usage': 'size over z-axis'})
     _secured: set = dc_field(default_factory=set)
 
+    @classmethod
+    def usage(
+            cls,
+            field_name: str
+            ) -> str:
+        'Return "usage" Field metadata if set for field_name.'
+        usages = {f.name: f.metadata['usage'] for f in dc_fields(cls)
+                  if 'usage' in f.metadata}
+        assert field_name in usages
+        return usages[field_name]
+
     @classmethod
     def sortables(
             cls
@@ -428,7 +436,7 @@ class BrickDesign(Textfiled, WithDb, Lookupable):
                     ) -> bool:
                 assert q_body.isdigit()
                 return getattr(item, attr_name) == int(q_body)
-            return 'by ' + ATTR_DESCS[attr_name], match
+            return 'by ' + BrickDesignData.usage(attr_name), match
         return super().matchers() | {
             f'{attr_name}{CHAR_ATTR_EQ}': attr_matcher(attr_name)
             for attr_name, attr_type in BrickDesignData.sortables().items()
@@ -450,7 +458,7 @@ class BrickDesign(Textfiled, WithDb, Lookupable):
                     ) -> tuple[Self, ...]:
                 return tuple(sorted(pre_sorted,
                                     key=lambda item: getattr(item, attr_name)))
-            return 'by ' + ATTR_DESCS[attr_name], f_sort
+            return 'by ' + BrickDesignData.usage(attr_name), f_sort
         return super().sorters()\
             | {TOK_SORT_BOX: cls._by_box_sorter('design')}\
             | {attr_name: attr_sorter(attr_name)
index bf0f5f7bedcea1ec86e0d1930af876ce8634811e..103adca31f93dbc26f05a0eaccb4e411b33eecba 100755 (executable)
@@ -17,7 +17,6 @@ from bricksplom.misc import (
         CHAR_SEP_LDRAW_MODES,
         LDRAW_MODES,
         PARAM_Q_ID,
-        TOK_SORT_ID,
         )
 
 NAME_ENV_DIRNAME = 'BRICKSPLOM_DIR'