Change history
Version 2.44.3 (10/08/2024)
- Fix to version numbering.
Version 2.43.4 (10/07/2024)
- Fix to generation of validate_ method for each class. The
generated code was not validating member variables in
superclasses. We now travel up the chain of each superclass to
perform more complete validation. Thanks to Brent Clendinning for
the alert on this problem.
Version 2.44.1 (05/28/2024)
- Ran black formatter on generateDS.py and
process_includes.py.
- Fix regular expressions that were no longer acceptable to Python
3.12+.
Version 2.43.3 (11/02/2023)
- Added warning message that is printed when generateDS.py is asked
to process an XML schema that has an xs:simpleType that contains
an xs:union. generateDS does not handle that. Thanks to Alex
Krizsan for suggesting this.
- Added a unit test for type substitution
(tests/type_substitution*) using xsi:type.
Version 2.43.2 (08/22/2023)
- Fixes to the GraphQL support: (1) several issues that were related
to substitutionGroup; (2) fixed missing access to
character_content when an element has attributes or is "mixed";
(3) fixed an error that occurs when child.maxOccurs > 1.
Version 2.43.1 (08/07/2023)
Added two utility scripts:
- ./utils/gds_split_one_to_many.py
- ./utils/gds_join_many_to_one.py
The purpose of the first is to split a module generated by
generateDS into smaller modules (in particular, one for each
complexType definition) in order to facility easier viewing
and editing. The purpose of the second is to enable you, if you
have modified any of the split modules, to join back together into
a single module that can be executed or imported.
Added the README file ./utils/README_split_join.rst containing
notes on the these utility scripts.
Added a unit/regression test for the split-join capability.
Thanks to Amudha Duraisamy for suggesting this capability.
Version 2.42.2 (07/14/2023)
- Added unit/regression test for the GraphQL support.
- Added demo for generateDS GraphQL support to
./Demos/People/. See the ./Demos/People/README.txt and
the two shell scripts ./Demos/People/run-*.sh.
You will need to install Strawberry to run this demo. See
http://www.davekuhlman.org/generateDS.html#graphql-support
Version 2.42.1 (07/14/2023)
Version 2.41.5 (05/06/2023)
- Changed name of method "_hasContent" to "has__content" so that we
both (1) avoid conflicts with XML complexType member names and
(2) avoid warnings generated by pylint. Thanks to Amudha
Duraisamy for reporting this.
Version 2.41.4 (04/25/2023)
- Fix to formatting of floats. Thanks to Amudha Duraisamy for
reporting this.
Version 2.41.3 (03/06/2023)
- Fix for mixed content -- When mixed="true" was an attribute of
complexContent element, instead of on the ``complexType that
contained it, generateDS.py was not picking it up. Now it
does, and it generates code for valueOf_, etc. Thanks to
Edwin Matthijssen for help with this.
Version 2.41.2 (02/28/2023)
- Fix to export of an element that has mixed/simpleContent. The
character content (_valueOf) was not being exported. Thanks to
Edwin Matthijssen for reporting this.
Version 2.41.1 (10/03/2022)
- Added command line option "--use-regex-module". This option
causes generation of modules that import the regex module
instead of the re module. There are some regular expressions
that regex handles but that re does not, for example
"p{...}". See https://pypi.org/project/regex/ and
https://github.com/mrabarnett/mrab-regex. Thanks to Christian for
reporting this.
Version 2.40.13 (05/18/2022)
- Applied patch provided by Ben Dehner to fix handling of elements
that have a default value and/or are nillable. Thanks to Ben for
this.
Version 2.40.12 (05/09/2022)
- Corrected fix for transform of "n" to "
" in function
quote_attrib.
- Strip white space from around boolean values in function
gds_parse_boolean. Thanks to Pete Foreman for reporting this
and for suggesting the fix.
Version 2.40.11 (05/02/2022)
- Added transform of "n" to "
" in function quote_attrib.
Thanks to Gabriel Kleinoscheg for suggesting this change.
Version 2.40.10 (03/16/2022)
- Fix to export of anytypeobjs. Force conversion to str. Thanks to
Diego Coppa for reporting this.
Version 2.40.9 (03/07/2022)
- Fix to method gds_validate_simple_patterns for Decimal (and
other?) types. Convert target to string. Thanks to Diego Coppa
for reporting this.
Version 2.40.8 (01/28/2022)
- Applied patch for the generated __str__ method.
Thanks to Juha Tuomala for this fix.
Version 2.40.7 (01/17/2022)
- Fix for "-p" (class name prefix) command line option.
Some code generated with this option omitted using it.
Also modified generated get_root_tag function so as
to do correct class look-up when this prefix is not blank.
Thanks to Vladimir Dvorak for reporting this.
Version 2.40.6 (11/30/2021)
- Applied patch to continue support for Python 2.7 when using
StringIO. Thanks to Ankur Sinha from the libNeuroML
project for this fix.
Version 2.40.5 (10/19/2021)
Fix to test for targetNamespace agreement between including and
included schemas. Thanks to Samantha R. for this report.
See ticket #27 "Assertion Error while create the DS" at
SourceForge.
Comment: The assertion exception was caused by a check for
consistency of the targetNamespace between including and included
schemas. I'm wondering if generateds should be checking schemas
for correctness. Perhaps, if we can parse the schemas (with Lxml
etree) we should always try to generate a module. At any rate, I
modified the test so that it passes.
See the following for a description of this requirement:
The following schemas reproduced the error and can be used for testing:
https://github.com/srdc/ontmalizer
Version 2.40.4 (10/18/2021)
- Removed use of formatted string literals (e.g. "f'xxx {value} yyy'").
They are not supported until Python version 3.6.
Thanks to Sam Denton for a report on this.
- Merged pull request from Mustafa Şenol Coşar -- Fix base classes
not found; generate temporary file and delete it. Thank you
Mustafa.
Version 2.40.3 (10/01/2021)
Version 2.40.2 (10/01/2021)
- Fixed issue that occurs when __str__ in the GeneratedsSuper``
class calls export, but command line flag "--disable-xml" has
omitted generation of the export methods. Thanks to Mustafa Şenol
Coşar for reporting this.
Version 2.40.1 (09/28/2021)
- Merged pull request from Mustafa Şenol Coşar for episodic
compilation and imports from modules generated with multiple file
output. Thanks much to Mustafa for all your work on this.
Version 2.39.11 (09/14/2021)
Added __str__ to boiler-plate for GeneratedsSuper``
superclass. This might be useful, for example when debugging and
you are writing code that interacts with generated API and want to
display an object with something like print(str(obj)) or maybe
just print(obj). Here is an example:
>>> import tmp02sup as glib
>>> obj = glib.parse('test01.xml', silence=True)
>>> print(obj)
Thanks to Juha Tuomala for suggesting this
and for guidance on implementing it.
Added utils/post_process.py, which can be used to post-process
the XML files generated by exporting objects from a generated
module. There are several ways to plug custom code into this
script. See utils/README.txt and also the doc-string in
utils/post_process.py. A possible use might be to strip
namespace prefixes and namespace prefix declarations from an
exported XML instance document:
def process(root):
for elem in root.iter():
elem.tag = etree.QName(elem).localname
etree.cleanup_namespaces(root)
Version 2.39.10 (09/03/2021)
- Fix so that we do not generate calls to add_anytypeobjs_. This
causes problems when command line option
--use-getter-setter=none `` is used. Reported by Ankur Sinha at
the ``libNeuroML project. Thanks.
- Fix to cast value to int `` in ``gds_format_integer and to
float in gds_format_float.
- Added fix to gds_format_base64 to convert value to be returned
from bytes to str. Thanks to JROC for reporting this and
for suggesting the fix. See ticket #21 at SourceForge.
Version 2.39.9 (08/25/2021)
- Added unit test for generation of recursive generator method
triggered by command line option --export="generator".
- Several fixes to generateDS.txt: (1) Fixed link to mailing
list at SourceForge.net. (2) Fixed the example code for
attribute groups. Thanks to John Hagen for reporting this.
Version 2.39.8 (08/23/2021)
- Applied patch for generation of recursive generator method.
Thanks to Erdal Karaca for this patch.
Version 2.39.7 (08/20/2021)
- Applied patch to modify MemberSpec_ for attributes.
Provides access to original name.
Thanks to Erdal Karaca for this patch.
Version 2.39.6 (08/18/2021)
- Applied additional patches for reverse_mapping in to_etree.
Thanks to Erdal Karaca for these fixes.
- Added reverse_mapping_ parameter to methods to_etree and
to_etree_simple in boilerplate for class MixedContainer.
Version 2.39.5 (08/17/2021)
- Copied changes from testing to the repo.
Version 2.39.4 (08/17/2021)
- Removed try/except from around generated import of lxml.
lxml is required. The generated code can produce misleading
and mysterious errors if lxml is not installed.
- Made a fix in django_etl to prevent erroneous array
reference for valueOf. Also, replaced GeneratedsSuper in
generatedssuper.py with up-to-date code. Thanks to Drew Beebe
for reporting this.
- Added collection of reverse mapping to the to_etree generated
as a result of using --export="etree write ...". Thanks to
Erdal Karaca for suggesting this and for guidance about it.
Version 2.39.3 (08/13/2021)
- Fix to validation of date-time. Needed to add generation of
several lines of code that convert a date-time object to a string,
e.g. before a regular expression match/search. Thanks to Heinrich
Taube for reporting this.
Version 2.39.2 (06/25/2021)
Some generated method names have been made non-public by prefixing
them with a single underscore. The new method names are:
- _buildAttributes
- _buildChildren
- _exportChildren
- _exportAttributes
- _exportLiteralAttributes
- _exportLiteralChildren
- _hasContent
This change, it is hoped, will make the documentation generated by
Sphinx a bit more readable by eliminating names that are not of
interest to those seeking to understand the public API of
generated classes.
Version 2.39.1 (06/17/2021)
- Fixes for schema annotation/documentation items that we turn into
Python doc strings. When documentation is for a child
element/member or an attribute, we now turn them into an unordered
list that is formatted for reStructuredText and Sphinx.
- Added a unit test to cover some of the annotation/documentation
doc string cases.
- Modified import of GeneratedsSuper to allow easier replacement
by users.
Version 2.38.7 (04/20/2021)
- Modified build and PyPI upload scripts so that we build and upload
a wheel rather than an egg file.
Version 2.38.6 (04/12/2021)
- Added missing validation of xs:simpleType lists in
buildAttributes. Changed for simple types derived from
integer, float, double, and boolean.
Version 2.38.5 (04/01/2021)
- Minor code formating and cleanup so that we pass (most of) the
style checks performed by flake8.
Version 2.38.4 (03/26/2021)
- Fixes for the "No suitable ns prefix for element" warning message.
- Attempting to fix a missing namespace prefix problem reported by
Jason Mathews. Possible solution (work-around) is to explicitly
set xxxx_nsprefix_ instance variable, where "xxxx" is the name
of a child.
Version 2.38.3 (03/23/2021)
- Several fixes for attributes whose type is an xs:simpleType
that is a restriction of another xs:simpleType that is defined
as a list. Thanks to Omar Garrido Martin for reporting this.
- Added unit test for xs:simpleType that is defined as a list.
Version 2.38.2 (03/19/2021)
- Another patch for namespace prefixes. Thanks again, Sebastian
Hegler.
Version 2.38.1 (03/18/2021)
- Applied Sebastian Hegler's patches to fix incorrect generation of
namespace prefixes. Thank you, Sebastian, for this work.
Version 2.37.16 (02/05/2021)
- Another fix for the tag names of elements in a
substitutionGroup, where the head of the group is an abstract
type.
Version 2.37.15 (01/28/2021)
Version 2.37.14 (01/27/2021)
- Fix to generation of the code that passes in the tag name during
export -- Need to avoid passing in name when child is member of a
substitutionGroup. Thanks to Jason Mathews for reporting this
and for providing guidance on a solution.
Version 2.37.13 (01/16/2021)
- Fix to generation of export attribute that is defined as an
xs:simpleType with base type xs:dateTime so that we select
on the base type. Thanks to Shane Rigby for reporting this.
Version 2.37.12 (01/14/2021)
- Added utility to convert XML to a "canonical" JSON. See
utils/xml_to_json.py.
- Added utility to convert "canonical" JSON to XML. See
utils/json_to_xml.py.
- Fix to handle the case where the name of a child element is the
same as the name of the element/class it is in. Now, we look up
the class in globals (globals()) instead of locally. Thanks
to Peter Henry for reporting this.
Version 2.37.11 (12/21/2020)
- Fix to abstract types. When a child is declared with a type that
is an abstract complexType, then, during export, the tag name of
the exported child element should be the name declared in the
parent.
Version 2.37.10 (12/14/2020)
- Merged new feature for custom imports -- Enable user to specify a
file containing import templates to be inserted into the generated
module. Thanks to Björn Freise for implementing this
feature and providing the patch.
- Merged reworking of generation of code for validating simpleType.
Thanks to Björn Freise for this work.
Version 2.37.9 (12/10/2020)
- Fix to validation error -- "NoneType object is not callable".
Thanks to Jason Mathews for the report.
- Fix to erroneous spelling of "valuess".
Version 2.37.8 (12/08/2020)
- Fixed uninitialized variable used during validation method
generation. Thanks to Jason Mathews for catching this.
- Modified gds_format_double method in boiler plate so that it
uses "%s" string format specification. Again, thanks to Jason.
Version 2.37.7 (12/07/2020)
- Add data type conversion to gds_format_xxxx_list for integer,
float, decimal, double, and boolean. Thanks to Jason Mathews for
this fix.
- Adding generation and calls to validation methods for
xs:complexType that contains xs:simpleContent.
Version 2.37.6 (12/01/2020)
- Fix to process_includes.py -- The import/include schema
location resolocation function was not checking for prefix
"https:" (in addition to "http:", etc.).
- Applied patches to process_includes.py from Sebastian Hegler:
improved renaming of types. Thanks to Sebastian for these fixes.
- A small fix to process_includes.py so that it successfully
finds xs:simpleType when needed to create xs:complexType
containing xs:simpleContent for top-level xs:element.
Version 2.37.5 (11/25/2020)
- Fix to case where maxOccurs is defined both in an
xs:choice and a child xs:element. If the maxOccurs in
the child is greater than 1, it should override that in the
xs:choice. Thanks to Jason Mathews for reporting this, for
suggesting a solution, and for providing test files.
Version 2.37.4 (11/23/2020)
- Fixed another "maxLoop exceeded" problem. An
xs:extension/base reference was not being renamed to a new
unique name. Thanks to Bryce Beagle for reporting this and for
providing a schema (test case).
- One more fix for ModuleNotFoundError``, this one because
ModuleNotFoundError seems not to have been added until
Pthon 3.6. Thanks again to Jan Orel for the report.
Version 2.37.3 (11/19/2020)
- Fixed ModuleNotFound/ImportError for Python 2. Thanks to
Jan Orel for reporting this.
Version 2.37.2 (11/17/2020)
- Modified validation check for xs:hexBinary. A length of N
implies N * 2 characters. Modified checks generated for
length, minInclusive, maxInclusive, minExclusive,
maxExclusive, minLength, and maxLength. Thanks to
Björn Freise for catching and reporting this.
- Fix for generation of validation method for Decimal types.
Added "decimal_." prefix to "Decimal". Thanks again to
Björn Freise for reporting this.
Version 2.37.1 (11/13/2020)
- Added command line option --import-path="abc". This enables
us to generate relative import statements. Default value is "".
A possible use case is where the generated module is to be
installed inside a package hierarchy and it is desired that the
generated module import files (only) from a specific location
within that package hierarchy of packages.
- Added unit test for relative import and --import-path.
- Changed try/except statements in the generated code from using
except ImportError to except ModuleNotFoundError which is
a more specific test of whether the module can be imported. This
avoids hiding other kinds of errors that can occur during import.
Version 2.36.6 (11/03/2020)
- Another fix for generation of xs:complexType containing
xs:simpleContent. This fix avoids duplicate top-level names
and fixes up references to them.
Version 2.36.5 (10/27/2020)
- When a top-level element declaration has as its type a
xs:simpleType, we do not have a xs:complexType from which
we can generate a Python class. So, with this fix,
process_includes.py generates an xs:complexType containing
xs:simpleContent from which we can generate a Python Class.
Thanks to Sebastian Hegler for reporting this.
Version 2.36.4 (10/21/2020)
- Added fix to make command line option "--cleanup-name-list" more
user friendly by stripping off extra quotes. Thanks to Sebastian
Hegler for this patch.
- Added fix to more correctly convert Enum names that contain
special characters. Also includes some code clean-up. Thanks
again to Sebastian for this.
Version 2.36.3 (10/20/2020)
- Applied patch that adds "https:" to the check for when to retrieve
file from the Internet rather than the file system. Also added
this check for "http|https|ftp" in gds_collect_namespace_mappings.py.
Thanks to Sebastian Hegler for this fix.
- Added file utils/validate.py -- Uses Lxml to validate a XML
instance doc against an XML schema. It's intended as a helpful
utility that can be used instead of xmllint for validation.
Version 2.36.2 (09/01/2020)
- A fix to the nsmap fix-up in
gds_collect_namespace_mappings.py.
Also made this fix in process_includes.py.
- Added call to cleanupName in
gds_collect_namespace_mappings.py so that the
names in the mapping will match generated class names.
Changed name of generated mapping/dict from
NamespaceToDefMappings to NamespaceToDefMappings_.
Version 2.36.1 (08/28/2020)
- Added gds_collect_namespace_mappings.py. Also added generation
of the namespace mapping to the generated module.
- Fix to the raise_anon_complextypes in process_includes.py so
that xpath search would work when XML schema namespace is the
default (rather than "xs" or "xsd"). Thanks to Siva Prabhakaran
for providing the test files that enabled diagnosing and fixing
this bug.
Version 2.35.27 (08/25/2020)
- Applied patch from Sebastian Dransfeld to fix resolution of
simpleType. Call resolveBaseTypeForSimpleType instead of
plain lookup in SimpleTypeDict. Thank you Sebastian.
- Added ./utils/collect_children*. The collect_children
function in collect_children.py can be used to create a list of
the children of an instance of a generated class. Thanks to
Sebastian Dransfeld for inspiration on this.
- Fixes to generation of the __all__ global variable to add
missing items.
Version 2.35.26 (08/19/2020)
- Added "range" and "set" to the NameTable so that definitions
(e.g. complexType) named "range" and "set" will be renamed to
"range_" and "set_".
Version 2.35.25 (08/17/2020)
- Fixed endless recursion error that occurs when you use a schema
that contains group definitions with circular references. For
example, group A references group B that references group A.
Thanks to Siva Prabhakaran for reporting this and for providing a
schema that enabled me to reproduce the error.
- Fixed error that occurs when we do an xpath search with a schema
that uses xmlns="http://www.w3.org/2001/XMLSchema" as the default
namespace. We want the namespaces for the xpath to include the
"xs:" prefix.
Version 2.35.24 (06/09/2020)
- Fix to avoid an exception that occurs when there are annotations
on enumerations in an anonymous simpleType that defines an
attribute. Thanks to Martin Yeo for reporting this.
- Anonymous simpleType that defines an attribute were not
generating an Enum class, validators, etc. With this fix, those
anonymous types are now raised to the top level and given names
similarly to the way that anonymous complex types and simple types
that define elements.
Version 2.35.23 (05/21/2020)
- Fix to generation of hasContent_ method for child elements
that are defined with xs:simpleContent. We were erroneously
generating a string value without quotes. Now we check for
None.
Version 2.35.22 (05/11/2020)
- Modified generation of Enum classes so that they now inherit
str as a mixin. Thanks to Konstantin Baierer for this
suggestion and for guidance.
- Added "# noqa:" comments telling flake8 to ignore warnings on
specific lines. But, we do not want to add that annotation on
the boiler plate code that is written to generated modules.
- Fixes to MANIFEST.in so that needed files would be included in
compressed tar file, in particular for unit tests.
- Changed from use of gzip to bzip2 for creating compressed
tar file. See file build_dist.
Version 2.35.21 (04/23/2020)
- Fixes to gds_format_decimal and gds_format_decimal_list so
that significant zeroes are preserved and unneeded ones are
trimmed. Thanks to Bram Bourgoignie for reporting this and for
guidance in fixing it.
- Added unit test for gds_format_decimal and
gds_format_decimal_list.
Version 2.35.20 (04/21/2020)
- Bumped version because PyPI will not let me upload updated version
with the same name.
Version 2.35.19 (04/21/2020)
- Fix to generation of the hasContent_ method so that it checks
both containers self.valueOf_ and self.content_.
self.valueOf_ only contains character content. But, we could
have a mixed content element in an XML instance document or
constructed programatically that contains only markup and no text.
- Enhancement to capture and export namespace prefixes xml: and
xlink: when used on attribute names.
Version 2.35.18 (04/13/2020)
- Eliminated exception caused when an xs:simpleType has base
types and those have xs:union, which I suppose can have base
xs:simpleType with an xs:union etc. Too complicated. For
now, we just ignore it and do not generate a validator.
Version 2.35.17 (03/13/2020)
- Modifications to generation of to_etree methods so that the
nsmap can be passed in. Also, modified the parseEtree
function so that nsmap can be passed as an argument. Thanks
to Yudi (rv) for this suggestion and for mapping out how to do it.
- Also changed the signature of the to_etree methods in the
superclass so that they accept mapping_ and nsmap_
arguments, even those they are not used. That prevents errors
when they are called, and we don't have to figure out when to pass
in those arguments and when not.
Version 2.35.16 (03/12/2020)
- Fix to export of anytypeobj. Must export raw XML content only
when exportChildren is not called from a subclass. Thanks
to Pieter De Rycke for reporting this and for providing a schema
and XML instance document to test against.
Version 2.35.15 (02/28/2020)
- Another fix for the original type name. Thank you Petr Matyas.
Version 2.35.14 (02/20/2020)
- Fix to export to_etree. Decimal type was not calling
gds_format_decimal. Also, changed gds_format_decimal so
that it formats as a string type and not as a float.
Version 2.35.13 (02/10/2020)
- Another fix to the infinite loop caused by using an absolute path.
Thanks again to Bryce Beagle for reporting this.
Version 2.35.12 (02/07/2020)
- Using an absolute path to the schema file can cause
process_includes.py to go into an infinite loop. Added call
to os.path.relpath(schema_path) to convert to a relative path.
Version 2.35.11 (01/30/2020)
- Another fix for the infinite loop while searching for base type in
find_simple_type_base. This time caused to failed look-up in
SimpleTypeDict when an imported schema used a different
Xschema prefix than the importing one ("xs:" vs empty/default).
Also a fix so that determinePythonType would find and validate
the simple base type. And, limited the max times in that loop.
Thanks to Kilian for reporting this in issue 28.
Version 2.35.10 (01/22/2020)
- Fixed search for base type in find_simple_type_base while generating validator methods.
The definition was an xs:simpleType definition that contained
a xs:union instead of an xs:restricction, causing an
infinite loop. This fix prevents the endless loop, but does not
handle the xs:union, i.e. it does not generate tests for all
of the types in the union.
Version 2.35.9 (01/17/2020)
- Merged pull request -- Use mapped name instead of name. Thank you
Jonas Kahler.
Version 2.35.8 (01/02/2020)
- A fix to prevent the cardinality check in the generated
validate_ method when the item is in an xs:choice.
Version 2.35.7 (11/27/2019)
- Merged Buğra's pull request -- Add missing members to slots for
advanced scenarios.
Version 2.35.6 (11/26/2019)
- Added support for xsd:choice to generation of validate_
method. Now, we do not perform cardinality checks on members of a
choice group.
Version 2.35.5 (11/22/2019)
Version 2.35.4 (11/19/2019)
- Fix to validate_ method -- Perform cardinality check on
complex type children even when not recursive.
- Cardinality check in validate_ method for children in choice
group is not correct. Generate commented-out cardinality check
until we figure it out.
Version 2.35.3 (11/19/2019)
- Improvements to support for __slots__ class variable.
Version 2.35.2 (11/18/2019)
- Added additional test for --enable-slots but without
--disable-xml.
Version 2.35.1 (11/18/2019)
- New feature -- Merged contributed work by Buğra Gedit that enables
generateDS.py to generate classes (for complex types) that
uses __slots__. This will reduce space occupied by instances
and will likely result in improved speed. Thank you Buğra.
Version 2.34.2 (11/17/2019)
- More fixes to generation of method validate_. Handle lists of
children. Fixed indentation errors.
Version 2.34.1 (11/14/2019)
More fixes to validation.
Added checks for required items and cardinality of items that are
lists.
Added ability to produce a Python generator function that walks
the tree and produces each (complex type) object in the tree.
To add this method to the code generated for each complex type in
the output module, add "generator" to the "--export" command line
option. For example:
--export="write generator"
Version 2.33.19 (11/11/2019)
- Changed definition of gds_validate_integer and
gds_validate_double to make them consistent with
gds_validate_float.
- Changes to the generation of the validate_ methods so that
they now include code that calls gds_validate_xxxx to validate
built-in Xschema simple types as well as those defined in the
schema.
- Various fixes to other validation methods in GeneratedsSuper.
- Fixes to the generation of import statements when using the
"--one-file-per-xsd" command line option.
Version 2.33.18 (11/04/2019)
- Fixes to sqlalchemy_etl. The file generatedssuper.py was
out of sync with the boiler-plate version in generateDS.py.
Copied updates into that file (sqlalchemy_etl/generatedssuper.py).
Thanks to Michael Alaly for reporting this.
- Fixed error that occurs with command line option
--one-file-per-xsd and --export="validate".
- Fixed error that occurs when simple base type is None. Thanks to
Ľubomír Kučera for reporting this.
Version 2.33.17 (11/01/2019)
- Fix to warning messages for simple type validation so that when
line number is unknown, the line number is omitted rather than
printing "undefined".
Version 2.33.16 (10/30/2019)
- Modified boiler-plate of __eq__ method in GeneratedsSuper.
A set object is not hashable. Caused exception. Replaced with
list.
Version 2.33.15 (10/28/2019)
- Fix to django, django_etl, and sqlalchemy_etl.
Replaced platform specific path separator with platform
independent use of os.path.join. Switched to use of args as a
string rather than a list/tuple and added shell=True for
Popen.
Version 2.33.14 (10/21/2019)
- Fix to generation of validate_ method so that children defined
as simple types with maxOccurs="unbounded" will iterate over
those children and call the relevant validate method on each one
(i.e. in a for loop).
- Fix to function makeFile in generateDS.py so that, for
Python 3 only, it opens/creates the file object with
encoding="utf-8".
- Function to generate the validate_ method in each complex type
class was not being called when command line option
"--disable-xml" was used. Moved call to generateValidatorMethods
outside the if not XmlDisabled: statement.
- Modified the __eq__ method that is included in the common
superclass (GeneratedsSuper) so as to prevent a possible
endless recursion through parent. Also modified the __eq__
method so that the gds_collector_ member is excluded from the
test for equality.
Version 2.33.13 (10/14/2019)
- Add IDREF to list of string types so as to prevent it from being
handled as a complex child. Note, however that it may be that
using IDREF to define a child is not even correct usage in a
schema. But, when it is used that way, this fix will prevent
generation of code with undefined references (classes).
Version 2.33.12 (10/09/2019)
- Added ability to generate code so that, during the build phase,
each instance of classes that represent xs:complexType objects
will be given an instance variable self.gds_elementtree_node_
that is the ElementTree node. Users can then add code that,
e.g., prints self.gds_elementtree_node_.sourceline.
- Added ability to generate code in which the simple type validation
methods include the source line number of the containing node in
validation warning messages.
- Fixed bug that occurs when an element as both a child and an
attribute that have the same name. We were creating a new
XschemaAttribute object with a new name, but were not copying
the other values in that old object. So, for example, the data
type of the attribute was forgotten. Now, we copy the internal
values into the new XschemaAttribute.
Version 2.33.11 (10/02/2019)
- Added ability to generate a validate method ("obj.validate_") in
each complex type class using the "--export" command line option
(for example, --export="write validate").
Version 2.33.10 (10/01/2019)
- Modification to generated validator methods so that they return
True or False: True means no validator warning messages issued;
False means that there was at least one validator error and a
message was issued.
Version 2.33.9 (09/30/2019)
- Fixes for simple type validation -- Removed use of the Python
warnings module. Added a "collector" class to generated
modules. Validation messages are added to this collector. After
parsing and building, these messages can be optionally written to
stderr. The generated parse functions (parse, parseEtree,
etc.) do this. The collector class can be optionally replaced by
an imported module.
Version 2.33.8 (09/26/2019)
- Fix to generation of Enum classes. Added backslash escape to
single quotes in enumeration values. Thanks to Shane Rigby for
catching and reporting this.
Version 2.33.7 (09/22/2019)
- Added xs:NCName and xs:QName to list of string types so
that we treat them as strings. Thanks to David Milner for
catching and reporting this.
Version 2.33.6 (09/20/2019)
- Modified the type check in generated simple type validation
methods so that we exit immediately if the test fails.
- Modification to generated simple type validation methods for
enumeration restrictions: (1) converted items in the enumation to
the target type; (2) generated simpler inclusion test using the
Python in operator.
Version 2.33.5 (09/19/2019)
- Patch to handling of CDATA. Thanks to huynhlv_54 for this fix.
See his pull request at Bitbucket.
- Modified definition of regular expression PRESERVE_CDATA_TAGS_PAT
(added flag re_.DOTALL) so that it will capture CDATA
containing a new line.
- Another fix to generation of simple type validation methods. This
one enables us to handle simple types whose name includes a name
space prefix.
Version 2.33.4 (09/17/2019)
- Added type test to generated simple type validation methods.
Version 2.33.3 (09/13/2019)
- Fix to validation test on simpleType restriction
totalDigits. Thanks to Buğra Gedik for catching this.
- Fix to parsing of simple types that are restrictions on float and
decimal when they are used as attributes. We need to convert them
to Python numeric types.
- Fixed capture (build) of float types so that they use
gds_parse_float.
- Fixed capture (build) of integer types so that they use
gds_parse_integer.
- Fixes so that binary strings ("b'xxx'") are not displayed in
validation warning messages.
Version 2.33.2 (09/04/2019)
- Added default hash method (__hash__) from class object.
Thanks to Mustafa Şenol Coşar and Henrique Andrade for guidance
with this.
- When run under Python 3, generateDS.py was generating binary
strings in MemberSpec. Changed to produce plain strings. Thanks
again to Mustafa and Henrique.
- Validator methods generated by gDS caused an exception under
Python 2 when the string being checked contained a non-ascii
character. The generated code contained an unnecessary cast
(str(xxx)). Removed the cast. Thanks again to Mustafa for
reporting and helping with this.
Version 2.33.1 (07/08/2019)
- Fix so that, for command line option --disable-xml, we also
disable the use of etree_ in GeneratedsSuper.gds_build_any.
Thanks to Mustafa Şenol Coşar for identifying this issue.
Version 2.33.0 (06/28/2019)
- Added feature -- Capture the prefix of each element on input
(during build), then use that during export. There is an API to
get and set the name space and prefix in instances of the
generated classes: get_ns_prefix_, set_ns_prefix_,
and for members (XXX_nsprefix_).
- Added feature -- Before export, the parse function scans the
lxml XML element tree and creates all needed NS prefix definitions
for export at the top level. There is also a function (which is
called by parse) that collects all the name space prefixes and
their definitions (URIs).
- Fix -- Added .encode('utf-8') for generation of Enum classes
in order to prevent an exception when running under Python 2.
- Added programming language classifiers (Python 2 and 3) to
setup.py. Thanks to Mustafa Şenol Coşar for this suggestion.
Version 2.32.1 (06/16/2019)
- Fix to generateToEtreeAttributes (generate export to_etree
attributes) -- For simple types, we need to key on the base type
so that for restrictions on simple types give us xs:integer,
xs:float, etc. Thanks to Van Huynh Le for reporting this and
providing a test case.
Version 2.32.0 (05/23/2019)
- Added support for ETL/ELT (extract transform load) to SQLAlchemy
database. This support is experimental and is work in progress.
With this support, you can (1) generate models for SQLAlchemy and
(2) load data from an XML instance doc into your database using
the exportSQLAlchemy methods generated by generateDS.py.
Note that you must run generateDS.py with command line option
--export="write sqlalchemy" in order to generate the
SQLAlchemy export methods. For more information see
./sqlalchemy_etl/README.txt.
- There is an alternative implementation of support for SQLAlchemy.
You can find that implementation in
./sqlalchemy_etl_alternative.
Version 2.31.4 (05/17/2019)
- Fixed (or maybe added an implementation of) the processing for
xs:any. Now, for elements defined as type xs:any, we
save an internal representation that is the Etree node/element
converted with to a string. We use
etree_.tostring(node, encoding='unicode') to perform this
conversion. Then, during export, we write out this string as is.
If the user wants to write code that manipulates the internal
(string) representation of the node, then the user can use
etree_.fromstring(self.anytypeobjs_) in order to produce an
Etree Element, then use the Etree Element API to access and
manipulate parts of the Element.
- Added vim mode line to generateDS.py and
process_includes.py.
- Changed generation of validator methods (validate_xxx)
for simple types gYear and gYearMonth. We now use string
comparison. The old generate code was causing an exception when
executed. Thanks to Andrii Iudin for alerting me about this
issue.
- Fixed several errors that occurred when --no-process-includes
option caused skipping of calling process_includes.py and,
therefore, we do not return several values that are used later
(for example, the Lxml element tree).
Version 2.31.3 (05/03/2019)
- A possible global (top-level) type definition caused a conflict.
Use the type name, not the child/member name.
- Recursive (transitive?) substitutionGroup caused the wrong
member name to be used in the build method. Fixed so that it
used the member name (instance variable name) for the
substitutionGroup. Thanks to Paul Vajda for reporting this
and for providing a detailed description and for helping to track
down this problem and the one above.
Version 2.31.2 (04/25/2019)
- Fix to handling of nsmap in process_includes.py. Thanks
to Jan Orel for reporting this problem and providing a hint on how
to solve it.
Version 2.31.1 (04/22/2019)
- Modified the processing done in process_includes.py so that
when there are definitions in different name spaces that have the
same unqualified name, we rename some of them. This enables us to
generate separate classes for definitions (e.g.
xs:complexType) that have the same unqualified name but
different qualified names.
- Added generation of a dictionary (RenameMappings_) in the
generated module that maps qualified names to the renamed
unqualified names.
- Comments: The above changes should enable uses to deal with
schemas that have duplicate unqualified names that are actually
unique qualified names (same name, different namespace). It's not
an elegant solution, but hopefully enables us to handle schemas
(containing duplicate names) that we could not before. For
schemas that do not have duplicate unqualified names, behavior
should be unchanged.
- Fix to generation of enums from xs:simpleType -- Make sure that
labels are unique within a single enum.
Version 2.30.24 (04/02/2019)
Version 2.30.23 (04/01/2019)
- Added Marco Trevisan's changes to improve enums and to add
doc strings for enums. See:
https://bitbucket.org/dkuhlman/generateds/pull-requests/57.
Thank you Marco.
- When running under Python 3, replaced use of imp module, which
is deprecated in Python 3, with importlib. Note that the
-u and --user-methods command line option now take a path
and file name rather than a dotted module.
Version 2.30.22 (03/20/2019)
- Added ignored file list.
- Fixed Travis tests execution.
- Migrated tests to pytest.
- Deterministic rendering of dicts; strings without u'' prefix.
Thanks to Daniele Esposti for these improvements.
Running the unit tests in the tests/ directory now requires
pytest (py.test). You can run the unit tests by going to
the tests directory and running $ pytest.
Version 2.30.21 (03/18/2019)
- Modifications to use the requests package instead of plain
urrlib. Doing so will: (1) simplify the loading of resources from
the network and (2) automatically send all the necessary headers.
Thanks to Daniele Esposti for this fix. Note that this makes
installation of the requests module a requirement for running
generateDS.py.
Version 2.30.20 (03/18/2019)
- Fix to regular expression patterns generated for validators.
Thanks to Raphaël Valyi for this fix.
Version 2.30.19 (03/07/2019)
- Modifications so that during export, the gds_format_xxx,
gds_parse_xxx, and gds_validate_xxx methods in class
GeneratedsSuper in either the generated superclass module or
in module generatedssuper, if that can be imported at
run-time, are called. That enables the user to provide a special,
customized version of that module, which when importable can
provide custom formatting during export. A customized version of
that module can be created by copying class GeneratedsSuper
and some required imports, function definitions, etc. from a
generated superclass module. Thanks to Gérard Yin for focusing me
on this issue.
Version 2.30.18 (03/04/2019)
- Fixed export of attributes so that they are not omitted when
use="required". Thanks to Andrii Iudin for reporting this and
providing a test case.
Version 2.30.17 (03/04/2019)
- Merged Raphaël's fix to improve capture of annotations. Thanks,
Raphaël.
Version 2.30.16 (03/04/2019)
- Merged Raphaël's fix in process_includes.py.
Version 2.30.15 (02/25/2019)
- Fixed error that occurs when one schema includes another (with
xs:include) and the included schema docs use a difference
namespace prefix for the XML schema namespace than the main schema
doc. For example, one uses "xs:" and the other uses "xsd:".
- Merged fix to process_includes.py that copies and preserves
annotations in raise_anon_complestypes. Thanks to Raphaël Valyi
for this fix.
Version 2.30.14 (02/12/2019)
- Bugfix: Avoid the TypeError which was caused if infile is a file
object or BytesIO object. Thank you, Andreas Brodtkor.
Version 2.30.13 (01/28/2019)
- Fix to order of arguments generated for call to superclass
exportChildren method. Thank you to Edwin Matthijssen for
identifying and reporting this.
- Added generation of set_xxxx_with_type for children that are
extensions and abstract and cardinality of zero or one. Again,
thanks to Edwin for describing this need and for his guidance
with implementing it..
- Removed duplicate generation of add_xxxx method.
- Fix to generation of "xsi:type" attributes. Added use of table
GenerateDSNamespaceTypePrefixes from module
generatedsnamespaces.py to specify the namespace prefix on a
per type basis.
- Added ability to specify the namespace prefix for types that are
extensions of (derived from) an abstract type and that are
specified on export with the "xsi:type" attribute.
Version 2.30.12 (01/14/2019)
- Merged pull request that fixed the parsexml_ generated function
so that it now handles paths that are consistent with pathlib
objects in addition to paths represented as strings. Thanks to
Chris Barnes for this fix.
Version 2.30.11 (12/19/2018)
- Fixes to export of namespacedef_ so that exporting does not
repeat the namespace prefix definition in nested elements.
Version 2.30.10 (11/30/2018)
- Fixes to logging. Pass arguments to logging methods, instead of
formatting before the call so the formatting will not be done
unnecessarily. Thanks to Mustafa Şenol Coşar for these fixes.
Version 2.30.9 (11/29/2018)
- Fix imported module is generated more than once. Thank you
Mustafa Senol Cosar for this fix.
Version 2.30.8 (11/14/2018)
- Added unit tests for enum import. Thanks to Mustafa Şenol Coşar
for adding these tests.
- Fix to generation of externalImports so that the generated
import statements will be in a consistent, predictable order.
- Converted tests/EnumImport/test_generated_code.py to use the
Python unit test framework.
Version 2.30.7 (11/12/2018)
- Applied patch with fix for subclass suffix "Sub". Thanks to
Lucius for this fix.
- Fixed lines in generateDS.py that were too long and exceeded
the style guide recommendation (PEP 8).
Version 2.30.6 (11/09/2018)
- Merged additional namespace prefixes from François.
- Fixed one corner case with the new namespace prefix changes -- For
mixed content (character content containing mark-up) the
parameters in the call and definition of method export in
class MixedContainer were out of sync.
- Question: Is it possible that we need an additional change to pass
namespace prefixes and their definitions through mixed content and
into complex content that it might contain?
- Added an additional unit test for the namespace prefix changes.
See the ipo unit test. Thanks again to François Guimond for
help with this.
Version 2.30.5 (11/07/2018)
- Merged namespace prefix changes for export functions from François
Guimond. Thank you François.
Version 2.30.4 (11/06/2018)
- Another patch from Mustafa for enums. Thanks Mustafa.
- A fix from François Guimond for passing namespaceprefix to
self.exportChildren. Thanks François.
Version 2.30.3 (11/05/2018)
- Merged Mustafa Coşar's fix for enums. Thank you Mustafa.
- Added several files in the test/ directory to the repo.
Version 2.30.2 (11/01/2018)
- When dealing with a derived type, generate "set_xxx" and "add_xxx"
methods that automatically set original_tagname_ and
extensiontype_, so that when exported xsi:type is used to
specify the type. Thanks to Edwin Matthijssen for working with me
on this.
Version 2.30.1 (10/18/2018)
- New feature -- Each generated data binding class has a new
instance variable: parent_object_. It is automatically set to
reference the parent (i.e. container) of this object. Thanks to
Florian de Boissieu for suggesting this enhancement.
- Added a comment to generateDS.py to help with customizing the
code generated in getters and setters. You can search
generateDS.py for "add custom code here" and then add custom
code there. This is not a terribly convenient way for a user to
add custom code, so if someone finds a need to use it, please
contact me and we'll try to find a better way.
Version 2.29.25 (10/05/2018)
- Added a section to the documentation (generateDS.txt) for types
derived by extension, i.e. types that use the xsi:type attribute
in the XML instance document. Thanks to Justin McManus for
motivating me to learn about this and for providing guidance and
pointers along the way.
- Added a unit test for types derived by extension.
- Converted unit tests so that we can use Python 3 not Python 2.
- Changes in generateDS.py so that it uses the six
compatibility library to handle the urllib name changes
between Python 2 and 3.
Version 2.29.24 (08/27/2018)
- Changed name of parameter in the export method from "namespace"
to "namespaceprefix" in an attempt to reduce confusion about its
use. It's value, if it has one, should be something like "abc:".
Thanks to Bernd Zimmermann for his advice and encouragement on
this.
Version 2.29.23 (08/16/2018)
- Added new command line option "--create-mandatory-children". If a
child is defined with minOccurs="1" and maxOccurs="1" and the
child is xs:complexType and the child is not defined with
xs:simpleContent, then in the element's constructor generate code
that automatically creates an instance of the child. Thanks to
Vincent Helfre for analyzing this issue and providing guidance
toward a solution.
Version 2.29.22 (08/03/2018)
- Fixed exception that occurs when (1) an xs:complexType is defined
with an attribute and a child that have the same name and (2) the
"-a" command line flag is used to specify a schema namespace
prefix other than the default (e.g. generateDS.py -a "xsd:" ...).
Thanks to Daniel Ramirez for tracking down and analyzing this
issue.
Version 2.29.21 (08/02/2018)
- Fix to use of simpleType name. Needed to do cleanupName() on the
class name. Thanks to Daniel Ramirez for reporting this and for
suggesting a fix.
Version 2.29.20 (07/30/2018)
- Fix to generation of regular expression used to validate a
simpleType. Before this fix, we were replacing "|" with "$|^" to
implement alternatives in a test. By removing that replacement,
we leave it up to the author of the schema to encode that test of
alternatives into the regular expression. Thanks to Bernd
Zimmermann for reporting this issue.
- Fixes to formatting of xs:dateTime. Thanks to Tim Hulst for this
fix.
Version 2.29.19 (07/20/2018)
- Merged pull request that makes generated enums for each simpleType
uppercase. Thanks to Mustafa Şenol Coşar for this enhancement.
- Added new command line option "--mixed-case-enums" to control
whether simpleType enums are changed to upper case. The default
is True.
Version 2.29.18 (07/19/2018)
- Fixes to the example code underneath Demos/. Thanks to Witold
Jarzynka for reporting this.
Version 2.29.17 (07/11/2018)
- Merged pull request that generates enum classes for each simpleType.
Thanks to Mustafa Şenol Coşar for this enhancement.
- Fix to generatedssuper.py -- (1) Added on_delete to Django
ForeignKey declarations. (2) Added relative import (dot) to
generated admin.py.
Version 2.29.16 (06/21/2018)
- Added dependencies to setup.py. Thanks to Laszlo for this
suggestion.
- Fixes to specifying character encodings. We now read XML schema
files in binary mode. (2) We now use the value of
--external-encoding only when a generated module is run under
Python 2 (not Python 3); we use it to encode the XML instance
document; if --external-encoding was not used, then we use
"utf-8" to encode exported XML. Thanks to Laszlo for his
guidance on this.
Version 2.29.15 (05/16/2018)
- Fixed issue related to use of command line flag
--preserve-cdata-tags: when the generated regex pattern was not
matched (returned None), created an exception. Added a test for
None. Also, required conversion of bytes to str before the
pattern match for Python 3. Thanks to Lavanya Poondru for
reporting this and helping with a fix.
Version 2.29.14 (05/08/2018)
- Fixes to logging in generateDS.py -- (1) Setup logging only when
running as script. (2) Use named logger instead of root one.
Thanks to Andrei Fokau for this fix.
Version 2.29.13 (05/08/2018)
- Merged PR from Andrei Fokau. Fix tests by striping varying lines.
Also add config for Travis CI. Thanks to Andrei for this
enhancement.
Version 2.29.12 (04/23/2018)
- Patch to compute the fully qualified name of the simple types
before resolving the built-in base type. Thanks to Alim Gokkaya
for this fix.
Version 2.29.11 (03/16/2018)
- Fix for the --no-namespace-defs command line option. The work on
namespaces in v. 2.29.6 appears to have conflicted with and
deactivated this. Thanks to Olof Kindgren for reporting this.
- Added unit test for --no-namespace-defs.
Version 2.29.10 (03/14/2018)
- Fix to resolution of child types -- Formerly, we were adding some
unnecessary and unwanted entries to fqnToElementDict, which
caused the look-up to get the wrong type. Thanks to Olof Kindgren
for guiding me through this.
Version 2.29.9 (03/02/2018)
- Added command line flag --always-export-default
(AlwaysExportDefault). When used, the generated module will
always export attributes with a default value even when the
current value is equal to the default value. Thanks to Marc
Capavanni for suggesting this.
Version 2.29.8 (03/02/2018)
- Added a change so that an attribute specified as fixed will be
handled in the same way as one specified as default. This
leaves it to the user to validate and enforce the fixed
restriction in some other way, e.g. through use of an XML
validating parser such as xmllint. Thanks to Sanja Abbott for
suggesting this enhancement.
- Various fixes for string/unicode differences across Python 2 and
Python 3.
Version 2.29.7 (02/05/2018)
- Fix for unicode error that occurs during simpleType validation
under Python 2.7. Thanks to Juha Tuomala for reporting this issue.
- Added a test for xs:simpleType validation that uses a pattern
containing a multi-byte character.
Version 2.29.6 (01/22/2018)
- Fix to generation of namespace prefix in export methods. With
this fix, process_includes.py collects information about which
xs:element and xs:complexType definitions are in which target
namespaces. Then generateDS.py uses that dictionary to generate
export methods that produce the namespace prefix. Thanks to Rob
Calvert for identifying this problem and for helping me to
understand it.
Version 2.29.5 (01/17/2018)
- Fix to prevent infinite recursion that happens when a simple type
is defined whose name is the same as it's restriction base type
except for the namespace prefix. Thanks to Nicolas de Saint Jorre
for reporting this problem and for providing a schema that
reproduces it.
Version 2.29.4 (12/14/2017)
- Fix for exporting the child of an element, when that child is
declared as an instance of an abstract type (abstract="true" in
the schema). When exporting, the type of the child needs to be
determine at runtime through polymorphism. This fix prevents the
containing (parent) object from passing the name of the abstract
class to the instance of the concrete class when calling its
export function. Thanks to Rob Calvert for reporting this and for
his analysis that helped me understand the problem.
Version 2.29.3 (12/11/2017)
- Resolved an issue with a type casting problem that occurs when a
numeric default value is provided as default for an xsd:attribute.
Normally attributes were being type casted at the constructor to a
Python type if the types are one of the builtins. However
attributes derived from a builtin type via xsd:simpleType
definitions couldn't be casted to a base type and were being
treated as strings. Refactored out the simple type resolution
from the XsdElement class to a function so that we can reuse the
same code for both elements and attributes. Thanks to
Alim Gokkaya for fixing this and for providing a pull request.
Version 2.29.2 (12/07/2017)
- Fix for use of StringIO in generated subclass modules. Thanks to
Rohan Dsa for alerting me on this.
Version 2.29.1 (12/07/2017)
- Fix to generation of code to export child elements that have
default values. When the element's value is equal to the default
value, the export of the element should be omitted only if the
element is optional (i.e. minOccurs=0). Thanks to Andrii Iudin
for reporting this.
- Several modifications to use the six module as a cleaner way to
smooth over differences between Python 2 and Python 3.
- Added file generateds/django/README.txt containing instructions on
running the Django code generation support. Thanks to Christian
González for reporting problems with this and for providing
information that helped understanding the source of the
difficulties.
Version 2.29.0 (11/28/2017)
- Fixes to export of namespace prefixes for schemas that are
imported. Thanks to Bob Barcklay for reporting this and for
advise on fixes.
Version 2.28.2 (10/27/2017)
- Changed name/version number scheme to all numeric with dots.
Required by setuptools or the Python Package Index.
- Accepted and merged pull request by Eugene Petkevich that fixes
export of elements with mixed content. Thank you Eugene.
Version 2.28d (10/25/2017)
- Fix for incorrect resolution of type for a child element type
defined with <xs:element ref="Abc"/>. The ref= can refer to a
global (top level) xs:element rather than an xs:complexType, in
which case we need to use the type= to determine the
xs:complexType. Thanks to Bob Barcklay and Olof Kindgren for
reporting this issue and for working with me on this and helping
to track down the fix.
Version 2.28c (10/17/2017)
- Fix for generation of GDSClassesMapping dictionary. Formerly, we
were generating entries in this dictionary for some xs:element
items that were not at top level. Fixed so that only xs:element
items at top level (immediately under the root/schema node) are
included in this dictionary. Thanks to Christin Gunning for
reporting this and for guiding me on this change.
Version 2.28b (08/22/2017)
- Fix for Django models and forms generation -- "float" data type
was being mapped and was not treated as a simple data type.
Thanks to Sriram Sundar for catching and reporting this.
- Sriram also requested that in the Django models and forms
generation, we be able to omit the "_model" and "_form" suffix on
generated class names. There is now a "--no-class-suffixes"
command line option accepted by both gends_run_gen_django.py
and gends_generate_django.py to do that. Thanks to Sriram for
this suggestion.
- Added Python version to the information in the comments at the top
of generated modules.
Version 2.28a (06/23/2017)
Significant work by Alim Gokkaya. Thank you, Alim.
Here's a summary of what's been changed:
- Added new command-line options:
- --disable-xml: Toggles the generation of XML serialization
related code
- --disable-generatedssuper-lookup: Disables generation of the
try-except lookup for a generatedssuper module
- --use-source-file-as-module-name: Sets the source XSD file name as
the target module name in the one file per XSD mode
- Retained xsd:choice related information in the generated class
MemberSpec.
- Retained the original XML schema attribute definitions in the generated
class members.
- Fixed generation of import statements for the base classes.
- Fixed class not being generated when parent class is defined in
another XML schema file.
- Fixed fqn-module mapping being unavailable for the classes defined
in imported XML schema files.
- Fixed attribute names are sometimes not cleaned-up from the prefix
- Fixed xsd:simpleType validations methods are not being generated in
one-file-per-xsd mode.
- Fixed equality check against objects defining extra attributes.
- Added unit test for command line options --disable-xml and
--disable-generatedssuper-lookup.
Version 2.27b (06/09/2017)
- Fixed a bug that occurred when an element definition contains a
child defined as xs:any. The member spec (MemberSpec_) was not
generated with the correct name. Also in the django support,
added a temporary fix for xs:any child elements. Thanks to Rémy
Gibault for reporting this.
- Django support -- Models in django are case insensitive. That
means that if a schema defines multiple element types that differ
only in case, and we generate two models that differ only in case,
django says it's an error. So, implemented a facility which,
when multiple names differ only in case, adds a suffix so that
those names will be unique even when case is ignored. Again,
thanks to Rémy for finding and reporting this.
- Django support: (1) Added a test and more explanatory error
message for the case where gends_generate_django.py was failing to
import the correct version of module generatedssuper.py. (2)
Created a mapping so that all generated model and form names are
unique even when case is ignored. (3) Added a name mapping to
avoid clashes with Python keywords.
Version 2.27a (06/01/2017)
- Fixed bug in gends_extract_simple_types.py that caused an
exception when the simpleType name has a namespace prefix.
Thanks to Rémy Gibault for reporting this.
- Added two utilities that can be used to replace the capability
invoked by the --one-file-per-xsd command line option.
utils/collect_schema_locations.py can be used to collect and write
out the top level schema locations. batch_generate.py can be used
to (read the output from collect_schema_locations.py and generate
modules. Use --help to obtain more information from each of
these. For instructions on this, see the docs and also the README
in the utils/ subdirectory.
- Various fixes for the generation of namespace prefix definitions
when the generated export functions are called. Thanks to Eugene
Petkevich for reporting and working with me on this.
- Added command line option --no-namespace-defs to force export
functions to not added namespace prefix defintions.
- Added ability for generated modules to import a module
(generatedsnamespaces.py) containing a dictionary
(GenerateDSNamespaceDefs) that maps element type names to the
namespace prefix definitions (or any XML attributes, actually)
that are to be added to specific elements during export. See the
docs and also notes near where generatedsnamespaces.py is imported
in a generated module.
- Fixed an error in gends_run_gen_django.py which caused it to fail
when generateDS.py produced a warning message. Thanks to Rémy
Gibault for catching and reporting this.
- Added a utility to help with analyzing complex schemas.
utils/show_schema_hierarchy.py can by used to show an indented
hierarchy of schemas that are pulled in by xs:include and
xs:import elements. Type utils/show_schema_hierarchy.py --help
for more info. Also see the docs.
Version 2.26a (05/09/2017)
- Added command line options --no-collect-includes and
--no-redefine-groups. These options selectively turn off tasks
performed in process_includes.py. These options were added
because the use of --no-process-includes (which omits all
processing done in process_includes.py) was reported to cause
errors. See the documentation and the usage message (run
generateDS.py --help) for more information. Thanks to
Florian Wilmshoever for reporting and working with me on this.
- Moved README to README.rst so that hopefully Bitbucket will
render it as reStructuredText (with Docutils). Also, fixed a
number of reST/Docutils errors in README.rst.
- Another fix for unicode encoding in process_includes.py.
- A bug was uncovered when the "-o" command line option is omitted
and the Python version is 3. Added a check that forces the use of
the "-o" option unless the one-per option is included. Thanks to
Oskari Petas for reporting this.
Version 2.25a (03/21/2017)
- Fixes to the Django support for Python 3. Thanks to Shane Rigby
for all his help with all of these changes to the Django code.
- Added optional to the MemberSpec so that when command line
option "--member-specs" is "dict" or "list", the generated code
specifies whether the member is optional or not.
- In the Django support, django/gends_run_gen_django.py now has
new option "-s" ("--script") that can be used to write out the
command lines used internally by django/gends_run_gen_django.py.
This new flag can be used to generate a shell script that can be
run instead of django/gends_run_gen_django.py. (Note: The
script might require a minor edit or two.)
- In the Django support, there is now some attempt to treat optional
members specially and to generate "blank=True, null=True," in the
models.py file.
- Fix to Django support so that we generate unique names for
related_name.
- Added several date/time types for Django support: 'gYear',
'gYearMonth', 'gMonth', 'gMonthDay', 'gDay',
Version 2.24b (01/02/2017)
- Added several fixes to generateDS.py and process_includes.py that
are needed for the support for Python 3. Thank you Ian Glover for
catching this and for contributing the fixes.
- Fixed bug in generation of regular expression for validating
pattern in a restriction on a simpleType. In the pattern, we
needed to replace "|" with "$|^", unless the vertical bar was
escaped with a backslash. This was necessary so that each regular
expression separated by a vertical bar would be anchored at the
left and right. Thanks to Clint Pitzak for catching and reporting
this.
- Modified the Django support (in ./django/) so that it will run
under Python 3. Thanks to Shane Rigby for reporting this problem.
- Fixed an error in encoding unicode valueOf_ for <xs:complexType
<xs:simpleContent> <xs:extension base="xs:string">. Thanks to
Andrii Iudin for catching this.
Version 2.24a (11/16/2016)
- Added entry_points to setup.py so that distutils will generate
executable scripts for executable .py files (for example,
generateDS.py and process_includes.py). Thanks to Michael Jenny
for suggesting this and for showing the way to do it.
- Fixed function call signature mismatch in MixedContainer call to
export method. Thanks to Lev Israel for catching this and
providing the solution.
- Added "remove duplicate elements" fix to catch duplicate
definitions of child elements with the same name inside a single
parent element. This fix does the following: (1) removes
duplicate child; (2) makes the remaining child a Python list
(effectively maxOccurs="unbounded"); (3) prints a warning message
when it finds and removes a duplicate. Thanks to Pietro Saccardi
for catching and reporting this.
- More fixes for "remove duplicate elements".
- Removed command line option for "remove duplicate elements". This
behavior will now always be performed.
- Added unit test for "remove duplicate elements".
- Added command line option "--no-warnings" to turn off warning
messages. I needed it for the unit test for "remove duplicate
elements".
Version 2.23b (09/26/2016)
- Added missing unit test files to build (MANIFEST.in).
- Fixed exception that occurs when character content is empty for an
element defined as type xs:token. Thanks to Andrii Iudin for
reporting and checking this.
Version 2.23a (09/14/2016)
- Integrated Clayton Daley's fixes to the unit tests. Thanks much,
Clayton.
- Clayton's fixes to the unit tests uncovered several errors that
had been masked and hidden. Fixed those errors, for example: (1)
eliminated generation of erroneous call to validation method; (2)
added catalog file.
Version 2.22c (04/26/2016)
- Fixes to generation of validation methods for xs:date, xs:time,
and xs:dateTime simpleType. Thanks to Andrii Iudin for reporting
this and for suggesting a solution.
- Added additional unit tests for validations of xs:date, xs:time,
and xs:dateTime simpleType.
Version 2.22b (04/20/2016)
- Fixed endless recursion that occurred while attempting to replace
attribute group names. Thanks to Bing Wang for reporting this and
for identifying and providing the XML schema that reproduced it.
- Fixed failure to clean up names containing special characters in
function generateBuildStandard_1. This error was uncovered
when generating code from Bing Wang's schema. Thanks again Bing.
Version 2.22a (04/11/2016)
- Added support for additional command line options to
generateds_gui.py. Added analogous support to generateDS.py for
use of session files produced by generateds_gui.py.
- There is now a bit of documentation with a few usage notes on
generateds_gui.py. See generateds_gui_notes.txt and
generateds_gui_notes.html.
Version 2.21a (04/01/2016)
The GUI (graphical) front end to generateDS.py has been
resuscitated and is now working again thanks to Aleksandr
Dragunkin.
The GUI front end must be run under Python 3, and you must install
Python support for Gtk.
Aleksandr has also provided a Russian translation of the labels
etc in the user interface. You can run that with:
$ cd /path/to/generateds/gui
$ python3 generateds_gui.py --impl-gui=generateds_gui_ru.glade
Note that the GUI interface still lacks support for a few of the
command line options that were added most recently to
generateDS.py. If you need one or more of those missing options
but would still like to use the GUI front end, you can consider
using the "Capture CL" under the Tools menu, and then copy and
paste the result into a shell script, add any needed options to
that script, and run the script from the command line.
Version 2.20b (03/28/2016)
- Fixes to handling of simpleType with and without restrictions on
another defined simpleType. These were not being handled
correctly when the name of the simpleType contained a dash.
Thanks to Ryku for identifying this problem and for a very helpful
description of what was wrong and for providing schemas to
reproduce the problem.
Version 2.20a (02/25/2016)
- Another patch for Python 2 and 3. We needed to protect against
performing an encoding that caused an exception in generateDS.py
and process_includes.py. Thanks to Marcus Schäfer for catching
this and for providing a fix.
Version 2.19b (02/16/2016)
- Modified generated code so that it will run under both Python 2
and Python 3. There is no longer any need to generate different
code for Python 2 and Python 3. If fact, the "--py3" command line
option has been removed.
Version 2.19a (02/08/2016)
Added the ability to generate code that can run under Python 3.
Use the "--py3" command line option. Note that if you generate
code for Python 2 (the default), then you must run that generated
code under Python 2. And, if you generate code for Python 3,
then you must run that generated code under Python 3. There is
currently no way to generate code that will run under both Python
2 and Python 3.
Modifications so that generateDS.py itself can be run with either
Python 2 or Python 3.
Fixed the template (TEMPLATE_HEADER) so that it uses the format
function and keyword arguments.
Added info on --py3 command line option to doc (generateDS.txt).
Added new script (fix_subclass_refs.py) that can be used to fix-up
(change) which subclass file (of two or more that were generated
with the -s command line option) is used by the superclass file
when parsing an XML instance document. This will enable you to
use the -s option to generate multiple subclass files, add
different code to each of them, and then parse documents and
create instances of classes from one then another during the same
run. But also, see next item.
Added generation of code to lookup the subclass of a generated
class using a global variable containing the subclass module.
This provides an alternative and more convenient way to do the
above (i.e., use fix_subclass_refs.py to select from multiple
subclass files generated with the -s command line option).
However, there may be tasks that can be performed with that script
or a modified version of it that cannot be done with this approach
using a global variable. Here is a sample script that uses this
option:
import tmp01suba
import tmp01subb
def test():
tmp01suba.supermod.CurrentSubclassModule_ = tmp01suba
roota = tmp01suba.parse('test01.xml', silence=True)
tmp01subb.supermod.CurrentSubclassModule_ = tmp01subb
rootb = tmp01subb.parse('test01.xml', silence=True)
roota.show()
print '-' * 50
rootb.show()
test()
Version 2.18a (12/16/2015)
- Fixed quoting of simpleContent so that, e.g., "&" is exported
as "&" and not as "&". Thanks to Ardan Patwardha for
reporting this and contributing a fix.
- Fix to generation of exportAttributes so that the test for already
generated is properly quoted. Thanks to Naresh Shenoy for
reporting this and for contributing a fix.
- Another fix related to the unquoted constant in exportAttributes.
A simple fix had a bad conflict. Thanks to Christian Rasmussen
for focusing my attention on this one.
- Fix for xs:simpleContent that extends type xs:float (or xs:integer
or other numeric types). When set to numeric zero (for example,
after parsing the instance doc), the value was not being exported.
Thanks to Ardan Patwardhan for diagnosing this and for
contributing the fix.
Version 2.17a (08/17/2015)
- Modified setup.py so that process_includes.py is installed where
it can be imported.
- Changed default settings for export -- Default is now to generate
only the normal export methods, instead of both normal and
literal. See command line option --export.
- Fix to regex pattern used to capture "<![CDATA[ ... ]]>". The old
pattern was dropping ending characters when the content contained
HTML/XML markup. Thanks to Adrian Cook for this fix.
- Merged use of replacement patterns in cleanupName. With this fix
users can specify patterns to look for and replacements strings to
be used to clean up special characters and other patterns in
names. There are some notes in the document; search for
"cleanup-name" in generateDS.html. Thanks to Fedor Tyurin for
suggesting and implementing this enhancement.
- Added unit test for enhanced cleanupName. Added documentation to
generateDS.txt.
Version 2.16a (05/28/2015)
- Added new command line option ("--preserve-cdata-tags") that
causes generation of code that contains a special parser to retain
CDATA tags. Thanks to Adrian Cook for reporting this, for
providing test data and test cases, and for help with testing and
feed-back.
- Added ability for user to specify the names of classes generated
from anonymous, nested xs:complexType definitions, rather than
accept the names created in process_includes.py.
- Added a unit test for the anonymous, nested definition capability.
- Fix to error caused by check (in generated code) for whether lxml
or ElementTree is being used. We no longer support use of
ElementTree. Thanks to Emil Nordling for catching and reporting
this.
Version 2.15b (04/07/2015)
- Fix to generation of simpleType validation code for list (unbounded)
elements. Thanks to wobanator for this fix.
- Fix to code for --one-file-per-xsd. Added check to avoid an
infinite loop schemas not suitable to --one-file-per-xsd. Thanks
Michael Vezie for catching this and for identifying relevant
location in the code. And, thanks to George David for providing a
better fix than mine.
- Enhancement so that child elements defined with a default value
will not export when the current value and the default value are
the same. Also added equivalent changes for attributes. Thanks
to Jan Biel for finding and reporting this.
- Added unit tests for the above default value enhancement.
Version 2.15a (02/18/2015)
- Modifications so that we generate code that can be used by Python 3.
Thanks much to Richard Gerkin for this work.
- Removed possible use of ElementTree. Lxml is now a requirement
for both running generateDS.py itself and for running the
generated code.
- Fixed exporting of text content so that, when it contains CDATA
sections, the mark-up characters inside the CDATA sections are not
escaped. Thanks to George David for reporting this and for
helping with a fix.
Version 2.14a (11/26/2014)
- Fixed export of simpleType lists (added "' '.join(data)". Thanks
to Per Rosengren for catching this.
- Added new style validation of simpleType data. Validation
requirements are captured from the XML schema definition of the
simpleType, e.g. 'restriction base="..."' etc. Thanks to
azer gh for implementing much of this extended capability.
- Added unit test for simpleType validation, including test for
proper detection of bad (invalid) data.
- Did some code cleanup with the help of the flake8 code checker.
- Added a fix so that attribute declarations that use ref= rather
than type= will also be generated with the specific type. Thanks
to Florian Wilmshoever for catching and reporting this and for
providing an XML schema as a test case.
- Added unit test for reference to simpleType.
- Fix to generation of names of substitutionGroup. The namespace
prefix was not being stripped in some cases.
Version 2.13a (09/09/2014)
- Minor fix to function generateToEtreeChildren. Must generate
call to get_valueOf only when defined (i.e. when element is
simpleContent or isMixed).
- Fix to generation of class name prefixes added with the "-p"
command line option. This fix was added by Christian Ascheberg.
Thank you Christian.
- Added unit test for class name prefixes command line option.
Version 2.12f (08/12/2014)
- Fix for substitutionGroup conflict with keyword name mapping.
Thanks to Leonid Minchin for finding and helping with this
problem.
- An exception occured when an element had a documentation string
that was short (possibly 1 character). Fixed. Thanks to Matthias
Zaake for finding this and for providing a patch.
Version 2.12e (06/16/2014)
- Fix for formatting error. Thanks to Nikolay Lavrov for catching
this and for providing a fix.
- Fix to gds_parse_datetime(). The Python datetime module's
datetime object uses microseconds, but xs:dateTime uses fractions
of a second (e.g. 0.123). Converted from decimal fraction to
microseconds. Thanks to Mikki Weesenaar for catching this.
- Modified behavior and names for generated method insert_xxx(which
are generated when, e.g., maxOccurs="unbounded"), so that now we
generate insert_xxx_at and replace_xxx_at. Thanks to Bart
Wagenaar for pointing out this deviation from Pythonic style.
- Function transitiveClosure in generateDS.py was susceptible to
infinite looping. This seemed to occur when a substitutionGroup
contains a member with the same name as the head of the
substitutionGroup (but in a different namespace?). Added a test
to stop the recursion when this occurs. Thanks to Stuart Chalk
for finding and reporting this.
- Added explanation to the documentation explaining how the source
distribution (generateDS-x.xxy.tar.gz or Bitbucket) is needed for
use of the Django model generation capability.
Version 2.12d (04/02/2014)
- Fix for an infinite loop caused by inconsistent use of
mapped/clean names with list AlreadyGenerated. Thanks to Jerome
Allasia for catching this and for suggesting a fix.
- Added a unit test for the use of mapped/clean names, in particular
when one xs:complexType is an xs:extension of another.
- Changed several lists to sets for faster look-up, for example
AlreadyGenerated, AlreadyGenerated_subclass, DelayedElements, etc.
- Cleaned up the use of functions mapName() and cleanupName() to
avoid duplicate transformations.
Version 2.12c (03/28/2014)
- Fix for "one module per XSD file" to handle an include or import
element that refers to a remote schema on the Net (i.e. the
location is "http:..." or "ftp:...") rather than a file on the
local file system. Added ability to access include/import file
across the Net. Thanks to Jinquan Liu for reporting this.
- Added schema to unit test for "one module per XSD file" that is
read from remote site (http://www.davekuhlman.org).
- Fix to process_includes.py -- When run directly from the command
line (as opposed to imported and called from another python
module), the fixtypenames option was not being intialized.
- Fix for error in order of generation of classes that have
superclasses. When an anonymous simpleType occured, the name of
the enclosing complexType was used, which caused generateDS.py to
believe that the superclass had already been generated. Thanks
again to Jinquan Liu for reporting this issue.
- Fix for handling of xs:substitutionGroup -- Namespace prefix was
causing gDS to fail to match on substitutionGroup name.
- Added code so that an instance of a generated class can remember
the tag from which it was built. This is needed for instances of
a class that represents an element type that is a member of a
xs:substitutionGroup. But, in fact, generated code now uses this
feature to remember and export the tag name of all complex
elements.
- Enhanced command line option --root-element so that both the root
tag and the root class can be specified (separated by a vertical
bar).
- Added support for the ability of an element definition to inherit
minOccurs and maxOccurs from the xs:sequence that contains it.
- The command line options and command line arguments used to
generate modules are now included as comments near the top of the
generated modules. Also included in these generated comments is
the command line used to generate the module. This will help
users later to determine which XML schema and what options were
used to generate each module, and to re-generate the module, if
needed. Thanks to Mikki Weesenaar for suggesting this
enhancement.
Version 2.12b (02/10/2014)
- Fix to the aliasing capability. You should now be able to alias
one element to another, and by doing so, only generate the
targeted alias. See notes on generateds_config.py in the
documentation for more on this. Thanks to Mikki Weesenaar for
bring up the use case that needed this.
- Additional fixes for the "one module per XSD file". Also,
creation of a unit test for this capability. See section "One
Per -- generating separate files from imported/included schemas"
in the documentation for more information. Thanks again to
George David for all his work on this.
- Fixes to process_includes.py -- Some uses of namespace prefix xs:
were hard-coded, whereas some XML schemas use xsd: instead of xs:.
- Various fixes to unit tests so that all unit tests pass when using
either the cloned Mercurial repository at Bitbucket
(https://bitbucket.org/dkuhlman/generateds) or the tar achive.
Version 2.12a (10/29/2013)
- A name conflict issue caused by naming anonymous types. An
anonymous type is a complexType that does not have a name
attribute and that is nested inside an element that does not have
a type attribute. Strengthened the code that generates new,
unique names. And, also fixed a problem or two in the surrounding
code. Thanks to Shahaf Abileah for reporting this and for
providing test files to reproduce the problem behavior.
- Created unit test for anonymous types.
- Added command line option --fix-type-names. This may be useful if
there are name conflicts in your XML schema, for example, because
the schema refers to two types with the same name but in different
namespaces.
- Ability added to generate one Python module for each XML Schema
(.xsd file) imported/included. Added command line options
--one-file-per-xsd, --output-directory=, and --module--suffix= in
support of this. Thanks much to George David for implementing
this new feature.
- This change provided by Logan Owen. -- Return self from build
function of generated classes, to allow easy chaining. The main
use case for this change is if you have a list of xml documents,
and you want to change them into generateDS class instances.
Thank you Logan.
Version 2.11a (08/16/2013)
- Added ability to use XML catalog to find included/imported
schemas. The -c command line option has been added to support
this. Thanks to George David for implementing this enhancement.
- Added unit test for the catalog capability.
- Added ability to pick up the target namespace and its prefix, then
use them in calling the export functions from the parse functions.
Thanks to George David for suggesting this.
- Several fixes to formatting date and floats during export. Thanks
to Domenico Mangieri for catching and fixing these.
- Added generation of an extra, optional "silence" argument to the
parse functions so that export can be turned on or off at runtime.
Domenico is the motivator on this one, too.
- The information about minOccurs and maxOccurs in the generateDS
document (generateDS.txt) was misleading or wrong. Edited it.
Thanks to Rinat Yangurazov for catching this.
Version 2.10b (07/22/2013)
Changed flag for generating getters and setters. Removed flag
--use-old-getter-setter. Replaced it with new flag
--use-getter-setter, which can have the following values:
"old" - Name getters/setters getVar()/setVar().
"new" - Name getters/setters get_var()/set_var().
"none" - Do not generate getter/setter methods.
The default is "new". See the help (use --help option) or see the
doc (generateDS.txt/generateDS.html) for more on this. Thanks to
Mike Vella for suggesting this.
Changed suffix used to prevent name conflicts with Python keywords
from "xx" to "_".
Version 2.10a (05/29/2013)
- Added ability to produce mapping (a dict) during call to
to_etree() that maps gDS instances to their associated etree
elements. Also added convenience method gds_reverse_node_mapping
to reverse the order of keys and values in a mapping/dict. See
function parseEtree in the generated code for hints about how to
produce these mappings. There is also a note on generating the
Lxml Element tree in the docs (generateDS.txt/generateDS.html).
- Python datetime.date objects don't have tzinfo, so trying to
access it in gds_format_date was throwing an error. According to
http://stackoverflow.com/a/610923, the best way to avoid that type
of error is to use a try/catch for AttributeError. Thanks to
Logan Owen for this fix.
- Fixed bug so that gDS will now handle a simpleType nested inside a
restriction nested inside a simpleType. Thanks to Christian
Kaiser for finding this, for focusing my attention on it, and for
providing the sample files to test it with.
- Fixed bug where gDS was failing to resolve defined a simpleType
correctly. It was failing to add the XSchema namespace (usually
xs:). Thanks again to Christian Kaiser for focusing me on this
one.
- Fixes to handling of xs:dateTime when the XML schema specifies a
default value and the XML instance document omits the value.
Also, fixed formatting because datetime.strftime does not handle
dates outside of range (e.g. earlier then 19000). Attempts to use
a consistent internal representation across xs:dateTime, xs:date,
and xs:time, specifically instances of datetime.datetime,
datetime.date, and datetime.time from the Python standard library.
Thanks to Shahaf Abileah for reporting this and for providing an
example of the schema. Caution: Because this changes the
internal representation of dates and times used by the generated
code, this fix may break some existing applications.
- Various fixes to generation of method exportLiteral in generated
classes.
- More code clean-up in generateDS.py to eliminate coding style
warnings and errors reported by flake8. Ditto for
process_includes.py. Also, made a few changes to reduce the
warnings and errors reported by flake8 when run on code generated
by gDS.
Version 2.9a (02/21/2013)
- Added support for exporting to an Lxml element tree. The element
tree can then be serialized to XML, e.g. using Lxml
etree.tostring(). This innovation is by Logan Owen, who also did
most of the work on it (but I helped some, too). Note that this
work is not yet complete; it's still "work in progress"; but it
looks very promising.
- Added --export command line option. This enables the user to
selectively generate export methods for any or all of normal
export, export to etree (lxml element tree), or export to literal
python code. This will enable users to reduce bulk in their
generated files when any or all of these are not needed. The
default is "write literal", i.e. the normal export methods that we
are used to. Use the --help command line option or read the doc
for a description of this option.
- Fixed a bug that occurs when a schema has an attributeGroup
referenced with a name that includes a namespace prefix but the
attributeGroup is defined with a name that does not have the
namespace prefix. Thanks to Mike Detecca for reporting this and
for nudging me in the right direction when I, initially, made the
wrong fix.
- Added unit test for export to etree.
- Various fixes to the to_etree (export to Lxml element tree)
capability: (1) fix to preserve names that contain special
characters (e.g. "-" and "."); (2) fix to preserve the type
attribute (xsi:type) for abstract types that whose type is set
explicitly. Round turn (XML --> gDS object tree --> lxml element
tree --> gDS --> lxml ...) now seems to work reasonably well,
although I'm guessing that there are still bits missing (in
particular, support for xs:anyAttribute).
Version 2.8c (provisional) (01/30/2013)
- Changed generated check for attributes that are already_processed
to use a set object rather than a list. Since sets are hashed, I
believe that lookup is faster.
Version 2.8b (01/30/2013)
- Fixed missing underscore in reference to member names in
generateExportLiteralFn_2. Thanks to Sergii Chernysh for
reporting this.
- Fixed use of NameTable for mapping names when an element has an
attribute and a child with the same name. Needed to use correct
name (original name or mapped name) when doing (1)
fix_dup_names, (2) exportAttributes, and (3) buildAttributes.
Thanks to Mike Vella for reporting this.
- Fixed gds_parse_datetime so that it will handle fractional
seconds. Thanks to Matt Hughes for providing this fix. Now,
xs:dateTime values that include microseconds are successfully
parsed and exported.
- Created a Mercurial repository for generateDS at Bitbucket:
https://bitbucket.org/dkuhlman/generateds
Version 2.8a (01/10/2013)
- Fix to process_includes.py so as to remove the limitation on the
number of unique names it can generate when raising anonymous
types to the top level. Thanks to Daniel Browne for help with
this.
- Added support for multiple level attributeGroup, i.e. for
attribute groups that themselves contain references to other
attribute groups. Thanks to Harley Green for pointing out the
need for this. Also added a unit test for attribute groups.
- Added support for more date and time simple types, specifically
gYear, gYearMonth, gMonth, gMonthDay, and gDay. Thanks to
Nicholas Krasney for catching this. Added tests in the unit
tests for these types.
- Quite a bit of code clean-up with the help of the flake8 Python
code checker. This is predominantly code cleanup that does not
affect behavior, most commonly splitting lines that are longer
than 80 characters across multiple lines for readability. (See:
http://pypi.python.org/pypi/flake8 for info about the flake8
Python code checker. I use it with the Syntastic plugin for the
Vim text editor.)
- Added generation of a dictionary that maps element definition
names to generated class names. Thanks to Elena Dolinin for the
original work on this one.
- Added support for xs:date and xs:dateTime. These are now
captured as instances of class datetime.datetime from the Python
standard library. They are parsed and exported with the help of
that class and using methods gds_format_date,
gds_format_datetime, gds_parse_date, and gds_parse_datetime in
class GeneratedsSuper (which is part of the generated module).
Logan Owen did the work on this. Thanks much to Logan for
implementing this and contributing this patch.
- Turned logging off. I did not realize that generateDS.py had
been creating a log file (generateDS.log). Logging can be
turned back on by modifying the logging calls near the top of
generateDS.py.
- Fixed exception that is thrown when the XML schema file (.xsd)
only contains a simple type. Now, the output is generated, but
it contains no data representation classes. Thanks to Daniel
Browne for catching this.
Version 2.7c (08/06/2012)
- Added xs:hexBinary to the list of string types in generateDS.py
and django/generatedssuper.py. Effectively, we are generating
the same code for types xs:base64Binary and xs:hexBinary. That
leaves it up to the user to add code that converts into and out
of these formats. Thanks to Peter Kreinhöfer for finding this.
- Added support for compressed export, that is, export without
ignorable white space (indentation and new lines). Normally the
generated export methods produce pretty-printed (indented) XML
output. With this change, we generate modules which enable you
to export in a way that omits ignorable whitespace. It is
anticipated that this feature will be useful to those who need
to export XML documents that are machine readable but not human
readable. Thanks much to Logan Owen for doing the work on this
one. Compressed (non-pretty-print) output is produced by
passing the keyword argument pretty_print=False to the export
method. There is a note in the document (generateDS.html) about
it; see section titled "Exporting compact XML documents".
Version 2.7b (12/10/2011)
- Fix for xs:any in buildChildren in an element defined with no
other children so that we do not generate "else:" clause without
an "if ...:". Thanks to Keith Robertson for help with this.
- Change for xs:any in buildChildren (when maxOccurs > 1) so that
the gds_build_any() method always, consistently takes a single
child node as input and returns a single built object. Thanks
Marcin Tustin for guidance with this.
- Fix for element definition containing an anonymous
xs:simpleType.
- Added xs:time to list of handled simple (date, time) types.
Version 2.7a (11/04/2011)
- Fix for case where a child is defined with a reference (ref="")
to a complexType (rather than a simpleType) and the complexType
is abstract.
- Added minimal support for xs:any. See section "Support for
xs:any" in the documentation.
- Added unit test for xs:any.
Version 2.6b (10/13/2011)
- Fix for case where a child element is declared with a type that
is a simpleType whose restriction base is another simpleType
that is referred to with a namespace prefix. With this fix we
ignore the prefix, so that at least it will work when there are
not two different simpleTypes whose qualified names have the
same local name (qualified name minus the namespace prefix).
Thanks to Thomas Nichols for finding and reporting this one.
- Added a unit test for the above restriction base with namespace
prefix.
- Added a blank character when needed at the beginning and end of
of doc strings inserted in generated classes to protect against
the case where the doc string begins or ends with a double quote
character.
- Fixes to various files in the tutorial/Code/ directory and to
the text files in the tutorial/ directory in order to make them
more consistent and less confusing. Added the individual sample
code files to the distribution so that users will not have to
find and unzip a zipped archive.
- Fixes to files in tests/ and to the distribution config
(MANIFEST.in) so that the distributed version would pass unit
tests. (Please let me know if it does not.)
- Removed file generatedssuper.py from the distribution. Added
notes to the documentation on how to create this module by
copying from a generated module for those who want to customize
those methods in the common superclass.
- Fix to django/generatedssuper.py -- Regularized and fixed the
names generated in models and forms files.
- Fix to the code that generates the member_data_item_/MemberSpec_
list/dict. If the type of a child element is defined by a
reference (ref="") to an element rather than, e.g. a
complexType, it was using the child's name not it's type.
- Added xs:base64Binary and xs:language to the list of string
types in generateDS.py and django/generatedssuper.py. Also,
xs:anyURI and xs:duration.
Version 2.6a (07/28/2011)
- Fix to capture xs:/xsd:/etc namespace prefix from schema. Was
not setting global variable XsdNameSpace. Thanks to Frank Liauw
for focusing my attention on this one.
- Fix for substitutionGroup -- Was not setting the correct
instance variable during generation of build method when child
is a member of substitutionGroup. Thanks to Serge Dikic for
finding this one and bringing it to my attention.
- One more attempt to fix whether to call the exportChildren
method when the complexType is an extension and not a
restriction and not defined with simple content that extends a
simpleType. Thanks to Jaime Cepas for alerting me to this.
- process_includes.py has a fix to the problem where there are
more than one anonymous complexType that define elements with
the same name. The issue is that generateDS.py must generate a
Python class for each complexType and cannot do so in this case.
One solution, which is now implemented in process_includes.py,
is to raise each complexType to top level in the schema DOM tree
and to give it a name. process_includes.py does this by
appending "Type" to the name, and when there are duplicate
names, appending "1" or "2" or ... to that.
So far this change passes my tests, but it does not work for
you, then comment out the call to raise_anon_complextypes().
Thanks to Amal Khailtash for finding a schema that exhibits this
problem and bringing it to my attention.
- Fix for generation of export method that exports xs:anyAttribute
when there is an xsi:type attribute.
- Fix for use of valueOf_ -- Should only be used when element is
defined either with (1) mixed content or (2) simpleContent.
- Question: The xsi:type attribute is being exported for any
derived type. Perhaps it's harmless, but it seems excessive.
When should the export method have that code to export the
xsi:type attribute? Only for types derived from (an extension
of) an abstract base type? Only for the abstract base type
itself? Only when a derived type is substituted for a base type
using the base type's tag and the xsi:type attribute to specify
the derived type? Need to investigate.
- I've reworked the xsi:type attribute stuff. It now operates on
the following assumptions: (1) an instance of any complexType
that has been extended can have an xsi:type attribute (which
specifies one of the extending types) and (2) the generated code
should export the xsi:type attribute only and always when (if
and only if) the element in the input instance document has that
attribute.
- A patch to convert floats and ints etc to str during export.
Thanks Jaime Cepas.
- Fixes to ctor/initializers when there is a default value for a
an child element defined as a complexType containing
simpleContent.
- librarytemplate -- (1) Renamed documentation files to
librarytemplate_howto.html and librarytemplate_howto.txt for
consistency with the name of the librarytemplate distribution
file (currently librarytemplate-1.0a.zip). (2) Added the
documentation and distribution files for librarytemplate to the
main generateDS distribution file.
- Added xs:byte to the list of integer types.
Version 2.5a (06/06/2011)
- Fix for generation of default value in parameters for the
constructors.
- Fix for lookup of attribute value in generated buildAttributes
methods -- Formerly, attribute names having a namespace prefix
were not being found.
- Added some support for xs:group -- Named model groups (model
group definitions) are now treated as definitions of blocks of
elements to be copied/inserted where referred to. This
replacement has been added to the preprocessing done in
process_includes.py. So, this <xs:group ref="some_def"/> is
replaced by the contents of <xs:group name="some_def"> ...
- Fix to generation of calls to validator methods for child
elements. Before the fix, the validators were called in
buildAttributes methods but not in buildChildren. Also,
generation of the validator method (stubs) was also missing in
some cases. Thanks to Béres Botond for alerting me to this.
- Fixes to generateds_gui.py -- Now it can load a session again.
Also a fix to the check for and warnings about the changes to
current session on exit.
- process_includes.py -- Fix for yet another problem with
including the same file multiple times when included from
different directories.
Version 2.4c (03/21/2011)
- Added minimal support for unsignedLong, unsignedInt, and
unsignedByte.
- Made the retrieval of the parent (superclass) name and parent
object for an element more consistent. Fixed some cases where
this was not handled correctly, in particular, the generation of
arguments and paramenters for ctors (__init__) was inconsistent
and caused errors.
- Regularized the handling of fromsubclass_ and added this
handling to the exportChildren methods. This is used to tell a
superclass, during build and export, that the subclass has
already performed certain operations.
- Fix to process_includes.py so as to prevent it from loading
schemas multiple times. The check for already_processed was
formerly incorrect.
- Fix related to restrictions on complexType -- Do not generate
call buildChildren in the superclass for restrictions (as
opposed to extensions) of a complexType. Ditto for
exportChildren. Note that restrictions must repeat (and
restrict the value of) each sub-element that is to be included
in the content of the restriction. See:
http://www.w3.org/TR/2004/REC-xmlschema-0-20041028/#DerivByRestrict
Version 2.4b (02/21/2011)
- Fix to generation the superclass in the class statement header
line. Formerly we did not correctly pick-up the superclass
name (from extension base=""). Thanks to Timo Sugliani for
finding this bug.
Version 2.4a (02/16/2011)
- A few fixes to format of some error messages.
- Clean-up names in the exportableClassList (__all__).
- Modify reading session object/doc to use lxml instead of
minidom.
- Fix to process_includes.py to protect against crash when an
import element is missing a schemaLocation attribute.
- Fix to parsing and exporting simpleTypes declared as lists
(<xs:list>).
- Added new methods to class GeneratedsSuper to validate (during
build) and format (during export) for simpleTypes declared as lists
(<xs:list>).
- Fix for incorrect detection of type during generation of build
method.
- Added first cut at generating Django models and forms.
Thanks to Derek Corbett for this suggestion.
- Added "meta-app" that generates Django database models and
Django forms. See doc and files in subdirectory django/.
- Fix to generation of __all__ list: converted non-word
characters to "_" etc
- Fix to process_includes.py so that it uses the entire path to a
file when trying to determine whether it duplicates a previous
import. Perhaps this will avoid skipping an import when
attempting to import two files with the same name from
different directories. Thanks to Mihai Ibanescu for pointing
out this fix.
Version 2.3b (12/28/2010)
- Fix for simpleTypes defined as a restriction whose (ultimate)
base type is a pre-defined simple type which were not generating
correct (type-specific) code in build method. Thanks to
Noel Merket for finding this problem.
- Fix for simpleTypes defined as a xs:list with "itemType"
attribute where the type was not being recognized.
- Fix so that we recognize some other simple types as xs:string
type (e.g. xs:NMTOKEN, xs:ID, xs:Name).
- To do -- If a simpleType is a restriction on another simpleType and
the base simpleType definition is declared as a list, we are
not recognizing that it is a list.
Version 2.3a (12/02/2010)
Added generatation of code to handle attributes inherited by a
restriction from its base type and the types that the base
extends (i.e. from a restriction base class and its
superclasses). Thanks for help from Jaime Cepas.
Fix to code that generate the references to the superclass from
a type that is an extension: special characters (e.g. dash)
were not being cleaned/mapped. Reported by Koen Smets; thanks.
To do:
In a restriction, inherited attributes can be "prohibited".
It would be nice if gDS would do something to block their
use.
When:
AbstractElement mixed=false and
Element1 mixed=true base=AbstractElement and
Element2 mixed=FALSE base=AbstractElement
Incorrect parse code is generated for Element2.
Reported by Jaime Cepas.
It might be desirable if the getter functions could be asked
to return values encoded to utf-8 for xs:string types.
Code that is generated to export to python code needs
updating, in particular we need to update encoding of
exported strings. Thanks to Kristoffer Kobosko for
reporting this.
Update to the code that generates code that exports Python
literals (exportLiteral ...). In particular: (1) fix
excoding of Python code and of string literals (unicode, utf-8).
Version 2.2b (11/10/2010)
- Added generation of __all__ global variable containing a list
of generated class names. This enables you to do a reasonably
safe "from mymodule import *". It's sorted, so it also gives
you something in the way of an alphabetical table of contents
of the generated classes. Thanks to Jaime Cepas for this.
- Added another fix so that the generated code for mixed content
elements will not generate empty blank lines on export. Thanks
again to Jaime for this fix.
- Added patch to sort mixed content in their class containers.
Jaime contributed this one too. Thanks again.
- Added check for endless recursion while collection list of
parent type element names. When detected, raises exception
that identifies the elements. Thanks to Maximilian Holtzberg
for finding this one. One case that can cause this problem is
when an element type definition extends a type definition of
the same name in a different namespace. Since generateDS.py
ignores the namespace, this looks like a type that is extending
itself.
- Modified code generated to process token lists in order to
prevent breakage processing some strings.
- Updated the tutorial so that the examples use the new parsers
(ElementTree or lxml).
- The "Clear" buttons in generateds_gui.py is broken when run with
GTK2. generateds_gui.py is still usable, but, if you need to
erase the contents of a text field, you will have to do so
manually until I can figure out a fix.
Version 2.2a (9/14/2010)
Changes for coding consistency -- Used wrt() pervasively
instead of outfile.write().
Re-write of process_includes.py -- It now handles
xs:include/xs:import elements that include a file from another
directory that incude a file relative to that directory that
include a file across HTTP, and so on.
The command line option --search-path is no longer supported. I
don't think that behavior was standard for XML schema anyway.
Removed support for search_path from generateDS.py,
process_includes.py, and generateds_gui.py.
Added support for specifying additional name mappings in a config
file: generateds_config.py. That file, if it exists, must be
located where it can be imported by generateDS.py and should
contain a dictionary named NameTable. For example, the following
maps the name "range" to "rangeType" so that if the schema defines
a complexType "range", generateDS.py will generate a class named
"rangeType":
- NameTable = {
'range': 'rangeType',
}
See the doc for more on this.
Instead of using the lower() function from the string module,
added a function to the GeneratedsSuper class and used the string
method. Prepares for Python 3.0
Added gds_ prefix to all methods in class GeneratedsSuper to
make possible name clashes less likely.
Fixes to exporting elements with mixed="true" -- Reduced extra
whitespace.
Fixes to building (capturing) attribute values for elements with
anyAttribute="..." -- Eliminated capture of duplicate attribute
values.
Version 2.1d (8/23/2010)
- Fix to indentation of generated code in the build method for
type checking of NonNegativeIntegerType.
- Fix to generation parameters in call to superclass constructor.
Count of children was incorrect, triggering generation of
valueOf_.
- Known issue -- If type B extends type A, and type A declares
anyAttribute, then duplicate attributes with the same name may
be produced during export.
- Known issue -- Some namespaces ("{URI}") are not converted to
namespace prefix during export. The needed information is not
available during export.
Version 2.1c (8/8/2010)
Fix to functions parse, parseString, and parseLiteral so that
they start the build with the correct root class. I believe
that there yet is another case that this does not handle,
specifically when element name is different from class/type
name and the element definition is not the first definition in
the schema.
Fix to generation of build method for derived elements (i.e.
elements with "extension base=". These were being treated as
if they were abstract, i.e. 'abstract="true"'.
Fix to generation of the call to the superclass constructor in
the generated subclass module. Prevented the generation of
duplicate arguments.
Added a comment to the generated superclass module at the top
that specifies the utf-8 source code encoding:
# -- coding: utf-8 --
Version 2.1b (8/2/2010)
- Fix to generation of export functions. If no children, must
generate "pass" statement.
- Changed generated get_all_text function so that it uses an "if"
statement instead of a conditional (if) expression. The
conditional expression does not work with older versions of
Python.
Version 2.1a (7/8/2010)
- Added ability to capture annotation/documentation element text
as doc-strings in the generated classes. Thanks to
Roy Williams for suggesting this and for guidance.
Version 2.0b (6/24/2010)
- Fix to generation of export method so that valueOf_ is exported
when childCount == 0 and not isMixed.
Version 2.0a (6/21/2010)
- Switched to use of lxml/ElementTree in generated files.
Thanks to Biswanath Patel and Jaime Huerta Cepas for
encouraging me to implement the switch to lxml/ElementTree.
- Modified the generation of functions parse(), parseString(),
and parseLiteral() so that they automatically recognize the
root element of an instance XML document and call the build
method of the appropriate class.
- Fix to hasContent_ method so that in elements defined
with extension-base, the superclass is checked also.
- For classes that must call an overridden method m in the
superclass, switched to use "super(superclassname, self).m(...)"
instead of "m.(self, ...)".
- Known issues -- (1) generateDS.py loops and crashes with
"RuntimeError: maximum recursion depth exceeded" on some
schemas (for example collada_schema_1_4.xsd). (2) Failure in
process_includes.py with import of remote file and nested
imports (for example collada_schema_1_5.xsd).
Version 1.20g (5/21/2010)
- Update to documentation -- Added a section on suggested ways to
handle/recognize different top level (root) elements.
Version 1.20f (5/3/2010)
- Fix to generation of export so that anyAttribute does not cause
duplicate attributes to be exported.
- Fix so that we do a better job of determining whether a
reference to a type is a simple, builtin type in generation of
constructor.
- Fix to generation of constructors so that (1) valueOf_ is
intialized in subclass modules and (2) valueOf_ is initialized
to None (rather than '').
- To do: Extend the --root-element flag so that we can specify both
the tag name and the element/type name. Sometimes they are
different.
Version 1.20e (2/8/2010)
- Fixed error that caused incorrect tag name to be exported
when the tag name contains special characters and the tag name is
different from the type name.
- Fixed links so that latest versions are included in the install
distribution file.
Version 1.20d (2/3/2010)
- Updated version number/info in genereateds_gui.py.
- Fix to process_includes.py -- Handle include elements and
import elements in the same way. In particular, allow both to
reference schema files on either the local file system or
remotely across the Net (via ftp or http).
- Fix to generation of properties -- When the name of a member is
mapped (e.g. a Python language keyword), wrong name for getter
and setter was used.
- Fix to generation of export methods: missing encoding.
- Fix to selection of type for exportLiteral.
- Added missing files in the tests/ directory to the distribution.
Version 1.20c (1/1/2010)
- Replaced symbolic links in the distribution with hard links.
Symbolic links do not work on MS Windows.
- Fix to the use of the subprocess module in generateds_gui.py,
which had caused a problem on MS Windows.
- Cosmetic fix in generateds_gui.py: labeled "Save" (session) button.
- Fix so that File/Open action in generateds_gui.py will check
for and warn user if the session data has been modified.
- Fix to generation of code for simpleContent with restriction:
now treats the restriction element as a superclass. Thanks
to Franis Sirkovic for catching this and for providing the
patch. Also added a unit test for this case.
Version 1.20b (12/14/2009)
- Fix to process_includes.py so that it handles relative paths
in include/import elements in the schema.
- Various fixes and additions to the GUI front-end, e.g. added
"Clear" buttons to erase some fields.
- Fixed bug -- self.inRestrictionType was not initialized.
- Added --session command line option to generateDS.py -- It
can now use session files generated by the GUI front-end.
- Fixes to the generation of the exportLiteral methods. We can
now export Python literal representation of an instance doc
that can be read/imported by Python.
- Added unit test for generation of Python literal representation.
- With the help of Erica Tolbert, generateDS.py can now generate
bindings for gcdml (Genomic Contextual Data Markup Language.
See http://gensc.org). Thank you, Erica.
- generateDS.py can now generate bindings for the following
(rather large) schemas:
Version 1.20a (12/01/2009)
- Added first version of the GUI front-end. See the generateDS
doc (generateDS.html).
Version 1.19a (10/21/2009)
Enhancement to the table of information generated in each class
when the --member-specs=list|dict command line option is used.
For a complexType defined as a simpleType, we now generate a
list of the simpleType and the simpleTypes it is based on using
name valueOf_. Thanks to Ryan Leslie for much help and
guidance with these changes.
Example:
'valueOf_': MemberSpec_('valueOf_', [u'RelationType',
u'RelationType2', u'xs:string'], 0),
Note the following incompatible changes:
- _MemberSpec changed to MemberSpec_ -- We want avoid posible
name conflicts, not make it "weakly hidden". See the Python
style guide for more on this
- _member_data_items changed to member_data_items_ -- Same
reason.
- Method MemberSpec_.get_data_type() now returns the last item
if the types is a list and the single type if not a list.
- Method MemberSpec_.get_data_type_chain() is a new method that
returns the entire list of data types.
The new tutorial (see tutorial/tutorial.html in the
distribution) has an example of the use of the MemberSpec
feature.
Fix to DecimalType -- In some cases treated as an integer.
Should be a float. Thanks Ryan Leslie for catching this.
Removed last bits of the generation of a SAX parser. It no
longer worked and is not needed.
Several fixes to determination and handling of types.
Added unit test for extensions to simple types and for MemberSpec.
There is now a preliminary version of a tutorial.
Version 1.18f (9/14/2009)
- Fixes to process_includes.py from Mihai Ibanescu. These fixes
address namespace and namespace prefix problems for XML tree
that is copied into a document. Thanks Mihai.
- Added xs:anySimpleType to the list of OtherSimpleTypes. This
prevents anySimpleType from being used as a base type.
- Change so that sub-classes are generated for types that do not
have children or attributes.
- Fixed crash that occurred when a simple type is nested in a simple
type and use of memberTypes attribute.
- Fix to GeneratedsSuper -- Inherit from "object".
- Added command line option --no-versions,
which, when used, tells generateDS.py not to insert the
version in generated files. This is useful when you want to
be able to compare generated files and not detect version
differences.
- Patch to eliminate extra space after element tag. Thank you
Ryan Leslie.
Version 1.18e (9/1/2009)
- Added patch from Mihai Ibanescu which handles and expands
groups. Also added Mihai's unit test for groups. Thank you,
Mihai.
- Added patch, also from Mihai, that passes the node's text to
the super-class constructor.
- Added patch that implements a --no-dates command line flag
which, when used, tells generateDS.py not to insert the
time-stamp in generated files. This is useful when you want to
be able to compare generated files and not detect date/time
differences. Thanks again to Mihai.
Version 1.18d (8/26/2009)
- Automatic detection of the namespace prefix used in the schema
document. Thanks to Mihai Ibanescu for this enhancement.
- Fix to deal conflicts with generateDS's internal function
names, for example "build". Thanks again to Mihai.
- Upgrade to the unit test harness. Replace popen (which is
deprecated) with use of the subprocess module. Thank you Mahai.
- Fix in the class constructors (__init__) to cast XML primitive
types (xs:integer, xs:float, etc) to Python built-in types
(int, float, etc). Thanks once more to Mahai.
- Fix to add enumeration value resolution when the possible
values are not declared in an explicit definition but in a "top
level" type. Also fix a bug with enumeration value population
for elements where the unwound element stack contains more than
one element. Thanks to Chris Allan for this fix.
Version 1.18c (8/11/2009)
- Small changes related to check for mixed content.
- Enhancement to generation of hasContent_() method to check for items
with maxOccurs > 1.
- Fix for generation of test for valueOf_ in hasContent() method.
- Fix for generation of initializers in ctor -- children were being
skipped when the element is mixed.
Version 1.18b (7/29/2009)
- Fix for exception with simpleType that is an extension of
another simpleType.
- Change to mixed extension chain -- Will now generate class.
- Fix to generation of constructors -- Will now initialize to
default value for simpleTypes.
- Fixed generations of validator methods, validator bodies,
and call to validator bodies for attributes.
- Command line option "--validator-bodies" now triggers check for
option value is an existing directory.
- Various cleanup, deleting commented-out debug code, etc.
- Now writing help messages, error messages to stderr instead of
to stdout.
Version 1.18a (7/14/2009)
- Added command line flag --member-specs to generate the member
specifications as described in "User Methods" section of the doc.
The member specs can be a list or a dictionary.
- Fix to export indentation. Thanks Tim Marchelli.
- Added a utility script: generate_coverage.py which generates a
dictionary of class names and classes from a (superclass) module
generated by generateDS.py.
Version 1.17d (7/2/2009)
- Fix for generation of recursively defined simpleTypes, e.g.
a simpleType defined as a restriction of another simpleType.
(see fix_simpletype comment in generateDS.py)
- Added version number to generated class files.
- Fixes to/for process_includes.py -- DirPath/DIRPATH now initialized
correctly and fixed failure to initialize a local variable.
Version 1.17c (6/24/2009)
- Fix for error generating code for exporting related to
simpleType.
- Fix for syntax error in export of boolean types.
- Fix for export of elements with type of attribute defined
in-line.
- Fix to generation of export function when the --silence
command line option is used.
Version 1.17b (6/10/2009)
- Fix so that generateDS.py will still work with Python 2.4.
Thanks to Dave Sugar for that.
Version 1.17a (5/20/2009)
- Modified export of children of type xs:string so that
(1) if None, not exported and (2) if not None but an
empty string, exported (example "<aa></aa>").
- Generated calls to format_string(), format_integer(), etc
in the generated export methods. Enables the user to
override these methods to customize format of exported
values. See the "Overridable methods" section in the
doc (generateDS.html) for more info and for an
explanation of how to override these methods.
Currently used to give the user control over formatting
of values during export.
- Fixes to generated build and export methods so that
elements defined as xs:simpleType as handled as
the specificsimpleType xs:restriction base, for example
xs:string, xs:integer, etc.
Version 1.16e (4/28/2009)
- Eliminated generation of SAX parser. I'm sure it no longer
worked, anyway.
- Fix to export of CDATA characters, provided by Kerim Mansour.
Thanks.
- Added support for command line option --external-encoding.
Exported character data is now encoded to sys.getdefaultencoding()
or to the encoding specified by command line option
--external-encoding.
- Added attributes (in addition to children) to the list of
data type specifications in _MemberSpec/_member_data_items.
This fix was provided by Ryan.
- Several fixes suggested by Kerim Mansour including one related
to export of CDATA. Thank you Kerim.
- Removed generation of SAX parser. It did not work
any more anyway.
Version 1.16d (3/25/2009)
Fixes to generation of the exportLiteral functions. We
can now do exportLiteral, then import the resulting file
in Python. See generated parseLiteral() for an example.
Added an additional parameter to the export() methods.
Now, you can call export() as follows:
- rootObj.export(outfile, 0,
namespacedef_='xmlns:abc="http://www.abc.com/namespacelo"')
which will insert the namespace prefix definition in the
exported root element.
Added new command line option --namespacedef= to specify
the namespacedef_ to be passed in by the generated
parse() and parseString() functions. Example use:
- generateDS.py --namespacedef='xmlns:abc="http://www.abc.com/"'
-o out.py myschema.xsd
Version 1.16c (3/13/2009)
- One more fix for abstract types -- When the implementation
element/class for an abstract class exports itself, it adds
the xsi:type="class_name" attribute.
- A minor fix to handling namespace prefix and the -a command
line option.
- Additional fixes so that in constructors (__init__), all
instance variables are initialized to None.
- Some fixes to quoting and escaping quotes when exporting
attribute values. Thanks to Kerim Mansour for help with this.
Version 1.16b (3/9/2009)
- Added support for restriction/list, i.e. a list of words
separated by whitespace.
Version 1.16a (2/16/2009)
- Generated export methods now check for empty content and
write out <xx ... /> rather than <xx ...></xx> if empty.
- All generated constructors (__init__()) now initialize
instance variables to None.
- Generated export methods now check for None before attempting
to write out attributes and children.
- More consistent use of direct access to instance variables
rather than calling getter methods with a class, that is
use of self.xxx rather than self.get_xxx().
Version 1.15d (1/22/2009)
- Fix to setup.py so that it also installs process_includes.py.
- Enhancements to process_includes.py so that it can also
retrieve included files via ftp and http.
- Fixes for default values for attributes.
- The above changes are all from Arne Grimstrup. Thank you Arne.
Version 1.15c (11/26/2008)
- Added switch (--silence) to cause generateDS.py to generate
parsing functions that do not write output to stdout. This fix
contributed by Al Niessner.
Version 1.15b (11/24/2008)
- Added Amnon Janiv's fixes for attribute groups and for logging.
Version 1.15a (11/20/2008)
Version 1.14g (10/17/2008)
- Fix in generation of exportChildren (omitted "_" in "namespace".
- Version 1.14f (10/06/2008)
- Minor fix related to simple types in generateBuildStandard_1().
- Version 1.14e (09/25/2008)
- Minor fix for generation of syntax error (missing parenthesis).
- Eliminated generation of specification of superclass
(superclass =) for undefined types.
- Fixed error setting value in SimpleElementDict.
- Fixed error when getting type for building attributes.
- Fixed and regularized exception reporting when building float
and integer values.
- Fixed error referring to simple types in build function.
- Version 1.14d (08/28/2008)
- Several fixes related to simple types.
- Version 1.14c (08/16/2008)
- One more namespace patch from Andre Adrian.
- A fix to generated export methods for valueOf from Oscar (Oeg
Bizz).
- First attempt to fix the name_type problem, specifically an
incorrect generation of the element name where it should
generate the type name and vice versa.
- Version 1.14b (06/17/2008):
- More namespace patches from Andre Adrian.
- Changed "lower()" to "str_lower()" in generated code so that
we have a less common name in generated code.
- Version 1.14a (06/03/2008):
- In generateBuildFn, the generated code formerly would skip the
children of a base class in an extension class if the
extension class has children of its own. This patch fixes
that problem. (The buildChildren call for the base class is
inside a "if hasChildren == 0" block.)
- The export functions formerly would output the attributes and
children of the derived classes before those of the base
class, where the XSL spec specifies that the base class
elements are earlier than derived elements in a sequence. This
patch corrects the generation order.
- This patch adds proper xs:boolean reading and writing to
generateDS. "true" and "false" values in the XML will become
True and False in Python, and will be written back out as
"true" and "false", respectively.
- Version 1.13a (05/26/2008):
- Added support for generating namespace prefix during export
if the XML Schema specifies the targetNamespace. Thanks to
Andre Adrian for implementing this feature.
- Version 1.12b (05/20/2008):
- Patches to escape special XML characters (entities) in valueOf
and attributes. Thanks to Darius Powell for this fix.
- Version 1.12a (05/06/2008):
- Fix to name used to generate validation method.
- Embedded process_includes.py functionality into generateDS.py.
- Version 1.11d (04/28/2008)
- Added support for specifying default values in attributes
and elements that are primitive types.
- Version 1.11c (03/31/2008)
- A fix in enumeration building code.
- Version 1.11b (11/19/2007)
- Fixed bug that caused an infinite loop when a class has a
simple type as a base/super class.
- Added additional simple types to the list of recognized simple
types. For a list of simple types, see:
http://www.w3.org/TR/xmlschema-0/#SimpleTypeFacets
- Added additional Python keywords to list of transformed names.
See global variable NameTable.
- Version 1.11a (10/11/2007)
-
- Version 1.10a (08/21/2007, again)
- Added xs:int basic type. Handle same as xs:integer.
- Generate tests so that for elements declared with
minOccurs="0" and maxOccurs="1" and empty value, then
export does not generate output.
- Version 1.10a (05/11/2007)
- Added support for user methods. See section "User Methods" in
the documentation.
- Version 1.9a (03/21/2007, again)
- Added process_includes.py which can be used as a pre-processor
to process include elements and create an XML Schema document
containing all included content.
- Modified generateDS.py so that it will read its input from a
pipe when given the command line argument "-" (dash).
- Version 1.9a (02/13/2007, again)
- Changed naming of getter and setter methods. Default is to
use get_var() and set_var() instead of getVar() and setVar().
The old behavior is available using the flag
--use-old-getter-setter.
- Version 1.9a (01/30/2007, again)
- Fix so that validator methods for simpleType are also
generated when the <xs:simpleType> occurs within an
<xs:element>.
- Version 1.9a (12/04/2006, again)
- Fixed errors (occuring on import of superclass module) when
an element is defined as an extension of an element that is
defined as a simpleType restriction on an xs:string.
- Version 1.9a (11/27/2006, again)
- Fix for elements that have attributes and no nested children.
Eliminated writing out new line chars in export methods.
- Version 1.9a (10/22/2006, again)
- Fix to capture text content of nodes defined with attributes
but with no nested elements into member varialbe valueOf_.
- Version 1.9a (10/10/2006)
- Added minimal support for simpleType.
- Generate stubs for and calls to validator methods for
simpleType.
- Retrieve bodies for validator methods for simpleTypes from
files in a directory specified with the --validator-bodies
command line flag.
- Version 1.8d (10/4/2006, again)
- Fixed several errors related to anyAttribute. It was
generating bad code if an element was defined with
anyAttribute but had no other attributes. And, in the same
situation, it was not generating export code properly.
- Version 1.8d (7/26/2006, again)
- Allowed dot/period as special character in element tags/names.
- Fixed several errors in generation of export and exportLiteral
functions. Special names (e.g. 'type', 'class') were not
being mapped to special spellings (e.g. 'ttype', 'klass', ).
- Fixed error in determining ExplicitDefine, which was
preventing export of some objects.
- Version 1.8d (7/19/2006, again)
- Added support for empty elements, i.e. elements that have no
children and no attributes. Formerly, they were ignored due
to a quirk in logic.
- Version 1.8d (4/13/2006)
- Added support for the following simple types: duration, anyURI
and unsignedShort. They are coerced to (and treated the same
as) xs:string, xs:string, and xs:integer, respectively
- Version 1.8c (12/22/2005, again)
- Fixed use of mapped names in generateExportLiteralFn().
- Version 1.8c (12/20/2005, again)
- Fix to generation of getters and setters for attributes.
Formerly generating accessors that handled lists of attribute
values.
- Version 1.8c (12/15/2005, again)
- Fix generated code so that it uses documentElement instead of
childNodes[0] to get the root element.
- Version 1.8c (5/10/2005, again)
- Patch for <xs:attribute ref="xxxx"/> -- Use the value of ref
as the name of the attribute. I'm not sure whether this is
correct in all situations.
- Fix for generation of ctor for mixed type elements. Before
this fix, generateDS.py was failing to generate the
initializers in the __init__ method signature.
- Fix for generation of "class" declaration for extension
classes whose base class name is qualified with a namespace
(e.g., <xs:extension base="iodef:TextAbstractType">). Removed
the namespace. This fix also corrected the order of
generation of classes so that the base class is now correctly
generated before the subclass.
- Version 1.8c (4/26/2005)
- Added support for several simple types: xs:token, xs:short,
xs:long, xs:positiveInteger, xs:negativeInteger,
xs:long, xs:nonPositiveInteger, xs:nonNegativeInteger,
xs:date.
- Fixed error produced when an element definition inherits from
a simple type.
- Version 1.8b (2/25/2005)
- Added support for anyAttribute.
- Version 1.8a (2/23/05, again)
- Fixed incorrect generation of name and type for export
functions for root element.
- Fixed reference to root element type when root element name
and type are different.
- Version 1.8a (1/13/05, again)
- Fixed incorrect handling of extension of in-line element
definition.
- Code cleanup in support of the above.
- Version 1.8a (12/22/04)
- Added support for attributeGroup. Enables an XML Schema to
define attribute groups and then include them in
element/complexType definition.
- Added support for substitutionGroup. Enables use any of a set
of element types as alternatives to another element type.
Limitation: Does not work with simple element types.
- Version 1.7b (11/15/04)
- From an XML Schema, it is not possible to determine the
outer-most element in instance documents. generateDS.py now
generates a parser (parseSelect) that first uses a small SAX
parser to determine the outer-most element in the input
document, then invokes the normal parser with that element as
the root.
Version 1.7a (10/28/04)
- Thanks very much to Lloyd Kvam for help with these fixes and
improvements. His ideas, suggestions, and work have been
extremely valuable.
- Implementd partial support for <xsd:extension base="">.
Limitation: extension elements cannot override members
defined in a base.
- Refactored generated methods export and build, so that they
can be called by subclasses.
- The generated method exportLiteral has been left behind during
recent work. Brought it up-to-date.
- For Python, a super-class must be defined before the
sub-classes that reference it. Implemented a delaying
mechanism that enforces this ordering of generation of classes.
- Fixed a bug that occurred when an element is defined with
maxOccurs given a value other than "1" or "unbounded".
Version 1.6d (10/1/04)
- Several bug fixes.
- Added command-line flag --subclass-suffix="X". Changes the
suffix appended to the class name in subclass files. Default
if omitted is "Sub".
- Added an underscore to certain local variables to avoid name
conflicts.
- Thanks to Lloyd Kvam for help with this release. Lloyd found
and fixed a number of these problems.
- Added command-line flag "--subclass-suffix", which specifies
the suffix to be added to class names in subclass files.
Default is "Sub".
- Added command-line flag "--root-element", which makes a
specified element name the assumed root of instance documents
- In some schemas, attributes on a nested <complexType> pertain
to the containing <element>. Added code to copy the
attributes from the <complexType> to the <element>, if it is
nested.
Version 1.6c (9/15/04)
- generateDS.py was not walking lower levels of the tree data
structure collected by the SAX parser that describes the
classes to be generated. Now, function generate() calls
function generateFromTree() to recursively walk lower levels
of this tree structure.
- Fixed various errors that were introduced or uncovered by the
above change.
- Strengthen handling of mixed content. When an element
definition (<element> or <complexType>) contains the attribute
"mixed=" with a true value, then we generate the code for text
content, e.g. getValue(), setValue(), capture value in
build(), etc.
Version 1.6b (9/10/04, yet again)
- Still fixing bug related to generating all the sub-class
stubs. All sub-classes were not being generated when no
superclasses were generated (-o flag omitted), because there
are data structures that are created when superclasses are
generated and which are needed during sub-class generation.
Now we always write out super-classes, but write them to a
temp file if they are not requested.
Version 1.6b (8/26/04, again)
- Fixed bug -- complexTypes defined in-line were omitted from the
sub-class file. Now these sub-classes are being generated.
Version 1.6b (8/18/04)
- Added ability to access the text content of elements that are
defined but have no nested elements. The member variable is
valueOf_ (note underscore which will hopefully avoid name
conflicts) and the getter and setter methods are getValueOf_
and setValueOf_.
- Fixes to generation of exportLiteral methods. Formerly,
export of attributes was omitted.
- Removed un-used function that contained "yield" statement,
which caused problems with older versions of Python.
- Version 1.6a (7/23/04, again)
- Added optional generation of new style classes with
properties. This is experimental and, admittedly, not very
useful, as the property functions are simple getters and
setters. Maybe someday ... Use the "-m" flag to see the
resulting code.
- Version 1.6a (7/9/04, again)
- Minor fixes. Replaced dashes in names used as attributes (see
cleanupName().
- Version 1.6a (7/6/04, again)
- For XMLBehaviors, implemented ability to retrieve
implementation bodies for behaviors and for ancillaries
(pre-conditions and post-conditions) from a Web address (URL).
- Version 1.6a (6/30/04)
- Added generation of behaviors. An XML document can be used to
specify behaviors (methods) to be added to generated sub-class
files, including DBC (design by contract) pre- and
post-condition tests. See generateDS.html for more
information on XMLBehaviors.
- Version 1.5b (6/20/04, again)
- Fixed handling namespace prefix in the XMLSchema file itself.
generateDS.py now attempts to pick-up the namespace prefix
(alias) from the "xmlns:" attribute on the "schema" element.
- Version 1.5b (5/7/04)
- Fixed several minor problems related to XML namespaces.
Namespace prefix ignored when creating Python names (e.g. of
classes and namespace prefix ignored during parsing. That's
about the best I know to do right now.
- Fixed problems in generating code for names containing dashes.
Now using underscore in place of dashes for Python names.
- Version 1.5a (3/24/04)
- Added keyword arguments to the generated factory functions.
- Added generation of method "exportLiteral" and related support
to export elements/instances to Python data structure
literals.
- Version 1.4c (3/10/04)
- Element <complexType> in XSchema file not handled correctly.
Fixed this so that when <complexType> is at top level, it will
be handled the same way that an <element> is handled. Note:
We still have problems with <complexType> elements that are
more deeply nested.
- Version 1.4c (3/8/04)
- Added ability to pass namespace abbreviation from the command
line. For example, the "-a" option enables you to replace
"xs:" with "xsd:".
- Version 1.4b (9/30/03, again)
- Removed dependence on PyXML. Will now import XML support from
PyXML, if it is available, but if not, imports from the
Python standard library.
- Version 1.4b (9/30/03)
- Fixed name conflict in factory function (added underscore).
- Added generation of saxParseString function (parse string, not
file/URL).
- Fixed error -- ome constructors not using factory.
- Version 1.4a (9/17/03)
- Added generation of a SAX parser.
- Version 1.3c (9/11/03)
- Fixed problem caused by shared content model, i.e. when a
field (content) is declared with a complex type and the name
and the type are different. The fix enabled the field name
and the type of the object in that field to be different.
- Version 1.3b (9/9/03)
- Fixed error when a separate xs:element declaration is used for
elements declared with a simple type.
- Version 1.3a (8/18/03)
- Removed YAML support.
- Fixed error in name generation in generateBuildFn().
- Various fixes and cleanup in tests/ and Demo/.
- Version 1.2a (again, 5/16/03)
Fixed error in code generation for boolean attributes.
Fixed error in code generation for float values.
Added very simple unit tests in tests directory. Can be run
with:
cd tests
python test.py
- Version 1.2a (3/14/03)
- Added support for XML Schema xs:double and xs:boolean types.
- Version 1.1a (8/13/02)
- Added ability to generate subclass stubs for user method
implementation.
- A bit of clean-up to the command line options.
- Version 1.0a (3/15/02)
-