1.35.2
(fix): List-valued XML (TwiML) attributes and text accept a space-separated String or a single
value (including a Symbol) in addition to an Array, matching the legacy call style:
response.gather(input: "speech dtmf") and dial(status_callback_event: :answered) no
longer raise NoMethodError.
1.35.1
(fix): Fluent XML (TwiML) child methods accept the text content as a keyword as well as positionally,
matching the legacy call style: response.say(message: "x"), response.dial(number: "+1555") and
response.message(body: "hi") now emit the text instead of silently dropping it. Passing the text
both positionally and as a keyword raises ArgumentError.
1.35.0
(feat): XML (TwiML) types support the legacy twilio-ruby building style: constructors and fluent child methods yield the
new element to a block (VoiceResponse.new { |r| r.say("hi") }, r.gather { |g| g.say("one") }), and
add_child also accepts an element name with text and attributes (r.add_child("Custom", "v", a: "1")).
1.34.2
(fix): Enum-typed attributes and text on XML (TwiML) types are open on the wire: from_xml keeps a value the enum does
not declare (e.g. a voice added after the SDK was generated) instead of raising, and it round-trips through
to_xml. This matches how the same enums already behave in JSON.
1.34.1
(fix): Endpoints whose request body is an array, set, map, primitive, enum, optional/nullable object, or an alias of
one of these now send the body argument itself (e.g. [{"name":"Monstera"}]) instead of wrapping it with the
other keyword arguments (e.g. {"request": [...]}). This also applies to such bodies on endpoints with headers
or query parameters, which no longer leak into the body. Objects inside these bodies (optional/nullable objects,
list and set items, and map values) are serialized through their model so fields use their wire names, sets are
sent as JSON arrays, and an omitted optional body is still sent without a body.
1.34.0
(feat): Add opt-in userAgentOnly config. When enabled, generated clients send the User-Agent
header (including the structured form from includePlatformHeaders) but omit the
X-Fern-Language, X-Fern-SDK-Name, and X-Fern-SDK-Version headers. Disabled by default,
so existing generated output is unchanged. omitFernHeaders still takes precedence and drops
the User-Agent too.
1.33.0
(feat): The generated WebhooksHelper HMAC verifier now accepts a per-call algorithm override via an optional algorithm parameter on verifySignature,
one of sha1, sha256, sha384 or sha512. When omitted, the algorithm configured in
webhook-signature is used, so existing callers are unchanged. This lets one endpoint verify both
legacy HMAC-SHA1 (auth-token) and HMAC-SHA256 (shared-key) signed webhooks.
The verifier also logs a warning distinguishing an early failure (missing signature header) from a
failed verification (signature mismatch); it still returns false and never throws.
1.32.0
(feat): XML (TwiML) types keep text segments, typed child models and raw Element children in a single
ordered content list, so to_xml emits them in the order they were added
(response.say("a"); response.add_child(Element.new("Custom")); response.say("b") yields
<Say>a</Say><Custom/><Say>b</Say>) and from_xml preserves document order, including the
position of unknown elements. Adds add_text(String) to XML types and Element for mixed content
such as <Say>Hi <break strength="weak"/> world</Say>. Typed child properties and additional
children remain available and are reconciled into the content order on serialization.
1.31.1
(fix): XML-encoded (TwiML) types now include the <?xml version="1.0" encoding="UTF-8"?>
declaration by default when serialized to XML; pass the declaration flag as false
to omit it. Nested child elements and raw XmlElements are still written without it.
1.31.0
(feat): Add support for SDK variables (x-fern-sdk-variables / variables in api.yml).
Each variable is exposed as an optional keyword on the root client (e.g.
Client.new(target_account_sid: "AC...")); path parameters bound to a variable are
removed from the endpoint methods and request classes, and the value is read from
the client instead. String variables declared with an env fall back to
ENV.fetch("<ENV_VAR>", nil) when the keyword is omitted, and endpoints raise an
ArgumentError with a clear message when a required variable is still unset.