lib/zuora/utils/envelope.rb in zuora-ruby-0.4.0 vs lib/zuora/utils/envelope.rb in zuora-ruby-0.5.0
- old
+ new
@@ -6,16 +6,12 @@
# @param [Callable] header - optional function of builder, rtns builder
# @param [Callable] body - optional function of builder, rtns builder
def self.xml(header, body)
Nokogiri::XML::Builder.new do |builder|
builder[:soapenv].Envelope(Zuora::NAMESPACES) do
- builder[:soapenv].Header do
- header.call builder
- end if header
- builder[:soapenv].Body do
- body.call builder
- end if body
+ builder[:soapenv].Header { header.call builder } if header
+ builder[:soapenv].Body { body.call builder } if body
end
end
end
# Takes a body, and returns an envelope with session token merged in
@@ -24,27 +20,52 @@
def self.authenticated_xml(token, &body)
failure_message = 'Session token not set. Did you call authenticate?'
fail failure_message unless token.present?
header = lambda do |builder|
- builder[:api].SessionHeader do
- builder[:api].session(token)
- end
+ builder[:api].SessionHeader { builder[:api].session(token) }
builder
end
xml(header, body)
end
- # Builds multiple fields
+ # Builds one field using key and value. Treats value differently:
+ # - Hash: recursively builds fields
+ # - ZObject: builds a nested z object, building fields inside
+ # - Nil: does nothing
+ # - Else: builds the field node
# @param [Nokogiri::XML::Builder] builder
# @param [Symbol] namespace
+ # @param [Hash] key
+ # @param [Hash|Zuora::Soap::ZObject|NilClass|Object] value
+ # @return nil
+ def self.build_field(builder, namespace, key, value)
+ zuora_field_name = to_zuora_key(key)
+ build_fields_thunk = -> { build_fields builder, namespace, value }
+ case value
+ when Hash
+ builder[namespace].send(zuora_field_name) { build_fields_thunk[] }
+ when Zuora::Soap::ZObject
+ zuora_type = to_zuora_key(value.type)
+ xsi = { 'xsi:type' => "obj:#{zuora_type}" }
+ builder[:api].send(zuora_field_name) do
+ builder[:api].send(zuora_type, xsi) { build_fields_thunk[] }
+ end
+ when NilClass
+ else
+ builder[namespace].send(zuora_field_name, value)
+ end
+ end
+
+ # Builds multiple fields in given object
+ # @param [Nokogiri::XML::Builder] builder
+ # @param [Symbol] namespace
# @param [Hash] object
# @return nil
def self.build_fields(builder, namespace, object = {})
object.each do |key, value|
- zuora_field_name = to_zuora_key(key)
- builder[namespace].send(zuora_field_name, value) unless value.nil?
+ build_field builder, namespace, key, value
end
end
# Builds multiple objects
# @param [Nokogiri::XML::Builder] builder