clarity-api-sdk-python 0.2.12__tar.gz → 0.3.23__tar.gz

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.
Files changed (61) hide show
  1. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/PKG-INFO +20 -1
  2. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/README.md +7 -0
  3. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/pyproject.toml +17 -1
  4. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/clarity_api_sdk_python.egg-info/PKG-INFO +20 -1
  5. clarity_api_sdk_python-0.3.23/src/clarity_api_sdk_python.egg-info/SOURCES.txt +57 -0
  6. clarity_api_sdk_python-0.3.23/src/clarity_api_sdk_python.egg-info/requires.txt +25 -0
  7. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/cti/api/session.py +22 -5
  8. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/cti/logger/logger.py +22 -12
  9. clarity_api_sdk_python-0.3.23/src/cti/main_api.py +24 -0
  10. clarity_api_sdk_python-0.3.23/src/cti/model/__init__.py +28 -0
  11. clarity_api_sdk_python-0.3.23/src/cti/model/altitude_source.py +66 -0
  12. clarity_api_sdk_python-0.3.23/src/cti/model/attitude_source.py +94 -0
  13. clarity_api_sdk_python-0.3.23/src/cti/model/deferred_object_deletion.py +36 -0
  14. clarity_api_sdk_python-0.3.23/src/cti/model/depth_source.py +86 -0
  15. clarity_api_sdk_python-0.3.23/src/cti/model/device.py +92 -0
  16. clarity_api_sdk_python-0.3.23/src/cti/model/device_type.py +66 -0
  17. clarity_api_sdk_python-0.3.23/src/cti/model/final_product.py +66 -0
  18. clarity_api_sdk_python-0.3.23/src/cti/model/hierarchy.py +39 -0
  19. clarity_api_sdk_python-0.3.23/src/cti/model/layback_algorithm.py +47 -0
  20. clarity_api_sdk_python-0.3.23/src/cti/model/layback_source.py +68 -0
  21. clarity_api_sdk_python-0.3.23/src/cti/model/layback_type.py +47 -0
  22. clarity_api_sdk_python-0.3.23/src/cti/model/organization.py +42 -0
  23. clarity_api_sdk_python-0.3.23/src/cti/model/platform.py +55 -0
  24. clarity_api_sdk_python-0.3.23/src/cti/model/platform_type.py +53 -0
  25. clarity_api_sdk_python-0.3.23/src/cti/model/position_source.py +85 -0
  26. clarity_api_sdk_python-0.3.23/src/cti/model/processed_altitude.py +52 -0
  27. clarity_api_sdk_python-0.3.23/src/cti/model/processed_attitude.py +60 -0
  28. clarity_api_sdk_python-0.3.23/src/cti/model/processed_depth.py +66 -0
  29. clarity_api_sdk_python-0.3.23/src/cti/model/processed_layback.py +66 -0
  30. clarity_api_sdk_python-0.3.23/src/cti/model/processed_position.py +78 -0
  31. clarity_api_sdk_python-0.3.23/src/cti/model/processed_sidescan_ping.py +68 -0
  32. clarity_api_sdk_python-0.3.23/src/cti/model/processing_log.py +70 -0
  33. clarity_api_sdk_python-0.3.23/src/cti/model/project.py +52 -0
  34. clarity_api_sdk_python-0.3.23/src/cti/model/projection_option.py +42 -0
  35. clarity_api_sdk_python-0.3.23/src/cti/model/raw_altitude.py +66 -0
  36. clarity_api_sdk_python-0.3.23/src/cti/model/raw_attitude.py +78 -0
  37. clarity_api_sdk_python-0.3.23/src/cti/model/raw_depth.py +66 -0
  38. clarity_api_sdk_python-0.3.23/src/cti/model/raw_file.py +98 -0
  39. clarity_api_sdk_python-0.3.23/src/cti/model/raw_file_configuration.py +47 -0
  40. clarity_api_sdk_python-0.3.23/src/cti/model/raw_file_device_mapping.py +69 -0
  41. clarity_api_sdk_python-0.3.23/src/cti/model/raw_file_state.py +12 -0
  42. clarity_api_sdk_python-0.3.23/src/cti/model/raw_layback.py +66 -0
  43. clarity_api_sdk_python-0.3.23/src/cti/model/raw_position.py +114 -0
  44. clarity_api_sdk_python-0.3.23/src/cti/model/raw_sidescan_ping.py +67 -0
  45. clarity_api_sdk_python-0.3.23/src/cti/model/s3.py +51 -0
  46. clarity_api_sdk_python-0.3.23/src/cti/model/sidescan_ping_source.py +106 -0
  47. clarity_api_sdk_python-0.3.23/src/cti/model/source.py +49 -0
  48. clarity_api_sdk_python-0.3.23/src/cti/model/survey.py +70 -0
  49. clarity_api_sdk_python-0.3.23/src/cti/model/target.py +55 -0
  50. clarity_api_sdk_python-0.3.23/src/cti/model/tow_system.py +49 -0
  51. clarity_api_sdk_python-0.2.12/src/clarity_api_sdk_python.egg-info/SOURCES.txt +0 -15
  52. clarity_api_sdk_python-0.2.12/src/clarity_api_sdk_python.egg-info/requires.txt +0 -12
  53. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/setup.cfg +0 -0
  54. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/clarity_api_sdk_python.egg-info/dependency_links.txt +0 -0
  55. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/clarity_api_sdk_python.egg-info/top_level.txt +0 -0
  56. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/cti/__init__.py +0 -0
  57. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/cti/api/__init__.py +0 -0
  58. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/cti/api/async_client.py +0 -0
  59. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/cti/api/client.py +0 -0
  60. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/cti/logger/__init__.py +0 -0
  61. {clarity_api_sdk_python-0.2.12 → clarity_api_sdk_python-0.3.23}/src/cti/main.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clarity-api-sdk-python
3
- Version: 0.2.12
3
+ Version: 0.3.23
4
4
  Summary: A Python SDK to connect to the CTI Clarity API server.
5
5
  Author-email: "Chesapeake Technology Inc." <support@chesapeaketech.com>
6
6
  Project-URL: Homepage, https://github.com/chesapeake-tech/clarity-api-sdk-python
@@ -14,7 +14,19 @@ Requires-Dist: brotli
14
14
  Requires-Dist: h2
15
15
  Requires-Dist: httpx_auth>=0.23.1
16
16
  Requires-Dist: httpx-retries>=0.4.5
17
+ Requires-Dist: pydantic==2.12.3
17
18
  Requires-Dist: structlog
19
+ Provides-Extra: dev
20
+ Requires-Dist: black==25.9.0; extra == "dev"
21
+ Requires-Dist: build==1.3.0; extra == "dev"
22
+ Requires-Dist: mypy==1.18.2; extra == "dev"
23
+ Requires-Dist: pre-commit==4.3.0; extra == "dev"
24
+ Requires-Dist: pylint==3.3.8; extra == "dev"
25
+ Requires-Dist: pytest==8.4.2; extra == "dev"
26
+ Requires-Dist: pytest-asyncio==1.3.0; extra == "dev"
27
+ Requires-Dist: pytest-md==0.2.0; extra == "dev"
28
+ Requires-Dist: pytest-mock==3.15.1; extra == "dev"
29
+ Requires-Dist: twine==6.2.0; extra == "dev"
18
30
  Provides-Extra: brotli
19
31
  Requires-Dist: httpx[brotli]>=0.28.1; extra == "brotli"
20
32
  Provides-Extra: http2
@@ -76,8 +88,15 @@ logger_a.warning("This is a new warning message from logger_a.")
76
88
 
77
89
  logger_b.info("This info message from logger_b should NOT be visible.")
78
90
  logger_b.warning("This is warning message from logger_b")
91
+
92
+ # the value will be redacted
93
+ logger_b.info("password", extra={"aws_access_key_id", "AKIAIOSFODNN7EXAMPLE"})
79
94
  ```
80
95
 
96
+ ## Model
97
+
98
+ Pydantic models.
99
+
81
100
  ## API
82
101
 
83
102
  ### Singleton async client
@@ -54,8 +54,15 @@ logger_a.warning("This is a new warning message from logger_a.")
54
54
 
55
55
  logger_b.info("This info message from logger_b should NOT be visible.")
56
56
  logger_b.warning("This is warning message from logger_b")
57
+
58
+ # the value will be redacted
59
+ logger_b.info("password", extra={"aws_access_key_id", "AKIAIOSFODNN7EXAMPLE"})
57
60
  ```
58
61
 
62
+ ## Model
63
+
64
+ Pydantic models.
65
+
59
66
  ## API
60
67
 
61
68
  ### Singleton async client
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "clarity-api-sdk-python"
8
- version = "0.2.12"
8
+ version = "0.3.23"
9
9
  authors = [
10
10
  { name="Chesapeake Technology Inc.", email="support@chesapeaketech.com" },
11
11
  ]
@@ -23,10 +23,23 @@ dependencies = [
23
23
  "h2",
24
24
  "httpx_auth>=0.23.1",
25
25
  "httpx-retries>=0.4.5",
26
+ "pydantic==2.12.3",
26
27
  "structlog",
27
28
  ]
28
29
 
29
30
  [project.optional-dependencies]
31
+ dev = [
32
+ "black==25.9.0",
33
+ "build==1.3.0",
34
+ "mypy==1.18.2",
35
+ "pre-commit==4.3.0",
36
+ "pylint==3.3.8",
37
+ "pytest==8.4.2",
38
+ "pytest-asyncio==1.3.0",
39
+ "pytest-md==0.2.0",
40
+ "pytest-mock==3.15.1",
41
+ "twine==6.2.0"
42
+ ]
30
43
  brotli = ["httpx[brotli]>=0.28.1"]
31
44
  http2 = ["httpx[http2]>=0.28.1"]
32
45
 
@@ -35,3 +48,6 @@ http2 = ["httpx[http2]>=0.28.1"]
35
48
 
36
49
  [tool.setuptools.packages.find]
37
50
  where = ["src"]
51
+
52
+ [tool.pylint.main]
53
+ max-line-length = 150
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clarity-api-sdk-python
3
- Version: 0.2.12
3
+ Version: 0.3.23
4
4
  Summary: A Python SDK to connect to the CTI Clarity API server.
5
5
  Author-email: "Chesapeake Technology Inc." <support@chesapeaketech.com>
6
6
  Project-URL: Homepage, https://github.com/chesapeake-tech/clarity-api-sdk-python
@@ -14,7 +14,19 @@ Requires-Dist: brotli
14
14
  Requires-Dist: h2
15
15
  Requires-Dist: httpx_auth>=0.23.1
16
16
  Requires-Dist: httpx-retries>=0.4.5
17
+ Requires-Dist: pydantic==2.12.3
17
18
  Requires-Dist: structlog
19
+ Provides-Extra: dev
20
+ Requires-Dist: black==25.9.0; extra == "dev"
21
+ Requires-Dist: build==1.3.0; extra == "dev"
22
+ Requires-Dist: mypy==1.18.2; extra == "dev"
23
+ Requires-Dist: pre-commit==4.3.0; extra == "dev"
24
+ Requires-Dist: pylint==3.3.8; extra == "dev"
25
+ Requires-Dist: pytest==8.4.2; extra == "dev"
26
+ Requires-Dist: pytest-asyncio==1.3.0; extra == "dev"
27
+ Requires-Dist: pytest-md==0.2.0; extra == "dev"
28
+ Requires-Dist: pytest-mock==3.15.1; extra == "dev"
29
+ Requires-Dist: twine==6.2.0; extra == "dev"
18
30
  Provides-Extra: brotli
19
31
  Requires-Dist: httpx[brotli]>=0.28.1; extra == "brotli"
20
32
  Provides-Extra: http2
@@ -76,8 +88,15 @@ logger_a.warning("This is a new warning message from logger_a.")
76
88
 
77
89
  logger_b.info("This info message from logger_b should NOT be visible.")
78
90
  logger_b.warning("This is warning message from logger_b")
91
+
92
+ # the value will be redacted
93
+ logger_b.info("password", extra={"aws_access_key_id", "AKIAIOSFODNN7EXAMPLE"})
79
94
  ```
80
95
 
96
+ ## Model
97
+
98
+ Pydantic models.
99
+
81
100
  ## API
82
101
 
83
102
  ### Singleton async client
@@ -0,0 +1,57 @@
1
+ README.md
2
+ pyproject.toml
3
+ src/clarity_api_sdk_python.egg-info/PKG-INFO
4
+ src/clarity_api_sdk_python.egg-info/SOURCES.txt
5
+ src/clarity_api_sdk_python.egg-info/dependency_links.txt
6
+ src/clarity_api_sdk_python.egg-info/requires.txt
7
+ src/clarity_api_sdk_python.egg-info/top_level.txt
8
+ src/cti/__init__.py
9
+ src/cti/main.py
10
+ src/cti/main_api.py
11
+ src/cti/api/__init__.py
12
+ src/cti/api/async_client.py
13
+ src/cti/api/client.py
14
+ src/cti/api/session.py
15
+ src/cti/logger/__init__.py
16
+ src/cti/logger/logger.py
17
+ src/cti/model/__init__.py
18
+ src/cti/model/altitude_source.py
19
+ src/cti/model/attitude_source.py
20
+ src/cti/model/deferred_object_deletion.py
21
+ src/cti/model/depth_source.py
22
+ src/cti/model/device.py
23
+ src/cti/model/device_type.py
24
+ src/cti/model/final_product.py
25
+ src/cti/model/hierarchy.py
26
+ src/cti/model/layback_algorithm.py
27
+ src/cti/model/layback_source.py
28
+ src/cti/model/layback_type.py
29
+ src/cti/model/organization.py
30
+ src/cti/model/platform.py
31
+ src/cti/model/platform_type.py
32
+ src/cti/model/position_source.py
33
+ src/cti/model/processed_altitude.py
34
+ src/cti/model/processed_attitude.py
35
+ src/cti/model/processed_depth.py
36
+ src/cti/model/processed_layback.py
37
+ src/cti/model/processed_position.py
38
+ src/cti/model/processed_sidescan_ping.py
39
+ src/cti/model/processing_log.py
40
+ src/cti/model/project.py
41
+ src/cti/model/projection_option.py
42
+ src/cti/model/raw_altitude.py
43
+ src/cti/model/raw_attitude.py
44
+ src/cti/model/raw_depth.py
45
+ src/cti/model/raw_file.py
46
+ src/cti/model/raw_file_configuration.py
47
+ src/cti/model/raw_file_device_mapping.py
48
+ src/cti/model/raw_file_state.py
49
+ src/cti/model/raw_layback.py
50
+ src/cti/model/raw_position.py
51
+ src/cti/model/raw_sidescan_ping.py
52
+ src/cti/model/s3.py
53
+ src/cti/model/sidescan_ping_source.py
54
+ src/cti/model/source.py
55
+ src/cti/model/survey.py
56
+ src/cti/model/target.py
57
+ src/cti/model/tow_system.py
@@ -0,0 +1,25 @@
1
+ httpx>=0.28.1
2
+ brotli
3
+ h2
4
+ httpx_auth>=0.23.1
5
+ httpx-retries>=0.4.5
6
+ pydantic==2.12.3
7
+ structlog
8
+
9
+ [brotli]
10
+ httpx[brotli]>=0.28.1
11
+
12
+ [dev]
13
+ black==25.9.0
14
+ build==1.3.0
15
+ mypy==1.18.2
16
+ pre-commit==4.3.0
17
+ pylint==3.3.8
18
+ pytest==8.4.2
19
+ pytest-asyncio==1.3.0
20
+ pytest-md==0.2.0
21
+ pytest-mock==3.15.1
22
+ twine==6.2.0
23
+
24
+ [http2]
25
+ httpx[http2]>=0.28.1
@@ -19,12 +19,11 @@ Example:
19
19
  asyncio.run(main())
20
20
 
21
21
  # In other modules
22
- from cti.api.session import async_client
22
+ from cti.api.session import get_async_client
23
23
 
24
24
  async def fetch_data():
25
- if async_client:
26
- response = await async_client.get(...)
27
- return response.json()
25
+ response = await get_async_client().get(...)
26
+ return response.json()
28
27
  """
29
28
 
30
29
  # pylint: disable=global-statement, unnecessary-dunder-call
@@ -32,7 +31,7 @@ Example:
32
31
  from cti.api.async_client import ClarityApiAsyncClient
33
32
 
34
33
  # The singleton instance, initially None.
35
- async_client: ClarityApiAsyncClient | None
34
+ async_client: ClarityApiAsyncClient | None = None
36
35
 
37
36
 
38
37
  async def initialize_async_client() -> None:
@@ -47,6 +46,24 @@ async def initialize_async_client() -> None:
47
46
  await async_client.__aenter__()
48
47
 
49
48
 
49
+ def get_async_client() -> ClarityApiAsyncClient:
50
+ """Returns the shared ClarityApiAsyncClient instance.
51
+
52
+ If the client is not initialized, this function initializes it first.
53
+
54
+ Returns:
55
+ ClarityApiAsyncClient: The shared ClarityApiAsyncClient instance.
56
+
57
+ Raises:
58
+ ValueError: If initialize_async_client() has not been called first.
59
+ """
60
+ if async_client is None:
61
+ raise ValueError(
62
+ "initialize_async_client() must be called first to initialize client."
63
+ )
64
+ return async_client
65
+
66
+
50
67
  async def close_async_client() -> None:
51
68
  """Closes the shared ClarityApiAsyncClient instance.
52
69
 
@@ -143,7 +143,23 @@ def _secret_redaction_processor(_, __, event_dict):
143
143
  Returns:
144
144
  structlog.typing.EventDict: The processed event dictionary.
145
145
  """
146
- sensitive_keys = ["password", "api_key", "token", "SecretString"]
146
+ sensitive_keys = {
147
+ "access_token",
148
+ "api_key",
149
+ "auth",
150
+ "authorization",
151
+ "aws_access_key_id",
152
+ "aws_secret_access_key",
153
+ "aws_session_token",
154
+ "credentials",
155
+ "key",
156
+ "keycloak_client_id",
157
+ "keycloak_client_secret",
158
+ "password",
159
+ "secret",
160
+ "secretstring",
161
+ "token",
162
+ }
147
163
 
148
164
  def redact_dict(data):
149
165
  """Recursively redact sensitive keys in nested dictionaries.
@@ -155,22 +171,16 @@ def _secret_redaction_processor(_, __, event_dict):
155
171
  dict: The redacted dictionary.
156
172
  """
157
173
  if isinstance(data, dict):
158
- for key, value in data.items():
159
- if key in sensitive_keys:
174
+ # Use a copy of items to allow modification during iteration
175
+ for key, value in list(data.items()):
176
+ if key.lower() in sensitive_keys:
160
177
  data[key] = "[REDACTED]"
161
178
  elif isinstance(value, dict):
162
179
  redact_dict(value)
163
180
  return data
164
181
 
165
- # Redact top-level sensitive keys
166
- for key in sensitive_keys:
167
- if key in event_dict:
168
- event_dict[key] = "[REDACTED]"
169
-
170
- # Check for nested dictionaries and redact them
171
- for key, value in event_dict.items():
172
- if isinstance(value, dict):
173
- redact_dict(value)
182
+ # Redact top-level and nested keys
183
+ redact_dict(event_dict)
174
184
 
175
185
  return event_dict
176
186
 
@@ -0,0 +1,24 @@
1
+ """Example"""
2
+
3
+ import asyncio
4
+
5
+ from cti.api.session import (
6
+ get_async_client,
7
+ close_async_client,
8
+ initialize_async_client,
9
+ )
10
+
11
+
12
+ async def main():
13
+ """Example of using the Clarity API asynchronously"""
14
+ try:
15
+ await initialize_async_client()
16
+ client = get_async_client()
17
+ response = await client.get(url="/api/v1/status")
18
+ print(response.json())
19
+ finally:
20
+ await close_async_client()
21
+
22
+
23
+ if __name__ == "__main__":
24
+ asyncio.run(main())
@@ -0,0 +1,28 @@
1
+ """Pydantic models for CTI objects."""
2
+
3
+ import inspect
4
+ import pkgutil
5
+ from importlib import import_module
6
+
7
+ __all__ = []
8
+
9
+ # Iterate over all modules in the current package
10
+ for loader, name, is_pkg in pkgutil.iter_modules(__path__):
11
+ if not is_pkg:
12
+ # Import the module
13
+ module = import_module(f".{name}", __package__)
14
+ # Find all public classes in the module
15
+ for class_name, class_obj in inspect.getmembers(module, inspect.isclass):
16
+ # Check if the class is defined in this module (not imported)
17
+ # and if it's a public class (doesn't start with an underscore)
18
+ if class_obj.__module__ == module.__name__ and not class_name.startswith(
19
+ "_"
20
+ ):
21
+ # Add the class to globals() to make it importable from the package
22
+ globals()[class_name] = class_obj
23
+ # Add the class name to __all__
24
+ if class_name not in __all__:
25
+ __all__.append(class_name) # type: ignore
26
+
27
+ # Sort __all__ for consistency
28
+ __all__.sort() # type: ignore
@@ -0,0 +1,66 @@
1
+ """Pydantic models for altitude source data."""
2
+
3
+ from datetime import datetime
4
+ from uuid import UUID
5
+
6
+ from pydantic import BaseModel, ConfigDict
7
+
8
+
9
+ class AltitudeSourceBase(BaseModel):
10
+ """Base model for altitude source data.
11
+
12
+ Attributes:
13
+ input_timezone: Input timezone string.
14
+ start_time: Start timestamp.
15
+ end_time: End timestamp.
16
+ channels: Number of channels.
17
+ """
18
+
19
+ input_timezone: str
20
+ start_time: datetime
21
+ end_time: datetime
22
+ channels: int
23
+
24
+
25
+ class AltitudeSourceCreate(AltitudeSourceBase):
26
+ """Model for creating altitude source data.
27
+
28
+ Attributes:
29
+ device_id: Foreign key reference to Device.
30
+ source_id: Foreign key reference to Source.
31
+ """
32
+
33
+ device_id: UUID
34
+ source_id: UUID
35
+
36
+
37
+ class AltitudeSourceUpdate(BaseModel):
38
+ """Model for updating altitude source data.
39
+
40
+ Attributes:
41
+ input_timezone: Input timezone string.
42
+ start_time: Start timestamp.
43
+ end_time: End timestamp.
44
+ channels: Number of channels.
45
+ """
46
+
47
+ input_timezone: str | None = None
48
+ start_time: datetime | None = None
49
+ end_time: datetime | None = None
50
+ channels: int | None = None
51
+
52
+
53
+ class AltitudeSource(AltitudeSourceBase):
54
+ """Model for altitude source data with database fields.
55
+
56
+ Attributes:
57
+ altitude_source_id: Unique identifier for the altitude source.
58
+ device_id: Foreign key reference to Device.
59
+ source_id: Foreign key reference to Source.
60
+ """
61
+
62
+ altitude_source_id: UUID
63
+ device_id: UUID
64
+ source_id: UUID
65
+
66
+ model_config = ConfigDict(from_attributes=True)
@@ -0,0 +1,94 @@
1
+ """Pydantic models for attitude source data."""
2
+
3
+ from datetime import datetime
4
+ from uuid import UUID
5
+
6
+ from pydantic import BaseModel, ConfigDict
7
+
8
+
9
+ class AttitudeSourceBase(BaseModel):
10
+ """Base model for attitude source data.
11
+
12
+ Attributes:
13
+ input_timezone: Input timezone string.
14
+ channels: Number of channels.
15
+ start_time: Start timestamp.
16
+ end_time: End timestamp.
17
+ sample_rate: Sample rate in Hz.
18
+ projection_option: Foreign key reference to ProjectionOption.
19
+ apply_pitch: Whether to apply pitch correction.
20
+ offset_roll: Roll offset value.
21
+ offset_pitch: Pitch offset value.
22
+ offset_heading: Heading offset value.
23
+ offset_time: Time offset value.
24
+ """
25
+
26
+ input_timezone: str
27
+ channels: int
28
+ start_time: datetime
29
+ end_time: datetime
30
+ sample_rate: float | None = None
31
+ projection_option: UUID
32
+ apply_pitch: bool | None = None
33
+ offset_roll: float | None = None
34
+ offset_pitch: float | None = None
35
+ offset_heading: float | None = None
36
+ offset_time: float | None = None
37
+
38
+
39
+ class AttitudeSourceCreate(AttitudeSourceBase):
40
+ """Model for creating attitude source data.
41
+
42
+ Attributes:
43
+ device_id: Foreign key reference to Device.
44
+ source_id: Foreign key reference to Source.
45
+ """
46
+
47
+ device_id: UUID
48
+ source_id: UUID
49
+
50
+
51
+ class AttitudeSourceUpdate(BaseModel):
52
+ """Model for updating attitude source data.
53
+
54
+ Attributes:
55
+ input_timezone: Input timezone string.
56
+ channels: Number of channels.
57
+ start_time: Start timestamp.
58
+ end_time: End timestamp.
59
+ sample_rate: Sample rate in Hz.
60
+ projection_option: Foreign key reference to ProjectionOption.
61
+ apply_pitch: Whether to apply pitch correction.
62
+ offset_roll: Roll offset value.
63
+ offset_pitch: Pitch offset value.
64
+ offset_heading: Heading offset value.
65
+ offset_time: Time offset value.
66
+ """
67
+
68
+ input_timezone: str | None = None
69
+ channels: int | None = None
70
+ start_time: datetime | None = None
71
+ end_time: datetime | None = None
72
+ sample_rate: float | None = None
73
+ projection_option: UUID | None = None
74
+ apply_pitch: bool | None = None
75
+ offset_roll: float | None = None
76
+ offset_pitch: float | None = None
77
+ offset_heading: float | None = None
78
+ offset_time: float | None = None
79
+
80
+
81
+ class AttitudeSource(AttitudeSourceBase):
82
+ """Model for attitude source data with database fields.
83
+
84
+ Attributes:
85
+ attitude_source_id: Unique identifier for the attitude source.
86
+ device_id: Foreign key reference to Device.
87
+ source_id: Foreign key reference to Source.
88
+ """
89
+
90
+ attitude_source_id: UUID
91
+ device_id: UUID
92
+ source_id: UUID
93
+
94
+ model_config = ConfigDict(from_attributes=True)
@@ -0,0 +1,36 @@
1
+ """Pydantic models for deferred object deletion."""
2
+
3
+ from datetime import datetime
4
+ from uuid import UUID
5
+
6
+ from pydantic import BaseModel, ConfigDict
7
+
8
+
9
+ class DeferredObjectDeletionBase(BaseModel):
10
+ """Base model for deferred object deletion.
11
+
12
+ Attributes:
13
+ uri: URI for AWS S3 object, Azure Storage Blob, etc.
14
+ """
15
+
16
+ uri: str
17
+
18
+
19
+ class DeferredObjectDeletionCreate(DeferredObjectDeletionBase):
20
+ """Model for creating a deferred object deletion entry."""
21
+
22
+
23
+ class DeferredObjectDeletion(DeferredObjectDeletionBase):
24
+ """Model for deferred object deletion data with database fields.
25
+
26
+ Attributes:
27
+ deferred_object_deletion_id: Unique identifier for the deferred object deletion.
28
+ updated_by: User who initiated the deletion.
29
+ created_date: Date and time when the deletion request was initiated.
30
+ """
31
+
32
+ deferred_object_deletion_id: UUID
33
+ updated_by: str
34
+ created_date: datetime
35
+
36
+ model_config = ConfigDict(from_attributes=True)
@@ -0,0 +1,86 @@
1
+ """Pydantic models for depth source data."""
2
+
3
+ from datetime import datetime
4
+ from uuid import UUID
5
+
6
+ from pydantic import BaseModel, ConfigDict
7
+
8
+
9
+ class DepthSourceBase(BaseModel):
10
+ """Base model for depth source data.
11
+
12
+ Attributes:
13
+ input_timezone: Input timezone string.
14
+ channels: Number of channels.
15
+ start_time: Start timestamp.
16
+ end_time: End timestamp.
17
+ records: Number of records.
18
+ sample_rate: Sample rate in Hz.
19
+ smoothing: Smoothing parameter.
20
+ offset_z: Z-axis offset.
21
+ offset_time: Time offset.
22
+ """
23
+
24
+ input_timezone: str
25
+ channels: int
26
+ start_time: datetime
27
+ end_time: datetime
28
+ records: int | None = None
29
+ sample_rate: float | None = None
30
+ smoothing: float | None = None
31
+ offset_z: float | None = None
32
+ offset_time: float | None = None
33
+
34
+
35
+ class DepthSourceCreate(DepthSourceBase):
36
+ """Model for creating depth source data.
37
+
38
+ Attributes:
39
+ device_id: Foreign key reference to Device.
40
+ source_id: Foreign key reference to Source.
41
+ """
42
+
43
+ device_id: UUID
44
+ source_id: UUID
45
+
46
+
47
+ class DepthSourceUpdate(BaseModel):
48
+ """Model for updating depth source data.
49
+
50
+ Attributes:
51
+ input_timezone: Input timezone string.
52
+ channels: Number of channels.
53
+ start_time: Start timestamp.
54
+ end_time: End timestamp.
55
+ records: Number of records.
56
+ sample_rate: Sample rate in Hz.
57
+ smoothing: Smoothing parameter.
58
+ offset_z: Z-axis offset.
59
+ offset_time: Time offset.
60
+ """
61
+
62
+ input_timezone: str | None = None
63
+ channels: int | None = None
64
+ start_time: datetime | None = None
65
+ end_time: datetime | None = None
66
+ records: int | None = None
67
+ sample_rate: float | None = None
68
+ smoothing: float | None = None
69
+ offset_z: float | None = None
70
+ offset_time: float | None = None
71
+
72
+
73
+ class DepthSource(DepthSourceBase):
74
+ """Model for depth source data with database fields.
75
+
76
+ Attributes:
77
+ depth_source_id: Unique identifier for the depth source.
78
+ device_id: Foreign key reference to Device.
79
+ source_id: Foreign key reference to Source.
80
+ """
81
+
82
+ depth_source_id: UUID
83
+ device_id: UUID
84
+ source_id: UUID
85
+
86
+ model_config = ConfigDict(from_attributes=True)