Skip to content

Commit cdeabc6

Browse files
authored
[Voice] - support for the whole API
1 parent b45a4f3 commit cdeabc6

64 files changed

Lines changed: 2101 additions & 5 deletions

Some content is hidden

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

.github/workflows/run-tests.yml

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,15 @@ env:
2424
APPLICATION_SECRET: ${{ secrets.APPLICATION_SECRET }}
2525
APPLICATION_KEY: ${{ secrets.APPLICATION_KEY }}
2626
VERIFICATION_ID: ${{ secrets.VERIFICATION_ID }}
27-
VERIFICATION_ORIGIN: ${{ secrets.VERIFICATION_ORIGIN}}
28-
VERIFICATION_REQUEST_SIGNATURE_TIMESTAMP: ${{ secrets.VERIFICATION_REQUEST_SIGNATURE_TIMESTAMP}}
29-
VERIFICATION_REQUEST_WITH_EMPTY_BODY_SIGNATURE: ${{ secrets.VERIFICATION_REQUEST_WITH_EMPTY_BODY_SIGNATURE}}
30-
VERIFICATION_REQUEST_SIGNATURE: ${{ secrets.VERIFICATION_REQUEST_SIGNATURE}}
27+
VERIFICATION_ORIGIN: ${{ secrets.VERIFICATION_ORIGIN }}
28+
VERIFICATION_REQUEST_SIGNATURE_TIMESTAMP: ${{ secrets.VERIFICATION_REQUEST_SIGNATURE_TIMESTAMP }}
29+
VERIFICATION_REQUEST_WITH_EMPTY_BODY_SIGNATURE: ${{ secrets.VERIFICATION_REQUEST_WITH_EMPTY_BODY_SIGNATURE }}
30+
VERIFICATION_REQUEST_SIGNATURE: ${{ secrets.VERIFICATION_REQUEST_SIGNATURE }}
31+
VOICE_ORIGIN: ${{ secrets.VOICE_ORIGIN }}
32+
VOICE_ORIGIN_PHONE_NUMBER: ${{ secrets.VOICE_ORIGIN_PHONE_NUMBER }}
33+
VOICE_CALL_ID: ${{ secrets.VOICE_CALL_ID }}
34+
CONFERENCE_ID: ${{ secrets.CONFERENCE_ID }}
35+
CONFERENCE_CALL_ID: ${{ secrets.CONFERENCE_CALL_ID }}
3136

3237
jobs:
3338
build:

sinch/core/clients/sinch_client_async.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from sinch.domains.numbers import NumbersAsync
88
from sinch.domains.conversation import ConversationAsync
99
from sinch.domains.sms import SMSAsync
10-
from sinch.domains.verification import Verification as VerificationAsync
10+
from sinch.domains.verification import VerificationAsync
11+
from sinch.domains.voice import VoiceAsync
1112

1213

1314
class SinchClientAsync(SinchClientBase):
@@ -43,3 +44,4 @@ def __init__(
4344
self.conversation = ConversationAsync(self)
4445
self.sms = SMSAsync(self)
4546
self.verification = VerificationAsync(self)
47+
self.voice = VoiceAsync(self)

sinch/core/clients/sinch_client_base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from sinch.domains.numbers import NumbersBase
66
from sinch.domains.conversation import ConversationBase
77
from sinch.domains.sms import SMSBase
8+
from sinch.domains.voice import VoiceBase
89

910

1011
class SinchClientBase(ABC):
@@ -18,6 +19,7 @@ class SinchClientBase(ABC):
1819
numbers = NumbersBase
1920
conversation = ConversationBase
2021
sms = SMSBase
22+
voice = VoiceBase
2123

2224
@abstractmethod
2325
def __init__(

sinch/core/clients/sinch_client_configuration.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ def __init__(
3333
self.auth_origin = "auth.sinch.com"
3434
self.numbers_origin = "numbers.api.sinch.com"
3535
self.verification_origin = "verification.api.sinch.com"
36+
self.voice_applications_origin = "callingapi.sinch.com"
37+
self._voice_domain = "{}.api.sinch.com"
38+
self._voice_region = None
3639
self._conversation_region = "eu"
3740
self._conversation_domain = ".conversation.api.sinch.com"
3841
self._sms_region = "us"
@@ -46,6 +49,7 @@ def __init__(
4649
self._set_conversation_origin()
4750
self._set_sms_origin()
4851
self._set_templates_origin()
52+
self._set_voice_origin()
4953

5054
if logger_name:
5155
self.logger = logging.getLogger(logger_name)
@@ -54,6 +58,25 @@ def __init__(
5458
else:
5559
self.logger = logging.getLogger("Sinch")
5660

61+
def _set_voice_origin(self):
62+
if not self._voice_region:
63+
self.voice_origin = self._voice_domain.format("calling")
64+
else:
65+
self.voice_origin = self._voice_domain.format("calling-" + self._voice_region)
66+
67+
def _set_voice_region(self, region):
68+
self._voice_region = region
69+
self._set_voice_origin()
70+
71+
def _get_voice_region(self):
72+
return self._voice_region
73+
74+
voice_region = property(
75+
_get_voice_region,
76+
_set_voice_region,
77+
doc="Voice Region"
78+
)
79+
5780
def _set_sms_origin(self):
5881
self.sms_origin = self._sms_domain.format(self._sms_region)
5982

sinch/core/clients/sinch_client_sync.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from sinch.domains.conversation import Conversation
99
from sinch.domains.sms import SMS
1010
from sinch.domains.verification import Verification
11+
from sinch.domains.voice import Voice
1112

1213

1314
class SinchClient(SinchClientBase):
@@ -43,3 +44,4 @@ def __init__(
4344
self.conversation = Conversation(self)
4445
self.sms = SMS(self)
4546
self.verification = Verification(self)
47+
self.voice = Voice(self)

sinch/core/deserializers.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from datetime import datetime
2+
3+
4+
def timestamp_to_datetime_in_utc_deserializer(timestamp: str):
5+
"""
6+
Older Python versions (like 3.9) do not support "Z" as a TZ information.
7+
One needs to use '+00:00' to represent UTC tz.
8+
"""
9+
if timestamp.endswith("Z"):
10+
timestamp = timestamp[:-1]
11+
12+
return datetime.fromisoformat(timestamp + "+00:00")

0 commit comments

Comments
 (0)