vessel-api-python 1.3.1__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,17 @@
1
1
  """Pydantic v2 models for the Vessel Tracking API.
2
2
 
3
- Models are generated from the OpenAPI spec and follow Python conventions.
3
+ Models follow Python conventions. They are maintained by hand — there is no code
4
+ generator — but they now cover every property of every response definition in
5
+ openapi/swagger.json. Error payloads are the one deliberate exception: they are
6
+ surfaced as exceptions in ``_errors`` rather than as models here.
7
+
8
+ Because pydantic silently drops unmodelled keys, a property added to the spec
9
+ must be added here too or callers lose the data with no error. When the spec
10
+ changes, diff it against these classes.
11
+
4
12
  All optional fields use ``type | None = None`` and JSON field mapping uses
5
- ``Field(alias="camelCase")`` where the API returns camelCase keys.
13
+ ``Field(alias="camelCase")`` where the API returns camelCase keys. Note that
14
+ ``Vessel`` is snake_case on the wire and so needs no aliases.
6
15
  """
7
16
 
8
17
  from __future__ import annotations
@@ -60,180 +69,13 @@ class VesselFormerName(_Base):
60
69
  year_until: str | None = None
61
70
 
62
71
 
63
- class BroadcastStation(_Base):
64
- """NAVTEX radio broadcast station details."""
65
-
66
- country: str | None = None
67
- coverage: str | None = None
68
- latitude: float | None = None
69
- longitude: float | None = None
70
- name: str | None = None
71
- station_id: str | None = None
72
-
73
-
74
- # ---------------------------------------------------------------------------
75
- # Classification sub-models
76
- # ---------------------------------------------------------------------------
77
-
78
-
79
- class ClassificationPurpose(_Base):
80
- """Purpose entry within classification identification."""
81
-
82
- description: str | None = None
83
- is_main_purpose: bool | None = Field(default=None, alias="isMainPurpose")
84
- purpose: str | None = None
85
-
86
-
87
- class ClassificationCertificate(_Base):
88
- """Certificate entry within vessel classification."""
89
-
90
- certificate: str | None = None
91
- code: str | None = None
92
- expires: str | None = None
93
- ext_until: str | None = Field(default=None, alias="extUntil")
94
- issued: str | None = None
95
- term: str | None = None
96
- type: str | None = None
97
-
98
-
99
- class ClassificationCondition(_Base):
100
- """Condition entry within vessel classification."""
101
-
102
- condition: str | None = None
103
- due_date: str | None = Field(default=None, alias="dueDate")
104
- imposed_date: str | None = Field(default=None, alias="imposedDate")
105
-
106
-
107
- class ClassificationDimensions(_Base):
108
- """Vessel dimensions from classification data."""
109
-
110
- bm: float | None = None
111
- dm: float | None = None
112
- draught: float | None = None
113
- dwt: float | None = None
114
- gross_ton_69: float | None = Field(default=None, alias="grossTon69")
115
- lbp: float | None = None
116
- length_overall: float | None = Field(default=None, alias="lengthOverall")
117
- net_ton_69: float | None = Field(default=None, alias="netTon69")
118
-
119
-
120
- class ClassificationHull(_Base):
121
- """Hull details from classification data."""
122
-
123
- decks_number: str | None = Field(default=None, alias="decksNumber")
124
-
125
-
126
- class ClassificationIdentification(_Base):
127
- """Identification details from classification data."""
128
-
129
- class_status_string: str | None = Field(default=None, alias="classStatusString")
130
- flag_code: str | None = Field(default=None, alias="flagCode")
131
- flag_name: str | None = Field(default=None, alias="flagName")
132
- home_port: str | None = Field(default=None, alias="homePort")
133
- imo_number: str | None = Field(default=None, alias="imoNumber")
134
- non_class_relation_string: str | None = Field(
135
- default=None, alias="nonClassRelationString"
136
- )
137
- official_number: str | None = Field(default=None, alias="officialNumber")
138
- operational_status_string: str | None = Field(
139
- default=None, alias="operationalStatusString"
140
- )
141
- purposes: list[ClassificationPurpose] | None = None
142
- register_: str | None = Field(default=None, alias="register")
143
- signal_letters: str | None = Field(default=None, alias="signalLetters")
144
- type_formatted: str | None = Field(default=None, alias="typeFormatted")
145
- vessel_id: str | None = Field(default=None, alias="vesselId")
146
- vessel_name: str | None = Field(default=None, alias="vesselName")
147
-
148
-
149
- class ClassificationInfo(_Base):
150
- """Classification notation and class status details."""
151
-
152
- class_entry_date: str | None = Field(default=None, alias="classEntryDate")
153
- class_notation_string: str | None = Field(
154
- default=None, alias="classNotationString"
155
- )
156
- class_notation_string_design: str | None = Field(
157
- default=None, alias="classNotationStringDesign"
158
- )
159
- class_notation_string_in_operation: str | None = Field(
160
- default=None, alias="classNotationStringInOperation"
161
- )
162
- class_notation_string_main: str | None = Field(
163
- default=None, alias="classNotationStringMain"
164
- )
165
- construction_symbol: str | None = Field(default=None, alias="constructionSymbol")
166
- dual_class: str | None = Field(default=None, alias="dualClass")
167
- equipment_number: str | None = Field(default=None, alias="equipmentNumber")
168
- last_classification_society: str | None = Field(
169
- default=None, alias="lastClassificationSociety"
170
- )
171
- main_class: str | None = Field(default=None, alias="mainClass")
172
- main_class_machinery: str | None = Field(
173
- default=None, alias="mainClassMachinery"
174
- )
175
- register_notation_string: str | None = Field(
176
- default=None, alias="registerNotationString"
177
- )
178
-
179
-
180
- class ClassificationMachinery(_Base):
181
- """Machinery details from classification data."""
182
-
183
- main_propulsion: str | None = Field(default=None, alias="mainPropulsion")
184
-
185
-
186
- class ClassificationOwner(_Base):
187
- """Owner/manager details from classification data."""
188
-
189
- doc_holder_dnv_id: str | None = Field(default=None, alias="docHolderDnvId")
190
- doc_holder_imo_number: str | None = Field(
191
- default=None, alias="docHolderImoNumber"
192
- )
193
- doc_holder_name: str | None = Field(default=None, alias="docHolderName")
194
- manager_dnv_id: str | None = Field(default=None, alias="managerDnvId")
195
- manager_imo_number: str | None = Field(default=None, alias="managerImoNumber")
196
- manager_name: str | None = Field(default=None, alias="managerName")
197
- owner_dnv_id: str | None = Field(default=None, alias="ownerDnvId")
198
- owner_imo_number: str | None = Field(default=None, alias="ownerImoNumber")
199
- owner_name: str | None = Field(default=None, alias="ownerName")
200
-
201
-
202
- class ClassificationSurvey(_Base):
203
- """Survey entry within vessel classification."""
204
-
205
- category: str | None = None
206
- due_from: str | None = Field(default=None, alias="dueFrom")
207
- due_to: str | None = Field(default=None, alias="dueTo")
208
- last_date: str | None = Field(default=None, alias="lastDate")
209
- location: str | None = None
210
- postponed: str | None = None
211
- survey: str | None = None
212
-
213
-
214
- class ClassificationYard(_Base):
215
- """Shipyard/builder details from classification data."""
216
-
217
- contracted_builder: str | None = Field(default=None, alias="contractedBuilder")
218
- contracted_builder_build_no: str | None = Field(
219
- default=None, alias="contractedBuilderBuildNo"
220
- )
221
- date_of_build: str | None = Field(default=None, alias="dateOfBuild")
222
- hull_yard_build_no: str | None = Field(default=None, alias="hullYardBuildNo")
223
- hull_yard_name: str | None = Field(default=None, alias="hullYardName")
224
- keel_date: str | None = Field(default=None, alias="keelDate")
225
-
226
-
227
- # ---------------------------------------------------------------------------
228
- # Resolution metadata
229
- # ---------------------------------------------------------------------------
230
-
231
-
232
72
  class ResolutionMeta(_Base):
233
73
  """Metadata about ID resolution fallback. Present when the API resolved using a different ID type."""
74
+
234
75
  requested_id_type: str | None = Field(default=None, alias="requestedIdType")
235
76
  resolved_id_type: str | None = Field(default=None, alias="resolvedIdType")
236
77
  resolved_id: int | None = Field(default=None, alias="resolvedId")
78
+ suggested_id_type: str | None = Field(default=None, alias="suggestedIdType")
237
79
 
238
80
 
239
81
  # ---------------------------------------------------------------------------
@@ -246,16 +88,17 @@ class Vessel(_Base):
246
88
 
247
89
  breadth: int | None = None
248
90
  breadth_unit: str | None = None
249
- builder: str | None = None
250
91
  call_sign: str | None = None
251
- class_society: str | None = None
252
92
  country: str | None = None
253
93
  country_code: str | None = None
254
94
  deadweight_tonnage: int | None = None
255
95
  draft: int | None = None
256
96
  draft_unit: str | None = None
97
+ draught_calculated_avg: float | None = None
98
+ draught_observed_max: float | None = None
257
99
  engine_model_name: str | None = None
258
100
  engine_type: int | None = None
101
+ eni: str | None = None
259
102
  former_names: list[VesselFormerName] | None = None
260
103
  gross_tonnage: int | None = None
261
104
  home_port: str | None = None
@@ -263,11 +106,15 @@ class Vessel(_Base):
263
106
  kilowatt_power: int | None = None
264
107
  length: int | None = None
265
108
  length_unit: str | None = None
266
- manager_name: str | None = None
267
109
  mmsi: int | None = None
268
110
  name: str | None = None
111
+ name_ais: str | None = None
269
112
  operating_status: str | None = None
270
- owner_name: str | None = None
113
+ speed_calculated_avg: float | None = None
114
+ speed_observed_max: float | None = None
115
+ summer_draught: float | None = None
116
+ teu: int | None = None
117
+ vessel_subtype: str | None = None
271
118
  vessel_type: str | None = None
272
119
  year_built: int | None = None
273
120
 
@@ -300,18 +147,14 @@ class VesselPosition(_Base):
300
147
  class VesselPositionResponse(_Base):
301
148
  """Response for a single vessel position lookup."""
302
149
 
303
- vessel_position: VesselPosition | None = Field(
304
- default=None, alias="vesselPosition"
305
- )
150
+ vessel_position: VesselPosition | None = Field(default=None, alias="vesselPosition")
306
151
  meta: ResolutionMeta | None = Field(default=None, alias="_meta")
307
152
 
308
153
 
309
154
  class VesselPositionsResponse(_Base):
310
155
  """Response for multiple vessel positions."""
311
156
 
312
- vessel_positions: list[VesselPosition] | None = Field(
313
- default=None, alias="vesselPositions"
314
- )
157
+ vessel_positions: list[VesselPosition] | None = Field(default=None, alias="vesselPositions")
315
158
  next_token: str | None = Field(default=None, alias="nextToken")
316
159
  meta: ResolutionMeta | None = Field(default=None, alias="_meta")
317
160
 
@@ -328,35 +171,21 @@ class MarineCasualty(_Base):
328
171
  casualty_report_nr: str | None = Field(default=None, alias="casualtyReportNr")
329
172
  cf_coding: list[str] | None = Field(default=None, alias="cfCoding")
330
173
  collected_at: str | None = Field(default=None, alias="collectedAt")
331
- competent_authority: list[str] | None = Field(
332
- default=None, alias="competentAuthority"
333
- )
174
+ competent_authority: list[str] | None = Field(default=None, alias="competentAuthority")
334
175
  date_of_occurrence: str | None = Field(default=None, alias="dateOfOccurrence")
335
176
  deviation: list[str] | None = None
336
177
  event_type: list[str] | None = Field(default=None, alias="eventType")
337
- finished_investigation: bool | None = Field(
338
- default=None, alias="finishedInvestigation"
339
- )
178
+ finished_investigation: bool | None = Field(default=None, alias="finishedInvestigation")
340
179
  imo_nr: list[str] | None = Field(default=None, alias="imoNr")
341
180
  interim_report: bool | None = Field(default=None, alias="interimReport")
342
- investigating_state: str | None = Field(
343
- default=None, alias="investigatingState"
344
- )
181
+ investigating_state: str | None = Field(default=None, alias="investigatingState")
345
182
  lives_lost_total: str | None = Field(default=None, alias="livesLostTotal")
346
183
  name_of_ship: list[str] | None = Field(default=None, alias="nameOfShip")
347
- occurrence_severity: str | None = Field(
348
- default=None, alias="occurrenceSeverity"
349
- )
184
+ occurrence_severity: str | None = Field(default=None, alias="occurrenceSeverity")
350
185
  occurrence_uuid: str | None = Field(default=None, alias="occurrenceUuid")
351
- occurrence_with_persons: list[str] | None = Field(
352
- default=None, alias="occurrenceWithPersons"
353
- )
354
- occurrence_with_ships: list[str] | None = Field(
355
- default=None, alias="occurrenceWithShips"
356
- )
357
- people_injured_total: str | None = Field(
358
- default=None, alias="peopleInjuredTotal"
359
- )
186
+ occurrence_with_persons: list[str] | None = Field(default=None, alias="occurrenceWithPersons")
187
+ occurrence_with_ships: list[str] | None = Field(default=None, alias="occurrenceWithShips")
188
+ people_injured_total: str | None = Field(default=None, alias="peopleInjuredTotal")
360
189
  pollution: bool | None = None
361
190
  ship_craft_type: list[str] | None = Field(default=None, alias="shipCraftType")
362
191
  sr_coding: list[str] | None = Field(default=None, alias="srCoding")
@@ -370,34 +199,6 @@ class MarineCasualtiesResponse(_Base):
370
199
  meta: ResolutionMeta | None = Field(default=None, alias="_meta")
371
200
 
372
201
 
373
- class ClassificationVessel(_Base):
374
- """Full vessel classification data with nested sub-objects."""
375
-
376
- certificates: list[ClassificationCertificate] | None = None
377
- classification: ClassificationInfo | None = None
378
- collected_at: str | None = Field(default=None, alias="collectedAt")
379
- conditions: list[ClassificationCondition] | None = None
380
- dimensions: ClassificationDimensions | None = None
381
- hull: ClassificationHull | None = None
382
- identification: ClassificationIdentification | None = None
383
- imo: int | None = None
384
- machinery: ClassificationMachinery | None = None
385
- owner: ClassificationOwner | None = None
386
- surveys: list[ClassificationSurvey] | None = None
387
- yard: ClassificationYard | None = None
388
-
389
-
390
- # Keep the ``Classification`` alias so existing code continues to work.
391
- Classification = ClassificationVessel
392
-
393
-
394
- class ClassificationResponse(_Base):
395
- """Response for vessel classification."""
396
-
397
- classification: ClassificationVessel | None = None
398
- meta: ResolutionMeta | None = Field(default=None, alias="_meta")
399
-
400
-
401
202
  class VesselEmission(_Base):
402
203
  """A vessel emission record (EU MRV data)."""
403
204
 
@@ -474,136 +275,12 @@ class VesselETAResponse(_Base):
474
275
 
475
276
  class PortInboundResponse(_Base):
476
277
  """Response containing vessels heading to a port."""
278
+
477
279
  vessel_etas: list[VesselETA] | None = Field(default=None, alias="vesselETAs")
478
280
  next_token: str | None = Field(default=None, alias="nextToken")
479
281
 
480
282
 
481
283
  # ---------------------------------------------------------------------------
482
- # Inspection models
483
- # ---------------------------------------------------------------------------
484
-
485
-
486
- class InspectionRecord(_Base):
487
- """A port-state control inspection record (from types.Inspection)."""
488
-
489
- authority: str | None = None
490
- deficiencies: int | None = None
491
- detail_id: str | None = None
492
- detained: bool | None = None
493
- imo: int | None = None
494
- inspection_date: str | None = None
495
- inspection_type: str | None = None
496
- mou_region: str | None = None
497
- port: str | None = None
498
-
499
-
500
- # Keep ``Inspection`` as an alias so existing imports keep working.
501
- Inspection = InspectionRecord
502
-
503
-
504
- class InspectionDeficiency(_Base):
505
- """A deficiency entry from an inspection detail."""
506
-
507
- category: str | None = None
508
- count: int | None = None
509
- deficiency: str | None = None
510
-
511
-
512
- class InspectionDetailRecord(_Base):
513
- """Detailed inspection record with deficiency breakdown."""
514
-
515
- authority: str | None = None
516
- deficiencies: list[InspectionDeficiency] | None = None
517
- deficiency_count: int | None = None
518
- detail_id: str | None = None
519
- detained: bool | None = None
520
- detention_grounds: list[InspectionDeficiency] | None = None
521
- imo: int | None = None
522
- inspection_date: str | None = None
523
- inspection_type: str | None = None
524
- mou_region: str | None = None
525
- port: str | None = None
526
-
527
-
528
- # Keep ``InspectionDetail`` as an alias so existing imports keep working.
529
- InspectionDetail = InspectionDetailRecord
530
-
531
-
532
- class InspectionsResponseData(_Base):
533
- """Inner data of the inspections response (types.InspectionsResponse)."""
534
-
535
- cached_at: str | None = None
536
- imo: int | None = None
537
- inspection_count: int | None = None
538
- inspections: list[InspectionRecord] | None = None
539
-
540
-
541
- class TypesInspectionsResponse(_Base):
542
- """Response for vessel inspections (wraps InspectionsResponseData)."""
543
-
544
- cached_at: str | None = None
545
- imo: int | None = None
546
- inspection_count: int | None = None
547
- inspections: list[InspectionRecord] | None = None
548
-
549
-
550
- class InspectionDetailResponseData(_Base):
551
- """Inner data of the inspection detail response."""
552
-
553
- cached_at: str | None = None
554
- detail_id: str | None = None
555
- imo: int | None = None
556
- inspection_detail: InspectionDetailRecord | None = None
557
-
558
-
559
- class TypesInspectionDetailResponse(_Base):
560
- """Response for a detailed inspection."""
561
-
562
- cached_at: str | None = None
563
- detail_id: str | None = None
564
- imo: int | None = None
565
- inspection_detail: InspectionDetailRecord | None = None
566
-
567
-
568
- # ---------------------------------------------------------------------------
569
- # Ownership models
570
- # ---------------------------------------------------------------------------
571
-
572
-
573
- class VesselOwnership(_Base):
574
- """Vessel ownership and management details."""
575
-
576
- doc_company: str | None = None
577
- doc_company_address: str | None = None
578
- imo: int | None = None
579
- registered_owner: str | None = None
580
- registered_owner_address: str | None = None
581
- ship_manager: str | None = None
582
- ship_manager_address: str | None = None
583
-
584
-
585
- # Keep ``Ownership`` as an alias so existing imports keep working.
586
- Ownership = VesselOwnership
587
-
588
-
589
- class OwnershipResponseData(_Base):
590
- """Inner data of the ownership response (types.OwnershipResponse)."""
591
-
592
- cached_at: str | None = None
593
- imo: int | None = None
594
- ownership: VesselOwnership | None = None
595
-
596
-
597
- class TypesOwnershipResponse(_Base):
598
- """Response for vessel ownership."""
599
-
600
- cached_at: str | None = None
601
- imo: int | None = None
602
- ownership: VesselOwnership | None = None
603
-
604
-
605
- # ---------------------------------------------------------------------------
606
- # Port models
607
284
  # ---------------------------------------------------------------------------
608
285
 
609
286
 
@@ -674,9 +351,7 @@ class PortEvent(_Base):
674
351
  class PortEventsResponse(_Base):
675
352
  """Response for port events list."""
676
353
 
677
- port_events: list[PortEvent] | None = Field(
678
- default=None, alias="portEvents"
679
- )
354
+ port_events: list[PortEvent] | None = Field(default=None, alias="portEvents")
680
355
  next_token: str | None = Field(default=None, alias="nextToken")
681
356
  meta: ResolutionMeta | None = Field(default=None, alias="_meta")
682
357
 
@@ -693,11 +368,24 @@ class PortEventResponse(_Base):
693
368
  # ---------------------------------------------------------------------------
694
369
 
695
370
 
371
+ class VesselSearchMeta(_Base):
372
+ """Metadata about which fields matched a vessel search query.
373
+
374
+ ``matched_on`` maps the index of a vessel in the ``vessels`` array to the
375
+ fields that matched it, e.g. ``{"0": ["eni"], "1": ["imo"]}``. Values are
376
+ arrays because one vessel can match on several fields at once.
377
+ """
378
+
379
+ matched_on: dict[str, list[str]] | None = Field(default=None, alias="matchedOn")
380
+ query: str | None = None
381
+
382
+
696
383
  class FindVesselsResponse(_Base):
697
384
  """Response for vessel search."""
698
385
 
699
386
  vessels: list[Vessel] | None = None
700
387
  next_token: str | None = Field(default=None, alias="nextToken")
388
+ meta: VesselSearchMeta | None = Field(default=None, alias="_meta")
701
389
 
702
390
 
703
391
  class FindPortsResponse(_Base):
@@ -735,9 +423,7 @@ class DGPSStation(_Base):
735
423
  class FindDGPSStationsResponse(_Base):
736
424
  """Response for DGPS station search."""
737
425
 
738
- dgps_stations: list[DGPSStation] | None = Field(
739
- default=None, alias="dgpsStations"
740
- )
426
+ dgps_stations: list[DGPSStation] | None = Field(default=None, alias="dgpsStations")
741
427
  next_token: str | None = Field(default=None, alias="nextToken")
742
428
 
743
429
 
@@ -828,9 +514,7 @@ class RadioBeacon(_Base):
828
514
  class FindRadioBeaconsResponse(_Base):
829
515
  """Response for radio beacon search."""
830
516
 
831
- radio_beacons: list[RadioBeacon] | None = Field(
832
- default=None, alias="radioBeacons"
833
- )
517
+ radio_beacons: list[RadioBeacon] | None = Field(default=None, alias="radioBeacons")
834
518
  next_token: str | None = Field(default=None, alias="nextToken")
835
519
 
836
520
 
@@ -856,9 +540,7 @@ class PortsWithinLocationResponse(_Base):
856
540
  class DGPSStationsWithinLocationResponse(_Base):
857
541
  """Response for DGPS station location queries."""
858
542
 
859
- dgps_stations: list[DGPSStation] | None = Field(
860
- default=None, alias="dgpsStations"
861
- )
543
+ dgps_stations: list[DGPSStation] | None = Field(default=None, alias="dgpsStations")
862
544
  next_token: str | None = Field(default=None, alias="nextToken")
863
545
 
864
546
 
@@ -879,37 +561,9 @@ class MODUsWithinLocationResponse(_Base):
879
561
  class RadioBeaconsWithinLocationResponse(_Base):
880
562
  """Response for radio beacon location queries."""
881
563
 
882
- radio_beacons: list[RadioBeacon] | None = Field(
883
- default=None, alias="radioBeacons"
884
- )
564
+ radio_beacons: list[RadioBeacon] | None = Field(default=None, alias="radioBeacons")
885
565
  next_token: str | None = Field(default=None, alias="nextToken")
886
566
 
887
567
 
888
568
  # ---------------------------------------------------------------------------
889
- # Navtex models
890
569
  # ---------------------------------------------------------------------------
891
-
892
-
893
- class Navtex(_Base):
894
- """A NAVTEX maritime safety message."""
895
-
896
- issuing_office: str | None = None
897
- label: str | None = None
898
- lines: list[str] | None = None
899
- metarea_coordinator: str | None = None
900
- metarea_id: str | None = None
901
- metarea_name: str | None = None
902
- metarea_region: str | None = None
903
- metarea_stations: list[BroadcastStation] | None = None
904
- raw_content: str | None = None
905
- timestamp: str | None = None
906
- wmo_header: str | None = None
907
-
908
-
909
- class NavtexMessagesResponse(_Base):
910
- """Response for NAVTEX messages list."""
911
-
912
- navtex_messages: list[Navtex] | None = Field(
913
- default=None, alias="navtexMessages"
914
- )
915
- next_token: str | None = Field(default=None, alias="nextToken")