Sanja, I apologize. I did not realize that another file (process_includes.py), imported by generateDS.py, had also changed. Actually, that new version of process_includes.py was at Bitbucket, but there was no way for you to know that.
So, I've created a new distribution file containing this fix. You should be able to use it as follows: $ tar xf generateDS-2.29.7.tar.gz $ cd generateDS-2.29.7 $ python generateDS.py -o tmp01sup.py ../test04-01.xsd $ diff -u ../generateDS-2.29.5/tmp01sup.py tmp01sup.py By the way, there is no need to do an install in order to run the above from within that directory. The last line above (diff -u ...) should produce the diff file that I've attached (in a separate email). The above produces the change that we have been trying to achieve, I believe. Please let me know about that. In a separate email, I've attached that new distribution file and the diff file, too. Again, I apologize for wasting your cycles. I like to put off pushing a change to Bitbucket and pypi.python.org until I have some confidence that we want to keep it. I need to come up with a more reliable way to pass along a temporary change for testing. Maybe this (producing a distribution file) is that better way. Let me know what you think about that, too, please. Dave On Wed, Feb 21, 2018 at 03:47:41PM +0000, Sanja Abbott wrote: > Hi Dave, > > Thank you for sending me generateDS.py (version 2.29.7), a schema for > testing the fixed attributes (test04-01.xsd) and the output file > (tmp07sup.py) you get by running this script. > > I have tried to replicate your results but I get this error: > > sanja-ml:generateDS-2.29.5 sanja$ python generateDS.py -o "test.py" > ../../Desktop/test04-01.xsd > Traceback (most recent call last): > File "generateDS.py", line 7438, in <module> > main() > File "generateDS.py", line 7426, in main > superModule=superModule) > File "generateDS.py", line 6904, in parseAndGenerate > no_redefine_groups=noRedefineGroups, > TypeError: 'lxml.etree._ElementTree' object is not iterable > > To explain how I got there. I've downloaded your latest available package > generateDS-2.29.5.tar.gz. Ran the following commands: > > tar xzvf generateDS-2.29.5.tar.gz > cd generateDS-2.29.5 > python setup.py build > python setup.py install > > Then I renamed generateDS.py to generateDS_original.py and copied > generateDS.py version '2.29.7' into the generateDS-2.29.5 folder. You can > see that the two generateDS scripts are in the same directory and they are > different: > > sanja-ml:generateDS-2.29.5 sanja$ diff generateDS.py generateDS_original.py > 232c232 > < VERSION = '2.29.7' > --- > > VERSION = '2.29.5' > 264d263 > < SchemaNamespaceDict = {} > 1434,1435c1433 > < default=None, > < fixed=None): > --- > > default=None): > 1440,1442d1437 > < # treat `fixed` the same as `default`. > < if fixed is not None: > < self.default = fixed > 1702,1705d1696 > < if 'fixed' in attrs: > < fixed = attrs['fixed'] > < else: > < fixed = None > 1708,1709c1699 > < attribute = XschemaAttribute( > < name, data_type, use, default, fixed) > --- > > attribute = XschemaAttribute(name, data_type, use, > default) > 1713,1714c1703 > < attribute = XschemaAttribute( > < name, data_type, use, default, fixed) > --- > > attribute = XschemaAttribute(name, data_type, use, > default) > 2824,2829d2812 > < ns_prefix = SchemaNamespaceDict.get(name) > < if ns_prefix is not None and ns_prefix[0] is not None: > < namespace = ns_prefix[0] + ':' > < ns_def = 'xmlns:{}'.format(ns_prefix[0]) > < if ns_def not in nameSpacesDef: > < nameSpacesDef += ' {}="{}"'.format(ns_def, ns_prefix[1]) > 4365c4348 > < pats2 = [u'^{}$'.format(replaceVbars(p1)) for p1 in pats1] > --- > > pats2 = ['^{}$'.format(replaceVbars(p1)) for p1 in pats1] > 4561,4562d4543 > < # Check special case: simpletype that restricts xs:simpletype. > < # Prevent infinite recursion. > 6870,6871c6851 > < SchemaLxmlTree, ModuleSuffix, UseSourceFileAsModuleName, \ > < SchemaNamespaceDict > --- > > SchemaLxmlTree, ModuleSuffix, UseSourceFileAsModuleName > 6898c6878 > < doc, SchemaNamespaceDict = > process_includes.process_include_files( > --- > > doc = process_includes.process_include_files( > 6935c6915 > < doc, SchemaNamespaceDict = > process_includes.process_include_files( > --- > > doc = process_includes.process_include_files( > > > If I ran generateDS_original.py on your schema (test04-01.xsd) and compare > the result with the tmp07sup.py file you've provided I get: > > sanja-ml:generateDS-2.29.5 sanja$ python generateDS_original.py -o "test.py" > ../../Desktop/test04-01.xsd > sanja-ml:generateDS-2.29.5 sanja$ diff test.py ../../Desktop/tmp07sup.py > 5,6c5,6 > < # Generated Wed Feb 21 15:32:42 2018 by generateDS.py version 2.29.5. > < # Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 12:54:16) [GCC 4.2.1 > (Apple Inc. build 5666) (dot 3)] > --- > > # Generated Mon Feb 19 14:13:30 2018 by generateDS.py version 2.29.7. > > # Python 3.6.3 (default, Oct 3 2017, 21:45:48) [GCC 7.2.0] > 9c9,14 > < # ('-o', 'test.py') > --- > > # ('-f', '') > > # ('-o', 'tmp07sup.py') > > # ('-s', 'tmp07sub.py') > > # ('--super', 'tmp07sup') > > # ('--member-specs', 'dict') > > # ('--export', 'write') > 12c17 > < # ../../Desktop/test04-01.xsd > --- > > # test04-01.xsd > 15c20 > < # generateDS_original.py -o "test.py" ../../Desktop/test04-01.xsd > --- > > # ./generateDS.py -f -o "tmp07sup.py" -s "tmp07sub.py" > --super="tmp07sup" --member-specs="dict" --export="write" test04-01.xsd > 18c23 > < # generateDS-2.29.5 > --- > > # Test01 > 448c453 > < ExternalEncoding = 'ascii' > --- > > ExternalEncoding = 'utf-8' > 718a724,728 > > member_data_items_ = { > > 'garden_name': MemberSpec_('garden_name', 'xs:string', 0, 0, > {'use': 'required'}), > > 'version': MemberSpec_('version', 'xs:token', 0, 0, {'use': > 'required'}), > > 'vegetable': MemberSpec_('vegetable', 'xs:string', 1, 1, {'name': > 'vegetable', 'type': 'xs:string', 'minOccurs': '0', 'maxOccurs': > 'unbounded'}, None), > > } > 721c731 > < def __init__(self, garden_name=None, version=None, vegetable=None): > --- > > def __init__(self, garden_name='dave\'s backyard', version='3.0.0.0', > vegetable=None): > 778c788 > < if self.garden_name is not None and 'garden_name' not in > already_processed: > --- > > if self.garden_name != "dave's backyard" and 'garden_name' not in > already_processed: > 781c791 > < if self.version is not None and 'version' not in > already_processed: > --- > > if self.version != "3.0.0.0" and 'version' not in > already_processed: > 924,925c934,935 > < sys.stdout.write('#from test import *\n\n') > < sys.stdout.write('import test as model_\n\n') > --- > > sys.stdout.write('#from tmp07sup import *\n\n') > > sys.stdout.write('import tmp07sup as model_\n\n') > > As expected, my test.py was created with the original generateDS script and > it's different to yours, mine used version '2.29.5', yours the intended > version '2.29.7'. > > However, if I repeat the same with your new generateDS.py version '2.29.7' > script I get the following: > sanja-ml:generateDS-2.29.5 sanja$ python generateDS.py -o "test.py" > ../../Desktop/test04-01.xsd > Traceback (most recent call last): > File "generateDS.py", line 7438, in <module> > main() > File "generateDS.py", line 7426, in main > superModule=superModule) > File "generateDS.py", line 6904, in parseAndGenerate > no_redefine_groups=noRedefineGroups, > TypeError: 'lxml.etree._ElementTree' object is not iterable > > I'm not sure what I could do next. I would be very grateful if you could > suggest what that might be. > > Thank you, > Sanja > > On 19/02/2018 22:36, Dave Kuhlman wrote: > > Sanja, > > > > If I understand you correctly, we are getting different results. > > > > I have the following in my test XML schema: > > > > <xs:attribute name="garden_name" type="xs:string" > > fixed="dave's backyard" use="required" /> > > <xs:attribute name="version" type="xs:token" use="required" > > fixed="3.0.0.0"/> > > > > And, the constructor that is generated by generateDS.py is the > > following: > > > > def __init__(self, garden_name='dave\'s backyard', version='3.0.0.0', > > vegetable=None): > > > > Am I right that this is what you want generated? > > > > If so, and if you are not getting that result, is it possible that > > another version of generateDS.py on your machine is being used by > > mistake. > > > > Or, maybe there is something that I don't understand correctly? > > > > I'll send the complete files (schema, generated module, and > > generateDS.py) in a separate email so as not to put too much bulk in > > the generateds-users email list. > > > > Let me know if there is something else I need to test. > > > > About, the generateds-users email list -- Yes, it would be good to > > reply to or CC that list. For one thing, that gives me an archive > > of comments, requests, fixes, etc. And, also, there may be other > > users who are interested, have suggestions, etc. > > > > Thanks for help with this. > > > > Dave > > > > On Mon, Feb 19, 2018 at 12:30:20PM +0000, Sanja Abbott wrote: > > > Dear Dave, > > > > > > thank you for sending me the fix for the issue of 'fixed values for > > > attributes'. I've tested your solution and it seems it's not producing the > > > result I expected. > > > > > > I'd like to have this attribute: > > > <xs:attribute name="version" type="xs:token" use="required" > > > fixed="3.0.0.0"/> > > > > > > For my purpose it's essential that the attribute is 'required'. If I > > > remove > > > use="required" and set default="3.0.0.0" (default can't be required): > > > <xs:attribute name="version" type="xs:token" default="3.0.0.0"/> > > > > > > I get exactly what I need in the python script using generateDS.py: > > > > > > def __init__(self, emdb_id=None, version='3.0.0.0', admin=None, > > > crossreferences=None, sample=None, ... > > > > > > However, the attribute I require creates: > > > def __init__(self, emdb_id=None, version=None, admin=None, > > > crossreferences=None, sample=None, ... > > > > > > > > > Is there anything that can be done so that I can use the intended format > > > for > > > my attribute. > > > > > > Since it's my first time contacting you I wasn't sure if I should cc > > > generateds-users as well. Please let me know. > > > > > > Thank you for your help, > > > Sanja > > > > > > > > > On 15/02/2018 21:20, Dave Kuhlman wrote: > > > > Sanja, > > > > > > > > I've been thinking about this issue a bit more. > > > > > > > > From what I can learn, an attribute with a `fixed` value is the same > > > > as one with a `default` value except that a validating parser should > > > > enforce the `fixed` restriction. That means that if the value of > > > > that attribute is different from the value specified by `fixed` in > > > > the schema, then the parser should report that the XML document does > > > > not validate. > > > > > > > > Here is a bit of information, if you are interested: > > > > > > > > - https://www.w3schools.com/xml/el_attribute.asp > > > > > > > > - https://msdn.microsoft.com/en-us/library/ms256143(v=vs.110).aspx > > > > > > > > The parsers generated by generateDS.py are *not* validating parsers. > > > > So, I believe that we're good by treating `fixed` attributes in the > > > > same way as `default` attributes. > > > > > > > > With this change, you will be able to get that fixed value even > > > > when the XML instance document omits it. > > > > > > > > If the user (you, for example) wants to validate an XML instance > > > > document and wants to enforce the `fixed` restriction, then s/he can > > > > run `xmllint` (or some other XML validation program) against the XML > > > > document and the schema. > > > > > > > > I've attached a modified version of generateDS.py containing this > > > > fix to a separate email. > > > > > > > > Let me know what you think and whether this solves the problem for > > > > you. > > > > > > > > And, thank you for suggesting this enhancement. > > > > > > > > Dave > > > > > > > > On Fri, Feb 09, 2018 at 11:42:22AM +0000, Sanja Abbott wrote: > > > > > Hi, > > > > > > > > > > I wonder if you could implement 'fixed' values for attributes in your > > > > > generateDS. My schema has an attribute called 'version': > > > > > > > > > > However, the python script that generateDS creates has no means to > > > > > use this > > > > > fixed value. > > > > > > > > > > Thank you, > > > > > Sanja Abbott > > > > > > > > > > -- > > > > > _____________________________________________ > > > > > > > > > > Sanja Abbott, PhD > > > > > Bioinformatician and Software Infrastructure Manager > > > > > Cellular Structures and 3D Bioimaging > > > > > European Bioinformatics Institute > > > > > Welcome Trust Genome Campus > > > > > Hinxton > > > > > Cambridge > > > > > CB10 1SD > > > > > UK > > > > > http://www.ebi.ac.uk > > > > > Tel: 01223 49 4300 > > > > > > > > > > ------------------------------------------------------------------------------ > > > > > 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 > > > -- > > > _____________________________________________ > > > > > > Sanja Abbott, PhD > > > Bioinformatician and Software Infrastructure Manager > > > Cellular Structures and 3D Bioimaging > > > European Bioinformatics Institute > > > Welcome Trust Genome Campus > > > Hinxton > > > Cambridge > > > CB10 1SD > > > UK > > > http://www.ebi.ac.uk > > > Tel: 01223 49 4300 > > > > > -- > _____________________________________________ > > Sanja Abbott, PhD > Bioinformatician and Software Infrastructure Manager > Cellular Structures and 3D Bioimaging > European Bioinformatics Institute > Welcome Trust Genome Campus > Hinxton > Cambridge > CB10 1SD > UK > http://www.ebi.ac.uk > Tel: 01223 49 4300 > -- 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