lib/dslize/formatter/xsd_formatter.rb in dslize-0.0.3 vs lib/dslize/formatter/xsd_formatter.rb in dslize-0.0.4
- old
+ new
@@ -19,10 +19,23 @@
# relations
xsd.sequence do
{ :has_one => nil, :has_many => "unbounded"}.each do |relation, max_occurs|
(options[relation] or []).each do |k, v|
named_object_if_needed(xsd, k, v) do
- xsd.element(nil, { :ref => (v[:type] or k), :maxOccurs => max_occurs }.select { |k,v| !v.nil? })
+ clazz = v[:type] or k
+ subclasses = get_subclasses(clazz)
+ if subclasses.empty?
+ xsd.element(nil, { :ref => clazz, :maxOccurs => max_occurs }.select { |k,v| !v.nil? })
+ else
+ xsd.choice({ :maxOccurs => max_occurs }.select { |k,v| !v.nil? }) do
+ subclasses.each do |sub_type|
+ xsd.element(nil, :ref => sub_type)
+ end
+ if !objects[clazz][:abstract]
+ xsd.element(nil, :ref => clazz)
+ end
+ end
+ end
end
end
end
end