clarity-api-sdk-python 0.3.18__tar.gz → 0.3.20__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 (58) hide show
  1. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/PKG-INFO +4 -1
  2. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/README.md +3 -0
  3. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/pyproject.toml +1 -1
  4. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/clarity_api_sdk_python.egg-info/PKG-INFO +4 -1
  5. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/clarity_api_sdk_python.egg-info/SOURCES.txt +2 -0
  6. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/logger/logger.py +22 -12
  7. clarity_api_sdk_python-0.3.20/src/cti/model/deferred_object_deletion.py +36 -0
  8. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/raw_file.py +22 -17
  9. clarity_api_sdk_python-0.3.20/src/cti/model/raw_file_state.py +12 -0
  10. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/setup.cfg +0 -0
  11. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/clarity_api_sdk_python.egg-info/dependency_links.txt +0 -0
  12. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/clarity_api_sdk_python.egg-info/requires.txt +0 -0
  13. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/clarity_api_sdk_python.egg-info/top_level.txt +0 -0
  14. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/__init__.py +0 -0
  15. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/api/__init__.py +0 -0
  16. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/api/async_client.py +0 -0
  17. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/api/client.py +0 -0
  18. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/api/session.py +0 -0
  19. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/logger/__init__.py +0 -0
  20. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/main.py +0 -0
  21. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/main_api.py +0 -0
  22. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/__init__.py +0 -0
  23. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/altitude_source.py +0 -0
  24. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/attitude_source.py +0 -0
  25. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/depth_source.py +0 -0
  26. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/device.py +0 -0
  27. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/device_type.py +0 -0
  28. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/final_product.py +0 -0
  29. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/hierarchy.py +0 -0
  30. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/layback_algorithm.py +0 -0
  31. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/layback_source.py +0 -0
  32. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/layback_type.py +0 -0
  33. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/organization.py +0 -0
  34. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/platform.py +0 -0
  35. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/platform_type.py +0 -0
  36. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/position_source.py +0 -0
  37. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/processed_altitude.py +0 -0
  38. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/processed_attitude.py +0 -0
  39. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/processed_depth.py +0 -0
  40. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/processed_layback.py +0 -0
  41. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/processed_position.py +0 -0
  42. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/processed_sidescan_ping.py +0 -0
  43. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/processing_log.py +0 -0
  44. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/project.py +0 -0
  45. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/projection_option.py +0 -0
  46. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/raw_altitude.py +0 -0
  47. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/raw_attitude.py +0 -0
  48. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/raw_depth.py +0 -0
  49. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/raw_file_configuration.py +0 -0
  50. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/raw_layback.py +0 -0
  51. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/raw_position.py +0 -0
  52. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/raw_sidescan_ping.py +0 -0
  53. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/s3.py +0 -0
  54. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/sidescan_ping_source.py +0 -0
  55. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/source.py +0 -0
  56. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/survey.py +0 -0
  57. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/target.py +0 -0
  58. {clarity_api_sdk_python-0.3.18 → clarity_api_sdk_python-0.3.20}/src/cti/model/tow_system.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clarity-api-sdk-python
3
- Version: 0.3.18
3
+ Version: 0.3.20
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
@@ -88,6 +88,9 @@ logger_a.warning("This is a new warning message from logger_a.")
88
88
 
89
89
  logger_b.info("This info message from logger_b should NOT be visible.")
90
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"})
91
94
  ```
92
95
 
93
96
  ## Model
@@ -54,6 +54,9 @@ 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
 
59
62
  ## Model
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "clarity-api-sdk-python"
8
- version = "0.3.18"
8
+ version = "0.3.20"
9
9
  authors = [
10
10
  { name="Chesapeake Technology Inc.", email="support@chesapeaketech.com" },
11
11
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clarity-api-sdk-python
3
- Version: 0.3.18
3
+ Version: 0.3.20
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
@@ -88,6 +88,9 @@ logger_a.warning("This is a new warning message from logger_a.")
88
88
 
89
89
  logger_b.info("This info message from logger_b should NOT be visible.")
90
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"})
91
94
  ```
92
95
 
93
96
  ## Model
@@ -17,6 +17,7 @@ src/cti/logger/logger.py
17
17
  src/cti/model/__init__.py
18
18
  src/cti/model/altitude_source.py
19
19
  src/cti/model/attitude_source.py
20
+ src/cti/model/deferred_object_deletion.py
20
21
  src/cti/model/depth_source.py
21
22
  src/cti/model/device.py
22
23
  src/cti/model/device_type.py
@@ -43,6 +44,7 @@ src/cti/model/raw_attitude.py
43
44
  src/cti/model/raw_depth.py
44
45
  src/cti/model/raw_file.py
45
46
  src/cti/model/raw_file_configuration.py
47
+ src/cti/model/raw_file_state.py
46
48
  src/cti/model/raw_layback.py
47
49
  src/cti/model/raw_position.py
48
50
  src/cti/model/raw_sidescan_ping.py
@@ -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", "key", "auth"]
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,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)
@@ -1,18 +1,11 @@
1
1
  """Pydantic models for raw file. This is the data that has been uploaded but not ingested into the database."""
2
2
 
3
3
  from datetime import datetime
4
- from enum import Enum
5
4
  from uuid import UUID
6
5
 
7
6
  from pydantic import BaseModel, ConfigDict, field_validator
8
7
 
9
-
10
- class RawFileState(str, Enum):
11
- """State of a raw file upload."""
12
-
13
- UPLOADING = "uploading"
14
- READY = "ready"
15
- ERROR = "error"
8
+ from model.raw_file_state import RawFileState
16
9
 
17
10
 
18
11
  class RawFileBase(BaseModel):
@@ -52,17 +45,9 @@ class RawFileBase(BaseModel):
52
45
  class RawFileCreate(RawFileBase):
53
46
  """Model for creating raw file data (with survey_id in body)."""
54
47
 
55
-
56
48
  class RawFileUpdate(RawFileBase):
57
49
  """Model for updating raw file data.
58
50
 
59
- Attributes:
60
- """
61
-
62
-
63
- class RawFile(RawFileBase):
64
- """Model for raw file data with database fields.
65
-
66
51
  Attributes:
67
52
  raw_file_id: Unique identifier for the source.
68
53
  state: Upload state (uploading, ready, error).
@@ -70,12 +55,18 @@ class RawFile(RawFileBase):
70
55
  meta_data: meta data for the uri
71
56
  upload_id: S3 multipart upload ID (present while uploading, cleared when complete).
72
57
  """
73
-
74
58
  raw_file_id: UUID
75
59
  state: RawFileState = RawFileState.UPLOADING
76
60
  uri: str | None = None
77
61
  meta_data: dict
78
62
  upload_id: str | None = None
63
+
64
+ class RawFile(RawFileUpdate):
65
+ """Model for raw file data with database fields.
66
+
67
+ Attributes:
68
+ """
69
+
79
70
  created_date: datetime
80
71
  updated_date: datetime
81
72
  updated_by: str
@@ -88,3 +79,17 @@ class RawFileWithUpload(RawFile):
88
79
 
89
80
  Overrides optional fields from RawFile to be required for upload responses.
90
81
  """
82
+
83
+
84
+ class RawFileFilter(BaseModel):
85
+ """Model for filtering raw files.
86
+
87
+ Attributes:
88
+ survey_id: Survey ID filter (required).
89
+ state: Optional state filter (uploading, ready, error).
90
+ raw_configuration_id: Optional raw file configuration ID filter.
91
+ """
92
+
93
+ survey_id: UUID
94
+ state: RawFileState | None = None
95
+ raw_configuration_id: UUID | None = None
@@ -0,0 +1,12 @@
1
+ """Raw file state"""
2
+
3
+ from enum import Enum
4
+
5
+ class RawFileState(str, Enum):
6
+ """Status of a raw file upload."""
7
+
8
+ UPLOADING = "uploading"
9
+ READY = "ready"
10
+ ERROR_UPLOAD = "error_upload"
11
+ ERROR_INGEST = "error_ingest"
12
+ INGEST_COMPLETE = "ingest_complete"