Hi, Dave,
Thanks for your reply.
Sorry, I think I might not be quite specific in describing the issue I
encountered.
Actually, I mean, in the below xsd:
<xs:complexType name="TEntityType">
<xs:sequence>
<xs:element name="Documentation" type="edm:TDocumentation"
minOccurs="0" maxOccurs="1" />
<xs:element name="Key" type="edm:TEntityKeyElement"
minOccurs="0" maxOccurs="1" /> <xs:choice minOccurs="0"
maxOccurs="unbounded">
<xs:element name="Property" type="edm:TEntityProperty"
minOccurs="0" maxOccurs="unbounded" />
<xs:element name="NavigationProperty"
type="edm:TNavigationProperty" minOccurs="0" maxOccurs="unbounded" />
</xs:choice>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
<xs:attributeGroup ref="edm:TDerivableTypeAttributes" />
<xs:attribute ref="cg:TypeAccess" use="optional" />
<xs:anyAttribute namespace="##other" processContents="lax" />
</xs:complexType>
For TEntityType python class, the corresponding python class code should
have a get_NavigationProperty(self) method generated, as what is has done
for get_Property(self) method, but it isn't the case.
I confirm that the class for TNavigationProperty is well generated in my
output python code.
The below is the code generated for TEntityType , use can see that
get_NavigationProperty(self) methos is missing:
class TEntityType(GeneratedsSuper):
subclass = None
superclass = None
def __init__(self, Name=None, Documentation=None, Key=None,
Property=None, anytypeobjs_=None):
self.original_tagname_ = None
self.Name = _cast(None, Name)
self.Documentation = Documentation
self.Key = Key
if Property is None:
self.Property = []
else:
self.Property = Property
if anytypeobjs_ is None:
self.anytypeobjs_ = []
else:
self.anytypeobjs_ = anytypeobjs_
self.anyAttributes_ = {}
def factory(*args_, **kwargs_):
if TEntityType.subclass:
return TEntityType.subclass(*args_, **kwargs_)
else:
return TEntityType(*args_, **kwargs_)
factory = staticmethod(factory)
def get_Documentation(self): return self.Documentation
def set_Documentation(self, Documentation): self.Documentation =
Documentation
def get_Key(self): return self.Key
def set_Key(self, Key): self.Key = Key
def get_Property(self): return self.Property
def set_Property(self, Property): self.Property = Property
def add_Property(self, value): self.Property.append(value)
def insert_Property_at(self, index, value): self.Property.insert(index,
value)
def replace_Property_at(self, index, value): self.Property[index] =
value
def get_anytypeobjs_(self): return self.anytypeobjs_
def set_anytypeobjs_(self, anytypeobjs_): self.anytypeobjs_ =
anytypeobjs_
def add_anytypeobjs_(self, value): self.anytypeobjs_.append(value)
def insert_anytypeobjs_(self, index, value): self._anytypeobjs_[index]
= value
def get_Name(self): return self.Name
def set_Name(self, Name): self.Name = Name
def get_anyAttributes_(self): return self.anyAttributes_
def set_anyAttributes_(self, anyAttributes_): self.anyAttributes_ =
anyAttributes_
Regards
Nan
On Fri, Jun 5, 2015 at 2:35 AM, Dave Kuhlman <[email protected]>
wrote:
> On Tue, Jun 02, 2015 at 11:36:19PM +0800, Huang, Nan wrote:
> > Today I tried to work with generatedDS for my OData related project, we
> > have a XSD file in hands, and tried to generated the corresponding python
> > model for it, but we encountered an issue regarding a missing element in
> > the generated python code. We tried with the latest 2.16a0, and older
> ones,
> > 2.14a, 2,4c, all of them have the same issue.
> >
> > The XSD we tried to use is here:
> > https://msdn.microsoft.com/en-us/library/hh879817.aspx
> >
> > You can see that in this xsd, there is a section:
> >
> > <xs:complexType name="TEntityType">
> > <xs:sequence>
> > <xs:element name="Documentation" type="edm:TDocumentation"
> > minOccurs="0" maxOccurs="1" />
> > <xs:element name="Key" type="edm:TEntityKeyElement"
> > minOccurs="0" maxOccurs="1" /> <xs:choice minOccurs="0"
> > maxOccurs="unbounded">
> > <xs:element name="Property" type="edm:TEntityProperty"
> > minOccurs="0" maxOccurs="unbounded" />
> > <xs:element name="NavigationProperty"
> > type="edm:TNavigationProperty" minOccurs="0" maxOccurs="unbounded" />
> > </xs:choice>
> > <xs:any namespace="##other" processContents="lax" minOccurs="0"
> > maxOccurs="unbounded" />
> > </xs:sequence>
> > <xs:attributeGroup ref="edm:TDerivableTypeAttributes" />
> > <xs:attribute ref="cg:TypeAccess" use="optional" />
> > <xs:anyAttribute namespace="##other" processContents="lax" />
> > </xs:complexType>
> >
> > In the <xs:choice> element, there are two sub-elements, Property and
> > NavigationProperty. But in the generated code, we found only Property
> > under TEntityType, no NavigationProperty.
>
> Nan Huang,
>
> Thanks for your report. Your description of the problem was very
> helpful in trying to reproduce the problem.
>
> I've generated code using the XML schema you referred to. I also
> searched for, found, and downloaded a schema imported by that one.
> The schemas I'm using are at these locations:
>
> - https://msdn.microsoft.com/en-us/library/hh879817.aspx
> -
> https://code.google.com/p/edmx/source/browse/trunk/Source/Edmx/Schema/System.Data.Resources.CodeGenerationSchema.xsd
>
> I've attached those schemas to this message in case you want to
> compare them with yours.
>
> The code I generated contains definitions of classes TEntityProperty
> and TNavigationProperty. And in method buildChildren in class
> TEntityType, it builds Property as an instance of class
> TEntityProperty and it builds NavigationProperty as an instance of
> class TNavigationProperty. It also looks like they are both being
> exported in method exportChildren of class TEntityType.
>
> That all seems correct to me.
>
> So, which is the piece that is missing?
>
> I've attached the file that I generated (tmp01sup.py) so that you
> can check to see whether it contains something that is missing in
> that files that you generate.
>
> You can look at the top of that generated file to see the command
> line and options that I used to generate this file. I also tried it
> with other/fewer options and got similar results.
>
> I appologize for being a bit slow to see this problem. Perhaps you
> can tell me more specifically what is missing.
>
> I'm using generateDS.py 2.16a. That's the same as 2.16a0. For some
> reason, setuptools (or whatever it is) added the zero when I
> uploaded that version to the Python Package Index.
>
> >
> > Is this a bug or we miss-used the library? We simply used the -o
> > option in your tutorial.
> >
> > BTW, in recent version, we only support lxml instead of both lxml and
> > ET in generated code, this is a bit inconvenient as lxml is platform
> > dependent and need native library, and we cannot continue to have a
> > single pure python dist for all platforms.
>
> As I recall, I had problems with ElementTree at one point. It had
> something to do with namespaces and namespace prefixes in
> process_includes.py (which is imported by generateDS.py. My belief
> is that ElementTree is pretty strong in its support of namespaces,
> so we can wonder about whether that was my mistake.
>
> It is possible, maybe even likely, that you can patch the generated
> file so that it uses ElementTree instead of Lxml. You could even
> patch generateDS.py itself so that it produces files that use
> ElementTree instead of Lxml. It would require changing just a few
> lines of boiler plate, after all. Here is a diff that will give you
> an idea of what to change:
>
> --- tmp26sup.py 2015-06-04 11:15:02.236588923 -0700
> +++ test01.py 2015-06-04 11:17:36.094327799 -0700
> @@ -31,18 +31,14 @@
> import base64
> import datetime as datetime_
> import warnings as warnings_
> -from lxml import etree as etree_
> +from xml.etree import ElementTree as etree_
>
>
> Validate_simpletypes_ = True
>
>
> def parsexml_(infile, parser=None, **kwargs):
> - if parser is None:
> - # Use the lxml ElementTree compatible parser so that, e.g.,
> - # we ignore comments.
> - parser = etree_.ETCompatXMLParser()
> - doc = etree_.parse(infile, parser=parser, **kwargs)
> + doc = etree_.parse(infile, **kwargs)
> return doc
>
> There may be features that require Lxml in the generated code. But,
> if your use case does not use those features, ElementTree might work
> for you. You will have to do testing yourself to find out.
>
> If that works, at least your users will not need to install Lxml,
> even though you (or whoever generates the code) will still need
> Lxml.
>
> Hope this helps.
>
> Dave
>
> >
> > Regards
> >
> > Nan Huang
>
> --
>
> Dave Kuhlman
> http://www.davekuhlman.org
>
------------------------------------------------------------------------------
_______________________________________________
generateds-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/generateds-users