On Sun, Oct 23, 2016 at 05:30:55PM +0200, Pietro Saccardi wrote:
> Hello Dave,
> 
> my name is Pietro. I recently started using generateDS--great job! it's
> really useful and works seamlessly out of the box.

Pietro,

Great.

> 
> While testing, I encountered a bug. I wanted to file it to sourceforce, but
> I am unable to create tickets. I am also not very used to the platform so I
> may have missed something.

Not so great.

Thanks for reporting this.  I'm going to be away traveling for most
of this week.  I've put this on my To-do list, and will look at it when
I get back.

My recollection is that generateDS.py does not distinguish very
carefully between <xsd:sequence> and <xsd:choice>.  So, this may be
a pretty deep problem.  But, at the least, generateDS.py should not
generate the silly code that your example shows.

More later.

Dave

> 
> Anyway, I'll describe the bug.
> 
> Consider such a schema:
> 
> <xsd:element name="authors">
>     <xsd:complexType>
>         <xsd:sequence>
>             <xsd:element ref="author"/>
>             <xsd:choice maxOccurs="unbounded" minOccurs="0">
>                 <xsd:element ref="author"/>
>                 <xsd:element name="cooperation" type="xsd:string"/>
>             </xsd:choice>
>         </xsd:sequence>
>     </xsd:complexType>
> </xsd:element>
> 
> This will require the <authors> element to have a first child of type
> <author>, followed by zero or more instances of the elements <author> or
> <cooperation>.
> 
> Such schema is not handled correctly in generateDS; it will generate
> ambiguity between the unique, initial author and the list of author
> objects. This is an excerpt of the buildChildren method of the authors
> class:
> 
> def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
>     if nodeName_ == 'author':
>         obj_ = person.factory()
>         obj_.build(child_)
>         self.author = obj_
>         obj_.original_tagname_ = 'author'
>     elif nodeName_ == 'author':
>         obj_ = person.factory()
>         obj_.build(child_)
>         self.author.append(obj_)
>         obj_.original_tagname_ = 'author'
>     elif nodeName_ == 'cooperation':
>         cooperation_ = child_.text
>         cooperation_ = self.gds_validate_string(cooperation_, node,
> 'cooperation')
>         self.cooperation.append(cooperation_)
> 
> As you can see, the second elif will never be reached and any further
> <author> will override the author property, losing the remaining elements
> in the list. Also, the exportChildren method will crash, because it will
> try to enumerate the author property of authors.
> 
> I changed the structure of my XSD to work around this problem, but I think
> this should either be remarked in the documentation or fixed.
> 
> I hope this can be of any use; thank you for your great work on generateDS!
> 
> Best regards,
> 
> Pietro Saccardi

-- 

Dave Kuhlman
http://www.davekuhlman.org

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
generateds-users mailing list
generateds-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/generateds-users

Reply via email to