Skip to content

Commit 403236b

Browse files
authored
chore: remove Pydantic model
2 parents a9519c5 + ad9773f commit 403236b

File tree

8 files changed

+59
-88
lines changed

8 files changed

+59
-88
lines changed

sinch/domains/numbers/available_numbers.py

+14-14
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
ActivateNumberRequest, CheckNumberAvailabilityRequest, ListAvailableNumbersRequest, RentAnyNumberRequest
1111
)
1212
from sinch.domains.numbers.models.available import (
13-
ActivateNumberResponse, CheckNumberAvailabilityResponse, RentAnyNumberResponse
13+
CheckNumberAvailabilityResponse, RentAnyNumberResponse
1414
)
1515
from sinch.domains.numbers.models.numbers import (
16-
CapabilityTypeValuesList, Number, NumberSearchPatternTypeValues, NumberTypeValues
16+
ActiveNumber, CapabilityTypeValuesList, Number, NumberSearchPatternTypeValues, NumberTypeValues
1717
)
1818

1919

@@ -66,7 +66,7 @@ def activate(
6666
sms_configuration: Optional[SmsConfigurationDict] = None,
6767
voice_configuration: Optional[VoiceConfigurationDictType] = None,
6868
callback_url: Optional[StrictStr] = None
69-
) -> ActivateNumberResponse:
69+
) -> ActiveNumber:
7070
pass
7171

7272
@overload
@@ -76,7 +76,7 @@ def activate(
7676
sms_configuration: SmsConfigurationDict,
7777
voice_configuration: VoiceConfigurationDictEST,
7878
callback_url: Optional[StrictStr] = None
79-
) -> ActivateNumberResponse:
79+
) -> ActiveNumber:
8080
pass
8181

8282
@overload
@@ -86,7 +86,7 @@ def activate(
8686
sms_configuration: SmsConfigurationDict,
8787
voice_configuration: VoiceConfigurationDictFAX,
8888
callback_url: Optional[StrictStr] = None
89-
) -> ActivateNumberResponse:
89+
) -> ActiveNumber:
9090
pass
9191

9292
@overload
@@ -96,7 +96,7 @@ def activate(
9696
sms_configuration: SmsConfigurationDict,
9797
voice_configuration: VoiceConfigurationDictRTC,
9898
callback_url: Optional[StrictStr] = None
99-
) -> ActivateNumberResponse:
99+
) -> ActiveNumber:
100100
pass
101101

102102
def activate(
@@ -106,7 +106,7 @@ def activate(
106106
voice_configuration: Optional[VoiceConfigurationDictType] = None,
107107
callback_url: Optional[StrictStr] = None,
108108
**kwargs
109-
) -> ActivateNumberResponse:
109+
) -> ActiveNumber:
110110
"""
111111
Activate a virtual number to use with SMS, Voice, or both products.
112112
@@ -125,7 +125,7 @@ def activate(
125125
**kwargs: Additional parameters for the request.
126126
127127
Returns:
128-
ActivateNumberResponse: A response object with the activated number and its details.
128+
ActiveNumber: A response object with the activated number and its details.
129129
130130
For detailed documentation, visit https://developers.sinch.com
131131
"""
@@ -147,7 +147,7 @@ def rent_any(
147147
voice_configuration: None,
148148
number_pattern: Optional[NumberPatternDict] = None,
149149
capabilities: Optional[CapabilityTypeValuesList] = None,
150-
callback_url: Optional[str] = None,
150+
callback_url: Optional[StrictStr] = None,
151151
) -> RentAnyNumberResponse:
152152
pass
153153

@@ -160,7 +160,7 @@ def rent_any(
160160
voice_configuration: VoiceConfigurationDictRTC,
161161
number_pattern: Optional[NumberPatternDict] = None,
162162
capabilities: Optional[CapabilityTypeValuesList] = None,
163-
callback_url: Optional[str] = None,
163+
callback_url: Optional[StrictStr] = None,
164164
) -> RentAnyNumberResponse:
165165
pass
166166

@@ -173,7 +173,7 @@ def rent_any(
173173
voice_configuration: VoiceConfigurationDictFAX,
174174
number_pattern: Optional[NumberPatternDict] = None,
175175
capabilities: Optional[CapabilityTypeValuesList] = None,
176-
callback_url: Optional[str] = None,
176+
callback_url: Optional[StrictStr] = None,
177177
) -> RentAnyNumberResponse:
178178
pass
179179

@@ -186,7 +186,7 @@ def rent_any(
186186
voice_configuration: VoiceConfigurationDictEST,
187187
number_pattern: Optional[NumberPatternDict] = None,
188188
capabilities: Optional[CapabilityTypeValuesList] = None,
189-
callback_url: Optional[str] = None,
189+
callback_url: Optional[StrictStr] = None,
190190
) -> RentAnyNumberResponse:
191191
pass
192192

@@ -198,7 +198,7 @@ def rent_any(
198198
capabilities: Optional[CapabilityTypeValuesList] = None,
199199
sms_configuration: Optional[SmsConfigurationDict] = None,
200200
voice_configuration: Optional[VoiceConfigurationDictType] = None,
201-
callback_url: Optional[str] = None,
201+
callback_url: Optional[StrictStr] = None,
202202
**kwargs
203203
) -> RentAnyNumberResponse:
204204
"""
@@ -219,7 +219,7 @@ def rent_any(
219219
- `VoiceConfigurationDictRTC`: type 'RTC' with an `app_id` field.
220220
- `VoiceConfigurationDictEST`: type 'EST' with a `trunk_id` field.
221221
- `VoiceConfigurationDictFAX`: type 'FAX' with a `service_id` field.
222-
callback_url (str): The callback URL to receive notifications.
222+
callback_url (StrictStr): The callback URL to receive notifications.
223223
**kwargs: Additional parameters for the request.
224224
225225
Returns:

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import json
22
from sinch.core.enums import HTTPAuthentication, HTTPMethods
33
from sinch.core.models.http_response import HTTPResponse
4+
from sinch.domains.numbers.models.numbers import ActiveNumber
45
from sinch.domains.numbers.endpoints.numbers_endpoint import NumbersEndpoint
56
from sinch.domains.numbers.exceptions import NumberNotFoundException, NumbersException
6-
from sinch.domains.numbers.models.available import ActivateNumberRequest, ActivateNumberResponse
7+
from sinch.domains.numbers.models.available import ActivateNumberRequest
78

89

910
class ActivateNumberEndpoint(NumbersEndpoint):
@@ -22,10 +23,10 @@ def request_body(self) -> str:
2223
request_data = self.request_data.model_dump(by_alias=True, exclude_none=True)
2324
return json.dumps(request_data)
2425

25-
def handle_response(self, response: HTTPResponse) -> ActivateNumberResponse:
26+
def handle_response(self, response: HTTPResponse) -> ActiveNumber:
2627
try:
2728
super(ActivateNumberEndpoint, self).handle_response(response)
2829
except NumbersException as ex:
2930
raise NumberNotFoundException(message=ex.args[0], response=ex.http_response,
3031
is_from_server=ex.is_from_server)
31-
return self.process_response_model(response.body, ActivateNumberResponse)
32+
return self.process_response_model(response.body, ActiveNumber)

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

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from sinch.domains.numbers.models.available.activate_number_request import ActivateNumberRequest
2-
from sinch.domains.numbers.models.available.activate_number_response import ActivateNumberResponse
32
from sinch.domains.numbers.models.available.check_number_availability_request import CheckNumberAvailabilityRequest
43
from sinch.domains.numbers.models.available.check_number_availability_response import CheckNumberAvailabilityResponse
54
from sinch.domains.numbers.models.available.list_available_numbers_request import ListAvailableNumbersRequest
@@ -8,7 +7,6 @@
87

98
__all__ = [
109
"ActivateNumberRequest",
11-
"ActivateNumberResponse",
1210
"CheckNumberAvailabilityRequest",
1311
"CheckNumberAvailabilityResponse",
1412
"ListAvailableNumbersRequest",

sinch/domains/numbers/models/available/activate_number_response.py

-5
This file was deleted.

tests/e2e/numbers/features/steps/numbers.steps.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from datetime import timezone, datetime
33
from behave import given, when, then
44
from decimal import Decimal
5+
from sinch.domains.numbers.models.numbers import ActiveNumber
56
from sinch.domains.numbers.exceptions import NumberNotFoundException
6-
from sinch.domains.numbers.models.available.activate_number_response import ActivateNumberResponse
77
from sinch.domains.numbers.models.available.rent_any_number_response import RentAnyNumberResponse
88
from sinch.domains.numbers.models.numbers import NotFoundError
99

@@ -148,7 +148,7 @@ def step_rent_specific_number(context, phone_number):
148148

149149
@then('the response contains this rented phone number "{phone_number}"')
150150
def step_validate_rented_specific_number(context, phone_number):
151-
data: ActivateNumberResponse = context.response
151+
data: ActiveNumber = context.response
152152
assert data.phone_number == phone_number, f'Expected {phone_number}, got {data.phone_number}'
153153

154154
@when('I send a request to rent the unavailable phone number "{phone_number}"')

tests/unit/domains/numbers/models/available/response/test_activate_number_response_model.py

-60
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import pytest
22
from datetime import datetime, timezone
3-
from sinch.domains.numbers.models.available.activate_number_response import ActivateNumberResponse
43

54
@pytest.fixture
65
def test_data():
@@ -69,62 +68,3 @@ def assert_voice_configuration(voice_config):
6968
assert scheduled_voice_provisioning.last_updated_time == expected_last_updated_time
7069
assert scheduled_voice_provisioning.status == "PROVISIONING_STATUS_UNSPECIFIED"
7170
assert scheduled_voice_provisioning.app_id == "string"
72-
73-
def test_activate_number_response_expects_all_fields_mapped_correctly(test_data):
74-
"""
75-
Expects all fields to map correctly from camelCase input,
76-
converts nested keys to snake_case, and handles dynamic fields
77-
"""
78-
data = {
79-
"phoneNumber": "+12025550134",
80-
"displayName": "string",
81-
"regionCode": "US",
82-
"type": "MOBILE",
83-
"capability": ["SMS"],
84-
"money": {"currencyCode": "USD", "amount": "2.00"},
85-
"paymentIntervalMonths": 0,
86-
"nextChargeDate": "2025-01-22T13:19:31.095Z",
87-
"expireAt": "2025-03-29T13:19:31.095Z",
88-
"smsConfiguration": {
89-
"servicePlanId": "string",
90-
"campaignId": "string",
91-
"scheduledProvisioning": {
92-
"servicePlanId": "string",
93-
"campaignId": "string",
94-
"status": "PROVISIONING_STATUS_UNSPECIFIED",
95-
"lastUpdatedTime": "2025-02-21T13:19:31.095Z",
96-
"errorCodes": ["ERROR_CODE_UNSPECIFIED"],
97-
},
98-
},
99-
"voiceConfiguration": {
100-
"type": "RTC",
101-
"lastUpdatedTime": "2025-01-25T13:49:31.095Z",
102-
"scheduledVoiceProvisioning": {
103-
"type": "RTC",
104-
"lastUpdatedTime": "2025-02-22T13:19:31.095Z",
105-
"status": "PROVISIONING_STATUS_UNSPECIFIED",
106-
"appId": "string",
107-
},
108-
"appId": "string",
109-
},
110-
"callbackUrl": "https://www.your-callback-server.com/callback",
111-
}
112-
response = ActivateNumberResponse(**data)
113-
114-
assert response.phone_number == "+12025550134"
115-
assert response.display_name == "string"
116-
assert response.region_code == "US"
117-
assert response.type == "MOBILE"
118-
assert response.capability == ["SMS"]
119-
assert response.money.currency_code == "USD"
120-
assert response.payment_interval_months == 0
121-
expected_next_charge_data = (
122-
datetime(2025, 1, 22, 13, 19, 31, 95000, tzinfo=timezone.utc))
123-
assert response.next_charge_date == expected_next_charge_data
124-
expected_expire_at = (
125-
datetime(2025, 3, 29, 13, 19, 31, 95000, tzinfo=timezone.utc))
126-
assert response.expire_at == expected_expire_at
127-
assert response.callback_url == "https://www.your-callback-server.com/callback"
128-
# Assert sms_configuration and voice_configuration using helper functions
129-
assert_sms_configuration(response.sms_configuration)
130-
assert_voice_configuration(response.voice_configuration)

tests/unit/domains/numbers/models/test_numbers.py

+35
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from datetime import datetime, timezone
22
from sinch.domains.numbers.models.numbers import (
3+
ActiveNumber,
34
ScheduledProvisioningSmsConfiguration,
45
SmsConfigurationResponse,
56
VoiceConfigurationResponse, NotFoundError,
@@ -135,3 +136,37 @@ def test_not_found_error_deserialize_with_snake_case():
135136
assert not_found_error.details[0].resource_name == '+1234567890'
136137
assert not_found_error.details[0].owner == ''
137138
assert not_found_error.details[0].description == ''
139+
140+
def test_activate_number_response_expects_all_fields_mapped_correctly():
141+
"""
142+
Expects all fields to map correctly from camelCase input,
143+
converts nested keys to snake_case, and handles dynamic fields
144+
"""
145+
data = {
146+
"phoneNumber": "+12025550134",
147+
"displayName": "string",
148+
"regionCode": "US",
149+
"type": "MOBILE",
150+
"capability": ["SMS"],
151+
"money": {"currencyCode": "USD", "amount": "2.00"},
152+
"paymentIntervalMonths": 0,
153+
"nextChargeDate": "2025-01-22T13:19:31.095Z",
154+
"expireAt": "2025-03-29T13:19:31.095Z",
155+
"callbackUrl": "https://www.your-callback-server.com/callback",
156+
}
157+
response = ActiveNumber(**data)
158+
159+
assert response.phone_number == "+12025550134"
160+
assert response.display_name == "string"
161+
assert response.region_code == "US"
162+
assert response.type == "MOBILE"
163+
assert response.capability == ["SMS"]
164+
assert response.money.currency_code == "USD"
165+
assert response.payment_interval_months == 0
166+
expected_next_charge_data = (
167+
datetime(2025, 1, 22, 13, 19, 31, 95000, tzinfo=timezone.utc))
168+
assert response.next_charge_date == expected_next_charge_data
169+
expected_expire_at = (
170+
datetime(2025, 3, 29, 13, 19, 31, 95000, tzinfo=timezone.utc))
171+
assert response.expire_at == expected_expire_at
172+
assert response.callback_url == "https://www.your-callback-server.com/callback"

tests/unit/domains/numbers/test_available_numbers.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22
from unittest.mock import MagicMock
3+
34
from sinch.domains.numbers.available_numbers import AvailableNumbers
45
from sinch.domains.numbers.endpoints.available.list_available_numbers_endpoint import AvailableNumbersEndpoint
56
from sinch.domains.numbers.endpoints.available.activate_number_endpoint import ActivateNumberEndpoint
@@ -10,9 +11,10 @@
1011
from sinch.domains.numbers.models.available.check_number_availability_request import CheckNumberAvailabilityRequest
1112

1213
from sinch.domains.numbers.models.available.list_available_numbers_response import ListAvailableNumbersResponse
13-
from sinch.domains.numbers.models.available.activate_number_response import ActivateNumberResponse
1414
from sinch.domains.numbers.models.available.check_number_availability_response import CheckNumberAvailabilityResponse
1515

16+
from sinch.domains.numbers.models.numbers import ActiveNumber
17+
1618
@pytest.fixture
1719
def mock_sinch():
1820
"""Creates a mocked Sinch client."""
@@ -66,7 +68,7 @@ def test_activate_number_expects_correct_request(mock_sinch, mocker):
6668
Test that the AvailableNumbers.activate method sends the correct request
6769
and handles the response properly.
6870
"""
69-
mock_response = ActivateNumberResponse.model_construct()
71+
mock_response = ActiveNumber.model_construct()
7072
mock_sinch.configuration.transport.request.return_value = mock_response
7173

7274
spy_endpoint = mocker.spy(ActivateNumberEndpoint, "__init__")

0 commit comments

Comments
 (0)