Skip to content

Ship162

tangram_ship162

router module-attribute

router = APIRouter(
    prefix="/ship162",
    tags=["ship162"],
    responses={404: {"description": "Not found"}},
)

plugin module-attribute

plugin = Plugin(
    frontend_path="dist-frontend",
    routers=[router],
    into_frontend_config_function=transform_config,
)

ShipsConfig dataclass

Bases: HasTopbarUiConfig, HasSidebarUiConfig

Source code in packages/tangram_ship162/src/tangram_ship162/__init__.py
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
@dataclass(frozen=True)
class ShipsConfig(
    tangram_core.config.HasTopbarUiConfig, tangram_core.config.HasSidebarUiConfig
):
    ship162_channel: str = "ship162"
    history_table_name: str = "ship162"
    history_control_channel: str = "history:control"
    state_vector_expire: int = 600  # 10 minutes
    stream_interval_secs: float = 1.0
    log_level: str = "INFO"
    history_buffer_size: int = 100_000
    history_flush_interval_secs: int = 5
    history_optimize_interval_secs: int = 120
    history_optimize_target_file_size: int = 134217728
    history_vacuum_interval_secs: int = 120
    history_vacuum_retention_period_secs: int | None = 120
    topbar_order: int = 100
    sidebar_order: int = 100

ship162_channel class-attribute instance-attribute

ship162_channel: str = 'ship162'

history_table_name class-attribute instance-attribute

history_table_name: str = 'ship162'

history_control_channel class-attribute instance-attribute

history_control_channel: str = 'history:control'

state_vector_expire class-attribute instance-attribute

state_vector_expire: int = 600

stream_interval_secs class-attribute instance-attribute

stream_interval_secs: float = 1.0

log_level class-attribute instance-attribute

log_level: str = 'INFO'

history_buffer_size class-attribute instance-attribute

history_buffer_size: int = 100000

history_flush_interval_secs class-attribute instance-attribute

history_flush_interval_secs: int = 5

history_optimize_interval_secs class-attribute instance-attribute

history_optimize_interval_secs: int = 120

history_optimize_target_file_size class-attribute instance-attribute

history_optimize_target_file_size: int = 134217728

history_vacuum_interval_secs class-attribute instance-attribute

history_vacuum_interval_secs: int = 120

history_vacuum_retention_period_secs class-attribute instance-attribute

history_vacuum_retention_period_secs: int | None = 120

topbar_order class-attribute instance-attribute

topbar_order: int = 100

sidebar_order class-attribute instance-attribute

sidebar_order: int = 100

__init__

__init__(
    ship162_channel: str = "ship162",
    history_table_name: str = "ship162",
    history_control_channel: str = "history:control",
    state_vector_expire: int = 600,
    stream_interval_secs: float = 1.0,
    log_level: str = "INFO",
    history_buffer_size: int = 100000,
    history_flush_interval_secs: int = 5,
    history_optimize_interval_secs: int = 120,
    history_optimize_target_file_size: int = 134217728,
    history_vacuum_interval_secs: int = 120,
    history_vacuum_retention_period_secs: int | None = 120,
    topbar_order: int = 100,
    sidebar_order: int = 100,
) -> None

FrontendShipsConfig dataclass

Bases: HasTopbarUiConfig, HasSidebarUiConfig

Source code in packages/tangram_ship162/src/tangram_ship162/__init__.py
83
84
85
86
87
88
@dataclass(frozen=True)
class FrontendShipsConfig(
    tangram_core.config.HasTopbarUiConfig, tangram_core.config.HasSidebarUiConfig
):
    topbar_order: int
    sidebar_order: int

topbar_order instance-attribute

topbar_order: int

sidebar_order instance-attribute

sidebar_order: int

__init__

__init__(topbar_order: int, sidebar_order: int) -> None

get_trajectory_data async

get_trajectory_data(
    mmsi: int, backend_state: InjectBackendState
) -> list[dict[str, Any]]

Get the full trajectory for a given ship MMSI.

Source code in packages/tangram_ship162/src/tangram_ship162/__init__.py
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@router.get("/data/{mmsi}")
async def get_trajectory_data(
    mmsi: int, backend_state: tangram_core.InjectBackendState
) -> list[dict[str, Any]]:
    """Get the full trajectory for a given ship MMSI."""
    if not _HISTORY_AVAILABLE:
        raise HTTPException(
            status_code=501,
            detail="History feature is not installed. "
            "Install with `pip install 'tangram_ship162[history]'`",
        )

    redis_key = "tangram:history:table_uri:ship162"
    table_uri_bytes = await backend_state.redis_client.get(redis_key)

    if not table_uri_bytes:
        raise HTTPException(
            status_code=404,
            detail=(
                "Table 'ship162' not found.\nhelp: is the history service running?"
            ),
        )
    table_uri = table_uri_bytes.decode("utf-8")

    try:
        df = (
            pl.scan_delta(table_uri)
            .filter(pl.col("mmsi") == mmsi)
            .with_columns(pl.col("timestamp").dt.epoch(time_unit="s"))
            .sort("timestamp")
            .collect()
        )
        return Response(df.write_json(), media_type="application/json")
    except Exception as e:
        raise HTTPException(
            status_code=500, detail=f"Failed to query trajectory data: {e}"
        )

transform_config

transform_config(
    config_dict: dict[str, Any],
) -> FrontendShipsConfig
Source code in packages/tangram_ship162/src/tangram_ship162/__init__.py
91
92
93
94
95
96
def transform_config(config_dict: dict[str, Any]) -> FrontendShipsConfig:
    config = TypeAdapter(ShipsConfig).validate_python(config_dict)
    return FrontendShipsConfig(
        topbar_order=config.topbar_order,
        sidebar_order=config.sidebar_order,
    )

run_ships async

run_ships(backend_state: BackendState) -> None
Source code in packages/tangram_ship162/src/tangram_ship162/__init__.py
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
@plugin.register_service()
async def run_ships(backend_state: tangram_core.BackendState) -> None:
    from . import _ships

    plugin_config = backend_state.config.plugins.get("tangram_ship162", {})
    config_ships = TypeAdapter(ShipsConfig).validate_python(plugin_config)

    default_log_level = plugin_config.get(
        "log_level", backend_state.config.core.log_level
    )

    _ships.init_tracing_stderr(default_log_level)

    rust_config = _ships.ShipsConfig(
        redis_url=backend_state.config.core.redis_url,
        ship162_channel=config_ships.ship162_channel,
        history_control_channel=config_ships.history_control_channel,
        state_vector_expire=config_ships.state_vector_expire,
        stream_interval_secs=config_ships.stream_interval_secs,
        history_table_name=config_ships.history_table_name,
        history_buffer_size=config_ships.history_buffer_size,
        history_flush_interval_secs=config_ships.history_flush_interval_secs,
        history_optimize_interval_secs=config_ships.history_optimize_interval_secs,
        history_optimize_target_file_size=config_ships.history_optimize_target_file_size,
        history_vacuum_interval_secs=config_ships.history_vacuum_interval_secs,
        history_vacuum_retention_period_secs=config_ships.history_vacuum_retention_period_secs,
    )
    await _ships.run_ships(rust_config)

tangram_ship162._ships

ShipsConfig

redis_url property writable

redis_url: str

ship162_channel property writable

ship162_channel: str

history_control_channel property writable

history_control_channel: str

state_vector_expire property writable

state_vector_expire: int

stream_interval_secs property writable

stream_interval_secs: float

history_table_name property writable

history_table_name: str

history_buffer_size property writable

history_buffer_size: int

history_flush_interval_secs property writable

history_flush_interval_secs: int

history_optimize_interval_secs property writable

history_optimize_interval_secs: int

history_optimize_target_file_size property writable

history_optimize_target_file_size: int

history_vacuum_interval_secs property writable

history_vacuum_interval_secs: int

history_vacuum_retention_period_secs property writable

history_vacuum_retention_period_secs: Optional[int]

__new__

__new__(
    redis_url: str,
    ship162_channel: str,
    history_control_channel: str,
    state_vector_expire: int,
    stream_interval_secs: float,
    history_table_name: str,
    history_buffer_size: int,
    history_flush_interval_secs: int,
    history_optimize_interval_secs: int,
    history_optimize_target_file_size: int,
    history_vacuum_interval_secs: int,
    history_vacuum_retention_period_secs: Optional[int],
) -> ShipsConfig

init_tracing_stderr

init_tracing_stderr(filter_str: str) -> None

run_ships

run_ships(config: ShipsConfig) -> Any