Justin,

Super.  Glad to hear that we solved your problem.

I appreciate your words of thanks.

Let me know if and when you have more questions and suggestions.

Dave


On Fri, Oct 05, 2018 at 08:34:02AM -0400, Justin McManus wrote:
>    I think that's it, Dave! Glad to know it's currently supported after all!
>    Thanks for your time and patience. The updated documentation looks great
>    and should definitely help anyone else running into similar issues.
>    On Thu, Oct 4, 2018 at 5:57 PM Dave Kuhlman <dkuhl...@davekuhlman.org>
>    wrote:
> 
>      Justin,
> 
>      I'm groping here.  In part because it is certainly possible that the
>      code generated by `generateDS.py` does not fit your use case well.
>      But, let me try.
> 
>      If you look in the generated code at method `animalCollection.build`
>      and `animalCollection.buildChildren`, you will see that it captures
>      the value of the `xsi:type` attribute and then eventually builds an
>      instance of class `dog`.  I stepped through this code with the
>      debugger (`pdb`, actually `ipdb`) to make sure that this happens.
>      Also notice the following line at the end of
>      `animalCollection.buildChildren`:
> 
>          obj_.original_tagname_ = 'animal'
> 
>      That is part of what tells it to generate an "<animal>" with an
>      `xsi:type`
>      attribute instead of a "<dog>".  The other piece is
>      `obj_.extensiontype_`.
> 
>      So, attempting to answer your question: How do I create a `dog` that
>      is derived from `animal`? -- You build an instance of class `dog`,
>      but set its `original_tagname_` to "animal" and its `extensiontype_`
>      to "dog".  In order to test this, I did it as follows (see
>      sample01.py, in the attached zip file):
> 
>          import sys
>          import example01
> 
>          def test():
>              animal_collection = example01.animalCollection()
>              animal = example01.dog(name='milicent')
>              #
>              # must set original_tagname_ and extensiontype_ for
>              # type derived by extension.  For info, see:
>              #
>      https://www.w3.org/TR/2004/REC-xmlschema-0-20041028/#DerivExt
>              animal.original_tagname_ = 'animal'
>              animal.extensiontype_ = 'dog'
>              animal_collection.add_animal(animal)
>              animal_collection.export(sys.stdout, 0)
>              return animal_collection, animal
> 
>          test()
> 
>      Run it and you get:
> 
>              $ python sample01.py
>              <animalCollection>
>                      <animal
>      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:type="dog">
>                              <name>milicent</name>
>                      </animal>
>              </animalCollection>
> 
>      Does get you on the road toward what you are trying to accomplish?
>      If not, let me know, and give me a bit more guidance.
> 
>      Hope so.  Whew.  I had to grope and stumble through this in a
>      debugger.
> 
>      It's certainly not obvious.  I'll try to add a note on this to the
>      `generateDS` documentation.  (done)
> 
>      Maybe I'd best add a unit test, also.  (done)
> 
>      Hope this helps.  And, thanks for pushing me to work through it.
>      It's something I should understand, myself.
> 
>      Dave
> 
>      On Wed, Oct 03, 2018 at 08:54:29PM -0400, Justin McManus wrote:
>      > Ok, I'll admit that maybe I'm missing something here, but I'm really
>      not
>      > sure how to add an animal of type dog to the animal collection then,
>      which
>      > is the semantically valid XML required by the schema I'm working with.
>      E.g.
>      > this doesn't work:
>      >
>      > dog = example.animal("dog")
>      > dog.name = "fido"
>      > animalCollection.add_animal(dog)
>      > (the name is dropped from the output xml)
>      >
>      > How can I add the dog-specific fields (i.e. name) to an <animal
>      > xsi:type="dog">? If I export the dog from the above snippet, I get:
>      >
>      > <animal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>      > xsi:type="dog"/>
>      >
>      > On Wed, Oct 3, 2018 at 6:32 PM Dave Kuhlman <dkuhl...@davekuhlman.org>
>      > wrote:
>      >
>      > > Justin,
>      > >
>      > > Patient: "Doc, it hurts when I do this."
>      > > Doctor: "Then don't do that."
>      > >
>      > > Lord, I've waited entirely too long to tell that joke.  But,
>      > > seriously, ...
>      > >
>      > > If I understand you correctly, you are saying that the code
>      > > generated from `example.xsd` allows you to do this:
>      > >
>      > >     # test02.py
>      > >     import sys
>      > >     import example01
>      > >
>      > >     def test():
>      > >         animalcollection = example01.animalCollection()
>      > >         dog = example01.dog(name="frisky")
>      > >         # add a `dog` to `animalcollection.animal`.
>      > >         animalcollection.add_animal(dog)    # should not do
>      this.
>      > >         animalcollection.export(sys.stdout, 0)
>      > >
>      > >     test()
>      > >
>      > > So, I'm saying: "Don't do that."
>      > >
>      > > Again, more seriously, are you suggesting that the code generated by
>      > > `generateDS.py` should block you from adding a `dog` to
>      > > `animalcollection.animal`?  We can talk about whether those
>      > > generated bindings should prevent you from adding the wrong type of
>      > > object to a child collection.  Possibly, that would be a good
>      > > enhancement, though I'm not sure.  But, yes, you are right, the
>      > > generated code provides no such protection.
>      > >
>      > > And, yes, if you run the above code, it produces something we do not
>      > > want:
>      > >
>      > >         $ python test02.py
>      > >         <animalCollection>
>      > >                 <dog>
>      > >                         <name>frisky</name>
>      > >                 </dog>
>      > >         </animalCollection>
>      > >
>      > > And, actually, you can do silly things like the following, also:
>      > >
>      > >     class Goofy():
>      > >         pass
>      > >
>      > >     bad_dog = Goofy()
>      > >     animalcollection.add_animal(bad_dog)    # should not do
>      this.
>      > >
>      > > Do we really want the generated bindings to be checking for these
>      > > mis-uses?  I suppose this would mean that generated functions
>      > > `animalCollection.set_animal()` and `annimalCollection.add_animal()`
>      > > would need to do this checking.  What about the constructor? 
>      Should
>      > > it check each argument also?  That seems like a lot of
>      possibilities
>      > > to check for.  What do you think?
>      > >
>      > > Do I understand you correctly on this?
>      > >
>      > > Dave
>      > >
>      > > On Wed, Oct 03, 2018 at 01:06:24PM -0400, Justin McManus wrote:
>      > > > Thanks for your response, Dave. Sorry for the incomplete example.
>      To
>      > > > continue with your much better example, the problem occurs when
>      another
>      > > > complex type, let's say "animalCollection", lists "animal" as an
>      element.
>      > > > In this case, we can add a dog to the collection just fine using
>      the
>      > > > generated bindings, however schema validation will fail since the
>      > > > collection is only expected to contain animal. I've attached some
>      working
>      > > > (well, you know what i mean :)  examples this time.
>      > > >
>      > > > xmllint --schema example.xsd example-bad.xml
>      > > > <?xml version="1.0"?>
>      > > > <animalCollection>
>      > > >     <dog>
>      > > >         <name>fido</name>
>      > > >     </dog>
>      > > > </animalCollection>
>      > > > example-bad.xml:3: element dog: Schemas validity error : Element
>      'dog':
>      > > > This element is not expected. Expected is ( animal ).
>      > > > example-bad.xml fails to validate
>      > > >
>      > > > xmllint --schema example.xsd example-good.xml
>      > > > <?xml version="1.0"?>
>      > > > <animalCollection
>      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
>      > > >     <animal xsi:type="dog">
>      > > >         <name>fido</name>
>      > > >     </animal>
>      > > > </animalCollection>
>      > > > example-good.xml validates
>      > > >
>      > > >
>      > > >
>      > > > On Tue, Oct 2, 2018 at 4:57 PM Dave Kuhlman
>      <dkuhl...@davekuhlman.org>
>      > > > wrote:
>      > > >
>      > > > > Justin,
>      > > > >
>      > > > > Oops.  The output from xmllint in my previous message used a
>      > > > > slightly extended .xsd and .xml.
>      > > > >
>      > > > > Here is the output from the two files I actually attached:
>      > > > >
>      > > > >     $ xmllint --schema test01.xsd test01.xml
>      > > > >     <?xml version="1.0"?>
>      > > > >     <dog>
>      > > > >         <name>jasmine</name>
>      > > > >     </dog>
>      > > > >     test01.xml validates
>      > > > >
>      > > > > Dave
>      > > > >
>      > > > > On Tue, Oct 02, 2018 at 09:25:32AM -0400, Justin McManus wrote:
>      > > > > >    Hi,
>      > > > > >    Your generateDS library has been really useful to me,
>      thanks.
>      > > > > However, I
>      > > > > >    just found a blocking bug for my use case, and I checked
>      > > sourceforge
>      > > > > and
>      > > > > >    bitbucket and didn't find any public issue trackers that
>      I could
>      > > > > report it
>      > > > > >    on. I'll take a look at fixing it anyway, but I wanted to
>      check if
>      > > > > there's
>      > > > > >    a place to report this officially, and whether you're
>      accepting
>      > > pull
>      > > > > >    requests.
>      > > > > >    The issue was found in generateDS 2.29.24 from PyPi. The
>      gist of
>      > > it is
>      > > > > >    that complex subtypes are always assumed to be defined as
>      > > substitution
>      > > > > >    groups, e.g. type "Dog" that extends an abstract type
>      "Animal"
>      > > will be
>      > > > > >    rendered as <Dog> instead of <Animal type="Dog">, which
>      fails xsd
>      > > > > >    validation. Here's a minimal example:
>      > > > > >    example.xsd:
>      > > > > >    <?xml version="1.0"?>
>      > > > > >    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
>      > > version="1.0">
>      > > > > >    <xs:element name="SubType" type="SubType"></xs:element>
>      > > > > >    <xs:complexType name="AbstractBaseType"
>      > > > > abstract="true"></xs:complexType>
>      > > > > >    <xs:complexType name="SubType">
>      > > > > >      <xs:complexContent>
>      > > > > >        <xs:extension
>      base="AbstractBaseType"></xs:extension>
>      > > > > >      </xs:complexContent>
>      > > > > >    </xs:complexType>
>      > > > > >    </xs:schema>
>      > > > > >    $>  generateDS -o example.py ./example.xsd
>      > > > > >    $> python
>      > > > > >    >>> import sys, example
>      > > > > >    >>> example.SubType().export(sys.stdout, 0)
>      > > > > >    <SubType/>
>      > > > >
>      > > > > --
>      > > > >
>      > > > > Dave Kuhlman
>      > > > > http://www.davekuhlman.org
>      > > > >
>      > >
>      > > > <?xml version="1.0"?>
>      > > > <animalCollection>
>      > > >     <dog>
>      > > >         <name>fido</name>
>      > > >     </dog>
>      > > > </animalCollection>
>      > > >
>      > >
>      > >
>      > > > <?xml version="1.0"?>
>      > > > <animalCollection
>      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
>      > > >     <animal xsi:type="dog">
>      > > >         <name>fido</name>
>      > > >     </animal>
>      > > > </animalCollection>
>      > > >
>      > >
>      > >
>      > > --
>      > >
>      > > Dave Kuhlman
>      > > http://www.davekuhlman.org
>      > >
> 
>      --
> 
>      Dave Kuhlman
>      http://www.davekuhlman.org

-- 

Dave Kuhlman
http://www.davekuhlman.org


_______________________________________________
generateds-users mailing list
generateds-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/generateds-users

Reply via email to