datacosmos 0.0.9__py3-none-any.whl → 0.0.11__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.

Potentially problematic release.


This version of datacosmos might be problematic. Click here for more details.

@@ -1,32 +1,51 @@
1
- """Module defining a structured URL configuration model.
1
+ """Structured URL configuration model for the Datacosmos SDK.
2
2
 
3
- Ensures that URLs contain required components such as protocol, host,
4
- port, and path.
3
+ The model accepts *either* a mapping of fields
4
+ (protocol, host, port, path) **or** a raw URL string such as
5
+ ``"https://example.com/api/v1"`` and converts it into a fully featured
6
+ :class:`datacosmos.utils.url.URL` instance via :py:meth:`as_domain_url`.
5
7
  """
6
8
 
7
- from pydantic import BaseModel
9
+ from urllib.parse import urlparse
10
+
11
+ from pydantic import BaseModel, model_validator
8
12
 
9
13
  from datacosmos.utils.url import URL as DomainURL
10
14
 
11
15
 
12
16
  class URL(BaseModel):
13
- """Generic configuration model for a URL.
14
-
15
- This class provides attributes to store URL components and a method
16
- to convert them into a `DomainURL` instance.
17
- """
17
+ """Generic configuration model for a URL."""
18
18
 
19
19
  protocol: str
20
20
  host: str
21
21
  port: int
22
22
  path: str
23
23
 
24
- def as_domain_url(self) -> DomainURL:
25
- """Convert the URL instance to a `DomainURL` object.
24
+ @model_validator(mode="before")
25
+ @classmethod
26
+ def _coerce_from_string(cls, data):
27
+ """Convert a raw URL string into the dict expected by the model."""
28
+ if isinstance(data, cls):
29
+ return data
30
+
31
+ if isinstance(data, str):
32
+ parts = urlparse(data)
33
+ if not parts.scheme or not parts.hostname:
34
+ raise ValueError(f"'{data}' is not a valid absolute URL")
26
35
 
27
- Returns:
28
- DomainURL: A domain-specific URL object.
29
- """
36
+ default_port = 443 if parts.scheme == "https" else 80
37
+
38
+ return {
39
+ "protocol": parts.scheme,
40
+ "host": parts.hostname,
41
+ "port": parts.port or default_port,
42
+ "path": parts.path.rstrip("/"),
43
+ }
44
+
45
+ return data
46
+
47
+ def as_domain_url(self) -> DomainURL:
48
+ """Convert this Pydantic model to the utility `DomainURL` object."""
30
49
  return DomainURL(
31
50
  protocol=self.protocol,
32
51
  host=self.host,
@@ -6,10 +6,11 @@ from enum import Enum
6
6
  class ProcessingLevel(Enum):
7
7
  """Enum class for the processing levels of the data."""
8
8
 
9
- L0 = "L0"
10
- L1A = "L1A"
11
- L2A = "L2A"
12
- L1B = "L1B"
13
- L1C = "L1C"
14
- L1D = "L1D"
15
- L3 = "L3"
9
+ RAW = "RAW"
10
+ L0 = "l0"
11
+ L1A = "l1A"
12
+ L2A = "l2A"
13
+ L1B = "l1B"
14
+ L1C = "l1C"
15
+ L1D = "l1D"
16
+ L3 = "l3"
@@ -37,7 +37,7 @@ class UploadPath:
37
37
  dt = datetime.strptime(item.properties["datetime"], "%Y-%m-%dT%H:%M:%SZ")
38
38
  path = UploadPath(
39
39
  mission=mission,
40
- level=ProcessingLevel(item.properties["processing:level"].upper()),
40
+ level=ProcessingLevel(item.properties["processing:level"]),
41
41
  day=dt.day,
42
42
  month=dt.month,
43
43
  year=dt.year,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacosmos
3
- Version: 0.0.9
3
+ Version: 0.0.11
4
4
  Summary: A library for interacting with DataCosmos from Python code
5
5
  Author-email: Open Cosmos <support@open-cosmos.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -7,7 +7,7 @@ datacosmos/config/models/authentication_config.py,sha256=01Q90-yupbJ5orYDtatZIm9
7
7
  datacosmos/config/models/local_user_account_authentication_config.py,sha256=8WApn720MBXMKQa6w7bCd7Z37GRmYR-I7mBUgUI20lQ,701
8
8
  datacosmos/config/models/m2m_authentication_config.py,sha256=n76N4bakpPPycTOeKpiM8pazYtNqiJGMzZXmI_ogbHM,847
9
9
  datacosmos/config/models/no_authentication_config.py,sha256=x5xikSGPuqQbrf_S2oIWXo5XxAORci2sSE5KyJvZHVw,312
10
- datacosmos/config/models/url.py,sha256=fwr2C06e_RDS8AWxOV_orVxMWhc57bzYoWSjFxQbkwg,835
10
+ datacosmos/config/models/url.py,sha256=bBeulXQ2c-tLJyIoo3sTi9SPsZIyIDn_D2zmkCGWp9s,1597
11
11
  datacosmos/exceptions/__init__.py,sha256=Crz8W7mOvPUXYcfDVotvjUt_3HKawBpmJA_-uel9UJk,45
12
12
  datacosmos/exceptions/datacosmos_exception.py,sha256=rKjJvQDvCEbxXWWccxB5GI_sth662bW8Yml0hX-vRw4,923
13
13
  datacosmos/stac/__init__.py,sha256=B4x_Mr4X7TzQoYtRC-VzI4W-fEON5WUOaz8cWJbk3Fc,214
@@ -19,7 +19,7 @@ datacosmos/stac/collection/models/collection_update.py,sha256=XC6-29nLz1VGWMxYAw
19
19
  datacosmos/stac/constants/__init__.py,sha256=dDRSsF7CKqNF44yIlNdE-PD1sp0Q5mhTEPT7hHIK7YE,26
20
20
  datacosmos/stac/constants/satellite_name_mapping.py,sha256=EJqNdO9uW5B-sIeDF72AjnW7va5BM9mm4oNwijtl51w,575
21
21
  datacosmos/stac/enums/__init__.py,sha256=GUEL2xGtdjsrszrxivs0X6daxkaZs2JsTu2JoBtsvB4,22
22
- datacosmos/stac/enums/processing_level.py,sha256=5gHG-0kG5rCUxmXYwF3t94ALKk6zUqguOdyTL-jwgps,247
22
+ datacosmos/stac/enums/processing_level.py,sha256=kWGhpMXgzoyTzwR4yoSFd3UQ5IBw3cUf3TaM1FaOtUg,263
23
23
  datacosmos/stac/enums/product_type.py,sha256=7lL0unJ1hxevW8Pepn9rmydUUWIORu2x4MEtp6rSFbA,196
24
24
  datacosmos/stac/enums/season.py,sha256=QvUzXBYtPEfixhlbV0SAw2u_HK3tRFEnHKshJyIatdg,241
25
25
  datacosmos/stac/item/__init__.py,sha256=lRuD_yp-JxoLqBA23q0XMkCNImf4T-X3BJnSw9u_3Yk,200
@@ -36,7 +36,7 @@ datacosmos/stac/storage/storage_base.py,sha256=5ioMKbEltPEWr4dkhZQiUhdBFEhe7ajIY
36
36
  datacosmos/stac/storage/storage_client.py,sha256=GeWJoa8ALqelZHvmnop_sSuyU7ntFNFXMFQfplIo0kU,1145
37
37
  datacosmos/stac/storage/uploader.py,sha256=5W4Wcx2yzdkU9sg93jnwYP0TiZcuxQXB9owfjL2NsBg,3630
38
38
  datacosmos/stac/storage/dataclasses/__init__.py,sha256=IjcyA8Vod-z1_Gi1FMZhK58Owman0foL25Hs0YtkYYs,43
39
- datacosmos/stac/storage/dataclasses/upload_path.py,sha256=5QadynHxkJrnOk1lyPtLyiVAHdzBshEuhjA9hwVF0NI,1903
39
+ datacosmos/stac/storage/dataclasses/upload_path.py,sha256=2Nvk51j4s6Cyse9y9sKmN3rQLV7oIMNtokpnt4_qTaw,1895
40
40
  datacosmos/utils/__init__.py,sha256=XQbAnoqJrPpnSpEzAbjh84yqYWw8cBM8mNp8ynTG-54,50
41
41
  datacosmos/utils/url.py,sha256=iQwZr6mYRoePqUZg-k3KQSV9o2wju5ZuCa5WS_GyJo4,2114
42
42
  datacosmos/utils/http_response/__init__.py,sha256=BvOWwC5coYqq_kFn8gIw5m54TLpdfJKlW9vgRkfhXiA,33
@@ -44,8 +44,8 @@ datacosmos/utils/http_response/check_api_response.py,sha256=dKWW01jn2_lWV0xpOBAB
44
44
  datacosmos/utils/http_response/models/__init__.py,sha256=Wj8YT6dqw7rAz_rctllxo5Or_vv8DwopvQvBzwCTvpw,45
45
45
  datacosmos/utils/http_response/models/datacosmos_error.py,sha256=Uqi2uM98nJPeCbM7zngV6vHSk97jEAb_nkdDEeUjiQM,740
46
46
  datacosmos/utils/http_response/models/datacosmos_response.py,sha256=oV4n-sue7K1wwiIQeHpxdNU8vxeqF3okVPE2rydw5W0,336
47
- datacosmos-0.0.9.dist-info/licenses/LICENSE.md,sha256=vpbRI-UUbZVQfr3VG_CXt9HpRnL1b5kt8uTVbirxeyI,1486
48
- datacosmos-0.0.9.dist-info/METADATA,sha256=1vpXTtgxF7gG1CdXSg0nsprKapv5LocXA2lvXaSZFp0,896
49
- datacosmos-0.0.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
50
- datacosmos-0.0.9.dist-info/top_level.txt,sha256=ueobs5CNeyDbPMgXPcVV0d0yNdm8CvGtDT3CaksRVtA,11
51
- datacosmos-0.0.9.dist-info/RECORD,,
47
+ datacosmos-0.0.11.dist-info/licenses/LICENSE.md,sha256=vpbRI-UUbZVQfr3VG_CXt9HpRnL1b5kt8uTVbirxeyI,1486
48
+ datacosmos-0.0.11.dist-info/METADATA,sha256=moE0Kyji_v-O_MSXkBd3idYIjqRzut7qkY9bQ96IFU0,897
49
+ datacosmos-0.0.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
50
+ datacosmos-0.0.11.dist-info/top_level.txt,sha256=ueobs5CNeyDbPMgXPcVV0d0yNdm8CvGtDT3CaksRVtA,11
51
+ datacosmos-0.0.11.dist-info/RECORD,,