Skip to content

Commit cf221a6

Browse files
committed
DEVEXP-766: Refactor Numbers domain as expected generated structure
Signed-off-by: Jessica Matsuoka <jessica.akemi.matsuoka@sinch.com>
1 parent 403236b commit cf221a6

File tree

86 files changed

+600
-490
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+600
-490
lines changed

sinch/domains/numbers/__init__.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
from sinch.domains.numbers.available_numbers import AvailableNumbers
2-
from sinch.domains.numbers.active_numbers import ActiveNumbers, ActiveNumbersWithAsyncPagination
1+
from sinch.domains.numbers.api.v1.available_numbers.available_numbers_apis import AvailableNumbers
2+
from sinch.domains.numbers.api.v1.active_numbers.active_numbers_apis import (
3+
ActiveNumbers, ActiveNumbersWithAsyncPagination
4+
)
35
from sinch.domains.numbers.endpoints.callbacks.get_configuration import GetNumbersCallbackConfigurationEndpoint
46
from sinch.domains.numbers.endpoints.callbacks.update_configuration import UpdateNumbersCallbackConfigurationEndpoint
57
from sinch.domains.numbers.endpoints.regions.list_available_regions import ListAvailableRegionsEndpoint

sinch/domains/numbers/api/__init__.py

Whitespace-only changes.

sinch/domains/numbers/api/v1/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from sinch.domains.numbers.api.v1.active_numbers.active_numbers_endpoints import ListActiveNumbersEndpoint
2+
from sinch.domains.numbers.api.v1.active_numbers.active_numbers_apis import (
3+
ActiveNumbers, ActiveNumbersWithAsyncPagination
4+
)
5+
6+
__all__ = [
7+
"ListActiveNumbersEndpoint",
8+
"ActiveNumbers",
9+
"ActiveNumbersWithAsyncPagination"
10+
]

sinch/domains/numbers/active_numbers.py sinch/domains/numbers/api/v1/active_numbers/active_numbers_apis.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,23 @@
22
from pydantic import StrictStr, StrictInt
33
from sinch.core.pagination import TokenBasedPaginator, AsyncTokenBasedPaginator, Paginator
44
from sinch.domains.numbers.base_numbers import BaseNumbers
5+
from sinch.domains.numbers.api.v1.active_numbers import ListActiveNumbersEndpoint
56
from sinch.domains.numbers.endpoints.active import (
6-
GetNumberConfigurationEndpoint, ListActiveNumbersEndpoint, ReleaseNumberFromProjectEndpoint,
7+
GetNumberConfigurationEndpoint, ReleaseNumberFromProjectEndpoint,
78
UpdateNumberConfigurationEndpoint
89
)
9-
from sinch.domains.numbers.models.active import (
10-
ListActiveNumbersRequest
11-
)
1210
from sinch.domains.numbers.models.active.requests import (
1311
GetNumberConfigurationRequest, UpdateNumberConfigurationRequest, ReleaseNumberFromProjectRequest
1412
)
1513
from sinch.domains.numbers.models.active.responses import (
1614
UpdateNumberConfigurationResponse, GetNumberConfigurationResponse, ReleaseNumberFromProjectResponse
1715
)
18-
from sinch.domains.numbers.models.numbers import (
19-
CapabilityTypeValuesList, NumberTypeValues, NumberSearchPatternTypeValues, OrderByValues, ActiveNumber
20-
)
16+
from sinch.domains.numbers.models.v1.active_number import ActiveNumber
17+
from sinch.domains.numbers.models.v1.internal import ListActiveNumbersRequest
18+
from sinch.domains.numbers.models.v1.number_type import NumberTypeValues
19+
from sinch.domains.numbers.models.v1.order_by_values import OrderByValues
20+
from sinch.domains.numbers.models.v1.capability_type import CapabilityTypeValuesList
21+
from sinch.domains.numbers.models.v1.number_search_pattern_type import NumberSearchPatternTypeValues
2122

2223

2324
class ActiveNumbers(BaseNumbers):

sinch/domains/numbers/endpoints/active/list_active_numbers_endpoint.py sinch/domains/numbers/api/v1/active_numbers/active_numbers_endpoints.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from sinch.core.models.http_response import HTTPResponse
2-
from sinch.domains.numbers.endpoints.numbers_endpoint import NumbersEndpoint
2+
from sinch.domains.numbers.numbers_endpoint import NumbersEndpoint
33
from sinch.core.enums import HTTPAuthentication, HTTPMethods
4-
from sinch.domains.numbers.models.active.list_active_numbers_request import ListActiveNumbersRequest
5-
from sinch.domains.numbers.models.active.list_active_numbers_response import ListActiveNumbersResponse
4+
from sinch.domains.numbers.models.v1.internal.list_active_numbers_request import ListActiveNumbersRequest
5+
from sinch.domains.numbers.models.v1 import ListActiveNumbersResponse
66

77

88
class ListActiveNumbersEndpoint(NumbersEndpoint):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from sinch.domains.numbers.api.v1.available_numbers.available_numbers_endpoints import (
2+
ActivateNumberEndpoint, AvailableNumbersEndpoint, RentAnyNumberEndpoint, SearchForNumberEndpoint
3+
)
4+
5+
__all__ = [
6+
"ActivateNumberEndpoint",
7+
"AvailableNumbersEndpoint",
8+
"RentAnyNumberEndpoint",
9+
"SearchForNumberEndpoint"
10+
]

sinch/domains/numbers/available_numbers.py sinch/domains/numbers/api/v1/available_numbers/available_numbers_apis.py

+17-13
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
from typing import Optional, overload
22
from pydantic import StrictInt, StrictStr
3-
from sinch.domains.numbers.base_numbers import (
4-
BaseNumbers, SmsConfigurationDict, VoiceConfigurationDictRTC, VoiceConfigurationDictType,
5-
VoiceConfigurationDictEST, VoiceConfigurationDictFAX, NumberPatternDict)
6-
from sinch.domains.numbers.endpoints.available import (
7-
ActivateNumberEndpoint, AvailableNumbersEndpoint, RentAnyNumberEndpoint, SearchForNumberEndpoint
3+
from sinch.domains.numbers.base_numbers import BaseNumbers
4+
from sinch.domains.numbers.models.v1 import (
5+
AvailableNumber, CheckNumberAvailabilityResponse, RentAnyNumberResponse,
86
)
9-
from sinch.domains.numbers.models.available import (
10-
ActivateNumberRequest, CheckNumberAvailabilityRequest, ListAvailableNumbersRequest, RentAnyNumberRequest
7+
from sinch.domains.numbers.api.v1.available_numbers import (
8+
ActivateNumberEndpoint, AvailableNumbersEndpoint, RentAnyNumberEndpoint, SearchForNumberEndpoint
119
)
12-
from sinch.domains.numbers.models.available import (
13-
CheckNumberAvailabilityResponse, RentAnyNumberResponse
10+
from sinch.domains.numbers.models.v1.active_number import ActiveNumber
11+
from sinch.domains.numbers.models.v1.capability_type import CapabilityTypeValuesList
12+
from sinch.domains.numbers.models.v1.number_pattern_dict import NumberPatternDict
13+
from sinch.domains.numbers.models.v1.number_search_pattern_type import NumberSearchPatternTypeValues
14+
from sinch.domains.numbers.models.v1.number_type import NumberTypeValues
15+
from sinch.domains.numbers.models.v1.sms_configuration_dict import SmsConfigurationDict
16+
from sinch.domains.numbers.models.v1.voice_configuration_dict import (
17+
VoiceConfigurationDictType, VoiceConfigurationDictEST, VoiceConfigurationDictFAX, VoiceConfigurationDictRTC
1418
)
15-
from sinch.domains.numbers.models.numbers import (
16-
ActiveNumber, CapabilityTypeValuesList, Number, NumberSearchPatternTypeValues, NumberTypeValues
19+
from sinch.domains.numbers.models.v1.internal import (
20+
ActivateNumberRequest, CheckNumberAvailabilityRequest, RentAnyNumberRequest, ListAvailableNumbersRequest
1721
)
1822

1923

@@ -28,7 +32,7 @@ def list(
2832
capabilities: Optional[CapabilityTypeValuesList] = None,
2933
page_size: Optional[StrictInt] = None,
3034
**kwargs
31-
) -> list[Number]:
35+
) -> list[AvailableNumber]:
3236
"""
3337
Search for available virtual numbers for you to activate using a variety of parameters to filter results.
3438
@@ -43,7 +47,7 @@ def list(
4347
**kwargs: Additional filters for the request.
4448
4549
Returns:
46-
list[Number]: A response array with available numbers and their details.
50+
list[AvailableNumber]: A response array with available numbers and their details.
4751
4852
For detailed documentation, visit https://developers.sinch.com
4953
"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
import json
2+
from sinch.core.enums import HTTPAuthentication, HTTPMethods
3+
from sinch.core.models.http_response import HTTPResponse
4+
from sinch.domains.numbers.models.v1 import (
5+
AvailableNumber, CheckNumberAvailabilityResponse, ListAvailableNumbersResponse,
6+
RentAnyNumberResponse)
7+
from sinch.domains.numbers.models.v1.active_number import ActiveNumber
8+
9+
from sinch.domains.numbers.numbers_endpoint import NumbersEndpoint
10+
from sinch.domains.numbers.exceptions import NumberNotFoundException, NumbersException
11+
from sinch.domains.numbers.models.v1.internal import (
12+
ActivateNumberRequest, CheckNumberAvailabilityRequest, ListAvailableNumbersRequest, RentAnyNumberRequest
13+
)
14+
15+
16+
class ActivateNumberEndpoint(NumbersEndpoint):
17+
"""
18+
Endpoint to activate a virtual number for a project.
19+
"""
20+
ENDPOINT_URL = "{origin}/v1/projects/{project_id}/availableNumbers/{phone_number}:rent"
21+
HTTP_METHOD = HTTPMethods.POST.value
22+
HTTP_AUTHENTICATION = HTTPAuthentication.OAUTH.value
23+
24+
def __init__(self, project_id: str, request_data: ActivateNumberRequest):
25+
super(ActivateNumberEndpoint, self).__init__(project_id, request_data)
26+
27+
def request_body(self) -> str:
28+
# Convert the request data to a dictionary and remove None values
29+
request_data = self.request_data.model_dump(by_alias=True, exclude_none=True)
30+
return json.dumps(request_data)
31+
32+
def handle_response(self, response: HTTPResponse) -> ActiveNumber:
33+
try:
34+
super(ActivateNumberEndpoint, self).handle_response(response)
35+
except NumbersException as ex:
36+
raise NumberNotFoundException(message=ex.args[0], response=ex.http_response,
37+
is_from_server=ex.is_from_server)
38+
return self.process_response_model(response.body, ActiveNumber)
39+
40+
41+
class AvailableNumbersEndpoint(NumbersEndpoint):
42+
"""
43+
Endpoint to list available virtual numbers for a project.
44+
"""
45+
ENDPOINT_URL = "{origin}/v1/projects/{project_id}/availableNumbers"
46+
HTTP_METHOD = HTTPMethods.GET.value
47+
HTTP_AUTHENTICATION = HTTPAuthentication.OAUTH.value
48+
49+
def __init__(self, project_id: str, request_data: ListAvailableNumbersRequest):
50+
super(AvailableNumbersEndpoint, self).__init__(project_id, request_data)
51+
self.request_data = request_data
52+
53+
def build_query_params(self) -> dict:
54+
return self.request_data.model_dump(exclude_none=True, by_alias=True)
55+
56+
def handle_response(self, response: HTTPResponse) -> list[AvailableNumber]:
57+
"""
58+
Processes the API response and maps it to a response model.
59+
60+
Args:
61+
response (HTTPResponse): The raw HTTP response object received from the API.
62+
63+
Returns:
64+
list[AvailableNumber]: The response model containing the parsed response data.
65+
"""
66+
super(AvailableNumbersEndpoint, self).handle_response(response)
67+
response = self.process_response_model(response.body, ListAvailableNumbersResponse)
68+
return response.available_numbers
69+
70+
71+
class RentAnyNumberEndpoint(NumbersEndpoint):
72+
"""
73+
Endpoint to rent an available virtual number for a project.
74+
"""
75+
ENDPOINT_URL = "{origin}/v1/projects/{project_id}/availableNumbers:rentAny"
76+
HTTP_METHOD = HTTPMethods.POST.value
77+
HTTP_AUTHENTICATION = HTTPAuthentication.OAUTH.value
78+
79+
def __init__(self, project_id: str, request_data: RentAnyNumberRequest):
80+
super(RentAnyNumberEndpoint, self).__init__(project_id, request_data)
81+
self.request_data = request_data
82+
83+
def request_body(self) -> str:
84+
request_data = self.request_data.model_dump(by_alias=True, exclude_none=True)
85+
return json.dumps(request_data)
86+
87+
def handle_response(self, response: HTTPResponse) -> RentAnyNumberResponse:
88+
"""
89+
Handles the response from the API call.
90+
91+
Args:
92+
response (HTTPResponse): The response object from the API call.
93+
94+
Returns:
95+
RentAnyNumberResponse: The response data mapped to the RentAnyNumberResponse model.
96+
"""
97+
error = super(RentAnyNumberEndpoint, self).handle_response(response)
98+
if error:
99+
return error
100+
return self.process_response_model(response.body, RentAnyNumberResponse)
101+
102+
103+
class SearchForNumberEndpoint(NumbersEndpoint):
104+
"""
105+
Endpoint to check the availability of a virtual number for a project.
106+
"""
107+
ENDPOINT_URL = "{origin}/v1/projects/{project_id}/availableNumbers/{phone_number}"
108+
HTTP_METHOD = HTTPMethods.GET.value
109+
HTTP_AUTHENTICATION = HTTPAuthentication.OAUTH.value
110+
111+
def __init__(self, project_id: str, request_data: CheckNumberAvailabilityRequest):
112+
super(SearchForNumberEndpoint, self).__init__(project_id, request_data)
113+
114+
def handle_response(self, response: HTTPResponse) -> CheckNumberAvailabilityResponse:
115+
"""
116+
Processes the API response and maps it to a response
117+
118+
Args:
119+
response (HTTPResponse): The raw HTTP response object received from the API.
120+
121+
Returns:
122+
CheckNumberAvailabilityResponse: The response model containing the parsed response data
123+
of the requested phone number.
124+
"""
125+
try:
126+
super(SearchForNumberEndpoint, self).handle_response(response)
127+
except NumbersException as e:
128+
raise NumberNotFoundException(message=e.args[0], response=e.http_response, is_from_server=e.is_from_server)
129+
return self.process_response_model(response.body, CheckNumberAvailabilityResponse)

sinch/domains/numbers/base_numbers.py

-42
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,3 @@
1-
from typing import TypedDict, Literal, Union, Annotated
2-
from typing_extensions import NotRequired
3-
from pydantic import Field
4-
from sinch.domains.numbers.models.numbers import NumberSearchPatternTypeValues
5-
6-
7-
class SmsConfigurationDict(TypedDict):
8-
service_plan_id: str
9-
campaign_id: NotRequired[str]
10-
11-
12-
class VoiceConfigurationDictRTC(TypedDict):
13-
type: Literal["RTC"]
14-
app_id: NotRequired[str]
15-
16-
17-
class VoiceConfigurationDictEST(TypedDict):
18-
type: Literal["EST"]
19-
trunk_id: NotRequired[str]
20-
21-
22-
class VoiceConfigurationDictFAX(TypedDict):
23-
type: Literal["FAX"]
24-
service_id: NotRequired[str]
25-
26-
27-
class VoiceConfigurationDictCustom(TypedDict):
28-
type: str
29-
30-
31-
class NumberPatternDict(TypedDict):
32-
pattern: NotRequired[str]
33-
search_pattern: NotRequired[NumberSearchPatternTypeValues]
34-
35-
36-
VoiceConfigurationDictType = Annotated[
37-
Union[VoiceConfigurationDictFAX, VoiceConfigurationDictRTC,
38-
VoiceConfigurationDictEST, VoiceConfigurationDictCustom],
39-
Field(discriminator="type")
40-
]
41-
42-
431
class BaseNumbers:
442
"""Base class for handling Sinch Number operations."""
453

Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
from sinch.domains.numbers.endpoints.active.get_number_configuration import GetNumberConfigurationEndpoint
2-
from sinch.domains.numbers.endpoints.active.list_active_numbers_endpoint import ListActiveNumbersEndpoint
32
from sinch.domains.numbers.endpoints.active.release_number_from_project import ReleaseNumberFromProjectEndpoint
43
from sinch.domains.numbers.endpoints.active.update_number_configuration import UpdateNumberConfigurationEndpoint
54

65
__all__ = [
76
"GetNumberConfigurationEndpoint",
8-
"ListActiveNumbersEndpoint",
97
"ReleaseNumberFromProjectEndpoint",
108
"UpdateNumberConfigurationEndpoint"
119
]

sinch/domains/numbers/endpoints/active/get_number_configuration.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from sinch.core.models.http_response import HTTPResponse
2-
from sinch.domains.numbers.endpoints.numbers_endpoint import NumbersEndpoint
2+
from sinch.domains.numbers.numbers_endpoint import NumbersEndpoint
33
from sinch.core.enums import HTTPAuthentication, HTTPMethods
44

55
from sinch.domains.numbers.models.active.requests import GetNumberConfigurationRequest

sinch/domains/numbers/endpoints/active/release_number_from_project.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from sinch.core.models.http_response import HTTPResponse
2-
from sinch.domains.numbers.endpoints.numbers_endpoint import NumbersEndpoint
2+
from sinch.domains.numbers.numbers_endpoint import NumbersEndpoint
33
from sinch.core.enums import HTTPAuthentication, HTTPMethods
44
from sinch.domains.numbers.models.active.requests import ReleaseNumberFromProjectRequest
55
from sinch.domains.numbers.models.active.responses import ReleaseNumberFromProjectResponse

sinch/domains/numbers/endpoints/active/update_number_configuration.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from sinch.core.models.http_response import HTTPResponse
2-
from sinch.domains.numbers.endpoints.numbers_endpoint import NumbersEndpoint
2+
from sinch.domains.numbers.numbers_endpoint import NumbersEndpoint
33
from sinch.core.enums import HTTPAuthentication, HTTPMethods
44
from sinch.domains.numbers.models.active.requests import UpdateNumberConfigurationRequest
55
from sinch.domains.numbers.models.active.responses import UpdateNumberConfigurationResponse

sinch/domains/numbers/endpoints/available/__init__.py

-11
This file was deleted.

sinch/domains/numbers/endpoints/available/activate_number_endpoint.py

-32
This file was deleted.

0 commit comments

Comments
 (0)