persistence: invert all writeability logic into not readonly
This commit is contained in:
@@ -7,7 +7,7 @@ from clan_lib.machines.actions import FieldSchema
|
|||||||
from clan_lib.nix_models.clan import InventoryMeta
|
from clan_lib.nix_models.clan import InventoryMeta
|
||||||
from clan_lib.persist.introspection import retrieve_typed_field_names
|
from clan_lib.persist.introspection import retrieve_typed_field_names
|
||||||
from clan_lib.persist.inventory_store import InventoryStore
|
from clan_lib.persist.inventory_store import InventoryStore
|
||||||
from clan_lib.persist.write_rules import is_writeable_key
|
from clan_lib.persist.write_rules import is_readonly_key
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ def get_clan_details_schema(flake: Flake) -> dict[str, FieldSchema]:
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
field: {
|
field: {
|
||||||
"readonly": not is_writeable_key(f"meta.{field}", write_info),
|
"readonly": is_readonly_key(f"meta.{field}", write_info),
|
||||||
# TODO: Provide a meaningful reason
|
# TODO: Provide a meaningful reason
|
||||||
"reason": None,
|
"reason": None,
|
||||||
"readonly_members": [],
|
"readonly_members": [],
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ from clan_lib.persist.path_utils import (
|
|||||||
list_difference,
|
list_difference,
|
||||||
set_value_by_path,
|
set_value_by_path,
|
||||||
)
|
)
|
||||||
from clan_lib.persist.write_rules import is_writeable_key
|
from clan_lib.persist.write_rules import is_readonly_key
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@@ -195,7 +195,7 @@ def get_machine_fields_schema(machine: Machine) -> dict[str, FieldSchema]:
|
|||||||
"readonly": (
|
"readonly": (
|
||||||
True
|
True
|
||||||
if field in protected_fields
|
if field in protected_fields
|
||||||
else not is_writeable_key(
|
else is_readonly_key(
|
||||||
f"machines.{machine.name}.{field}",
|
f"machines.{machine.name}.{field}",
|
||||||
write_info,
|
write_info,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from clan_lib.persist.path_utils import (
|
|||||||
path_starts_with,
|
path_starts_with,
|
||||||
path_to_string,
|
path_to_string,
|
||||||
)
|
)
|
||||||
from clan_lib.persist.write_rules import AttributeMap, is_writeable_path
|
from clan_lib.persist.write_rules import AttributeMap, is_readonly_path
|
||||||
|
|
||||||
|
|
||||||
def validate_no_static_deletion(
|
def validate_no_static_deletion(
|
||||||
@@ -22,7 +22,7 @@ def validate_no_static_deletion(
|
|||||||
|
|
||||||
def validate_not_readonly(path: PathTuple, writeables: AttributeMap) -> None:
|
def validate_not_readonly(path: PathTuple, writeables: AttributeMap) -> None:
|
||||||
"""Validate that a path is writeable."""
|
"""Validate that a path is writeable."""
|
||||||
if not is_writeable_path(path, writeables):
|
if is_readonly_path(path, writeables):
|
||||||
msg = f"Path '{path_to_string(path)}' is readonly. - It seems its value is statically defined in nix."
|
msg = f"Path '{path_to_string(path)}' is readonly. - It seems its value is statically defined in nix."
|
||||||
raise ClanError(msg)
|
raise ClanError(msg)
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class PersistenceAttribute(Enum):
|
|||||||
type AttributeMap = dict[PathTuple, set[PersistenceAttribute]]
|
type AttributeMap = dict[PathTuple, set[PersistenceAttribute]]
|
||||||
|
|
||||||
|
|
||||||
def is_writeable_path(
|
def is_readonly_path(
|
||||||
key: PathTuple,
|
key: PathTuple,
|
||||||
attributes: AttributeMap,
|
attributes: AttributeMap,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
@@ -30,9 +30,9 @@ def is_writeable_path(
|
|||||||
current_path = remaining
|
current_path = remaining
|
||||||
if current_path in attributes:
|
if current_path in attributes:
|
||||||
if PersistenceAttribute.WRITE in attributes[current_path]:
|
if PersistenceAttribute.WRITE in attributes[current_path]:
|
||||||
return True
|
|
||||||
if PersistenceAttribute.READONLY in attributes[current_path]:
|
|
||||||
return False
|
return False
|
||||||
|
if PersistenceAttribute.READONLY in attributes[current_path]:
|
||||||
|
return True
|
||||||
# Check the parent path
|
# Check the parent path
|
||||||
remaining = remaining[:-1]
|
remaining = remaining[:-1]
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ def is_writeable_path(
|
|||||||
raise ClanError(msg)
|
raise ClanError(msg)
|
||||||
|
|
||||||
|
|
||||||
def is_writeable_key(
|
def is_readonly_key(
|
||||||
key: str,
|
key: str,
|
||||||
attributes: AttributeMap,
|
attributes: AttributeMap,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
@@ -51,7 +51,7 @@ def is_writeable_key(
|
|||||||
In case of ambiguity use is_writeable_path with tuple keys.
|
In case of ambiguity use is_writeable_path with tuple keys.
|
||||||
"""
|
"""
|
||||||
items = key.split(".")
|
items = key.split(".")
|
||||||
return is_writeable_path(tuple(items), attributes)
|
return is_readonly_path(tuple(items), attributes)
|
||||||
|
|
||||||
|
|
||||||
def get_priority(value: Any) -> int | None:
|
def get_priority(value: Any) -> int | None:
|
||||||
|
|||||||
Reference in New Issue
Block a user