跳到导航

5.31.0

(feat): Object types carrying IR encoding.xml metadata (e.g. Twilio TwiML verbs imported from an OpenAPI xml object) now generate a to_xml() method (and __str__) that serializes the model as an XML element: properties marked as attributes become XML attributes, the text property becomes the element body, and remaining properties are emitted as ordered child elements, honoring wire names, namespaces/prefixes, wrapped lists and attribute list separators. A core/xml_utilities.py helper is emitted only when the API contains XML-encoded types.

(feat): XML-encoded object types with a list-valued child element property also generate fluent builder methods: append(child) and one <tag>(text, *, attributes...) method per child element type that constructs the child, appends it and returns it (e.g. response.say("Hello", voice="Polly.Joanna"), say.break_(time="100ms")). Method names derive from the XML tag; on a clash with a field they get an add_ prefix (Dial.add_number, Message.add_body).

(feat): XML-encoded types match the ergonomics of hand-written XML helper libraries: text-bearing elements accept their body positionally (Say("Hello", voice="man")), constructors and builder methods accept arbitrary **extra_attributes: str that are rendered as XML attributes (Say("Hi", foo="bar") -> <Say foo="bar">Hi</Say>), and str() of a root element (one never nested in another XML type) includes the <?xml version="1.0" encoding="UTF-8"?> declaration. to_xml(xml_declaration=...) is unchanged.

(feat): XML-encoded object types also generate a from_xml(xml) classmethod that parses an XML string (or a parsed element) back into the model: the root element name is validated, attributes/text/child elements map to their properties (honoring namespaces, wrapped lists and list separators), child unions dispatch on the element name, and scalar/enum values are converted by the model’s normal validation. Attributes the schema does not declare are kept as extra attributes and child elements it does not declare are preserved as XmlElement nodes (also addable via add_child(...)), so Model.from_xml(model.to_xml()) round-trips. Parsing uses the standard library with DOCTYPE declarations rejected; malformed input raises ValueError.