port-ocean 0.24.21__py3-none-any.whl → 0.24.22__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.
@@ -2,12 +2,37 @@ import json
2
2
  from typing import Type, Any, Optional
3
3
 
4
4
  from humps import decamelize
5
- from pydantic import BaseModel, AnyUrl, create_model, Extra, parse_obj_as, validator
5
+ from pydantic import (
6
+ BaseConfig,
7
+ BaseModel,
8
+ AnyUrl,
9
+ create_model,
10
+ Extra,
11
+ parse_obj_as,
12
+ validator,
13
+ )
6
14
  from pydantic.fields import ModelField, Field
7
15
 
8
16
  from port_ocean.config.base import BaseOceanModel
9
17
 
10
18
 
19
+ class NoTrailingSlashUrl(AnyUrl):
20
+ @classmethod
21
+ def validate(cls, value: Any, field: ModelField, config: BaseConfig) -> "AnyUrl":
22
+ if value is not None:
23
+ if isinstance(value, (bytes, bytearray)):
24
+ try:
25
+ value = value.decode()
26
+ except UnicodeDecodeError as exc:
27
+ raise ValueError("URL bytes must be valid UTF-8") from exc
28
+ else:
29
+ value = str(value)
30
+
31
+ if value != "/":
32
+ value = value.rstrip("/")
33
+ return super().validate(value, field, config)
34
+
35
+
11
36
  class Configuration(BaseModel, extra=Extra.allow):
12
37
  name: str
13
38
  type: str
@@ -39,7 +64,7 @@ def default_config_factory(configurations: Any) -> Type[BaseModel]:
39
64
  case "object":
40
65
  field_type = dict
41
66
  case "url":
42
- field_type = AnyUrl
67
+ field_type = NoTrailingSlashUrl
43
68
  case "string":
44
69
  field_type = str
45
70
  case "integer":
@@ -0,0 +1,38 @@
1
+ import pytest
2
+ from pydantic import BaseModel
3
+ from port_ocean.config.dynamic import NoTrailingSlashUrl
4
+ from typing import cast
5
+
6
+
7
+ class TestClass(BaseModel):
8
+ url: NoTrailingSlashUrl | None
9
+
10
+
11
+ def as_no_trailing_slash_url(value: str | None) -> NoTrailingSlashUrl:
12
+ # mypy casting
13
+ return cast(NoTrailingSlashUrl, value)
14
+
15
+
16
+ def test_trailing_slash_valid() -> None:
17
+ cls = TestClass(url=as_no_trailing_slash_url("http://example"))
18
+ assert cls.url == "http://example"
19
+
20
+
21
+ def test_trailing_slash_valid_remove_slash() -> None:
22
+ cls = TestClass(url=as_no_trailing_slash_url("http://example/"))
23
+ assert cls.url == "http://example"
24
+
25
+
26
+ def test_trailing_slash_not_valid() -> None:
27
+ with pytest.raises(ValueError):
28
+ TestClass(url=as_no_trailing_slash_url("/"))
29
+
30
+
31
+ def test_trailing_slash_not_valid_no_domain() -> None:
32
+ with pytest.raises(ValueError):
33
+ TestClass(url=as_no_trailing_slash_url("http:///"))
34
+
35
+
36
+ def test_trailing_empty() -> None:
37
+ cls = TestClass(url=None)
38
+ assert cls.url is None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.24.21
3
+ Version: 0.24.22
4
4
  Summary: Port Ocean is a CLI tool for managing your Port projects.
5
5
  Home-page: https://app.getport.io
6
6
  Keywords: ocean,port-ocean,port
@@ -68,7 +68,7 @@ port_ocean/clients/port/types.py,sha256=nvlgiAq4WH5_F7wQbz_GAWl-faob84LVgIjZ2Ww5
68
68
  port_ocean/clients/port/utils.py,sha256=osFyAjw7Y5Qf2uVSqC7_RTCQfijiL1zS74JJM0goxh0,2762
69
69
  port_ocean/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
70
  port_ocean/config/base.py,sha256=x1gFbzujrxn7EJudRT81C6eN9WsYAb3vOHwcpcpX8Tc,6370
71
- port_ocean/config/dynamic.py,sha256=T0AWE41tjp9fL1sgrTRwNAGlPw6xiakFp-KXWvHtu_4,2035
71
+ port_ocean/config/dynamic.py,sha256=Lrk4JRGtR-0YKQ9DDGexX5NGFE7EJ6VoHya19YYhssM,2687
72
72
  port_ocean/config/settings.py,sha256=R4Ju15XKbwQEg2W7uUCxoj4_9gUS9uYUFQnX-FUNRDI,7156
73
73
  port_ocean/consumers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
74
  port_ocean/consumers/kafka_consumer.py,sha256=N8KocjBi9aR0BOPG8hgKovg-ns_ggpEjrSxqSqF_BSo,4710
@@ -161,6 +161,7 @@ port_ocean/tests/clients/oauth/test_oauth_client.py,sha256=2XVMQUalDpiD539Z7_dk5
161
161
  port_ocean/tests/clients/port/mixins/test_entities.py,sha256=DeWbAQcaxT3LQQf_j9HA5nG7YgsQDvXmgK2aghlG9ug,6619
162
162
  port_ocean/tests/clients/port/mixins/test_integrations.py,sha256=vRt_EMsLozQC1LJNXxlvnHj3-FlOBGgAYxg5T0IAqtA,7621
163
163
  port_ocean/tests/clients/port/mixins/test_organization_mixin.py,sha256=zzKYz3h8dl4Z5A2QG_924m0y9U6XTth1XYOfwNrd_24,914
164
+ port_ocean/tests/config/test_config.py,sha256=Rk4N-ldVSOfn1p23NzdVdfqUpPrqG2cMut4Sv-sAOrw,1023
164
165
  port_ocean/tests/conftest.py,sha256=JXASSS0IY0nnR6bxBflhzxS25kf4iNaABmThyZ0mZt8,101
165
166
  port_ocean/tests/core/conftest.py,sha256=7K_M1--wQ08VmiQRB0vo1nst2X00cwsuBS5UfERsnG8,7589
166
167
  port_ocean/tests/core/defaults/test_common.py,sha256=sR7RqB3ZYV6Xn6NIg-c8k5K6JcGsYZ2SCe_PYX5vLYM,5560
@@ -201,8 +202,8 @@ port_ocean/utils/repeat.py,sha256=U2OeCkHPWXmRTVoPV-VcJRlQhcYqPWI5NfmPlb1JIbc,32
201
202
  port_ocean/utils/signal.py,sha256=mMVq-1Ab5YpNiqN4PkiyTGlV_G0wkUDMMjTZp5z3pb0,1514
202
203
  port_ocean/utils/time.py,sha256=pufAOH5ZQI7gXvOvJoQXZXZJV-Dqktoj9Qp9eiRwmJ4,1939
203
204
  port_ocean/version.py,sha256=UsuJdvdQlazzKGD3Hd5-U7N69STh8Dq9ggJzQFnu9fU,177
204
- port_ocean-0.24.21.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
205
- port_ocean-0.24.21.dist-info/METADATA,sha256=CMim2FITINDDdUII_ENejo3t677lzYlELYVfULtdfPs,6856
206
- port_ocean-0.24.21.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
207
- port_ocean-0.24.21.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
208
- port_ocean-0.24.21.dist-info/RECORD,,
205
+ port_ocean-0.24.22.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
206
+ port_ocean-0.24.22.dist-info/METADATA,sha256=50N8hfofvUl4hhRM850KH2qlF6RRBvw-EK_CCOrhFbA,6856
207
+ port_ocean-0.24.22.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
208
+ port_ocean-0.24.22.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
209
+ port_ocean-0.24.22.dist-info/RECORD,,