Source code for jsktoolbox.edmctool.stars

# -*- coding: utf-8 -*-
"""
Author:  Jacek 'Szumak' Kotlarski --<szumak@virthost.pl>
Created: 2024-10-07

Purpose: StarsSystem container.
"""

from inspect import currentframe
from typing import Optional, List, Dict, Union, Any

from ..attribtool import ReadOnlyClass
from ..raisetool import Raise
from ..basetool import BData
from .edsm_keys import EdsmKeys


class _Keys(object, metaclass=ReadOnlyClass):
    """Internal Keys container class."""

    # StarsSystem
    SS_ADDRESS: str = "__ss_address__"
    SS_DATA: str = "__ss_data__"
    SS_NAME: str = "__ss_name__"
    SS_POS_X: str = "__ss_pos_x__"
    SS_POS_Y: str = "__ss_pos_y__"
    SS_POS_Z: str = "__ss_pos_z__"
    SS_STAR_CLASS: str = "__ss_star_class__"


[docs] class StarsSystem(BData): """StarsSystem container class."""
[docs] def __init__( self, name: Optional[str] = None, address: Optional[int] = None, star_pos: Optional[List] = None, ) -> None: """Create Star System object. ### Arguments: * name: Optional[str] - Name of the star system. * address: Optional[int] - System address identifier. * star_pos: Optional[List] - Position coordinates of the star. """ self.name = name self.address = address self.star_pos = star_pos
[docs] def __repr__(self) -> str: """Give me class dump.""" return ( f"{self._c_name}(name='{self.name}', " f"address={self.address}, " f"star_pos={self.star_pos}, " f"data={self.data})" )
@property def address(self) -> Optional[int]: """Returns address of the star system. ### Returns: Optional[int] - The system address, or None if not set. """ return self._get_data(key=_Keys.SS_ADDRESS, default_value=None) @address.setter def address(self, arg: Optional[Union[int, str]]) -> None: """Sets address of the star system. ### Arguments: * arg: Optional[Union[int, str]] - System address as integer or string representation. """ if isinstance(arg, str): self._set_data( key=_Keys.SS_ADDRESS, value=int(arg), set_default_type=Optional[int], ) else: self._set_data( key=_Keys.SS_ADDRESS, value=arg, set_default_type=Optional[int] ) @property def data(self) -> Dict: """Returns data container. This is dictionary object for storing various elements. ### Returns: Dict - Dictionary containing system data. """ if self._get_data(key=_Keys.SS_DATA, default_value=None) is None: self._set_data(key=_Keys.SS_DATA, value={}, set_default_type=Dict) return self._get_data(key=_Keys.SS_DATA) # type: ignore @data.setter def data(self, value: Optional[Dict]) -> None: """Initialize or set data container. ### Arguments: * value: Optional[Dict] - Dictionary for storing system data or None to initialize empty. """ if value is None: self._set_data(key=_Keys.SS_DATA, value={}, set_default_type=Dict) else: self._set_data(key=_Keys.SS_DATA, value=value, set_default_type=Dict) @property def name(self) -> Optional[str]: """Returns name of the star system. ### Returns: Optional[str] - The system name, or None if not set. """ return self._get_data(key=_Keys.SS_NAME, default_value=None) @name.setter def name(self, arg: Optional[str]) -> None: """Sets name of the star system. ### Arguments: * arg: Optional[str] - Name of the star system. """ self._set_data(key=_Keys.SS_NAME, value=arg, set_default_type=Optional[str]) @property def pos_x(self) -> Optional[Union[float, int]]: """Returns pos_x of the star system. ### Returns: Optional[Union[float, int]] - X coordinate value, or None if not set. """ return self._get_data(key=_Keys.SS_POS_X, default_value=None) @pos_x.setter def pos_x(self, arg: Optional[Union[float, int]]) -> None: """Sets pos_x of the star system. ### Arguments: * arg: Optional[Union[float, int]] - X coordinate value. """ self._set_data( key=_Keys.SS_POS_X, value=arg, set_default_type=Optional[Union[float, int]] ) @property def pos_y(self) -> Optional[Union[float, int]]: """Returns pos_y of the star system. ### Returns: Optional[Union[float, int]] - Y coordinate value, or None if not set. """ return self._get_data(key=_Keys.SS_POS_Y, default_value=None) @pos_y.setter def pos_y(self, arg: Optional[Union[float, int]]) -> None: """Sets pos_y of the star system. ### Arguments: * arg: Optional[Union[float, int]] - Y coordinate value. """ self._set_data( key=_Keys.SS_POS_Y, value=arg, set_default_type=Optional[Union[float, int]] ) @property def pos_z(self) -> Optional[Union[float, int]]: """Returns pos_z of the star system. ### Returns: Optional[Union[float, int]] - Z coordinate value, or None if not set. """ return self._get_data(key=_Keys.SS_POS_Z, default_value=None) @pos_z.setter def pos_z(self, arg: Optional[Union[float, int]]) -> None: """Sets pos_z of the star system. ### Arguments: * arg: Optional[Union[float, int]] - Z coordinate value. """ self._set_data( key=_Keys.SS_POS_Z, value=arg, set_default_type=Optional[Union[float, int]] ) @property def star_class(self) -> str: """Returns star class string. ### Returns: str - Star classification identifier. """ return self._get_data(key=_Keys.SS_STAR_CLASS, default_value="") # type: ignore @star_class.setter def star_class(self, value: str) -> None: """Sets star class string. ### Arguments: * value: str - Star classification identifier. """ self._set_data(key=_Keys.SS_STAR_CLASS, value=value, set_default_type=str) @property def star_pos(self) -> List: """Returns the star position list. ### Returns: List - List containing [pos_x, pos_y, pos_z] coordinates. """ return [self.pos_x, self.pos_y, self.pos_z] @star_pos.setter def star_pos(self, arg: Optional[List] = None) -> None: """Sets the star position list. ### Arguments: * arg: Optional[List] - List with three coordinates [x, y, z] or None to clear. ### Raises: * TypeError: Argument is not a List or has incorrect length. """ if arg is None: self.pos_x, self.pos_y, self.pos_z = (None, None, None) elif isinstance(arg, List) and len(arg) == 3: self.pos_x, self.pos_y, self.pos_z = arg else: raise Raise.error( f"List type expected, '{type(arg)}' received.", TypeError, self._c_name, currentframe(), )
[docs] def update_from_edsm(self, data: Dict) -> None: """Update records from given EDSM Api dict. ### Arguments: * data: Dict - Dictionary containing EDSM API response data. """ if data is None or not isinstance(data, Dict): return self.name = data.get(EdsmKeys.NAME, self.name) self.address = data.get(EdsmKeys.ID64, self.address) if EdsmKeys.COORDS in data and EdsmKeys.X in data[EdsmKeys.COORDS]: self.pos_x = data[EdsmKeys.COORDS].get(EdsmKeys.X, self.pos_x) self.pos_y = data[EdsmKeys.COORDS].get(EdsmKeys.Y, self.pos_y) self.pos_z = data[EdsmKeys.COORDS].get(EdsmKeys.Z, self.pos_z) if EdsmKeys.BODY_COUNT in data: self.data[EdsmKeys.BODY_COUNT] = data[EdsmKeys.BODY_COUNT] if EdsmKeys.COORDS_LOCKED in data: self.data[EdsmKeys.COORDS_LOCKED] = data[EdsmKeys.COORDS_LOCKED] if EdsmKeys.REQUIRE_PERMIT in data: self.data[EdsmKeys.REQUIRE_PERMIT] = data[EdsmKeys.REQUIRE_PERMIT] if EdsmKeys.DISTANCE in data: self.data[EdsmKeys.DISTANCE] = data[EdsmKeys.DISTANCE] if EdsmKeys.BODIES in data: self.data[EdsmKeys.BODIES] = len(data[EdsmKeys.BODIES])
# #[EOF]#######################################################################