feat: complete SipConfiguration attributes for API 2026-04-16#39
Merged
Conversation
1813c14 to
64a53a4
Compare
Adds the 5 writable + 2 read-only SIP registration attributes introduced in API 2026-04-16: enabled_sip_registration, use_did_in_ruri, cnam_lookup, network_protocol_priority, diversion_inject_mode plus server-generated incoming_auth_username and incoming_auth_password (returned only when sip_registration is enabled, stripped from POST/PATCH bodies because the API rejects writes with 400 Param not allowed). Includes wire-format coverage of the create / read / disable PATCH flows, fixture alignment with real sandbox responses, and the SDK-specific changes needed to land the feature cleanly (typing / nullability fixes, read-only enforcement at the type level, constructor / builder ergonomics).
Override the SDK's idiomatic debug/log surface to replace credential field values with [FILTERED] before they reach default print(), logger output, debugger inspection, or unhandled exception traces. The wire payload is unaffected — serializers continue to emit the real values (or strip read-only ones via the existing read-only mechanism). Marks SIP auth_password and the server-generated incoming_auth_* on SipConfiguration, plus username and password on the credentials_and_ip authentication method, as sensitive.
2ff7b95 to
ead6eb7
Compare
The server enforces multi-field invariants on the sip_registration
toggle (host / port must be absent when enabled, use_did_in_ruri
must be false when disabled). The SDK applies those cascades
automatically on attribute assignment so caller code never has to
enumerate the rule set:
- enabled_sip_registration = True -> host = None, port = None
(always — needed for
PATCH-against-existing-trunk)
- enabled_sip_registration = False -> use_did_in_ruri = False
- host = <non-None> -> enabled_sip_registration = False,
use_did_in_ruri = False
The cascade fires only on application-driven property assignments;
SipConfiguration(attributes={...}) bypasses the setters via
_attributes, so deserialized server responses are unaffected.
Includes regression coverage for the fresh-config case (the cascade
must emit host=None / port=None even when the local _attributes dict
starts empty — a PATCH against a trunk that already has host
persisted on the server side requires explicit nullification on the
wire), plus an end-to-end sandbox example
(examples/voice_in_trunk_sip_registration.py).
Add a SIP registration usage section to the README that explains the cascade rules and shows the enable / disable examples. The disable example is a single setHost() / config.host = '...' call — the cascade flips the dependent fields automatically.
The same __repr__ override that masks credential attributes lived on two unrelated base classes — TrunkConfiguration and AuthenticationMethod, each in its own resource hierarchy. Extract the shared logic plus the _sensitive_attrs frozenset into a didww.mixins.RedactsSensitiveAttributes mixin; both base classes now inherit from it and the duplicate is gone. Behaviour is unchanged — the mixin's __repr__ body is line-for-line identical to the previous inline methods, and the existing redaction tests on both base classes continue to pass.
31af6db to
b8635d1
Compare
…README The example file was created in the cascade commit but the index table in examples/README.md was not updated alongside it.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Summary
Completes the API
2026-04-16SipConfigurationattribute set. Mirrors the Ruby reference PR #80.5 writable attributes (missed during the original 2026-04-16 rollout)
These attributes the server accepts under API
2026-04-16and are listed in the public 2026-04-16 changelog, but were absent from both this SDK and the public Postman collection. Server is authoritative — added all five:enabled_sip_registrationenabled_sip_registrationbooluse_did_in_ruriuse_did_in_ruriboolnetwork_protocol_prioritynetwork_protocol_priorityNetworkProtocolPriorityenumdiversion_inject_modediversion_inject_modeDiversionInjectModeenumcnam_lookupcnam_lookupboolTwo new string-backed enums in
didww.enums:DiversionInjectMode—none,did_numberNetworkProtocolPriority—force_ipv4,force_ipv6,any,prefer_ipv4,prefer_ipv62 read-only attributes
Server-generated, returned only when
enabled_sip_registrationisTrue:incoming_auth_usernameincoming_auth_passwordThe API rejects writes (
400 Param not allowed). Read-only semantics are implemented via:_read_only_attrsfrozensetdeclared onTrunkConfiguration(overridable by subclasses) listing keys to strip.TrunkConfiguration.to_jsonapi()filters these out before producing the JSON:API attributes object.SipConfigurationdeclares_read_only_attrs = frozenset({"incoming_auth_username", "incoming_auth_password"})and exposes the two fields as read-onlyproperty(no setter).This means a caller who loads a configuration from the server (with
incoming_auth_*populated) and submits it back throughupdate()will not accidentally echo the credentials and trigger a 400.Updated fixture
tests/fixtures/voice_in_trunks/list.yamlSIP configuration response was extended with the 2026-04-16 keys (no-registration shape:incoming_auth_*: null) and re-serialized as compact JSON for diff readability.Misc
3.1.0inpyproject.toml.Test plan
pytest— 294 tests passing