Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 76 additions & 1 deletion src/gfwapiclient/resources/fourwings/report/models/response.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import datetime

from typing import Any, List, Optional, Type
from typing import Any, Iterator, List, Optional, Type

from pydantic import Field, field_validator

Expand Down Expand Up @@ -164,3 +164,78 @@ def __init__(self, data: List[FourWingsReportItem]) -> None:
The list of report items.
"""
super().__init__(data=data)

@property
def vessel_ids(self) -> List[str]:
"""Returns AIS vessel identifiers (IDs).

Returns:
List[str]:
Valid list of AIS vessel identifier (ID).
"""

def extract_vessel_ids(item: FourWingsReportItem) -> Iterator[Optional[str]]:
yield item.vessel_id

mapped_vessel_ids: Iterator[Optional[str]] = self.flat_map(
mapper=extract_vessel_ids
)
matched_vessel_ids: List[str] = list(
{_vessel_id.strip() for _vessel_id in mapped_vessel_ids if _vessel_id}
)

return matched_vessel_ids

@property
def first_transmission_dates(self) -> List[datetime.date]:
"""Returns AIS transmission start dates.

Returns:
List[str]:
Valid list of AIS first transmission date.
"""

def extract_first_transmission_date(
item: FourWingsReportItem,
) -> Iterator[Optional[datetime.datetime]]:
yield item.first_transmission_date

mapped_first_transmission_dates: Iterator[Optional[datetime.datetime]] = (
self.flat_map(mapper=extract_first_transmission_date)
)
ais_first_transmission_dates: List[datetime.date] = list(
{
_first_transmission_date.date()
for _first_transmission_date in mapped_first_transmission_dates
if _first_transmission_date
}
)

return ais_first_transmission_dates

@property
def last_transmission_dates(self) -> List[datetime.date]:
"""Returns AIS transmission end dates.

Returns:
List[str]:
Valid list of AIS last transmission date.
"""

def extract_last_transmission_date(
item: FourWingsReportItem,
) -> Iterator[Optional[datetime.datetime]]:
yield item.last_transmission_date

mapped_last_transmission_dates: Iterator[Optional[datetime.datetime]] = (
self.flat_map(mapper=extract_last_transmission_date)
)
ais_last_transmission_dates: List[datetime.date] = list(
{
_last_transmission_date.date()
for _last_transmission_date in mapped_last_transmission_dates
if _last_transmission_date
}
)

return ais_last_transmission_dates
39 changes: 39 additions & 0 deletions tests/resources/fourwings/models/test_response_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,42 @@ def test_fourwings_report_result_deserializes_all_fields(
]
result = FourWingsReportResult(data=data)
assert cast(List[FourWingsReportItem], result.data()) == data


def test_fourwings_report_result_vessel_ids_returns_correctly(
mock_raw_fourwings_report_item: Dict[str, Any],
) -> None:
"""Test that `FourWingsReportResult` returns list of vessel ids correctly."""
data: List[FourWingsReportItem] = [
FourWingsReportItem(**mock_raw_fourwings_report_item)
]
result = FourWingsReportResult(data=data)
assert result.vessel_ids is not None
assert isinstance(result.vessel_ids, list)
assert len(result.vessel_ids) >= 1


def test_fourwings_report_result_first_transmission_dates_returns_correctly(
mock_raw_fourwings_report_item: Dict[str, Any],
) -> None:
"""Test that `FourWingsReportResult` first transmission dates returns list of first transmission dates correctly."""
data: List[FourWingsReportItem] = [
FourWingsReportItem(**mock_raw_fourwings_report_item)
]
result = FourWingsReportResult(data=data)
assert result.first_transmission_dates is not None
assert isinstance(result.first_transmission_dates, list)
assert len(result.first_transmission_dates) >= 1


def test_fourwings_report_result_last_transmission_dates_returns_correctly(
mock_raw_fourwings_report_item: Dict[str, Any],
) -> None:
"""Test that `FourWingsReportResult` last transmission dates to returns list of last transmission dates correctly."""
data: List[FourWingsReportItem] = [
FourWingsReportItem(**mock_raw_fourwings_report_item)
]
result = FourWingsReportResult(data=data)
assert result.last_transmission_dates is not None
assert isinstance(result.last_transmission_dates, list)
assert len(result.last_transmission_dates) >= 1
Loading