Repository: tefra/xsdata
Pull request #484 (2021-05-07 16:54:42)

Release v20.5

sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=tefra_xsdata&pullRequest=484&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=tefra_xsdata&pullRequest=484&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=tefra_xsdata&pullRequest=484&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=tefra_xsdata&pullRequest=484) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=tefra_xsdata&pullRequest=484&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=tefra_xsdata&pullRequest=484&metric=new_duplicated_lines_density&view=list)


codecov[bot]: # [Codecov](https://codecov.io/gh/tefra/xsdata/pull/484?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou) Report
> Merging [#484](https://codecov.io/gh/tefra/xsdata/pull/484?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou) (2dab926) into [master](https://codecov.io/gh/tefra/xsdata/commit/33cdae2b8c20691f79fd707229483fb55029d9f5?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou) (33cdae2) will **not change** coverage.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/tefra/xsdata/pull/484/graphs/tree.svg?width=650&height=150&src=pr&token=YzDDLtywvl&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou)](https://codecov.io/gh/tefra/xsdata/pull/484?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou)

```diff
@@            Coverage Diff            @@
##            master      #484   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           83        83           
  Lines         7320      7322    +2     
  Branches      1315      1315           
=========================================
+ Hits          7320      7322    +2     
```


| [Impacted Files](https://codecov.io/gh/tefra/xsdata/pull/484?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou) | Coverage Δ | |
|---|---|---|
| [xsdata/utils/hooks.py](https://codecov.io/gh/tefra/xsdata/pull/484/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou#diff-eHNkYXRhL3V0aWxzL2hvb2tzLnB5) | `100.00% <100.00%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/tefra/xsdata/pull/484?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/tefra/xsdata/pull/484?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou). Last update [33cdae2...2dab926](https://codecov.io/gh/tefra/xsdata/pull/484?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Chris+Tsou).

sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=tefra_xsdata&pullRequest=484&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=tefra_xsdata&pullRequest=484&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=tefra_xsdata&pullRequest=484&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=tefra_xsdata&pullRequest=484) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=tefra_xsdata&pullRequest=484&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=tefra_xsdata&pullRequest=484&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=tefra_xsdata&pullRequest=484&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=tefra_xsdata&pullRequest=484&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=tefra_xsdata&pullRequest=484&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=tefra_xsdata&pullRequest=484&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=tefra_xsdata&pullRequest=484) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=tefra_xsdata&pullRequest=484&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=tefra_xsdata&pullRequest=484&metric=new_duplicated_lines_density&view=list)



Patch:
diff --git a/CHANGES.rst b/CHANGES.rst
index 6ea08848..2b097a5e 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,3 +1,20 @@
+21.5 (2021-05-07)
+-----------------
+- Added output structure style single-package `#469 <https://github.com/tefra/xsdata/issues/469>`_
+- Added support for marshalling array of objects for json `#448 <https://github.com/tefra/xsdata/issues/448>`_
+- Added support to generate code from raw json documents `#445 <https://github.com/tefra/xsdata/issues/445>`_
+- Added docstring style Blank to avoid generating them `#460 <https://github.com/tefra/xsdata/issues/460>`_
+- Added validations for non supported type hints
+- Added support for python 3.10
+- Generate package __all__ lists `#459 <https://github.com/tefra/xsdata/issues/459>`_
+- Generate factory for xs:list enumeration default values `#471 <https://github.com/tefra/xsdata/issues/471>`_
+- Avoid generating prohibited elements with maxOccurs==0 `#478 <https://github.com/tefra/xsdata/issues/478>`_
+- Avoid generating identical overriding fields `#466 <https://github.com/tefra/xsdata/issues/466>`_
+- Fixed flattening base classes if they are also subclasses `#473 <https://github.com/tefra/xsdata/issues/473>`_
+- Fixed unchecked class name conflict resolution `#457 <https://github.com/tefra/xsdata/issues/457>`_
+- Refactored context components to improve binding performance `#476 <https://github.com/tefra/xsdata/issues/476>`_
+
+
 21.4 (2021-04-02)
 -----------------
 - Split requirements to extras cli, soap and lxml `#419 <https://github.com/tefra/xsdata/issues/419>`_
diff --git a/README.rst b/README.rst
index a4b34458..8b1b84ae 100644
--- a/README.rst
+++ b/README.rst
@@ -27,11 +27,11 @@ Naive XML Bindings for python
 
 --------
 
-xsData is a complete XML and JSON data binding library for python allowing developers to
-access and documents as simple objects rather than using DOM.
+xsData is a complete data binding library for python allowing developers to access and
+use XML and JSON documents as simple objects rather than using DOM.
 
-It ships with a code generator for XML schemas, WSDL definitions and XML documents. It
-produces simple dataclasses with type hints and binding metadata.
+It ships with a code generator for XML schemas, WSDL definitions, XML & JSON documents.
+It produces simple dataclasses with type hints and simple binding metadata.
 
 The included XML and JSON parser/serializer are highly optimized and adaptable, with
 multiple handlers and configuration properties.
@@ -76,7 +76,7 @@ Features
 
   - XML Schemas 1.0 & 1.1
   - WSDL 1.1 definitions with SOAP 1.1 bindings
-  - Directly from XML Documents
+  - Directly from XML and JSON Documents
   - Extensive configuration to customize output
   - Pluggable code writer for custom output formats
 
@@ -96,18 +96,18 @@ Features
   - Customize behaviour through config
 
 
-Changelog: 21.4 (2021-04-02)
+Changelog: 21.5 (2021-05-07)
 ----------------------------
-- Split requirements to extras cli, soap and lxml `#419 <https://github.com/tefra/xsdata/issues/419>`_
-- Fixed parser conflict when an attribute and element field have the same qualified name
-- Added cli auto detection for source types, removed cli flag `--wsdl`
-- Added cli support to generate code from raw xml documents
-- Added cli entry point to allow pluggable output formats `#429 <https://github.com/tefra/xsdata/issues/429>`_
-- Added cli short flags for all options and flags
-- Added handler to set effective choice groups `#433 <https://github.com/tefra/xsdata/issues/433>`_
-- Moved plantUML output format to a standalone `plugin <https://github.com/tefra/xsdata-plantuml>`_
-- Updated xml parser to allow unions of primitive and class types
-- Updated XmlDateTime parser to catch invalid cases with extra leading zeros
-- Updated QName converter to validate uri/ncname when parsing string representations
-- Updated JsonParser to allow parsing from filename string
-- Updated cli option `--compound-fields` to a boolean flag
+- Added output structure style single-package `#469 <https://github.com/tefra/xsdata/issues/469>`_
+- Added support for marshalling array of objects for json `#448 <https://github.com/tefra/xsdata/issues/448>`_
+- Added support to generate code from raw json documents `#445 <https://github.com/tefra/xsdata/issues/445>`_
+- Added docstring style Blank to avoid generating them `#460 <https://github.com/tefra/xsdata/issues/460>`_
+- Added validations for non supported type hints
+- Added support for python 3.10
+- Generate package __all__ lists `#459 <https://github.com/tefra/xsdata/issues/459>`_
+- Generate factory for xs:list enumeration default values `#471 <https://github.com/tefra/xsdata/issues/471>`_
+- Avoid generating prohibited elements with maxOccurs==0 `#478 <https://github.com/tefra/xsdata/issues/478>`_
+- Avoid generating identical overriding fields `#466 <https://github.com/tefra/xsdata/issues/466>`_
+- Fixed flattening base classes if they are also subclasses `#473 <https://github.com/tefra/xsdata/issues/473>`_
+- Fixed unchecked class name conflict resolution `#457 <https://github.com/tefra/xsdata/issues/457>`_
+- Refactored context components to improve binding performance `#476 <https://github.com/tefra/xsdata/issues/476>`_
diff --git a/docs/api/xml-handlers.rst b/docs/api/xml-handlers.rst
index 4fb41892..b7d1cdb8 100644
--- a/docs/api/xml-handlers.rst
+++ b/docs/api/xml-handlers.rst
@@ -32,18 +32,18 @@ performance and features.
 
 .. code-block::
 
-    Name (time in ms)               Min                   Max                  Mean                Median
-    --------------------------------------------------------------------------------------------------------------
-    LxmlEventHandler-100         9.1831 (1.0)         10.0212 (1.0)          9.3678 (1.0)          9.3246 (1.0)
-    XmlEventHandler-100          9.3700 (1.02)        10.4110 (1.04)         9.5449 (1.02)         9.4944 (1.02)
-    LxmlSaxHandler-100          10.9592 (1.19)        12.4429 (1.24)        11.1885 (1.19)        11.0935 (1.19)
-    XmlSaxHandler-100           13.1215 (1.43)        14.0672 (1.40)        13.4060 (1.43)        13.3534 (1.43)
-    LxmlEventHandler-1000       91.5178 (9.97)        93.6739 (9.35)        92.3735 (9.86)        92.1866 (9.89)
-    XmlEventHandler-1000        92.7241 (10.10)       97.5819 (9.74)        94.0311 (10.04)       93.7171 (10.05)
-    LxmlSaxHandler-1000        106.6704 (11.62)      110.6747 (11.04)      108.3380 (11.56)      108.2407 (11.61)
-    XmlSaxHandler-1000         131.2831 (14.30)      133.0032 (13.27)      132.3303 (14.13)      132.4381 (14.20)
-    LxmlEventHandler-10000     926.6736 (100.91)     938.2561 (93.63)      931.3415 (99.42)      930.3376 (99.77)
-    XmlEventHandler-10000      936.2768 (101.96)     944.1380 (94.21)      939.8639 (100.33)     938.3422 (100.63)
-    LxmlSaxHandler-10000     1,096.1053 (119.36)   1,109.3193 (110.70)   1,103.2988 (117.78)   1,104.0933 (118.41)
-    XmlSaxHandler-10000      1,338.3855 (145.75)   1,350.9106 (134.81)   1,347.0401 (143.79)   1,348.2108 (144.59)
-    --------------------------------------------------------------------------------------------------------------
+    Name (time in ms)                 Min                   Max                  Mean                Median
+    ----------------------------------------------------------------------------------------------------------------
+    XmlEventHandler-100           15.5117 (1.0)         25.2867 (1.05)        18.1108 (1.03)        17.4573 (1.02)
+    LxmlEventHandler-100          16.1423 (1.04)        24.5722 (1.02)        17.5419 (1.0)         17.1829 (1.0)
+    LxmlSaxHandler-100            19.4828 (1.26)        24.5199 (1.02)        21.4798 (1.22)        21.4161 (1.25)
+    XmlSaxHandler-100             22.0499 (1.42)        24.0960 (1.0)         22.7615 (1.30)        22.7022 (1.32)
+    XmlEventHandler-1000         164.0717 (10.58)      174.3340 (7.23)       169.8387 (9.68)       170.5508 (9.93)
+    LxmlEventHandler-1000        171.7118 (11.07)      183.6858 (7.62)       177.2971 (10.11)      177.2766 (10.32)
+    LxmlSaxHandler-1000          201.8185 (13.01)      214.4356 (8.90)       208.1227 (11.86)      208.3414 (12.12)
+    XmlSaxHandler-1000           223.9293 (14.44)      241.8015 (10.03)      234.8391 (13.39)      237.8538 (13.84)
+    XmlEventHandler-10000      1,687.5738 (108.79)   1,717.7587 (71.29)    1,702.0942 (97.03)    1,704.4335 (99.19)
+    LxmlEventHandler-10000     1,720.5759 (110.92)   1,763.5875 (73.19)    1,740.5879 (99.22)    1,738.3820 (101.17)
+    LxmlSaxHandler-10000       2,105.8143 (135.76)   2,178.7946 (90.42)    2,143.9545 (122.22)   2,141.1028 (124.61)
+    XmlSaxHandler-10000        2,321.4368 (149.66)   2,430.4984 (100.87)   2,370.5923 (135.14)   2,373.6413 (138.14)
+    ----------------------------------------------------------------------------------------------------------------
diff --git a/docs/api/xml-writers.rst b/docs/api/xml-writers.rst
index 24adbeb2..24848856 100644
--- a/docs/api/xml-writers.rst
+++ b/docs/api/xml-writers.rst
@@ -31,11 +31,11 @@ exceptions when handling mixed content with ``pretty_print=True``.
 .. code-block::
 
     Name (time in ms)                Min                   Max                  Mean                Median
-    ------------------------------------------------------------------------------------------------------------
-    LxmlEventWriter-100          12.3876 (1.0)         14.0231 (1.02)        12.7359 (1.00)        12.6545 (1.00)
-    XmlEventWriter-100           12.4709 (1.01)        13.7136 (1.0)         12.7122 (1.0)         12.6516 (1.0)
-    LxmlEventWriter-1000        121.3230 (9.79)       127.0393 (9.26)       123.3760 (9.71)       122.5806 (9.69)
-    XmlEventWriter-1000         122.6532 (9.90)       125.3476 (9.14)       124.2966 (9.78)       124.6594 (9.85)
-    LxmlEventWriter-10000     1,223.8570 (98.80)    1,234.0158 (89.98)    1,230.9853 (96.84)    1,232.9678 (97.46)
-    XmlEventWriter-10000      1,228.0192 (99.13)    1,235.6687 (90.11)    1,232.3008 (96.94)    1,233.0478 (97.46)
+    --------------------------------------------------------------------------------------------------------------
+    LxmlEventWriter-100          19.5958 (1.0)         44.7400 (1.0)         21.9167 (1.0)         20.8375 (1.0)
+    XmlEventWriter-100           20.0230 (1.02)        60.4467 (1.35)        23.9251 (1.09)        22.2102 (1.07)
+    XmlEventWriter-1000         202.7945 (10.35)      219.1466 (4.90)       207.3766 (9.46)       204.9455 (9.84)
+    LxmlEventWriter-1000        208.1190 (10.62)      238.5222 (5.33)       218.3315 (9.96)       210.8077 (10.12)
+    LxmlEventWriter-10000     1,982.3172 (101.16)   2,075.0310 (46.38)    2,039.1569 (93.04)    2,038.3305 (97.82)
+    XmlEventWriter-10000      2,041.9899 (104.21)   2,123.2829 (47.46)    2,073.9406 (94.63)    2,069.6950 (99.33)
     --------------------------------------------------------------------------------------------------------------
diff --git a/docs/examples/w3c-suite.rst b/docs/examples/w3c-suite.rst
index bed41ea1..9ad28eba 100644
--- a/docs/examples/w3c-suite.rst
+++ b/docs/examples/w3c-suite.rst
@@ -16,17 +16,8 @@ XML and JSON Binding.
     At least until I can manage to reduce the total run time which is about 8 minutes
     without coverage.
 
-
-XSD Results: **10** failed, **14576** passed, **89** skipped, **16** warnings
-
-XML Results: **3** failed, **14582** passed, **90** skipped, **15** warnings
-
-JSON Results: **113** failed, **14562** passed, **1** warnings
-
-
 ✨✨✨✨
 
-
 .. hint::
 
     The `xmlschema <https://pypi.org/project/xmlschema/>`_ is used to validate xml
diff --git a/setup.cfg b/setup.cfg
index bc0f63cb..ed2e3121 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
 [metadata]
 name = xsdata
-version = 21.4
+version = 21.5
 description = Python XML Binding
 long_description = file: README.rst
 long_description_content_type = text/x-rst
diff --git a/xsdata/cli.py b/xsdata/cli.py
index 27e67355..a8426fee 100644
--- a/xsdata/cli.py
+++ b/xsdata/cli.py
@@ -184,6 +184,9 @@ def generate(**kwargs: Any):
 
     if kwargs["ns_struct"]:
         config.output.structure = StructureStyle.NAMESPACES
+        logger.warning(
+            "--ns-struct is deprecated switch to '--structure-style namespaces'"
+        )
     elif kwargs["structure_style"] != StructureStyle.FILENAMES.value:
         config.output.structure = StructureStyle(kwargs["structure_style"])
 
diff --git a/xsdata/utils/hooks.py b/xsdata/utils/hooks.py
index 12041270..e1e16754 100644
--- a/xsdata/utils/hooks.py
+++ b/xsdata/utils/hooks.py
@@ -7,7 +7,12 @@ else:
 
 
 def load_entry_points(name: str):
-    eps = importlib_metadata.entry_points()
-    if name in eps:
-        for ep in eps[name]:
-            ep.load()
+    entry_points = importlib_metadata.entry_points()
+
+    if hasattr(entry_points, "select"):
+        plugins = entry_points.select(group=name)  # type: ignore
+    else:
+        plugins = entry_points.get(name, [])
+
+    for plugin in plugins:
+        plugin.load()


Test patch:
diff --git a/tests/utils/test_hooks.py b/tests/utils/test_hooks.py
index ba1712f5..8167e67d 100644
--- a/tests/utils/test_hooks.py
+++ b/tests/utils/test_hooks.py
@@ -6,7 +6,7 @@ from xsdata.utils.hooks import load_entry_points
 
 class HooksTests(TestCase):
     @mock.patch("xsdata.utils.hooks.importlib_metadata.entry_points")
-    def test_load_entry_points(self, mock_entry_points):
+    def test_load_entry_points_with_mapping_api(self, mock_entry_points):
         first_ep = mock.Mock()
         second_ep = mock.Mock()
         third_ep = mock.Mock()
@@ -21,5 +21,16 @@ class HooksTests(TestCase):
         second_ep.load.assert_called_once_with()
         self.assertEqual(0, third_ep.load.call_count)
 
-        load_entry_points("bar")
-        third_ep.load.assert_called_once_with()
+    @mock.patch("xsdata.utils.hooks.importlib_metadata.entry_points")
+    def test_load_entry_points_with_select_api(self, mock_entry_points):
+        first_ep = mock.Mock()
+        second_ep = mock.Mock()
+
+        entry_points = mock.Mock()
+        entry_points.select.return_value = [first_ep, second_ep]
+        mock_entry_points.return_value = entry_points
+
+        load_entry_points("foo")
+        first_ep.load.assert_called_once_with()
+        second_ep.load.assert_called_once_with()
+        entry_points.select.assert_called_once_with(group="foo")