ddi-l 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. ddi_l-0.1.0/CHANGELOG.md +9 -0
  2. ddi_l-0.1.0/CITATION.cff +25 -0
  3. ddi_l-0.1.0/CODE_OF_CONDUCT.md +63 -0
  4. ddi_l-0.1.0/CONTRIBUTING.md +129 -0
  5. ddi_l-0.1.0/LICENSE +21 -0
  6. ddi_l-0.1.0/Makefile +18 -0
  7. ddi_l-0.1.0/PKG-INFO +269 -0
  8. ddi_l-0.1.0/README.md +226 -0
  9. ddi_l-0.1.0/SECURITY.md +68 -0
  10. ddi_l-0.1.0/codegen/COVERAGE_AUDIT.md +266 -0
  11. ddi_l-0.1.0/codegen/__init__.py +1 -0
  12. ddi_l-0.1.0/codegen/compare_models.py +377 -0
  13. ddi_l-0.1.0/codegen/coverage_audit.py +340 -0
  14. ddi_l-0.1.0/codegen/generate_model_bases.py +578 -0
  15. ddi_l-0.1.0/codegen/xsd_introspect.py +466 -0
  16. ddi_l-0.1.0/pyproject.toml +223 -0
  17. ddi_l-0.1.0/scripts/check_clean_install.py +88 -0
  18. ddi_l-0.1.0/scripts/check_distributions.py +167 -0
  19. ddi_l-0.1.0/src/ddi_l/__init__.py +188 -0
  20. ddi_l-0.1.0/src/ddi_l/_document_maintainables.py +256 -0
  21. ddi_l-0.1.0/src/ddi_l/_document_mixins.py +726 -0
  22. ddi_l-0.1.0/src/ddi_l/_document_namespaces.py +50 -0
  23. ddi_l-0.1.0/src/ddi_l/_etree.py +530 -0
  24. ddi_l-0.1.0/src/ddi_l/_etree.pyi +61 -0
  25. ddi_l-0.1.0/src/ddi_l/_schema_versions.py +145 -0
  26. ddi_l-0.1.0/src/ddi_l/cli.py +1573 -0
  27. ddi_l-0.1.0/src/ddi_l/constants.py +170 -0
  28. ddi_l-0.1.0/src/ddi_l/document.py +3079 -0
  29. ddi_l-0.1.0/src/ddi_l/examples/Quality_of_Life.xml +17915 -0
  30. ddi_l-0.1.0/src/ddi_l/examples/__init__.py +1 -0
  31. ddi_l-0.1.0/src/ddi_l/examples/build_and_validate.py +939 -0
  32. ddi_l-0.1.0/src/ddi_l/examples/example_fragment.xml +186 -0
  33. ddi_l-0.1.0/src/ddi_l/examples/example_instance.xml +944 -0
  34. ddi_l-0.1.0/src/ddi_l/examples/tests/__init__.py +0 -0
  35. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/__init__.py +1 -0
  36. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/golden/example_instance.canonical.xml +583 -0
  37. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/golden/minimal_instance.canonical.xml +10 -0
  38. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/golden/quality_of_life_instance.canonical.xml +351 -0
  39. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/instances/example_instance.xml +584 -0
  40. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/instances/quality_of_life_instance.xml +351 -0
  41. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/invalid_instance_3_1_missing_id.xml +6 -0
  42. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/invalid_instance_3_2_missing_id.xml +6 -0
  43. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/invalid_instance_missing_id.xml +6 -0
  44. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/malformed_instance.xml +2 -0
  45. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/minimal_fragment.xml +31 -0
  46. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/minimal_instance.xml +13 -0
  47. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/minimal_instance_3_1.xml +13 -0
  48. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/minimal_instance_3_2.xml +13 -0
  49. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/archive_minimal.golden.xml +5 -0
  50. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/archive_minimal.xml +5 -0
  51. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/archive_with_specific.golden.xml +21 -0
  52. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/archive_with_specific.xml +21 -0
  53. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/category_representative.golden.xml +19 -0
  54. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/category_representative.xml +19 -0
  55. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/classification_family_nested.golden.xml +73 -0
  56. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/classification_family_nested.xml +72 -0
  57. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/classification_item_nested.golden.xml +56 -0
  58. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/classification_item_nested.xml +52 -0
  59. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/classification_scheme_deep.golden.xml +113 -0
  60. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/classification_scheme_deep.xml +108 -0
  61. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/classification_series_with_scheme.golden.xml +61 -0
  62. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/classification_series_with_scheme.xml +57 -0
  63. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/code_list_full.golden.xml +35 -0
  64. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/code_list_full.xml +35 -0
  65. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/code_list_minimal.golden.xml +5 -0
  66. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/code_list_minimal.xml +5 -0
  67. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/collection_activity_administrative.golden.xml +30 -0
  68. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/collection_activity_administrative.xml +30 -0
  69. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/collection_activity_sensor.golden.xml +30 -0
  70. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/collection_activity_sensor.xml +30 -0
  71. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/collection_event_minimal.golden.xml +8 -0
  72. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/collection_event_minimal.xml +8 -0
  73. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/comparison_full.golden.xml +8 -0
  74. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/comparison_full.xml +8 -0
  75. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/comparison_minimal.golden.xml +5 -0
  76. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/comparison_minimal.xml +5 -0
  77. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/comparison_multi_name.golden.xml +14 -0
  78. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/comparison_multi_name.xml +14 -0
  79. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/comparison_with_maps.golden.xml +247 -0
  80. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/comparison_with_maps.xml +247 -0
  81. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/computation_item_full.golden.xml +25 -0
  82. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/computation_item_full.xml +25 -0
  83. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/concept_full.golden.xml +8 -0
  84. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/concept_full.xml +8 -0
  85. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/concept_map_with_items.golden.xml +99 -0
  86. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/concept_map_with_items.xml +99 -0
  87. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/concept_minimal.golden.xml +5 -0
  88. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/concept_minimal.xml +5 -0
  89. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_component_full.golden.xml +98 -0
  90. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_component_full.xml +98 -0
  91. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_component_minimal.golden.xml +5 -0
  92. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_component_minimal.xml +5 -0
  93. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_component_representative.golden.xml +110 -0
  94. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_component_representative.xml +110 -0
  95. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_variable_full.golden.xml +42 -0
  96. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_variable_full.xml +42 -0
  97. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_variable_minimal.golden.xml +5 -0
  98. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_variable_minimal.xml +5 -0
  99. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_variable_representative.golden.xml +42 -0
  100. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/conceptual_variable_representative.xml +42 -0
  101. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_capture_development_minimal.golden.xml +32 -0
  102. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_capture_development_minimal.xml +32 -0
  103. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_capture_method_administrative.golden.xml +37 -0
  104. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_capture_method_administrative.xml +37 -0
  105. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_capture_method_sensor.golden.xml +37 -0
  106. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_capture_method_sensor.xml +37 -0
  107. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_collection_full.golden.xml +33 -0
  108. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_collection_full.xml +33 -0
  109. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_collection_minimal.golden.xml +12 -0
  110. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_collection_minimal.xml +12 -0
  111. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_collection_questionnaire.golden.xml +259 -0
  112. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_collection_questionnaire.xml +260 -0
  113. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_collection_with_extra.golden.xml +13 -0
  114. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/data_collection_with_extra.xml +13 -0
  115. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/general_instruction_minimal.golden.xml +20 -0
  116. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/general_instruction_minimal.xml +19 -0
  117. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/generation_instruction_minimal.golden.xml +26 -0
  118. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/generation_instruction_minimal.xml +24 -0
  119. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/group_minimal.golden.xml +33 -0
  120. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/group_minimal.xml +33 -0
  121. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/if_then_else_full.golden.xml +50 -0
  122. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/if_then_else_full.xml +50 -0
  123. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/information_classification_full.golden.xml +41 -0
  124. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/information_classification_full.xml +41 -0
  125. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/information_classification_minimal.golden.xml +5 -0
  126. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/information_classification_minimal.xml +5 -0
  127. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/instruction_group_with_reference.golden.xml +15 -0
  128. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/instruction_group_with_reference.xml +15 -0
  129. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/instruction_with_texts.golden.xml +18 -0
  130. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/instruction_with_texts.xml +18 -0
  131. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/instrument_full.golden.xml +8 -0
  132. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/instrument_full.xml +8 -0
  133. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/instrument_minimal.golden.xml +5 -0
  134. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/instrument_minimal.xml +5 -0
  135. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/interviewer_instruction_scheme_nested.golden.xml +65 -0
  136. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/interviewer_instruction_scheme_nested.xml +65 -0
  137. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/logical_product_full.golden.xml +72 -0
  138. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/logical_product_full.xml +72 -0
  139. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/logical_product_minimal.golden.xml +12 -0
  140. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/logical_product_minimal.xml +12 -0
  141. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/managed_missing_values_representation_full.golden.xml +56 -0
  142. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/managed_missing_values_representation_full.xml +56 -0
  143. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/managed_missing_values_representation_minimal.golden.xml +5 -0
  144. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/managed_missing_values_representation_minimal.xml +5 -0
  145. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/methodology_item_sampling.golden.xml +16 -0
  146. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/methodology_item_sampling.xml +15 -0
  147. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/methodology_nested.golden.xml +1 -0
  148. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/methodology_nested.xml +67 -0
  149. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/methodology_scheme_with_items.golden.xml +1 -0
  150. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/methodology_scheme_with_items.xml +34 -0
  151. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/observation_plan_administrative.golden.xml +31 -0
  152. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/observation_plan_administrative.xml +31 -0
  153. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/observation_plan_sensor.golden.xml +31 -0
  154. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/observation_plan_sensor.xml +31 -0
  155. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/organization_minimal.golden.xml +22 -0
  156. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/organization_minimal.xml +22 -0
  157. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_instance_group_full.golden.xml +46 -0
  158. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_instance_group_full.xml +46 -0
  159. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_instance_group_minimal.golden.xml +5 -0
  160. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_instance_group_minimal.xml +5 -0
  161. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_instance_minimal.golden.xml +23 -0
  162. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_instance_minimal.xml +23 -0
  163. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_structure_full.golden.xml +14 -0
  164. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_structure_full.xml +14 -0
  165. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_structure_minimal.golden.xml +5 -0
  166. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/physical_structure_minimal.xml +5 -0
  167. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_control_minimal.golden.xml +15 -0
  168. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_control_minimal.xml +15 -0
  169. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_control_scheme_minimal.golden.xml +30 -0
  170. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_control_scheme_minimal.xml +30 -0
  171. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_method_scheme_minimal.golden.xml +30 -0
  172. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_method_scheme_minimal.xml +30 -0
  173. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_method_with_command.golden.xml +18 -0
  174. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_method_with_command.xml +18 -0
  175. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_scheme_with_processes.golden.xml +30 -0
  176. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_scheme_with_processes.xml +30 -0
  177. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_step_scheme_minimal.golden.xml +30 -0
  178. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_step_scheme_minimal.xml +30 -0
  179. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_step_with_components.golden.xml +45 -0
  180. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_step_with_components.xml +45 -0
  181. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_with_inline_components.golden.xml +60 -0
  182. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/process_with_inline_components.xml +60 -0
  183. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/processing_event_scheme_with_groups.golden.xml +133 -0
  184. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/processing_event_scheme_with_groups.xml +133 -0
  185. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/processing_event_with_operations.golden.xml +68 -0
  186. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/processing_event_with_operations.xml +68 -0
  187. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/processing_instruction_group_minimal.golden.xml +30 -0
  188. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/processing_instruction_group_minimal.xml +27 -0
  189. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/processing_instruction_scheme_minimal.golden.xml +58 -0
  190. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/processing_instruction_scheme_minimal.xml +54 -0
  191. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_scheme_minimal.golden.xml +52 -0
  192. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_scheme_minimal.xml +48 -0
  193. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_scheme_nested.golden.xml +122 -0
  194. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_scheme_nested.xml +122 -0
  195. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_standard_enriched.golden.xml +44 -0
  196. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_standard_enriched.xml +44 -0
  197. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_standard_group_enriched.golden.xml +47 -0
  198. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_standard_group_enriched.xml +47 -0
  199. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_standard_group_minimal.golden.xml +16 -0
  200. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_standard_group_minimal.xml +15 -0
  201. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_standard_minimal.golden.xml +27 -0
  202. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_standard_minimal.xml +27 -0
  203. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_enriched.golden.xml +38 -0
  204. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_enriched.xml +38 -0
  205. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_group_enriched.golden.xml +57 -0
  206. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_group_enriched.xml +57 -0
  207. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_group_minimal.golden.xml +23 -0
  208. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_group_minimal.xml +21 -0
  209. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_minimal.golden.xml +23 -0
  210. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_minimal.xml +22 -0
  211. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_with_other_statement.golden.xml +14 -0
  212. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/quality_statement_with_other_statement.xml +14 -0
  213. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_block_with_references.golden.xml +39 -0
  214. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_block_with_references.xml +39 -0
  215. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_construct_full.golden.xml +36 -0
  216. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_construct_full.xml +36 -0
  217. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_grid_with_dimension.golden.xml +71 -0
  218. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_grid_with_dimension.xml +71 -0
  219. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_group_with_references.golden.xml +22 -0
  220. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_group_with_references.xml +22 -0
  221. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_item_full.golden.xml +10 -0
  222. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_item_full.xml +10 -0
  223. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_item_minimal.golden.xml +5 -0
  224. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_item_minimal.xml +5 -0
  225. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_map_with_correspondence.golden.xml +55 -0
  226. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_map_with_correspondence.xml +55 -0
  227. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_scheme_with_fragments.golden.xml +178 -0
  228. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/question_scheme_with_fragments.xml +178 -0
  229. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/regenerate.py +1977 -0
  230. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/represented_variable_with_code.golden.xml +32 -0
  231. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/represented_variable_with_code.xml +32 -0
  232. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/resource_package_minimal.golden.xml +16 -0
  233. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/resource_package_minimal.xml +16 -0
  234. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/review_event_minimal.golden.xml +9 -0
  235. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/review_event_minimal.xml +9 -0
  236. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/sampling_information_group_minimal.golden.xml +30 -0
  237. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/sampling_information_group_minimal.xml +30 -0
  238. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/sampling_information_scheme_minimal.golden.xml +77 -0
  239. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/sampling_information_scheme_minimal.xml +77 -0
  240. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/sampling_plan_minimal.golden.xml +20 -0
  241. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/sampling_plan_minimal.xml +20 -0
  242. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/sequence_minimal.golden.xml +23 -0
  243. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/sequence_minimal.xml +23 -0
  244. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/statement_item_full.golden.xml +13 -0
  245. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/statement_item_full.xml +13 -0
  246. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_minimal.golden.xml +12 -0
  247. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_minimal.xml +12 -0
  248. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_nonsurvey_admin.golden.xml +1 -0
  249. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_nonsurvey_admin.xml +158 -0
  250. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_nonsurvey_sensor.golden.xml +1 -0
  251. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_nonsurvey_sensor.xml +152 -0
  252. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_with_conceptual_component.golden.xml +110 -0
  253. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_with_conceptual_component.xml +110 -0
  254. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_with_conceptual_component_expected.xml +36 -0
  255. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_with_inline_modules.golden.xml +176 -0
  256. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/study_unit_with_inline_modules.xml +176 -0
  257. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/unit_type_full.golden.xml +18 -0
  258. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/unit_type_full.xml +18 -0
  259. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/unit_type_minimal.golden.xml +12 -0
  260. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/unit_type_minimal.xml +12 -0
  261. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/unit_type_representative.golden.xml +18 -0
  262. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/unit_type_representative.xml +18 -0
  263. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/universe_full.golden.xml +8 -0
  264. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/universe_full.xml +8 -0
  265. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/universe_minimal.golden.xml +5 -0
  266. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/universe_minimal.xml +5 -0
  267. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_enriched.golden.xml +109 -0
  268. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_enriched.xml +109 -0
  269. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_full.golden.xml +22 -0
  270. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_full.xml +22 -0
  271. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_group_minimal.golden.xml +19 -0
  272. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_group_minimal.xml +19 -0
  273. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_map_with_items.golden.xml +71 -0
  274. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_map_with_items.xml +71 -0
  275. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_minimal.golden.xml +5 -0
  276. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/variable_minimal.xml +5 -0
  277. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/weighting_full.golden.xml +56 -0
  278. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/weighting_full.xml +56 -0
  279. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/weighting_methodology_full.golden.xml +9 -0
  280. ddi_l-0.1.0/src/ddi_l/examples/tests/fixtures/models/weighting_methodology_full.xml +9 -0
  281. ddi_l-0.1.0/src/ddi_l/examples/use_cases/load_instance.py +53 -0
  282. ddi_l-0.1.0/src/ddi_l/examples/use_cases/validate_instance.py +51 -0
  283. ddi_l-0.1.0/src/ddi_l/examples/use_cases/write_instance.py +51 -0
  284. ddi_l-0.1.0/src/ddi_l/exceptions.py +581 -0
  285. ddi_l-0.1.0/src/ddi_l/index.py +759 -0
  286. ddi_l-0.1.0/src/ddi_l/io.py +687 -0
  287. ddi_l-0.1.0/src/ddi_l/jsonld.py +239 -0
  288. ddi_l-0.1.0/src/ddi_l/lint.py +667 -0
  289. ddi_l-0.1.0/src/ddi_l/maintainable_registry.py +232 -0
  290. ddi_l-0.1.0/src/ddi_l/models/__init__.py +286 -0
  291. ddi_l-0.1.0/src/ddi_l/models/_generated/__init__.py +5 -0
  292. ddi_l-0.1.0/src/ddi_l/models/_generated/archive.py +1175 -0
  293. ddi_l-0.1.0/src/ddi_l/models/_generated/comparative.py +347 -0
  294. ddi_l-0.1.0/src/ddi_l/models/_generated/conceptualcomponent.py +1185 -0
  295. ddi_l-0.1.0/src/ddi_l/models/_generated/datacollection.py +6510 -0
  296. ddi_l-0.1.0/src/ddi_l/models/_generated/dataset.py +195 -0
  297. ddi_l-0.1.0/src/ddi_l/models/_generated/ddiprofile.py +148 -0
  298. ddi_l-0.1.0/src/ddi_l/models/_generated/fixed_attributes.py +516 -0
  299. ddi_l-0.1.0/src/ddi_l/models/_generated/group.py +691 -0
  300. ddi_l-0.1.0/src/ddi_l/models/_generated/instance.py +627 -0
  301. ddi_l-0.1.0/src/ddi_l/models/_generated/label_slots.py +222 -0
  302. ddi_l-0.1.0/src/ddi_l/models/_generated/logicalproduct.py +2513 -0
  303. ddi_l-0.1.0/src/ddi_l/models/_generated/physicaldataproduct.py +701 -0
  304. ddi_l-0.1.0/src/ddi_l/models/_generated/physicaldataproduct_ncube_inline.py +196 -0
  305. ddi_l-0.1.0/src/ddi_l/models/_generated/physicaldataproduct_ncube_normal.py +205 -0
  306. ddi_l-0.1.0/src/ddi_l/models/_generated/physicaldataproduct_ncube_tabular.py +268 -0
  307. ddi_l-0.1.0/src/ddi_l/models/_generated/physicaldataproduct_proprietary.py +206 -0
  308. ddi_l-0.1.0/src/ddi_l/models/_generated/physicalinstance.py +602 -0
  309. ddi_l-0.1.0/src/ddi_l/models/_generated/reusable.py +5116 -0
  310. ddi_l-0.1.0/src/ddi_l/models/_generated/studyunit.py +196 -0
  311. ddi_l-0.1.0/src/ddi_l/models/archive.py +75 -0
  312. ddi_l-0.1.0/src/ddi_l/models/base.py +2287 -0
  313. ddi_l-0.1.0/src/ddi_l/models/classification.py +171 -0
  314. ddi_l-0.1.0/src/ddi_l/models/comparison.py +295 -0
  315. ddi_l-0.1.0/src/ddi_l/models/concept.py +50 -0
  316. ddi_l-0.1.0/src/ddi_l/models/conceptualcomponent.py +294 -0
  317. ddi_l-0.1.0/src/ddi_l/models/datacollection/__init__.py +117 -0
  318. ddi_l-0.1.0/src/ddi_l/models/datacollection/_monolith.py +3579 -0
  319. ddi_l-0.1.0/src/ddi_l/models/dataset.py +224 -0
  320. ddi_l-0.1.0/src/ddi_l/models/dissemination.py +808 -0
  321. ddi_l-0.1.0/src/ddi_l/models/group.py +41 -0
  322. ddi_l-0.1.0/src/ddi_l/models/instance.py +87 -0
  323. ddi_l-0.1.0/src/ddi_l/models/logicalproduct.py +2100 -0
  324. ddi_l-0.1.0/src/ddi_l/models/methodology.py +538 -0
  325. ddi_l-0.1.0/src/ddi_l/models/physical.py +233 -0
  326. ddi_l-0.1.0/src/ddi_l/models/process.py +602 -0
  327. ddi_l-0.1.0/src/ddi_l/models/profile.py +68 -0
  328. ddi_l-0.1.0/src/ddi_l/models/quality.py +87 -0
  329. ddi_l-0.1.0/src/ddi_l/models/reusable.py +267 -0
  330. ddi_l-0.1.0/src/ddi_l/models/study.py +810 -0
  331. ddi_l-0.1.0/src/ddi_l/namespace_utils.py +263 -0
  332. ddi_l-0.1.0/src/ddi_l/namespaces.py +249 -0
  333. ddi_l-0.1.0/src/ddi_l/operations.py +244 -0
  334. ddi_l-0.1.0/src/ddi_l/py.typed +0 -0
  335. ddi_l-0.1.0/src/ddi_l/registry/__init__.py +175 -0
  336. ddi_l-0.1.0/src/ddi_l/schema_loader/__init__.py +91 -0
  337. ddi_l-0.1.0/src/ddi_l/schema_loader/_cache.py +85 -0
  338. ddi_l-0.1.0/src/ddi_l/schema_loader/_compat.py +110 -0
  339. ddi_l-0.1.0/src/ddi_l/schema_loader/_constants.py +66 -0
  340. ddi_l-0.1.0/src/ddi_l/schema_loader/_conversion.py +838 -0
  341. ddi_l-0.1.0/src/ddi_l/schema_loader/_conversion_runtime.py +126 -0
  342. ddi_l-0.1.0/src/ddi_l/schema_loader/_fallback.py +137 -0
  343. ddi_l-0.1.0/src/ddi_l/schema_loader/_libxml2.py +80 -0
  344. ddi_l-0.1.0/src/ddi_l/schema_loader/_namespaces.py +240 -0
  345. ddi_l-0.1.0/src/ddi_l/schema_loader/_preflight.py +54 -0
  346. ddi_l-0.1.0/src/ddi_l/schema_loader/_validation.py +757 -0
  347. ddi_l-0.1.0/src/ddi_l/schema_loader/_versions.py +127 -0
  348. ddi_l-0.1.0/src/ddi_l/schema_sync.py +208 -0
  349. ddi_l-0.1.0/src/ddi_l/schemas/README.md +38 -0
  350. ddi_l-0.1.0/src/ddi_l/schemas/__init__.py +1 -0
  351. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-attribs-1.xsd +82 -0
  352. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-bdo-1.xsd +85 -0
  353. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-blkphras-1.xsd +206 -0
  354. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-blkpres-1.xsd +42 -0
  355. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-blkstruct-1.xsd +57 -0
  356. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-charent-1.xsd +41 -0
  357. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-datatypes-1.xsd +147 -0
  358. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-framework-1.xsd +74 -0
  359. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-hypertext-1.xsd +51 -0
  360. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-inlphras-1.xsd +220 -0
  361. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-inlpres-1.xsd +56 -0
  362. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-inlstruct-1.xsd +60 -0
  363. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-inlstyle-1.xsd +27 -0
  364. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-lat1.ent +121 -0
  365. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-list-1.xsd +128 -0
  366. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-notations-1.xsd +105 -0
  367. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-pres-1.xsd +53 -0
  368. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-special.ent +82 -0
  369. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-symbol.ent +204 -0
  370. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-table-1.xsd +323 -0
  371. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/XHTML/xhtml-text-1.xsd +70 -0
  372. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/archive.xsd +1797 -0
  373. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/comparative.xsd +570 -0
  374. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/conceptualcomponent.xsd +1517 -0
  375. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/datacollection.xsd +7300 -0
  376. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/dataset.xsd +243 -0
  377. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/dc.xsd +119 -0
  378. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/dcmitype.xsd +53 -0
  379. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/dcterms.xsd +383 -0
  380. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/ddi-xhtml11-model-1.xsd +462 -0
  381. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/ddi-xhtml11-modules-1.xsd +537 -0
  382. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/ddi-xhtml11.xsd +83 -0
  383. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/ddiprofile.xsd +227 -0
  384. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/group.xsd +1403 -0
  385. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/instance_3_1.xsd +406 -0
  386. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/logicalproduct.xsd +3488 -0
  387. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/physicaldataproduct.xsd +813 -0
  388. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/physicaldataproduct_ncube_inline.xsd +221 -0
  389. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/physicaldataproduct_ncube_normal.xsd +237 -0
  390. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/physicaldataproduct_ncube_tabular.xsd +283 -0
  391. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/physicaldataproduct_proprietary.xsd +237 -0
  392. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/physicalinstance.xsd +833 -0
  393. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/reusable.xsd +8337 -0
  394. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/studyunit.xsd +325 -0
  395. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_1/xml.xsd +76 -0
  396. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-attribs-1.xsd +82 -0
  397. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-bdo-1.xsd +85 -0
  398. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-blkphras-1.xsd +206 -0
  399. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-blkpres-1.xsd +42 -0
  400. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-blkstruct-1.xsd +57 -0
  401. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-charent-1.xsd +41 -0
  402. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-datatypes-1.xsd +147 -0
  403. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-framework-1.xsd +74 -0
  404. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-hypertext-1.xsd +51 -0
  405. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-inlphras-1.xsd +220 -0
  406. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-inlpres-1.xsd +56 -0
  407. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-inlstruct-1.xsd +60 -0
  408. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-inlstyle-1.xsd +27 -0
  409. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-lat1.ent +121 -0
  410. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-list-1.xsd +128 -0
  411. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-notations-1.xsd +105 -0
  412. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-pres-1.xsd +53 -0
  413. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-special.ent +82 -0
  414. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-symbol.ent +204 -0
  415. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-table-1.xsd +323 -0
  416. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/XHTML/xhtml-text-1.xsd +70 -0
  417. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/archive.xsd +1797 -0
  418. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/comparative.xsd +570 -0
  419. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/conceptualcomponent.xsd +1517 -0
  420. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/datacollection.xsd +7300 -0
  421. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/dataset.xsd +243 -0
  422. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/dc.xsd +119 -0
  423. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/dcmitype.xsd +53 -0
  424. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/dcterms.xsd +383 -0
  425. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/ddi-xhtml11-model-1.xsd +462 -0
  426. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/ddi-xhtml11-modules-1.xsd +537 -0
  427. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/ddi-xhtml11.xsd +83 -0
  428. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/ddiprofile.xsd +227 -0
  429. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/group.xsd +1403 -0
  430. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/instance_3_2.xsd +406 -0
  431. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/logicalproduct.xsd +3488 -0
  432. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/physicaldataproduct.xsd +813 -0
  433. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/physicaldataproduct_ncube_inline.xsd +221 -0
  434. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/physicaldataproduct_ncube_normal.xsd +237 -0
  435. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/physicaldataproduct_ncube_tabular.xsd +283 -0
  436. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/physicaldataproduct_proprietary.xsd +237 -0
  437. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/physicalinstance.xsd +833 -0
  438. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/reusable.xsd +8337 -0
  439. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/studyunit.xsd +325 -0
  440. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_2/xml.xsd +76 -0
  441. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-attribs-1.xsd +82 -0
  442. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-bdo-1.xsd +85 -0
  443. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-blkphras-1.xsd +206 -0
  444. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-blkpres-1.xsd +42 -0
  445. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-blkstruct-1.xsd +57 -0
  446. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-charent-1.xsd +41 -0
  447. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-datatypes-1.xsd +147 -0
  448. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-framework-1.xsd +74 -0
  449. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-hypertext-1.xsd +51 -0
  450. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-inlphras-1.xsd +220 -0
  451. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-inlpres-1.xsd +56 -0
  452. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-inlstruct-1.xsd +60 -0
  453. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-inlstyle-1.xsd +27 -0
  454. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-lat1.ent +121 -0
  455. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-list-1.xsd +128 -0
  456. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-notations-1.xsd +105 -0
  457. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-pres-1.xsd +53 -0
  458. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-special.ent +82 -0
  459. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-symbol.ent +204 -0
  460. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-table-1.xsd +323 -0
  461. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/XHTML/xhtml-text-1.xsd +70 -0
  462. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/archive.xsd +1797 -0
  463. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/comparative.xsd +570 -0
  464. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/conceptualcomponent.xsd +1517 -0
  465. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/datacollection.xsd +7300 -0
  466. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/dataset.xsd +243 -0
  467. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/dc.xsd +119 -0
  468. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/dcmitype.xsd +53 -0
  469. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/dcterms.xsd +383 -0
  470. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/ddi-xhtml11-model-1.xsd +462 -0
  471. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/ddi-xhtml11-modules-1.xsd +537 -0
  472. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/ddi-xhtml11.xsd +83 -0
  473. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/ddiprofile.xsd +227 -0
  474. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/group.xsd +1403 -0
  475. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/instance_3_3.xsd +406 -0
  476. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/logicalproduct.xsd +3488 -0
  477. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/physicaldataproduct.xsd +813 -0
  478. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/physicaldataproduct_ncube_inline.xsd +221 -0
  479. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/physicaldataproduct_ncube_normal.xsd +237 -0
  480. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/physicaldataproduct_ncube_tabular.xsd +283 -0
  481. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/physicaldataproduct_proprietary.xsd +237 -0
  482. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/physicalinstance.xsd +833 -0
  483. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/reusable.xsd +8337 -0
  484. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/studyunit.xsd +325 -0
  485. ddi_l-0.1.0/src/ddi_l/schemas/ddi/v3_3/xml.xsd +76 -0
  486. ddi_l-0.1.0/src/ddi_l/schemas/license.txt +117 -0
  487. ddi_l-0.1.0/src/ddi_l/schemas/readme.txt +169 -0
  488. ddi_l-0.1.0/src/ddi_l/server/__init__.py +27 -0
  489. ddi_l-0.1.0/src/ddi_l/server/app.py +101 -0
  490. ddi_l-0.1.0/src/ddi_l/server/config.py +52 -0
  491. ddi_l-0.1.0/src/ddi_l/server/i18n.py +372 -0
  492. ddi_l-0.1.0/src/ddi_l/server/openapi.py +91 -0
  493. ddi_l-0.1.0/src/ddi_l/server/render.py +57 -0
  494. ddi_l-0.1.0/src/ddi_l/server/routes.py +551 -0
  495. ddi_l-0.1.0/src/ddi_l/server/samples.py +145 -0
  496. ddi_l-0.1.0/src/ddi_l/server/schemas.py +502 -0
  497. ddi_l-0.1.0/src/ddi_l/validation.py +372 -0
  498. ddi_l-0.1.0/src/ddi_l/xml_utils.py +174 -0
  499. ddi_l-0.1.0/tests/__init__.py +22 -0
  500. ddi_l-0.1.0/tests/conftest.py +158 -0
  501. ddi_l-0.1.0/tests/fixtures/Canadian_Survey_on_Business_conditions.xml +145404 -0
  502. ddi_l-0.1.0/tests/helpers/__init__.py +1 -0
  503. ddi_l-0.1.0/tests/helpers/maintainable_fixtures.py +244 -0
  504. ddi_l-0.1.0/tests/helpers/synthetic_maintainable.py +54 -0
  505. ddi_l-0.1.0/tests/test_backend_parity.py +345 -0
  506. ddi_l-0.1.0/tests/test_base_coverage.py +918 -0
  507. ddi_l-0.1.0/tests/test_child_identification_propagation.py +72 -0
  508. ddi_l-0.1.0/tests/test_cli.py +1250 -0
  509. ddi_l-0.1.0/tests/test_cli_edge_cases.py +445 -0
  510. ddi_l-0.1.0/tests/test_conversion_coverage.py +521 -0
  511. ddi_l-0.1.0/tests/test_conversion_runtime.py +128 -0
  512. ddi_l-0.1.0/tests/test_crud_api.py +1264 -0
  513. ddi_l-0.1.0/tests/test_datacollection_coverage.py +484 -0
  514. ddi_l-0.1.0/tests/test_datacollection_example_roundtrip.py +90 -0
  515. ddi_l-0.1.0/tests/test_demos.py +106 -0
  516. ddi_l-0.1.0/tests/test_docs_code_samples.py +200 -0
  517. ddi_l-0.1.0/tests/test_docs_execution.py +272 -0
  518. ddi_l-0.1.0/tests/test_docs_r.py +116 -0
  519. ddi_l-0.1.0/tests/test_docs_site_config.py +341 -0
  520. ddi_l-0.1.0/tests/test_document.py +890 -0
  521. ddi_l-0.1.0/tests/test_document_coverage.py +627 -0
  522. ddi_l-0.1.0/tests/test_document_dict_roundtrip.py +495 -0
  523. ddi_l-0.1.0/tests/test_document_handles.py +234 -0
  524. ddi_l-0.1.0/tests/test_document_mixins.py +622 -0
  525. ddi_l-0.1.0/tests/test_document_versioning_flush.py +195 -0
  526. ddi_l-0.1.0/tests/test_etree.py +188 -0
  527. ddi_l-0.1.0/tests/test_exceptions_coverage.py +519 -0
  528. ddi_l-0.1.0/tests/test_finegrained_helpers.py +223 -0
  529. ddi_l-0.1.0/tests/test_fragment.py +291 -0
  530. ddi_l-0.1.0/tests/test_generic_engine_shadow.py +146 -0
  531. ddi_l-0.1.0/tests/test_identifier_generation.py +44 -0
  532. ddi_l-0.1.0/tests/test_import_cost.py +43 -0
  533. ddi_l-0.1.0/tests/test_index.py +637 -0
  534. ddi_l-0.1.0/tests/test_index_coverage.py +502 -0
  535. ddi_l-0.1.0/tests/test_instance_roundtrip.py +59 -0
  536. ddi_l-0.1.0/tests/test_invalid_inputs.py +201 -0
  537. ddi_l-0.1.0/tests/test_io.py +803 -0
  538. ddi_l-0.1.0/tests/test_io_coverage.py +453 -0
  539. ddi_l-0.1.0/tests/test_jsonld.py +189 -0
  540. ddi_l-0.1.0/tests/test_lint.py +501 -0
  541. ddi_l-0.1.0/tests/test_lint_edge_cases.py +485 -0
  542. ddi_l-0.1.0/tests/test_logging_plugin.py +78 -0
  543. ddi_l-0.1.0/tests/test_logicalproduct_coverage.py +896 -0
  544. ddi_l-0.1.0/tests/test_logicalproduct_models.py +108 -0
  545. ddi_l-0.1.0/tests/test_maintainable_comparisons.py +106 -0
  546. ddi_l-0.1.0/tests/test_maintainable_registry.py +72 -0
  547. ddi_l-0.1.0/tests/test_maintainable_registry_coverage.py +295 -0
  548. ddi_l-0.1.0/tests/test_model_coverage_misc.py +642 -0
  549. ddi_l-0.1.0/tests/test_model_edge_cases.py +605 -0
  550. ddi_l-0.1.0/tests/test_models_roundtrip.py +975 -0
  551. ddi_l-0.1.0/tests/test_namespace_provenance.py +187 -0
  552. ddi_l-0.1.0/tests/test_namespace_utils.py +230 -0
  553. ddi_l-0.1.0/tests/test_namespaces.py +63 -0
  554. ddi_l-0.1.0/tests/test_nonsurvey_roundtrip.py +126 -0
  555. ddi_l-0.1.0/tests/test_packaged_examples.py +69 -0
  556. ddi_l-0.1.0/tests/test_packaging.py +19 -0
  557. ddi_l-0.1.0/tests/test_public_api.py +131 -0
  558. ddi_l-0.1.0/tests/test_quality_of_life_fragment.py +230 -0
  559. ddi_l-0.1.0/tests/test_questionnaire_fragments.py +102 -0
  560. ddi_l-0.1.0/tests/test_registry_class.py +167 -0
  561. ddi_l-0.1.0/tests/test_release_metadata.py +99 -0
  562. ddi_l-0.1.0/tests/test_resolver_helpers.py +186 -0
  563. ddi_l-0.1.0/tests/test_roundtrip_fidelity.py +63 -0
  564. ddi_l-0.1.0/tests/test_schema_conversion_bench.py +119 -0
  565. ddi_l-0.1.0/tests/test_schema_loader.py +698 -0
  566. ddi_l-0.1.0/tests/test_schema_loader_fallback.py +159 -0
  567. ddi_l-0.1.0/tests/test_schema_loader_missing_helper.py +193 -0
  568. ddi_l-0.1.0/tests/test_schema_loader_validation_cache.py +68 -0
  569. ddi_l-0.1.0/tests/test_schema_sync.py +334 -0
  570. ddi_l-0.1.0/tests/test_schema_versions.py +292 -0
  571. ddi_l-0.1.0/tests/test_scheme_labels.py +180 -0
  572. ddi_l-0.1.0/tests/test_server.py +435 -0
  573. ddi_l-0.1.0/tests/test_server_examples.py +221 -0
  574. ddi_l-0.1.0/tests/test_server_i18n.py +213 -0
  575. ddi_l-0.1.0/tests/test_training_docs.py +74 -0
  576. ddi_l-0.1.0/tests/test_utility_edge_cases.py +719 -0
  577. ddi_l-0.1.0/tests/test_validation.py +339 -0
  578. ddi_l-0.1.0/tests/test_validation_backends.py +262 -0
  579. ddi_l-0.1.0/tests/test_validation_coverage.py +436 -0
  580. ddi_l-0.1.0/tests/test_validation_fragment_cache.py +44 -0
  581. ddi_l-0.1.0/tests/test_validations.py +424 -0
  582. ddi_l-0.1.0/tests/test_version_detection.py +97 -0
  583. ddi_l-0.1.0/tests/test_version_helpers.py +106 -0
  584. ddi_l-0.1.0/tests/test_versionable_metadata.py +58 -0
  585. ddi_l-0.1.0/tests/test_xml_security.py +43 -0
  586. ddi_l-0.1.0/tests/test_xml_utils.py +72 -0
  587. ddi_l-0.1.0/uv.lock +2675 -0
@@ -0,0 +1,9 @@
1
+ # Changelog
2
+
3
+ The changelog is maintained as part of the documentation site so it stays
4
+ bilingual and versioned alongside the docs.
5
+
6
+ - English: [docs/release-notes.en.md](docs/release-notes.en.md)
7
+ - Français : [docs/release-notes.fr.md](docs/release-notes.fr.md)
8
+
9
+ Both are published at <https://pbisson44.github.io/ddi-l/>.
@@ -0,0 +1,25 @@
1
+ cff-version: 1.2.0
2
+ title: "ddi-l: a Python toolkit for DDI Lifecycle 3.3 XML documents"
3
+ message: "If you use this software, please cite it using these metadata."
4
+ type: software
5
+ authors:
6
+ - family-names: Bisson
7
+ given-names: Philippe
8
+ repository-code: "https://github.com/pbisson44/ddi-l"
9
+ url: "https://github.com/pbisson44/ddi-l"
10
+ abstract: >-
11
+ ddi-l is a Python library and command-line tool for creating, reading,
12
+ updating, and validating DDI Lifecycle 3.3 XML documents. Its model layer is
13
+ generated from the official DDI XML Schemas, and the DDI 3.1, 3.2, and 3.3
14
+ schemas are bundled so validation works offline.
15
+ keywords:
16
+ - DDI
17
+ - DDI Lifecycle
18
+ - metadata
19
+ - survey
20
+ - XML
21
+ - official statistics
22
+ - data documentation
23
+ license: MIT
24
+ version: 0.1.0
25
+ date-released: "2026-08-08"
@@ -0,0 +1,63 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic
9
+ status, nationality, personal appearance, race, caste, color, religion, or
10
+ sexual identity and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment:
18
+
19
+ - Demonstrating empathy and kindness toward other people
20
+ - Being respectful of differing opinions, viewpoints, and experiences
21
+ - Giving and gracefully accepting constructive feedback
22
+ - Accepting responsibility and apologizing to those affected by our mistakes,
23
+ and learning from the experience
24
+ - Focusing on what is best for the overall community
25
+
26
+ Examples of unacceptable behavior:
27
+
28
+ - The use of sexualized language or imagery, and sexual attention or advances
29
+ - Trolling, insulting or derogatory comments, and personal or political attacks
30
+ - Public or private harassment
31
+ - Publishing others' private information, such as a physical or email address,
32
+ without their explicit permission
33
+ - Other conduct which could reasonably be considered inappropriate in a
34
+ professional setting
35
+
36
+ ## Enforcement Responsibilities
37
+
38
+ Community leaders are responsible for clarifying and enforcing our standards
39
+ of acceptable behavior and will take appropriate and fair corrective action in
40
+ response to any behavior that they deem inappropriate, threatening, offensive,
41
+ or harmful.
42
+
43
+ ## Scope
44
+
45
+ This Code of Conduct applies within all community spaces, and also applies
46
+ when an individual is officially representing the community in public spaces.
47
+
48
+ ## Enforcement
49
+
50
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
51
+ reported to the maintainer at <pbisson44@gmail.com>. All complaints will be
52
+ reviewed and investigated promptly and fairly.
53
+
54
+ All community leaders are obligated to respect the privacy and security of the
55
+ reporter of any incident.
56
+
57
+ ## Attribution
58
+
59
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
60
+ version 2.1, available at
61
+ <https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.
62
+
63
+ [homepage]: https://www.contributor-covenant.org
@@ -0,0 +1,129 @@
1
+ # Contributing to ddi-l
2
+
3
+ Thanks for helping improve `ddi-l`! This guide covers the development
4
+ environment, coding standards, the XSD-driven codegen pipeline, and how to
5
+ run the quality gates.
6
+
7
+ The full contributor guide, including the architecture overview, lives at
8
+ [docs/DEVELOPMENT.en.md](docs/DEVELOPMENT.en.md)
9
+ ([français](docs/DEVELOPMENT.fr.md)).
10
+
11
+ ## Set up your environment
12
+
13
+ **Python 3.11 or newer** is required. The project is managed with
14
+ [uv](https://docs.astral.sh/uv/); `uv.lock` pins every dependency version and
15
+ CI installs from it with `--locked`.
16
+
17
+ ```bash
18
+ uv sync --group dev # Runtime + development dependencies
19
+ uv sync --group dev --extra full # ...plus the optional lxml backend
20
+ uv sync --group docs # Documentation toolchain
21
+ ```
22
+
23
+ Note that `full` is an **extra**, not a dependency group: `--group full`
24
+ fails.
25
+
26
+ With plain pip instead:
27
+
28
+ ```bash
29
+ python -m venv .venv && source .venv/bin/activate
30
+ pip install -e '.[full]' --group dev # pip 25.1+ reads dependency groups
31
+ ```
32
+
33
+ ## Coding standards
34
+
35
+ - **Formatting and linting**: `ruff format` and `ruff check` with the
36
+ project configuration in `pyproject.toml`. Line length is 88 characters.
37
+ `ruff` and `mypy` are pinned to exact versions; bump them deliberately.
38
+ - **Type hints**: `mypy` on `src/` and `tests/` is blocking in CI.
39
+ - **Docstrings**: Google style (`Args:`, `Returns:`, `Raises:` sections).
40
+ Enforced by ruff's `D` rule set with `convention = "google"`.
41
+ - **Imports**: Ruff's isort integration handles ordering.
42
+ - **Tests**: `pytest` with `pytest-cov`. Tests go under `tests/`.
43
+ Coverage target is 90%.
44
+ - **Documentation**: pages come in `.en.md` / `.fr.md` pairs. Update both
45
+ when you change user-facing content.
46
+
47
+ ## Quality gates
48
+
49
+ Run these before opening a pull request:
50
+
51
+ ```bash
52
+ uv run ruff format --check . # Formatting
53
+ uv run ruff check . # Linting (includes docstring rules)
54
+ uv run mypy src tests # Type checking
55
+ uv run pytest # Tests with coverage
56
+ uvx pip-audit --strict # Dependency vulnerability scan
57
+ git diff --exit-code # A test run must not modify tracked files
58
+ ```
59
+
60
+ Or use the Makefile for release-level checks:
61
+
62
+ ```bash
63
+ make release-check # Build, verify assets, test install
64
+ ```
65
+
66
+ `make release-check` builds both distributions, asserts the bundled XSDs and
67
+ examples are present, asserts `ddi_l` is the only top-level package in the
68
+ wheel, then installs the wheel into a clean virtualenv and validates a
69
+ document with it. Run it before proposing a release.
70
+
71
+ ## XSD-driven codegen pipeline
72
+
73
+ All model classes are generated from the DDI 3.3 XSD files. The XSD is the
74
+ single source of truth for fields, ordering, namespaces, and documentation.
75
+
76
+ To regenerate models after modifying the codegen scripts:
77
+
78
+ ```bash
79
+ uv run python -m codegen.generate_model_bases
80
+ ```
81
+
82
+ CI runs a drift check (`git diff --exit-code src/ddi_l/models/_generated/`)
83
+ to ensure generated code stays in sync with the XSD. Never edit generated
84
+ files by hand.
85
+
86
+ Key codegen files:
87
+
88
+ - `codegen/xsd_introspect.py`: Extracts the XSD content model
89
+ - `codegen/generate_model_bases.py`: Emits generated field-only base classes
90
+ - `codegen/coverage_audit.py`: Regenerates `codegen/COVERAGE_AUDIT.md`
91
+ - `src/ddi_l/models/base.py`: Generic XML engine; `MaintainableBase.from_xml`
92
+ and `.to_xml` drive serialization off the generated `_FIELD_XML_MAP`,
93
+ `_ATTR_XML_MAP`, and `_ELEMENT_ORDER` tables
94
+ - `src/ddi_l/models/_generated/`: Generated output (do not edit), including
95
+ `label_slots.py`, the schema-derived table of elements that may carry an
96
+ `r:Label`
97
+
98
+ ## Bundled schemas
99
+
100
+ The DDI XSDs live inside the package at `src/ddi_l/schemas/` so validation
101
+ works offline from a plain `pip install ddi-l`. Always resolve them through
102
+ `importlib.resources` (`resources.files("ddi_l.schemas")`), never a path
103
+ relative to the repository root, which works in a clone and breaks in an
104
+ installed wheel. The schemas are CC-BY-4.0 from the DDI Alliance; their
105
+ `license.txt` and `readme.txt` must stay in the distribution.
106
+
107
+ ## Documentation
108
+
109
+ The documentation site uses MkDocs with the Material theme and bilingual
110
+ (EN/FR) support via `mkdocs-static-i18n`.
111
+
112
+ ```bash
113
+ uv run mkdocs serve --strict # Live preview on http://127.0.0.1:8000
114
+ uv run mkdocs build --strict # Build and check for errors
115
+ # or
116
+ make docs-serve
117
+ make docs-build
118
+ ```
119
+
120
+ ## Submitting changes
121
+
122
+ 1. Fork the repository and create a feature branch.
123
+ 2. Write or update tests alongside code changes.
124
+ 3. Update both the English and French documentation pages where relevant.
125
+ 4. Run the quality gates listed above.
126
+ 5. Commit with clear messages describing the intent of each change.
127
+ 6. Open a pull request with a summary and any related issue references.
128
+
129
+ Thanks for contributing!
ddi_l-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Philippe Bisson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
ddi_l-0.1.0/Makefile ADDED
@@ -0,0 +1,18 @@
1
+ .PHONY: example release-check docs-build docs-serve
2
+
3
+ example:
4
+ python -m ddi_l.examples.build_and_validate --refresh
5
+
6
+ # Build both distributions and check their contents and a clean install.
7
+ release-check:
8
+ rm -rf dist
9
+ python -m build --sdist --wheel
10
+ python scripts/check_distributions.py dist
11
+ python scripts/check_clean_install.py dist
12
+
13
+ # NO_MKDOCS_2_WARNING silences Material's advisory banner.
14
+ docs-build:
15
+ NO_MKDOCS_2_WARNING=1 mkdocs build --strict
16
+
17
+ docs-serve:
18
+ NO_MKDOCS_2_WARNING=1 mkdocs serve --strict
ddi_l-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,269 @@
1
+ Metadata-Version: 2.4
2
+ Name: ddi-l
3
+ Version: 0.1.0
4
+ Summary: Python toolkit for DDI Lifecycle XML: read, author, validate and lint DDI 3.1, 3.2 and 3.3
5
+ License-Expression: MIT
6
+ License-File: LICENSE
7
+ License-File: src/ddi_l/schemas/license.txt
8
+ Keywords: ddi,ddi-lifecycle,metadata,survey,xml,statistics,data-documentation
9
+ Author: Philippe Bisson
10
+ Author-email: pbisson44@gmail.com
11
+ Requires-Python: >=3.11
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Environment :: Console
16
+ Classifier: Natural Language :: English
17
+ Classifier: Natural Language :: French
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3 :: Only
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Programming Language :: Python :: 3.14
25
+ Classifier: Topic :: Scientific/Engineering
26
+ Classifier: Topic :: Text Processing :: Markup :: XML
27
+ Classifier: Typing :: Typed
28
+ Provides-Extra: full
29
+ Provides-Extra: server
30
+ Requires-Dist: defusedxml (>=0.7)
31
+ Requires-Dist: litestar (>=2.12,<3) ; extra == "server"
32
+ Requires-Dist: lxml (>=4.9) ; extra == "full"
33
+ Requires-Dist: orjson (>=3.9)
34
+ Requires-Dist: uvicorn[standard] (>=0.30) ; extra == "server"
35
+ Requires-Dist: xmlschema (>=2.4)
36
+ Project-URL: Changelog, https://github.com/pbisson44/ddi-l/blob/main/docs/release-notes.en.md
37
+ Project-URL: Documentation, https://pbisson44.github.io/ddi-l/
38
+ Project-URL: Homepage, https://github.com/pbisson44/ddi-l
39
+ Project-URL: Issues, https://github.com/pbisson44/ddi-l/issues
40
+ Project-URL: Repository, https://github.com/pbisson44/ddi-l
41
+ Description-Content-Type: text/markdown
42
+
43
+ # ddi-l
44
+
45
+ [![PyPI version](https://img.shields.io/pypi/v/ddi-l.svg)](https://pypi.org/project/ddi-l/)
46
+ [![Python versions](https://img.shields.io/pypi/pyversions/ddi-l.svg)](https://pypi.org/project/ddi-l/)
47
+ [![Development status](https://img.shields.io/pypi/status/ddi-l.svg)](https://pypi.org/project/ddi-l/)
48
+ [![Typed](https://img.shields.io/pypi/types/ddi-l.svg)](https://peps.python.org/pep-0561/)
49
+ [![DDI Lifecycle](https://img.shields.io/badge/DDI%20Lifecycle-3.1%20%7C%203.2%20%7C%203.3-0b7285.svg)](https://ddialliance.org/Specification/DDI-Lifecycle/3.3/)
50
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/pbisson44/ddi-l/blob/main/LICENSE)
51
+
52
+ [![CI](https://img.shields.io/github/actions/workflow/status/pbisson44/ddi-l/ci.yml?branch=main&label=CI&logo=github)](https://github.com/pbisson44/ddi-l/actions/workflows/ci.yml)
53
+ [![Docs](https://img.shields.io/github/actions/workflow/status/pbisson44/ddi-l/deploy-docs.yml?branch=main&label=docs&logo=readthedocs&logoColor=white)](https://pbisson44.github.io/ddi-l/)
54
+ [![Coverage](https://img.shields.io/badge/coverage-%E2%89%A590%25%20%28CI%20gate%29-brightgreen.svg)](https://github.com/pbisson44/ddi-l/blob/main/pyproject.toml)
55
+
56
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
57
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
58
+ [![Checked with mypy](https://img.shields.io/badge/mypy-checked-2a6db2.svg)](https://mypy-lang.org/)
59
+ [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pbisson44/ddi-l/blob/main/.pre-commit-config.yaml)
60
+
61
+ A Python library for creating, reading, updating, and validating
62
+ [DDI Lifecycle 3.3](https://ddialliance.org/Specification/DDI-Lifecycle/3.3/)
63
+ XML documents.
64
+
65
+ **[Documentation](https://pbisson44.github.io/ddi-l/)**: guides, a models
66
+ reference, CLI recipes and a 16-module training curriculum, in English and
67
+ French.
68
+
69
+ ## Installation
70
+
71
+ ```bash
72
+ pip install ddi-l
73
+ ```
74
+
75
+ Optional extras:
76
+
77
+ ```bash
78
+ pip install 'ddi-l[full]' # lxml: faster parsing and validation
79
+ pip install 'ddi-l[server]' # HTTP API (see `ddi serve` below)
80
+ ```
81
+
82
+ The DDI 3.1, 3.2, and 3.3 XML Schemas are bundled with the package, so
83
+ validation works offline with no additional download.
84
+
85
+ **Using R?** Call `ddi-l` through [reticulate](https://rstudio.github.io/reticulate/);
86
+ see [Using ddi-l from R](https://pbisson44.github.io/ddi-l/r-users/).
87
+
88
+ ## Quick start
89
+
90
+ ### Create a study
91
+
92
+ ```python
93
+ import ddi_l as ddi
94
+
95
+ doc = ddi.new_study(title="Household Survey", agency="example.org")
96
+
97
+ # Add questions. `label=` is optional, but `ddi lint` reports every
98
+ # maintainable without one, so labelling here is the difference between
99
+ # output that passes the linter this package ships and output that warns
100
+ # about itself.
101
+ q_age = doc.add_question(text="How old are you?", label="Age question")
102
+ q_gender = doc.add_question(text="What is your gender?", label="Gender question")
103
+
104
+ # Add variables linked to questions
105
+ doc.add_variable(name="Age", question=q_age, label="Age in years")
106
+ doc.add_variable(name="Gender", question=q_gender, label="Gender of respondent")
107
+
108
+ # Add concepts and universes
109
+ doc.add_concept(name="Demographics", label="Demographics")
110
+ doc.add_universe(name="Canadian adults aged 18+", label="Canadian adults aged 18+")
111
+
112
+ # Save to XML
113
+ doc.save("household-survey.xml")
114
+ ```
115
+
116
+ ### Open and explore
117
+
118
+ ```python
119
+ import ddi_l as ddi
120
+
121
+ doc = ddi.open_ddi("household-survey.xml")
122
+
123
+ print(f"Questions: {len(doc.questions)}")
124
+ print(f"Variables: {len(doc.variables)}")
125
+
126
+ for v in doc.variables:
127
+ print(f" {v.identifier}")
128
+ ```
129
+
130
+ ### Update and delete
131
+
132
+ ```python
133
+ # Find an item by identifier
134
+ item = doc.find("some-identifier")
135
+
136
+ # Remove an item
137
+ doc.remove("some-identifier")
138
+
139
+ # Save changes
140
+ doc.save("household-survey.xml")
141
+ ```
142
+
143
+ ### Validate
144
+
145
+ ```python
146
+ import ddi_l as ddi
147
+
148
+ doc = ddi.open_ddi("household-survey.xml", validate=True)
149
+
150
+ issues = doc.validate()
151
+ for issue in issues:
152
+ print(f"[{issue.severity}] {issue.message}")
153
+ ```
154
+
155
+ ### Work with any DDI item type
156
+
157
+ The `add_item()` method supports all 30 registered DDI item types:
158
+
159
+ ```python
160
+ from ddi_l.models.logicalproduct import Category, RepresentedVariable
161
+ from ddi_l.models.datacollection import Instrument
162
+
163
+ doc.add_item(Category, name="Male")
164
+ doc.add_item(Category, name="Female")
165
+ doc.add_item(RepresentedVariable, name="Gender Representation")
166
+ doc.add_item(Instrument, name="CAWI Questionnaire")
167
+
168
+ # Query items by type
169
+ print(f"Categories: {len(doc.items(Category))}")
170
+ ```
171
+
172
+ ### Command-line interface
173
+
174
+ ```bash
175
+ ddi --version # Version and default DDI schema version
176
+ ddi validate my-study.xml # Schema validation
177
+ ddi lint my-study.xml # Lint checks (exits 1 on errors)
178
+ ddi to-json my-study.xml # Convert to JSON (round-trippable)
179
+ ddi to-jsonld my-study.xml # Convert to JSON-LD (linked data)
180
+ ddi from-json my-study.json -o my-study.xml # Convert back from JSON
181
+ ddi roundtrip my-study.xml -o out.xml # Round-trip XML
182
+ ddi versions # List supported DDI schema versions
183
+ ddi serve # HTTP API (needs the 'server' extra)
184
+ ```
185
+
186
+ `ddi validate` and `ddi lint` exit non-zero when they find **errors**, which is
187
+ what makes them usable as CI gates. Warnings are reported but do not fail the
188
+ run; add `--fail-severity warning` to `ddi lint` once a corpus is clean enough
189
+ to hold that line.
190
+
191
+ ### HTTP API
192
+
193
+ With `ddi-l[server]` installed, the same validate, lint and convert operations
194
+ are available over HTTP, which is useful when DDI validation has to be reachable from
195
+ outside Python:
196
+
197
+ ```bash
198
+ ddi serve --port 8080
199
+ curl --data-binary @my-study.xml http://localhost:8080/v1/validate
200
+ ```
201
+
202
+ `/v1/convert/jsonld` renders a study as linked data using the DDI Alliance's
203
+ own [DDI-RDF Discovery vocabulary](https://rdf-vocabulary.ddialliance.org/discovery.html),
204
+ ready to load into a triple store. It covers DDI's discovery subset and does not
205
+ convert back; use `/v1/convert/json` when the payload has to return to XML.
206
+
207
+ Open <http://localhost:8080/> in a browser and you land on **[Swagger UI](https://swagger.io/tools/swagger-ui/)
208
+ at `/schema`**: every endpoint with its request body, query parameters and
209
+ response schema, each carrying a real example. "Try it out" comes prefilled with
210
+ a valid DDI document, so you can validate one without writing a request first.
211
+ The raw OpenAPI document is at `/schema/openapi.json`.
212
+
213
+ See the [HTTP API guide](https://pbisson44.github.io/ddi-l/server/) for the
214
+ endpoint reference and the limits to set before exposing it.
215
+
216
+ ## What's public, and what's stable
217
+
218
+ `ddi-l` has a wide surface, so it is worth saying which part is the front door.
219
+
220
+ **Start here.** `ddi.new_study()` and `ddi.open_ddi()` return a `Document`, and
221
+ `Document` is the supported API for authoring and editing. Almost everything in
222
+ the guides uses it.
223
+
224
+ **The advanced layer** (`DDIDocument`, `DDIFragment`, `StudyCursor`, and the
225
+ generated classes under `ddi_l.models`) is public and documented, and is what
226
+ you reach for when you need raw elements, partial instances, or a specific study
227
+ in a multi-study file.
228
+
229
+ **Semantic versioning applies to** the `ddi_l` top-level exports, `ddi_l.models`,
230
+ `ddi_l.io`, `ddi_l.lint`, `ddi_l.validation`, `ddi_l.operations`, and the `ddi`
231
+ CLI's commands and exit codes.
232
+
233
+ **Provisional in 0.1.x**, and may change without a major bump:
234
+
235
+ - `ddi_l.models._generated`: regenerated from the XSDs; import the public
236
+ re-exports in `ddi_l.models` instead.
237
+ - `ddi_l.server` and its HTTP routes: new in this release and not yet exercised
238
+ against real deployments.
239
+ - Anything prefixed with `_`.
240
+
241
+ While `0.x`, breaking changes land in minor versions and are called out in the
242
+ [release notes](https://pbisson44.github.io/ddi-l/release-notes/).
243
+
244
+ ## Supported Python versions
245
+
246
+ Python 3.11, 3.12, 3.13, and 3.14.
247
+
248
+ ## Contributing
249
+
250
+ See [CONTRIBUTING.md](https://github.com/pbisson44/ddi-l/blob/main/CONTRIBUTING.md) for development setup, coding standards,
251
+ and testing instructions.
252
+
253
+ ## License
254
+
255
+ The `ddi-l` source code is [MIT](https://github.com/pbisson44/ddi-l/blob/main/LICENSE) licensed.
256
+
257
+ ### Bundled third-party content
258
+
259
+ This package redistributes the official DDI Lifecycle XML Schemas (versions
260
+ 3.1, 3.2, and 3.3) under `ddi_l/schemas/`, so that validation works offline.
261
+
262
+ - **Schemas:** © [DDI Alliance](https://ddialliance.org/), licensed
263
+ [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/).
264
+ - The full license text and the DDI Alliance release notes ship alongside the
265
+ schemas as `license.txt` and `readme.txt`.
266
+
267
+ The MIT license above covers the `ddi-l` code only; it does not alter the
268
+ terms under which the DDI schemas are provided.
269
+