aas-core-codegen 0.0.16__py3-none-any.whl

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 (604) hide show
  1. aas_core_codegen/__init__.py +6 -0
  2. aas_core_codegen/__main__.py +8 -0
  3. aas_core_codegen/common.py +500 -0
  4. aas_core_codegen/cpp/__init__.py +1 -0
  5. aas_core_codegen/cpp/aas_common/__init__.py +6 -0
  6. aas_core_codegen/cpp/aas_common/_generate.py +713 -0
  7. aas_core_codegen/cpp/common.py +681 -0
  8. aas_core_codegen/cpp/constants/__init__.py +6 -0
  9. aas_core_codegen/cpp/constants/_generate.py +568 -0
  10. aas_core_codegen/cpp/description.py +654 -0
  11. aas_core_codegen/cpp/enhancing/__init__.py +4 -0
  12. aas_core_codegen/cpp/enhancing/_generate.py +993 -0
  13. aas_core_codegen/cpp/iteration/__init__.py +6 -0
  14. aas_core_codegen/cpp/iteration/_generate.py +2332 -0
  15. aas_core_codegen/cpp/jsonization/__init__.py +6 -0
  16. aas_core_codegen/cpp/jsonization/_generate.py +2619 -0
  17. aas_core_codegen/cpp/main.py +694 -0
  18. aas_core_codegen/cpp/naming.py +170 -0
  19. aas_core_codegen/cpp/optionaling.py +557 -0
  20. aas_core_codegen/cpp/pattern/__init__.py +6 -0
  21. aas_core_codegen/cpp/pattern/_generate.py +508 -0
  22. aas_core_codegen/cpp/revm/__init__.py +6 -0
  23. aas_core_codegen/cpp/revm/_generate.py +1149 -0
  24. aas_core_codegen/cpp/stringification/__init__.py +5 -0
  25. aas_core_codegen/cpp/stringification/_generate.py +955 -0
  26. aas_core_codegen/cpp/structure/__init__.py +7 -0
  27. aas_core_codegen/cpp/structure/_generate.py +1503 -0
  28. aas_core_codegen/cpp/transpilation.py +1383 -0
  29. aas_core_codegen/cpp/unrolling.py +159 -0
  30. aas_core_codegen/cpp/verification/__init__.py +6 -0
  31. aas_core_codegen/cpp/verification/_generate.py +3073 -0
  32. aas_core_codegen/cpp/visitation/__init__.py +6 -0
  33. aas_core_codegen/cpp/visitation/_generate.py +521 -0
  34. aas_core_codegen/cpp/wstringification/__init__.py +5 -0
  35. aas_core_codegen/cpp/wstringification/_generate.py +586 -0
  36. aas_core_codegen/cpp/xmlization/__init__.py +6 -0
  37. aas_core_codegen/cpp/xmlization/_generate.py +5373 -0
  38. aas_core_codegen/cpp/yielding.py +201 -0
  39. aas_core_codegen/csharp/__init__.py +1 -0
  40. aas_core_codegen/csharp/common.py +224 -0
  41. aas_core_codegen/csharp/constants/__init__.py +5 -0
  42. aas_core_codegen/csharp/constants/_generate.py +409 -0
  43. aas_core_codegen/csharp/copying/__init__.py +4 -0
  44. aas_core_codegen/csharp/copying/_generate.py +498 -0
  45. aas_core_codegen/csharp/description.py +1103 -0
  46. aas_core_codegen/csharp/enhancing/__init__.py +4 -0
  47. aas_core_codegen/csharp/enhancing/_generate.py +667 -0
  48. aas_core_codegen/csharp/jsonization/__init__.py +4 -0
  49. aas_core_codegen/csharp/jsonization/_generate.py +1630 -0
  50. aas_core_codegen/csharp/main.py +421 -0
  51. aas_core_codegen/csharp/naming.py +157 -0
  52. aas_core_codegen/csharp/reporting/__init__.py +4 -0
  53. aas_core_codegen/csharp/reporting/_generate.py +266 -0
  54. aas_core_codegen/csharp/stringification/__init__.py +4 -0
  55. aas_core_codegen/csharp/stringification/_generate.py +243 -0
  56. aas_core_codegen/csharp/structure/__init__.py +6 -0
  57. aas_core_codegen/csharp/structure/_generate.py +1341 -0
  58. aas_core_codegen/csharp/transpilation.py +990 -0
  59. aas_core_codegen/csharp/unrolling.py +211 -0
  60. aas_core_codegen/csharp/verification/__init__.py +6 -0
  61. aas_core_codegen/csharp/verification/_generate.py +1457 -0
  62. aas_core_codegen/csharp/visitation/__init__.py +5 -0
  63. aas_core_codegen/csharp/visitation/_generate.py +579 -0
  64. aas_core_codegen/csharp/xmlization/__init__.py +4 -0
  65. aas_core_codegen/csharp/xmlization/_generate.py +1980 -0
  66. aas_core_codegen/golang/__init__.py +1 -0
  67. aas_core_codegen/golang/aas_common/__init__.py +4 -0
  68. aas_core_codegen/golang/aas_common/_generate.py +152 -0
  69. aas_core_codegen/golang/common.py +303 -0
  70. aas_core_codegen/golang/constants/__init__.py +5 -0
  71. aas_core_codegen/golang/constants/_generate.py +339 -0
  72. aas_core_codegen/golang/description.py +501 -0
  73. aas_core_codegen/golang/enhancing/__init__.py +4 -0
  74. aas_core_codegen/golang/enhancing/_generate.py +527 -0
  75. aas_core_codegen/golang/jsonization/__init__.py +4 -0
  76. aas_core_codegen/golang/jsonization/_generate.py +1740 -0
  77. aas_core_codegen/golang/main.py +368 -0
  78. aas_core_codegen/golang/naming.py +412 -0
  79. aas_core_codegen/golang/pointering.py +631 -0
  80. aas_core_codegen/golang/reporting/__init__.py +4 -0
  81. aas_core_codegen/golang/reporting/_generate.py +218 -0
  82. aas_core_codegen/golang/stringification/__init__.py +4 -0
  83. aas_core_codegen/golang/stringification/_generate.py +394 -0
  84. aas_core_codegen/golang/structure/__init__.py +6 -0
  85. aas_core_codegen/golang/structure/_generate.py +1493 -0
  86. aas_core_codegen/golang/transpilation.py +1191 -0
  87. aas_core_codegen/golang/unrolling.py +159 -0
  88. aas_core_codegen/golang/verification/__init__.py +6 -0
  89. aas_core_codegen/golang/verification/_generate.py +1513 -0
  90. aas_core_codegen/golang/xmlization/__init__.py +4 -0
  91. aas_core_codegen/golang/xmlization/_generate.py +2507 -0
  92. aas_core_codegen/infer_for_schema/__init__.py +21 -0
  93. aas_core_codegen/infer_for_schema/_inline.py +693 -0
  94. aas_core_codegen/infer_for_schema/_len.py +527 -0
  95. aas_core_codegen/infer_for_schema/_pattern.py +311 -0
  96. aas_core_codegen/infer_for_schema/_set.py +394 -0
  97. aas_core_codegen/infer_for_schema/_stringify.py +201 -0
  98. aas_core_codegen/infer_for_schema/_types.py +135 -0
  99. aas_core_codegen/infer_for_schema/match.py +122 -0
  100. aas_core_codegen/intermediate/__init__.py +78 -0
  101. aas_core_codegen/intermediate/_hierarchy.py +397 -0
  102. aas_core_codegen/intermediate/_stringify.py +989 -0
  103. aas_core_codegen/intermediate/_translate.py +5128 -0
  104. aas_core_codegen/intermediate/_types.py +2901 -0
  105. aas_core_codegen/intermediate/construction.py +750 -0
  106. aas_core_codegen/intermediate/doc.py +344 -0
  107. aas_core_codegen/intermediate/pattern_verification.py +428 -0
  108. aas_core_codegen/intermediate/revm.py +985 -0
  109. aas_core_codegen/intermediate/type_inference.py +2266 -0
  110. aas_core_codegen/java/__init__.py +1 -0
  111. aas_core_codegen/java/common.py +197 -0
  112. aas_core_codegen/java/constants/__init__.py +5 -0
  113. aas_core_codegen/java/constants/_generate.py +334 -0
  114. aas_core_codegen/java/copying/__init__.py +4 -0
  115. aas_core_codegen/java/copying/_generate.py +502 -0
  116. aas_core_codegen/java/description.py +774 -0
  117. aas_core_codegen/java/enhancing/__init__.py +4 -0
  118. aas_core_codegen/java/enhancing/_generate.py +820 -0
  119. aas_core_codegen/java/generation/__init__.py +5 -0
  120. aas_core_codegen/java/generation/_generate.py +285 -0
  121. aas_core_codegen/java/jsonization/__init__.py +4 -0
  122. aas_core_codegen/java/jsonization/_generate.py +1472 -0
  123. aas_core_codegen/java/main.py +438 -0
  124. aas_core_codegen/java/naming.py +187 -0
  125. aas_core_codegen/java/optional.py +514 -0
  126. aas_core_codegen/java/reporting/__init__.py +4 -0
  127. aas_core_codegen/java/reporting/_generate.py +248 -0
  128. aas_core_codegen/java/stringification/__init__.py +4 -0
  129. aas_core_codegen/java/stringification/_generate.py +212 -0
  130. aas_core_codegen/java/structure/__init__.py +6 -0
  131. aas_core_codegen/java/structure/_generate.py +1767 -0
  132. aas_core_codegen/java/transpilation.py +1111 -0
  133. aas_core_codegen/java/verification/__init__.py +6 -0
  134. aas_core_codegen/java/verification/_generate.py +1536 -0
  135. aas_core_codegen/java/visitation/__init__.py +5 -0
  136. aas_core_codegen/java/visitation/_generate.py +689 -0
  137. aas_core_codegen/java/xmlization/__init__.py +4 -0
  138. aas_core_codegen/java/xmlization/_generate.py +2274 -0
  139. aas_core_codegen/jsonld/__init__.py +1 -0
  140. aas_core_codegen/jsonld/main.py +455 -0
  141. aas_core_codegen/jsonschema/__init__.py +1 -0
  142. aas_core_codegen/jsonschema/main.py +982 -0
  143. aas_core_codegen/main.py +245 -0
  144. aas_core_codegen/naming.py +133 -0
  145. aas_core_codegen/opcua/__init__.py +1 -0
  146. aas_core_codegen/opcua/main.py +1525 -0
  147. aas_core_codegen/opcua/naming.py +126 -0
  148. aas_core_codegen/parse/__init__.py +46 -0
  149. aas_core_codegen/parse/_rules.py +796 -0
  150. aas_core_codegen/parse/_stringify.py +532 -0
  151. aas_core_codegen/parse/_translate.py +3940 -0
  152. aas_core_codegen/parse/_types.py +973 -0
  153. aas_core_codegen/parse/retree/__init__.py +46 -0
  154. aas_core_codegen/parse/retree/_fix.py +434 -0
  155. aas_core_codegen/parse/retree/_parse.py +1143 -0
  156. aas_core_codegen/parse/retree/_render.py +298 -0
  157. aas_core_codegen/parse/retree/_stringify.py +199 -0
  158. aas_core_codegen/parse/retree/_types.py +362 -0
  159. aas_core_codegen/parse/retree/_visitor.py +70 -0
  160. aas_core_codegen/parse/tree.py +1303 -0
  161. aas_core_codegen/protobuf/__init__.py +1 -0
  162. aas_core_codegen/protobuf/common.py +225 -0
  163. aas_core_codegen/protobuf/description.py +1102 -0
  164. aas_core_codegen/protobuf/main.py +115 -0
  165. aas_core_codegen/protobuf/naming.py +143 -0
  166. aas_core_codegen/protobuf/structure/__init__.py +6 -0
  167. aas_core_codegen/protobuf/structure/_generate.py +502 -0
  168. aas_core_codegen/py.typed +1 -0
  169. aas_core_codegen/python/__init__.py +1 -0
  170. aas_core_codegen/python/aas_common/__init__.py +4 -0
  171. aas_core_codegen/python/aas_common/_generate.py +63 -0
  172. aas_core_codegen/python/common.py +406 -0
  173. aas_core_codegen/python/constants/__init__.py +5 -0
  174. aas_core_codegen/python/constants/_generate.py +377 -0
  175. aas_core_codegen/python/description.py +508 -0
  176. aas_core_codegen/python/jsonization/__init__.py +4 -0
  177. aas_core_codegen/python/jsonization/_generate.py +1391 -0
  178. aas_core_codegen/python/main.py +323 -0
  179. aas_core_codegen/python/naming.py +255 -0
  180. aas_core_codegen/python/stringification/__init__.py +4 -0
  181. aas_core_codegen/python/stringification/_generate.py +129 -0
  182. aas_core_codegen/python/structure/__init__.py +6 -0
  183. aas_core_codegen/python/structure/_generate.py +1801 -0
  184. aas_core_codegen/python/transpilation.py +958 -0
  185. aas_core_codegen/python/unrolling.py +156 -0
  186. aas_core_codegen/python/verification/__init__.py +6 -0
  187. aas_core_codegen/python/verification/_generate.py +1471 -0
  188. aas_core_codegen/python/xmlization/__init__.py +4 -0
  189. aas_core_codegen/python/xmlization/_generate.py +3003 -0
  190. aas_core_codegen/python_protobuf/__init__.py +1 -0
  191. aas_core_codegen/python_protobuf/main.py +1424 -0
  192. aas_core_codegen/python_protobuf/naming.py +85 -0
  193. aas_core_codegen/rdf_shacl/__init__.py +1 -0
  194. aas_core_codegen/rdf_shacl/_description.py +351 -0
  195. aas_core_codegen/rdf_shacl/common.py +206 -0
  196. aas_core_codegen/rdf_shacl/main.py +114 -0
  197. aas_core_codegen/rdf_shacl/naming.py +145 -0
  198. aas_core_codegen/rdf_shacl/rdf.py +435 -0
  199. aas_core_codegen/rdf_shacl/shacl.py +453 -0
  200. aas_core_codegen/run.py +124 -0
  201. aas_core_codegen/smoke/__init__.py +1 -0
  202. aas_core_codegen/smoke/main.py +219 -0
  203. aas_core_codegen/specific_implementations.py +72 -0
  204. aas_core_codegen/stringify.py +333 -0
  205. aas_core_codegen/typescript/__init__.py +1 -0
  206. aas_core_codegen/typescript/aas_common/__init__.py +4 -0
  207. aas_core_codegen/typescript/aas_common/_generate.py +472 -0
  208. aas_core_codegen/typescript/common.py +340 -0
  209. aas_core_codegen/typescript/constants/__init__.py +5 -0
  210. aas_core_codegen/typescript/constants/_generate.py +347 -0
  211. aas_core_codegen/typescript/description.py +530 -0
  212. aas_core_codegen/typescript/jsonization/__init__.py +4 -0
  213. aas_core_codegen/typescript/jsonization/_generate.py +1510 -0
  214. aas_core_codegen/typescript/main.py +258 -0
  215. aas_core_codegen/typescript/naming.py +189 -0
  216. aas_core_codegen/typescript/stringification/__init__.py +4 -0
  217. aas_core_codegen/typescript/stringification/_generate.py +367 -0
  218. aas_core_codegen/typescript/structure/__init__.py +6 -0
  219. aas_core_codegen/typescript/structure/_generate.py +2500 -0
  220. aas_core_codegen/typescript/transpilation.py +1051 -0
  221. aas_core_codegen/typescript/unrolling.py +159 -0
  222. aas_core_codegen/typescript/verification/__init__.py +6 -0
  223. aas_core_codegen/typescript/verification/_generate.py +1578 -0
  224. aas_core_codegen/xsd/__init__.py +1 -0
  225. aas_core_codegen/xsd/main.py +1187 -0
  226. aas_core_codegen/xsd/naming.py +83 -0
  227. aas_core_codegen/yielding/__init__.py +1 -0
  228. aas_core_codegen/yielding/flow.py +139 -0
  229. aas_core_codegen/yielding/linear.py +754 -0
  230. aas_core_codegen-0.0.16.dist-info/METADATA +211 -0
  231. aas_core_codegen-0.0.16.dist-info/RECORD +604 -0
  232. aas_core_codegen-0.0.16.dist-info/WHEEL +5 -0
  233. aas_core_codegen-0.0.16.dist-info/entry_points.txt +3 -0
  234. aas_core_codegen-0.0.16.dist-info/licenses/AUTHORS +9 -0
  235. aas_core_codegen-0.0.16.dist-info/licenses/LICENSE +23 -0
  236. aas_core_codegen-0.0.16.dist-info/top_level.txt +2 -0
  237. dev/continuous_integration/__init__.py +1 -0
  238. dev/continuous_integration/check_help_in_readme.py +208 -0
  239. dev/continuous_integration/check_init_and_pyproject_consistent.py +154 -0
  240. dev/continuous_integration/precommit.py +400 -0
  241. dev/dev_scripts/__init__.py +1 -0
  242. dev/dev_scripts/compare_rendered_regexes_against_source_py.py +42 -0
  243. dev/dev_scripts/copy_to_aas_core3_cpp.py +100 -0
  244. dev/dev_scripts/copy_to_aas_core3_java.py +90 -0
  245. dev/dev_scripts/download_latest_aas_core_meta_v3.py +114 -0
  246. dev/dev_scripts/draw_bipartite_graph_based_on_lines.py +37 -0
  247. dev/dev_scripts/run_tests_with_rerecord.py +69 -0
  248. dev/dev_scripts/update_to_aas_core_meta.py +174 -0
  249. dev/integration_tests/input/jsonschema/boilerplate/main.py +55 -0
  250. dev/integration_tests/input/meta_model.py +38 -0
  251. dev/integration_tests/input/python/boilerplate/main.py +153 -0
  252. dev/integration_tests/main.py +258 -0
  253. dev/test_data/csharp/test_structure/concrete_class_with_descendants/meta_model.py +15 -0
  254. dev/test_data/csharp/test_structure/constructor_without_arguments/all_properties_optional/meta_model.py +9 -0
  255. dev/test_data/csharp/test_structure/constructor_without_arguments/no_properties/meta_model.py +6 -0
  256. dev/test_data/csharp/test_verification/builtin_functions/len/on_list/meta_model.py +20 -0
  257. dev/test_data/csharp/test_verification/builtin_functions/len/on_str/meta_model.py +16 -0
  258. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/as_prefix/meta_model.py +8 -0
  259. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/as_suffix/meta_model.py +8 -0
  260. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_group_with_quantifier/meta_model.py +8 -0
  261. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_the_middle/meta_model.py +8 -0
  262. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_union/meta_model.py +8 -0
  263. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/single_utf32_literal/meta_model.py +8 -0
  264. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/with_quantifier_within_group/meta_model.py +8 -0
  265. dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/with_quantifier_without_group/meta_model.py +8 -0
  266. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/at_the_beginning/meta_model.py +8 -0
  267. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/at_the_end/meta_model.py +8 -0
  268. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/in_the_middle/meta_model.py +8 -0
  269. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/multiple/meta_model.py +8 -0
  270. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/single/meta_model.py +8 -0
  271. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/single_with_quantifier/meta_model.py +8 -0
  272. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/mixed_with_non_utf32/meta_model.py +8 -0
  273. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/more_than_two_high_surrogates/meta_model.py +8 -0
  274. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/multiple_utf32_ranges/meta_model.py +8 -0
  275. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/multiple_utf32_ranges_mixed_with_non_utf32/meta_model.py +8 -0
  276. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/same_high_surrogate/meta_model.py +8 -0
  277. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/same_high_surrogate_with_quantifier/meta_model.py +8 -0
  278. dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/two_high_surrogates/meta_model.py +8 -0
  279. dev/test_data/intermediate/expected/class/empty/meta_model.py +6 -0
  280. dev/test_data/intermediate/expected/class/implementation_specific_method/meta_model.py +8 -0
  281. dev/test_data/intermediate/expected/class/inheritance/meta_model.py +41 -0
  282. dev/test_data/intermediate/expected/class/methods_with_contracts/meta_model.py +15 -0
  283. dev/test_data/intermediate/expected/class/only_method_no_property/meta_model.py +7 -0
  284. dev/test_data/intermediate/expected/class/only_property_no_method/meta_model.py +9 -0
  285. dev/test_data/intermediate/expected/constant/constant_set/of_enum/meta_model.py +12 -0
  286. dev/test_data/intermediate/expected/constant/constant_set/of_str/meta_model.py +4 -0
  287. dev/test_data/intermediate/expected/constant/constant_set/with_description/meta_model.py +6 -0
  288. dev/test_data/intermediate/expected/constant/constant_set/with_superset_of/meta_model.py +14 -0
  289. dev/test_data/intermediate/expected/constant/constant_str/only_value/meta_model.py +7 -0
  290. dev/test_data/intermediate/expected/constant/constant_str/with_description/meta_model.py +5 -0
  291. dev/test_data/intermediate/expected/documentation/docstring_with_special_characters_in_literal/meta_model.py +20 -0
  292. dev/test_data/intermediate/expected/documentation/docstring_with_special_characters_outside_literal/meta_model.py +20 -0
  293. dev/test_data/intermediate/expected/empty/meta_model.py +2 -0
  294. dev/test_data/intermediate/expected/enumeration/meta_model.py +9 -0
  295. dev/test_data/intermediate/expected/interface/basic/meta_model.py +14 -0
  296. dev/test_data/intermediate/expected/interface/empty/meta_model.py +7 -0
  297. dev/test_data/intermediate/expected/interface/inheritance/meta_model.py +27 -0
  298. dev/test_data/intermediate/expected/interface/method_signature/meta_model.py +10 -0
  299. dev/test_data/intermediate/expected/interface/only_constructor/meta_model.py +11 -0
  300. dev/test_data/intermediate/expected/method/non_mutating/implementation_specific/meta_model.py +12 -0
  301. dev/test_data/intermediate/expected/method/non_mutating/understood/meta_model.py +11 -0
  302. dev/test_data/intermediate/expected/type_annotation/atomic/meta_model.py +9 -0
  303. dev/test_data/intermediate/expected/type_annotation/subscripted/class/meta_model.py +13 -0
  304. dev/test_data/intermediate/expected/type_annotation/subscripted/primitive/meta_model.py +9 -0
  305. dev/test_data/intermediate/unexpected/constant_set/of_enum/enumeration_literals_in_subset_outside_of_superset/meta_model.py +20 -0
  306. dev/test_data/intermediate/unexpected/constant_set/of_enum/invalid_literal/meta_model.py +11 -0
  307. dev/test_data/intermediate/unexpected/constant_set/of_enum/mismatch_between_enumeration_and_literal/meta_model.py +30 -0
  308. dev/test_data/intermediate/unexpected/constant_set/of_enum/mismatch_in_enumerations_between_subset_and_superset/meta_model.py +21 -0
  309. dev/test_data/intermediate/unexpected/constant_set/of_str/literals_in_subset_outside_of_superset/meta_model.py +18 -0
  310. dev/test_data/intermediate/unexpected/constant_set/of_str/mismatch_between_type_annotation_and_literals/meta_model.py +10 -0
  311. dev/test_data/intermediate/unexpected/constant_set/of_str/superset_and_subset_mismatch_in_type/meta_model.py +12 -0
  312. dev/test_data/intermediate/unexpected/constraints/dangling_constraintref/meta_model.py +18 -0
  313. dev/test_data/intermediate/unexpected/constraints/duplicate_constraints/meta_model.py +20 -0
  314. dev/test_data/intermediate/unexpected/documentation/unexpected_documentation_elements/meta_model.py +34 -0
  315. dev/test_data/intermediate/unexpected/invariant/class_invariant_uses_re/meta_model.py +10 -0
  316. dev/test_data/intermediate/unexpected/invariant/invariant_of_constrained_primitive_uses_re/meta_model.py +7 -0
  317. dev/test_data/intermediate/unexpected/invariant/unexpected_argument_count_to_len/meta_model.py +20 -0
  318. dev/test_data/intermediate/unexpected/invariant/unhandled_built_in_function/meta_model.py +16 -0
  319. dev/test_data/intermediate/unexpected/method_definitions/non_constant_default/meta_model.py +7 -0
  320. dev/test_data/intermediate/unexpected/optional_constructor_arguments_wo_default/default_non_none/meta_model.py +16 -0
  321. dev/test_data/intermediate/unexpected/optional_constructor_arguments_wo_default/no_default/meta_model.py +16 -0
  322. dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/after_inheritance/meta_model.py +58 -0
  323. dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/type_missmatch/meta_model.py +9 -0
  324. dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/within_class/meta_model.py +22 -0
  325. dev/test_data/jsonschema/test_main/regression_when_len_constraints_on_inherited_property/meta_model.py +28 -0
  326. dev/test_data/opcua/test_main/abstract_and_concrete_classes/meta_model.py +37 -0
  327. dev/test_data/opcua/test_main/classes_with_invariants/meta_model.py +21 -0
  328. dev/test_data/opcua/test_main/concrete_class_with_descendant/meta_model.py +27 -0
  329. dev/test_data/opcua/test_main/concrete_class_with_enum/meta_model.py +21 -0
  330. dev/test_data/opcua/test_main/concrete_class_with_list_of_instances/meta_model.py +21 -0
  331. dev/test_data/opcua/test_main/concrete_class_with_primitive_attributes/meta_model.py +41 -0
  332. dev/test_data/opcua/test_main/concrete_class_with_string/meta_model.py +13 -0
  333. dev/test_data/opcua/test_main/constrained_primitive/meta_model.py +20 -0
  334. dev/test_data/opcua/test_main/multiple_inheritance/meta_model.py +25 -0
  335. dev/test_data/parse/expected/constant/constant_set/of_enum/meta_model.py +12 -0
  336. dev/test_data/parse/expected/constant/constant_set/of_str/meta_model.py +4 -0
  337. dev/test_data/parse/expected/constant/constant_set/with_description/meta_model.py +6 -0
  338. dev/test_data/parse/expected/constant/constant_set/with_superset_of/meta_model.py +14 -0
  339. dev/test_data/parse/expected/constant/constant_str/only_value/meta_model.py +7 -0
  340. dev/test_data/parse/expected/constant/constant_str/with_description/meta_model.py +5 -0
  341. dev/test_data/parse/expected/enum/ok/meta_model.py +15 -0
  342. dev/test_data/parse/expected/implementation_specific_class/properties_and_methods_in_implementation_specific_class/meta_model.py +17 -0
  343. dev/test_data/parse/expected/inheritance/basic/meta_model.py +11 -0
  344. dev/test_data/parse/expected/inheritance/diamond/meta_model.py +26 -0
  345. dev/test_data/parse/expected/inheritance/inheritance_from_concrete_class/meta_model.py +10 -0
  346. dev/test_data/parse/expected/invariants/in_relation/meta_model.py +16 -0
  347. dev/test_data/parse/expected/method/arguments/meta_model.py +7 -0
  348. dev/test_data/parse/expected/method/basic/meta_model.py +7 -0
  349. dev/test_data/parse/expected/method/contracts/condition_as_keyword_argument/meta_model.py +8 -0
  350. dev/test_data/parse/expected/method/contracts/condition_as_positional_argument/meta_model.py +8 -0
  351. dev/test_data/parse/expected/method/contracts/description_as_keyword_argument/meta_model.py +8 -0
  352. dev/test_data/parse/expected/method/contracts/description_as_positional_argument/meta_model.py +8 -0
  353. dev/test_data/parse/expected/method/contracts/multiple_contracts_in_order/meta_model.py +17 -0
  354. dev/test_data/parse/expected/method/contracts/postcondition/basic/meta_model.py +10 -0
  355. dev/test_data/parse/expected/method/contracts/postcondition/snapshot/with_keyword_arguments/meta_model.py +9 -0
  356. dev/test_data/parse/expected/method/contracts/postcondition/snapshot/with_positional_arguments/meta_model.py +9 -0
  357. dev/test_data/parse/expected/method/default/meta_model.py +9 -0
  358. dev/test_data/parse/expected/method/description/meta_model.py +8 -0
  359. dev/test_data/parse/expected/method/is_implementation_specific/meta_model.py +8 -0
  360. dev/test_data/parse/expected/method/non_mutating/meta_model.py +11 -0
  361. dev/test_data/parse/expected/method/returns_none/meta_model.py +7 -0
  362. dev/test_data/parse/expected/method/returns_something/meta_model.py +7 -0
  363. dev/test_data/parse/expected/single_class/description/meta_model.py +12 -0
  364. dev/test_data/parse/expected/single_class/empty/meta_model.py +6 -0
  365. dev/test_data/parse/expected/single_class/property/description/meta_model.py +14 -0
  366. dev/test_data/parse/expected/single_class/property/mandatory/meta_model.py +6 -0
  367. dev/test_data/parse/expected/single_class/property/optional/meta_model.py +6 -0
  368. dev/test_data/parse/expected/single_class/property/recursion_to_entity/meta_model.py +6 -0
  369. dev/test_data/parse/unexpected/class_decorators/non_name_decorator/meta_model.py +7 -0
  370. dev/test_data/parse/unexpected/class_decorators/unknown_decorator/meta_model.py +7 -0
  371. dev/test_data/parse/unexpected/class_definitions/is_abstract_and_implementation_specific/meta_model.py +8 -0
  372. dev/test_data/parse/unexpected/class_definitions/unexpected_docstring_before_a_method/meta_model.py +11 -0
  373. dev/test_data/parse/unexpected/class_definitions/unexpected_docstring_for_a_pass/meta_model.py +9 -0
  374. dev/test_data/parse/unexpected/class_definitions/unexpected_double_description_for_a_property/meta_model.py +10 -0
  375. dev/test_data/parse/unexpected/class_inheritances/inheriting_from_implementation_specific_parent/meta_model.py +20 -0
  376. dev/test_data/parse/unexpected/class_inheritances/non_name_super_class/meta_model.py +6 -0
  377. dev/test_data/parse/unexpected/enum/expression_as_assignment_value/meta_model.py +6 -0
  378. dev/test_data/parse/unexpected/enum/non_assignment/meta_model.py +8 -0
  379. dev/test_data/parse/unexpected/enum/non_string_literal/meta_model.py +6 -0
  380. dev/test_data/parse/unexpected/enum/unexpected_inheritance/meta_model.py +6 -0
  381. dev/test_data/parse/unexpected/method_contracts/contract/non_lambda_condition/meta_model.py +8 -0
  382. dev/test_data/parse/unexpected/method_contracts/contract/non_string_literal_description/meta_model.py +8 -0
  383. dev/test_data/parse/unexpected/method_contracts/contract/without_any_arguments/meta_model.py +8 -0
  384. dev/test_data/parse/unexpected/method_contracts/contract/without_condition/meta_model.py +8 -0
  385. dev/test_data/parse/unexpected/method_contracts/postcondition/OLD_in_postcondition_without_snapshot/meta_model.py +8 -0
  386. dev/test_data/parse/unexpected/method_contracts/postcondition/argument_missing_in_function/meta_model.py +8 -0
  387. dev/test_data/parse/unexpected/method_contracts/precondition/argument_missing_in_function/meta_model.py +8 -0
  388. dev/test_data/parse/unexpected/method_contracts/snapshot/argument_missing_in_function/meta_model.py +8 -0
  389. dev/test_data/parse/unexpected/method_contracts/snapshot/capture_not_a_lambda/meta_model.py +8 -0
  390. dev/test_data/parse/unexpected/method_contracts/snapshot/invalid_name/meta_model.py +8 -0
  391. dev/test_data/parse/unexpected/method_contracts/snapshot/name_not_a_string_literal/meta_model.py +8 -0
  392. dev/test_data/parse/unexpected/method_contracts/snapshot/without_a_capture/meta_model.py +8 -0
  393. dev/test_data/parse/unexpected/method_contracts/snapshot/without_a_name/meta_model.py +8 -0
  394. dev/test_data/parse/unexpected/method_decorators/non_mutating/non_mutating_constructor/meta_model.py +8 -0
  395. dev/test_data/parse/unexpected/method_decorators/non_mutating/non_mutating_verification_function/meta_model.py +8 -0
  396. dev/test_data/parse/unexpected/method_decorators/non_name_decorator/meta_model.py +8 -0
  397. dev/test_data/parse/unexpected/method_decorators/unknown_call_decorator/meta_model.py +8 -0
  398. dev/test_data/parse/unexpected/method_decorators/unknown_name_decorator/meta_model.py +8 -0
  399. dev/test_data/parse/unexpected/method_definitions/argument_with_final/meta_model.py +7 -0
  400. dev/test_data/parse/unexpected/method_definitions/argument_without_a_type_annotation/meta_model.py +7 -0
  401. dev/test_data/parse/unexpected/method_definitions/default_for_self/meta_model.py +7 -0
  402. dev/test_data/parse/unexpected/method_definitions/dunder/meta_model.py +7 -0
  403. dev/test_data/parse/unexpected/method_definitions/init_with_return_type/meta_model.py +7 -0
  404. dev/test_data/parse/unexpected/method_definitions/with_keyword_only_arguments/meta_model.py +7 -0
  405. dev/test_data/parse/unexpected/method_definitions/with_positional_arguments/meta_model.py +7 -0
  406. dev/test_data/parse/unexpected/method_definitions/with_type_annotation_for_self/meta_model.py +7 -0
  407. dev/test_data/parse/unexpected/method_definitions/with_variable_arguments/meta_model.py +7 -0
  408. dev/test_data/parse/unexpected/method_definitions/with_variable_keyword_arguments/meta_model.py +7 -0
  409. dev/test_data/parse/unexpected/method_definitions/without_arguments/meta_model.py +7 -0
  410. dev/test_data/parse/unexpected/method_definitions/without_self/meta_model.py +7 -0
  411. dev/test_data/parse/unexpected/method_definitions/without_type_annotation_for_result/meta_model.py +7 -0
  412. dev/test_data/parse/unexpected/property_definitions/final_without_subscript/meta_model.py +6 -0
  413. dev/test_data/parse/unexpected/property_definitions/nested_final/meta_model.py +6 -0
  414. dev/test_data/parse/unexpected/property_definitions/non_simple/meta_model.py +6 -0
  415. dev/test_data/parse/unexpected/property_definitions/unexpected_assignment/meta_model.py +6 -0
  416. dev/test_data/parse/unexpected/property_definitions/unexpected_non_name_property/meta_model.py +6 -0
  417. dev/test_data/parse/unexpected/property_definitions/without_type_annotation/meta_model.py +6 -0
  418. dev/test_data/parse/unexpected/symbol_table/constant_set_with_a_non_set_subset/meta_model.py +6 -0
  419. dev/test_data/parse/unexpected/symbol_table/dangling_inheritance/meta_model.py +6 -0
  420. dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_a_property/meta_model.py +6 -0
  421. dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_an_argument/meta_model.py +7 -0
  422. dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_constant_set/meta_model.py +6 -0
  423. dev/test_data/parse/unexpected/symbol_table/dangling_subset_in_constant_set/meta_model.py +4 -0
  424. dev/test_data/parse/unexpected/symbol_table/inheritance_from_non_class/meta_model.py +10 -0
  425. dev/test_data/parse_retree/expected/character_set/common_escaping/source.py +1 -0
  426. dev/test_data/parse_retree/expected/character_set/complementing/double_caret/source.py +1 -0
  427. dev/test_data/parse_retree/expected/character_set/complementing/multiple_ranges/source.py +1 -0
  428. dev/test_data/parse_retree/expected/character_set/complementing/suffix_dash/source.py +1 -0
  429. dev/test_data/parse_retree/expected/character_set/escape_first_caret/source.py +1 -0
  430. dev/test_data/parse_retree/expected/character_set/literals_which_need_no_escaping_in_characters_set_but_need_escaping_outside/source.py +1 -0
  431. dev/test_data/parse_retree/expected/character_set/multiple_ranges/source.py +1 -0
  432. dev/test_data/parse_retree/expected/character_set/single_literal/source.py +1 -0
  433. dev/test_data/parse_retree/expected/character_set/single_range/source.py +1 -0
  434. dev/test_data/parse_retree/expected/character_set/unescaped_dash/only_dash/source.py +1 -0
  435. dev/test_data/parse_retree/expected/character_set/unescaped_dash/prefix_dash/source.py +1 -0
  436. dev/test_data/parse_retree/expected/character_set/unescaped_dash/suffix_dash/source.py +1 -0
  437. dev/test_data/parse_retree/expected/dot/source.py +1 -0
  438. dev/test_data/parse_retree/expected/empty/group/source.py +1 -0
  439. dev/test_data/parse_retree/expected/empty/group_in_a_group/source.py +1 -0
  440. dev/test_data/parse_retree/expected/empty/group_of_union_of_empty_concatenations/source.py +1 -0
  441. dev/test_data/parse_retree/expected/empty/regex/source.py +1 -0
  442. dev/test_data/parse_retree/expected/empty/union_of_empty_concatenations/source.py +1 -0
  443. dev/test_data/parse_retree/expected/escaped_literals/source.py +1 -0
  444. dev/test_data/parse_retree/expected/formatted_value/at_the_beginning/source.py +1 -0
  445. dev/test_data/parse_retree/expected/formatted_value/at_the_end/source.py +1 -0
  446. dev/test_data/parse_retree/expected/formatted_value/in_the_middle/source.py +1 -0
  447. dev/test_data/parse_retree/expected/formatted_value/single_formatted_value/source.py +1 -0
  448. dev/test_data/parse_retree/expected/literal/source.py +1 -0
  449. dev/test_data/parse_retree/expected/quantifier/greedy/at_least_3/source.py +1 -0
  450. dev/test_data/parse_retree/expected/quantifier/greedy/at_least_one/source.py +1 -0
  451. dev/test_data/parse_retree/expected/quantifier/greedy/at_most_3/source.py +1 -0
  452. dev/test_data/parse_retree/expected/quantifier/greedy/exactly_3/source.py +1 -0
  453. dev/test_data/parse_retree/expected/quantifier/greedy/maybe/source.py +1 -0
  454. dev/test_data/parse_retree/expected/quantifier/greedy/zero_or_more/source.py +1 -0
  455. dev/test_data/parse_retree/expected/quantifier/non_greedy/at_least_3/source.py +1 -0
  456. dev/test_data/parse_retree/expected/quantifier/non_greedy/at_least_one/source.py +1 -0
  457. dev/test_data/parse_retree/expected/quantifier/non_greedy/at_most_3/source.py +1 -0
  458. dev/test_data/parse_retree/expected/quantifier/non_greedy/exactly_3/source.py +1 -0
  459. dev/test_data/parse_retree/expected/quantifier/non_greedy/maybe/source.py +1 -0
  460. dev/test_data/parse_retree/expected/quantifier/non_greedy/zero_or_more/source.py +1 -0
  461. dev/test_data/parse_retree/expected/quantifier/on_a_character_set/source.py +1 -0
  462. dev/test_data/parse_retree/expected/quantifier/on_a_formatted_value/source.py +1 -0
  463. dev/test_data/parse_retree/expected/quantifier/on_a_group/source.py +1 -0
  464. dev/test_data/parse_retree/expected/quantifier/on_a_literal/source.py +1 -0
  465. dev/test_data/parse_retree/expected/start_and_stop_symbols/double_end_symbol/source.py +1 -0
  466. dev/test_data/parse_retree/expected/start_and_stop_symbols/double_start_symbol/source.py +1 -0
  467. dev/test_data/parse_retree/expected/start_and_stop_symbols/end_symbol_in_the_middle/source.py +1 -0
  468. dev/test_data/parse_retree/expected/start_and_stop_symbols/only_start_symbol/source.py +1 -0
  469. dev/test_data/parse_retree/expected/start_and_stop_symbols/only_stop_symbol/source.py +1 -0
  470. dev/test_data/parse_retree/expected/start_and_stop_symbols/start_symbol_at_the_beginning/source.py +1 -0
  471. dev/test_data/parse_retree/expected/start_and_stop_symbols/start_symbol_in_the_middle/source.py +1 -0
  472. dev/test_data/parse_retree/expected/start_and_stop_symbols/stop_symbol_at_the_end/source.py +1 -0
  473. dev/test_data/parse_retree/expected/union/of_character_sets/source.py +1 -0
  474. dev/test_data/parse_retree/expected/union/of_groups/source.py +1 -0
  475. dev/test_data/parse_retree/expected/union/of_string_literals/source.py +1 -0
  476. dev/test_data/parse_retree/expected/union/within_group/source.py +1 -0
  477. dev/test_data/parse_retree/expected/whitespace/source.py +1 -0
  478. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/Uxxxxxxxx_out_of_range/source.py +1 -0
  479. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/only_backslash/source.py +1 -0
  480. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_Uxxxxxxxx/source.py +1 -0
  481. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_uxxxx/source.py +1 -0
  482. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_x/source.py +1 -0
  483. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unexpected_escaping/source.py +1 -0
  484. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/digit/source.py +1 -0
  485. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_digit/source.py +1 -0
  486. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_whitespace/source.py +1 -0
  487. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_word/source.py +1 -0
  488. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/whitespace/source.py +1 -0
  489. dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/word/source.py +1 -0
  490. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/Uxxxxxxxx_out_of_range/source.py +1 -0
  491. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/only_backslash/source.py +1 -0
  492. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_Uxxxxxxxx/source.py +1 -0
  493. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_uxxxx/source.py +1 -0
  494. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_x/source.py +1 -0
  495. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unexpected_escaping/source.py +1 -0
  496. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/digit/source.py +1 -0
  497. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_digit/source.py +1 -0
  498. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_whitespace/source.py +1 -0
  499. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_word/source.py +1 -0
  500. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/whitespace/source.py +1 -0
  501. dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/word/source.py +1 -0
  502. dev/test_data/parse_retree/unexpected/invalid_character_range/source.py +1 -0
  503. dev/test_data/parse_retree/unexpected/invalid_quantifier/at_least_x/source.py +1 -0
  504. dev/test_data/parse_retree/unexpected/invalid_quantifier/between_3_and_x/source.py +1 -0
  505. dev/test_data/parse_retree/unexpected/invalid_quantifier/exactly_x/source.py +1 -0
  506. dev/test_data/parse_retree/unexpected/unhandled_group_directives/source.py +1 -0
  507. dev/test_data/parse_retree/unexpected/unterminated/character_set/source.py +1 -0
  508. dev/test_data/parse_retree/unexpected/unterminated/group/source.py +1 -0
  509. dev/test_data/parse_retree/unexpected/unterminated/group_of_union_of_empty_concatenations/source.py +1 -0
  510. dev/test_data/parse_retree/unexpected/unterminated/quantifier/source.py +1 -0
  511. dev/test_data/parse_retree/unexpected/unterminated/quantifier_with_comma/source.py +1 -0
  512. dev/test_data/parse_retree/unexpected/unterminated/quantifier_with_number_and_comma/source.py +1 -0
  513. dev/test_data/proto/test_main/expected/abstract_and_concrete_classes/meta_model.py +37 -0
  514. dev/test_data/proto/test_main/expected/concrete_class_with_descendants/meta_model.py +30 -0
  515. dev/test_data/proto/test_main/expected/concrete_class_with_enum/meta_model.py +21 -0
  516. dev/test_data/proto/test_main/expected/concrete_class_with_list_of_instances/meta_model.py +21 -0
  517. dev/test_data/proto/test_main/expected/concrete_class_with_primitive_attributes/meta_model.py +41 -0
  518. dev/test_data/python_protobuf/test_main/abstract_and_concrete_classes/expected_output/pbization.py +532 -0
  519. dev/test_data/python_protobuf/test_main/abstract_and_concrete_classes/meta_model.py +37 -0
  520. dev/test_data/python_protobuf/test_main/concrete_class_with_descendant/expected_output/pbization.py +527 -0
  521. dev/test_data/python_protobuf/test_main/concrete_class_with_descendant/meta_model.py +27 -0
  522. dev/test_data/python_protobuf/test_main/concrete_class_with_enum/expected_output/pbization.py +290 -0
  523. dev/test_data/python_protobuf/test_main/concrete_class_with_enum/meta_model.py +21 -0
  524. dev/test_data/python_protobuf/test_main/concrete_class_with_list_of_instances/expected_output/pbization.py +328 -0
  525. dev/test_data/python_protobuf/test_main/concrete_class_with_list_of_instances/meta_model.py +23 -0
  526. dev/test_data/python_protobuf/test_main/concrete_class_with_primitive_attributes/expected_output/pbization.py +274 -0
  527. dev/test_data/python_protobuf/test_main/concrete_class_with_primitive_attributes/meta_model.py +41 -0
  528. dev/test_data/rdf_shacl/test_main/expected/regression_when_lang_string_class_is_missing/meta_model.py +29 -0
  529. dev/test_data/rdf_shacl/test_main/expected/regression_when_len_constraints_on_inherited_property/meta_model.py +27 -0
  530. dev/test_data/rdf_shacl/test_main/unexpected/regression_len_constraint_on_class_property/meta_model.py +61 -0
  531. dev/test_data/real_meta_models/aas_core_meta.v3.py +5721 -0
  532. dev/test_data/smoke/test_main/unexpected/infer_for_schema_error/meta_model.py +12 -0
  533. dev/test_data/smoke/test_main/unexpected/intermediate_error/meta_model.py +18 -0
  534. dev/test_data/smoke/test_main/unexpected/parse_error/meta_model.py +5 -0
  535. dev/test_data/smoke/test_main/unexpected/pattern_verification_unparsable_regex/direct_match/meta_model.py +8 -0
  536. dev/test_data/smoke/test_main/unexpected/type_error/meta_model.py +18 -0
  537. dev/tests/__init__.py +1 -0
  538. dev/tests/common.py +197 -0
  539. dev/tests/cpp/__init__.py +0 -0
  540. dev/tests/cpp/test_common.py +32 -0
  541. dev/tests/cpp/test_main.py +144 -0
  542. dev/tests/cpp/test_pattern.py +188 -0
  543. dev/tests/cpp/test_verification.py +189 -0
  544. dev/tests/cpp/test_yielding.py +225 -0
  545. dev/tests/csharp/__init__.py +0 -0
  546. dev/tests/csharp/live_test_main.py +109 -0
  547. dev/tests/csharp/test_common.py +28 -0
  548. dev/tests/csharp/test_description.py +684 -0
  549. dev/tests/csharp/test_main.py +129 -0
  550. dev/tests/csharp/test_structure.py +93 -0
  551. dev/tests/csharp/test_verification.py +82 -0
  552. dev/tests/description.py +29 -0
  553. dev/tests/golang/__init__.py +0 -0
  554. dev/tests/golang/test_common.py +78 -0
  555. dev/tests/golang/test_main.py +128 -0
  556. dev/tests/infer_for_schema/__init__.py +0 -0
  557. dev/tests/infer_for_schema/common.py +47 -0
  558. dev/tests/infer_for_schema/test_len_on_properties.py +955 -0
  559. dev/tests/infer_for_schema/test_len_on_self.py +580 -0
  560. dev/tests/infer_for_schema/test_patterns_on_properties.py +686 -0
  561. dev/tests/infer_for_schema/test_patterns_on_self.py +258 -0
  562. dev/tests/infer_for_schema/test_property_in_set_of_enumeration_literals.py +600 -0
  563. dev/tests/infer_for_schema/test_property_in_set_of_primitives.py +549 -0
  564. dev/tests/intermediate/__init__.py +0 -0
  565. dev/tests/intermediate/test_constructor.py +719 -0
  566. dev/tests/intermediate/test_hierarchy.py +221 -0
  567. dev/tests/intermediate/test_revm.py +134 -0
  568. dev/tests/intermediate/test_translate.py +337 -0
  569. dev/tests/intermediate/test_type_inference.py +333 -0
  570. dev/tests/intermediate/test_types.py +169 -0
  571. dev/tests/java/__init__.py +0 -0
  572. dev/tests/java/test_common.py +20 -0
  573. dev/tests/java/test_description.py +128 -0
  574. dev/tests/java/test_main.py +234 -0
  575. dev/tests/jsonld_context/test_main.py +79 -0
  576. dev/tests/opcua/__init__.py +3 -0
  577. dev/tests/opcua/test_main.py +110 -0
  578. dev/tests/our_jsonschema/__init__.py +3 -0
  579. dev/tests/our_jsonschema/test_main.py +232 -0
  580. dev/tests/parse/__init__.py +0 -0
  581. dev/tests/parse/test_parse.py +503 -0
  582. dev/tests/parse/test_retree.py +272 -0
  583. dev/tests/proto/__init__.py +0 -0
  584. dev/tests/proto/test_main.py +112 -0
  585. dev/tests/python/__init__.py +0 -0
  586. dev/tests/python/test_common.py +124 -0
  587. dev/tests/python/test_main.py +126 -0
  588. dev/tests/python/test_xml_playground.py +254 -0
  589. dev/tests/python_protobuf/__init__.py +0 -0
  590. dev/tests/python_protobuf/test_main.py +111 -0
  591. dev/tests/rdf_shacl/__init__.py +0 -0
  592. dev/tests/rdf_shacl/test_common.py +32 -0
  593. dev/tests/rdf_shacl/test_description.py +223 -0
  594. dev/tests/rdf_shacl/test_main.py +194 -0
  595. dev/tests/smoke/__init__.py +0 -0
  596. dev/tests/smoke/test_main.py +83 -0
  597. dev/tests/test_common.py +94 -0
  598. dev/tests/typescript/__init__.py +0 -0
  599. dev/tests/typescript/test_common.py +108 -0
  600. dev/tests/typescript/test_main.py +125 -0
  601. dev/tests/xsd/__init__.py +0 -0
  602. dev/tests/xsd/test_main.py +227 -0
  603. dev/tests/yielding/__init__.py +0 -0
  604. dev/tests/yielding/test_linear.py +558 -0
@@ -0,0 +1,693 @@
1
+ """Merge constrained primitives as property constraints."""
2
+ import collections
3
+ from typing import Tuple, Optional, List, Mapping, MutableMapping, Sequence
4
+
5
+ from icontract import ensure
6
+
7
+ from aas_core_codegen import intermediate
8
+ from aas_core_codegen.common import Error
9
+ from aas_core_codegen.infer_for_schema import (
10
+ _len as infer_for_schema_len,
11
+ _pattern as infer_for_schema_pattern,
12
+ _set as infer_for_schema_set,
13
+ )
14
+ from aas_core_codegen.infer_for_schema._types import (
15
+ ConstraintsByProperty,
16
+ LenConstraint,
17
+ PatternConstraint,
18
+ SetOfPrimitivesConstraint,
19
+ SetOfEnumerationLiteralsConstraint,
20
+ )
21
+
22
+
23
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
24
+ def _infer_len_constraints_by_constrained_primitive(
25
+ symbol_table: intermediate.SymbolTable,
26
+ ) -> Tuple[
27
+ Optional[MutableMapping[intermediate.ConstrainedPrimitive, LenConstraint]],
28
+ Optional[List[Error]],
29
+ ]:
30
+ """Infer the constraints on ``len(.)`` of the constrained primitives."""
31
+
32
+ # NOTE (mristin, 2022-02-11):
33
+ # We do this inference in two passes. In the first pass, we only infer
34
+ # the constraints defined for the constrained primitive and ignore the ancestors.
35
+ # In the second pass, we stack the constraints of the ancestors as well.
36
+
37
+ errors = [] # type: List[Error]
38
+
39
+ first_pass: MutableMapping[
40
+ intermediate.ConstrainedPrimitive, LenConstraint
41
+ ] = collections.OrderedDict()
42
+
43
+ for constrained_primitive in symbol_table.constrained_primitives:
44
+ (
45
+ len_constraint,
46
+ len_constraint_errors,
47
+ ) = infer_for_schema_len.infer_len_constraint_of_self(
48
+ constrained_primitive=constrained_primitive
49
+ )
50
+
51
+ if len_constraint_errors is not None:
52
+ errors.extend(len_constraint_errors)
53
+ else:
54
+ assert len_constraint is not None
55
+
56
+ first_pass[constrained_primitive] = len_constraint
57
+
58
+ if len(errors) > 0:
59
+ return None, errors
60
+
61
+ second_pass: MutableMapping[
62
+ intermediate.ConstrainedPrimitive, LenConstraint
63
+ ] = collections.OrderedDict()
64
+
65
+ for our_type in symbol_table.our_types_topologically_sorted:
66
+ if isinstance(our_type, intermediate.ConstrainedPrimitive):
67
+ # NOTE (mristin, 2022-02-11):
68
+ # We make the copy in order to avoid bugs when we start processing
69
+ # the inheritances.
70
+ len_constraint = first_pass[our_type].copy()
71
+
72
+ for inheritance in our_type.inheritances:
73
+ inherited_len_constraint = second_pass.get(inheritance, None)
74
+ assert (
75
+ inherited_len_constraint is not None
76
+ ), "Expected topological order"
77
+
78
+ if inherited_len_constraint.min_value is not None:
79
+ len_constraint.min_value = (
80
+ max(
81
+ len_constraint.min_value, inherited_len_constraint.min_value
82
+ )
83
+ if len_constraint.min_value is not None
84
+ else inherited_len_constraint.min_value
85
+ )
86
+
87
+ if inherited_len_constraint.max_value is not None:
88
+ len_constraint.max_value = (
89
+ min(
90
+ len_constraint.max_value, inherited_len_constraint.max_value
91
+ )
92
+ if len_constraint.max_value is not None
93
+ else inherited_len_constraint.max_value
94
+ )
95
+
96
+ second_pass[our_type] = len_constraint
97
+
98
+ assert len(errors) == 0
99
+ return second_pass, None
100
+
101
+
102
+ def _infer_pattern_constraints_by_constrained_primitive(
103
+ symbol_table: intermediate.SymbolTable,
104
+ pattern_verifications_by_name: infer_for_schema_pattern.PatternVerificationsByName,
105
+ ) -> MutableMapping[intermediate.ConstrainedPrimitive, List[PatternConstraint]]:
106
+ """Infer the pattern constraints of the constrained strings."""
107
+
108
+ # NOTE (mristin, 2022-02-11):
109
+ # We do this inference in two passes. In the first pass, we only infer
110
+ # the constraints defined for the constrained primitive and ignore the ancestors.
111
+ # In the second pass, we stack the constraints of the ancestors as well.
112
+
113
+ first_pass: MutableMapping[
114
+ intermediate.ConstrainedPrimitive,
115
+ List[PatternConstraint],
116
+ ] = collections.OrderedDict()
117
+
118
+ for our_type in symbol_table.our_types:
119
+ if (
120
+ isinstance(our_type, intermediate.ConstrainedPrimitive)
121
+ and our_type.constrainee is intermediate.PrimitiveType.STR
122
+ ):
123
+ pattern_constraints = infer_for_schema_pattern.infer_patterns_on_self(
124
+ constrained_primitive=our_type,
125
+ pattern_verifications_by_name=pattern_verifications_by_name,
126
+ )
127
+
128
+ first_pass[our_type] = pattern_constraints
129
+
130
+ second_pass: MutableMapping[
131
+ intermediate.ConstrainedPrimitive,
132
+ List[PatternConstraint],
133
+ ] = collections.OrderedDict()
134
+
135
+ for our_type in first_pass:
136
+ # NOTE (mristin, 2022-02-11):
137
+ # We make the copy in order to avoid bugs when we start processing
138
+ # the inheritances.
139
+ pattern_constraints = first_pass[our_type][:]
140
+
141
+ for inheritance in our_type.inheritances:
142
+ assert inheritance in first_pass, (
143
+ f"We are processing the constrained primitive {our_type.name!r}. "
144
+ f"However, its parent, {inheritance.name!r}, has not been processed in "
145
+ f"the first pass. Something probably went wrong in the first pass."
146
+ )
147
+
148
+ inherited_pattern_constraints = second_pass.get(inheritance, None)
149
+ assert inherited_pattern_constraints is not None, (
150
+ f"Expected topological order. However, our type {our_type.name!r} "
151
+ f"is being processed before one of its parents, {inheritance.name!r}."
152
+ )
153
+
154
+ pattern_constraints = inherited_pattern_constraints + pattern_constraints
155
+
156
+ second_pass[our_type] = pattern_constraints
157
+
158
+ return second_pass
159
+
160
+
161
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
162
+ def infer_constraints_by_class(
163
+ symbol_table: intermediate.SymbolTable,
164
+ ) -> Tuple[
165
+ Optional[MutableMapping[intermediate.ClassUnion, ConstraintsByProperty]],
166
+ Optional[List[Error]],
167
+ ]:
168
+ """Infer the constraints from the invariants and constrained primitives."""
169
+ errors = [] # type: List[Error]
170
+
171
+ pattern_verifications_by_name = (
172
+ infer_for_schema_pattern.map_pattern_verifications_by_name(
173
+ verifications=symbol_table.verification_functions
174
+ )
175
+ )
176
+
177
+ (
178
+ len_constraints_by_constrained_primitive,
179
+ some_errors,
180
+ ) = _infer_len_constraints_by_constrained_primitive(symbol_table=symbol_table)
181
+ if some_errors is not None:
182
+ errors.extend(some_errors)
183
+
184
+ if len(errors) > 0:
185
+ return None, errors
186
+
187
+ assert len_constraints_by_constrained_primitive is not None
188
+
189
+ patterns_by_constrained_primitive = (
190
+ _infer_pattern_constraints_by_constrained_primitive(
191
+ symbol_table=symbol_table,
192
+ pattern_verifications_by_name=pattern_verifications_by_name,
193
+ )
194
+ )
195
+
196
+ result: MutableMapping[
197
+ intermediate.ClassUnion, ConstraintsByProperty
198
+ ] = collections.OrderedDict()
199
+
200
+ for cls in symbol_table.classes:
201
+ # region Infer constraints on ``len(.)``
202
+
203
+ len_constraints_by_property: MutableMapping[
204
+ intermediate.Property, LenConstraint
205
+ ] = collections.OrderedDict()
206
+
207
+ (
208
+ len_constraints_from_invariants,
209
+ len_constraints_errors,
210
+ ) = infer_for_schema_len.len_constraints_from_invariants(cls=cls)
211
+
212
+ if len_constraints_errors is not None:
213
+ errors.extend(len_constraints_errors)
214
+ continue
215
+
216
+ assert len_constraints_from_invariants is not None
217
+
218
+ patterns_by_property: MutableMapping[
219
+ intermediate.Property, List[PatternConstraint]
220
+ ] = collections.OrderedDict()
221
+
222
+ patterns_from_invariants_by_property = (
223
+ infer_for_schema_pattern.patterns_from_invariants(
224
+ cls=cls,
225
+ pattern_verifications_by_name=pattern_verifications_by_name,
226
+ )
227
+ )
228
+
229
+ # region Merge the length constraints
230
+
231
+ for prop in cls.properties:
232
+ # NOTE (mristin, 2022-03-03):
233
+ # We need to go beneath ``Optional`` as the constraints are applied even
234
+ # if a property is optional. In cases where cardinality is affected by
235
+ # ``Optional``, the client code needs to cover them separately.
236
+ type_anno = intermediate.beneath_optional(prop.type_annotation)
237
+
238
+ len_constraint_from_type: Optional[LenConstraint] = None
239
+
240
+ len_constraint_from_invariants = len_constraints_from_invariants.get(
241
+ prop, None
242
+ )
243
+
244
+ if (
245
+ isinstance(type_anno, intermediate.OurTypeAnnotation)
246
+ and isinstance(type_anno.our_type, intermediate.ConstrainedPrimitive)
247
+ # NOTE (mristin, 2023-02-06):
248
+ # We infer constraints for constrained primitives only for
249
+ # the class that defines the property, and skip these constraints
250
+ # in the descendant classes. This is necessary to avoid
251
+ # unnecessary repetitions of constraints in the schemas.
252
+ #
253
+ # In case your schema engine *does not* support inheritance or other
254
+ # forms of stacking constraints over classes, see the method
255
+ # ``merge_constraints_with_ancestors``.
256
+ and prop.specified_for is cls
257
+ ):
258
+ len_constraint_from_type = len_constraints_by_constrained_primitive.get(
259
+ type_anno.our_type, None
260
+ )
261
+
262
+ # Merge the constraint from the type and from the invariants
263
+
264
+ if (
265
+ len_constraint_from_type is None
266
+ and len_constraint_from_invariants is None
267
+ ):
268
+ pass
269
+
270
+ elif (
271
+ len_constraint_from_type is not None
272
+ and len_constraint_from_invariants is None
273
+ ):
274
+ if (
275
+ len_constraint_from_type.min_value is not None
276
+ or len_constraint_from_type.max_value is not None
277
+ ):
278
+ len_constraints_by_property[prop] = len_constraint_from_type
279
+
280
+ elif (
281
+ len_constraint_from_type is None
282
+ and len_constraint_from_invariants is not None
283
+ ):
284
+ if (
285
+ len_constraint_from_invariants.min_value is not None
286
+ or len_constraint_from_invariants.max_value is not None
287
+ ):
288
+ len_constraints_by_property[prop] = len_constraint_from_invariants
289
+
290
+ elif (
291
+ len_constraint_from_type is not None
292
+ and len_constraint_from_invariants is not None
293
+ ):
294
+ # NOTE (mristin, 2022-03-02):
295
+ # We have to make the bounds *stricter* since both
296
+ # the type constraints and the invariant(s) need to be satisfied.
297
+
298
+ min_value = infer_for_schema_len.max_with_none(
299
+ len_constraint_from_type.min_value,
300
+ len_constraint_from_invariants.min_value,
301
+ )
302
+
303
+ max_value = infer_for_schema_len.min_with_none(
304
+ len_constraint_from_type.max_value,
305
+ len_constraint_from_invariants.max_value,
306
+ )
307
+
308
+ if (
309
+ min_value is not None
310
+ and max_value is not None
311
+ and min_value > max_value
312
+ ):
313
+ errors.append(
314
+ Error(
315
+ cls.parsed.node,
316
+ f"The inferred minimum and maximum value on len(.) "
317
+ f"is contradictory: "
318
+ f"minimum = {min_value}, maximum = {max_value}; "
319
+ f"please check the invariants and "
320
+ f"any involved constrained primitives",
321
+ )
322
+ )
323
+ continue
324
+
325
+ if min_value is not None or max_value is not None:
326
+ len_constraints_by_property[prop] = LenConstraint(
327
+ min_value=min_value, max_value=max_value
328
+ )
329
+
330
+ else:
331
+ raise AssertionError(
332
+ f"Unhandled case: "
333
+ f"{len_constraint_from_type=}, {len_constraint_from_invariants}"
334
+ )
335
+
336
+ # endregion
337
+
338
+ # region Infer constraints on string patterns
339
+
340
+ for prop in cls.properties:
341
+ # NOTE (mristin, 2022-03-03):
342
+ # We need to go beneath ``Optional`` as the constraints are applied even
343
+ # if a property is optional. In cases where cardinality is affected by
344
+ # ``Optional``, the client code needs to cover them separately.
345
+ type_anno = intermediate.beneath_optional(prop.type_annotation)
346
+
347
+ patterns_from_type: List[PatternConstraint] = []
348
+ patterns_from_invariants = patterns_from_invariants_by_property.get(
349
+ prop, []
350
+ )
351
+
352
+ if (
353
+ isinstance(type_anno, intermediate.OurTypeAnnotation)
354
+ and isinstance(type_anno.our_type, intermediate.ConstrainedPrimitive)
355
+ # NOTE (mristin, 2023-02-06):
356
+ # We infer constraints for constrained primitives only for
357
+ # the class that defines the property, and skip these constraints
358
+ # in the descendant classes. This is necessary to avoid
359
+ # unnecessary repetitions of constraints in the schemas.
360
+ #
361
+ # In case your schema engine *does not* support inheritance or other
362
+ # forms of stacking constraints over classes, see the method
363
+ # ``merge_constraints_with_ancestors``.
364
+ and prop.specified_for is cls
365
+ ):
366
+ patterns_from_type = patterns_by_constrained_primitive.get(
367
+ type_anno.our_type, []
368
+ )
369
+
370
+ merged = patterns_from_type + patterns_from_invariants
371
+
372
+ if len(merged) > 0:
373
+ patterns_by_property[prop] = merged
374
+
375
+ # endregion
376
+
377
+ # region Infer constraints on constant sets
378
+
379
+ # fmt: off
380
+ set_constraints, some_errors = (
381
+ infer_for_schema_set.infer_set_constraints_by_property_from_invariants(
382
+ cls=cls,
383
+ symbol_table=symbol_table
384
+ )
385
+ )
386
+ # fmt: on
387
+
388
+ if some_errors is not None:
389
+ errors.extend(some_errors)
390
+ continue
391
+
392
+ assert set_constraints is not None
393
+
394
+ # endregion
395
+
396
+ # fmt: off
397
+ result[cls] = ConstraintsByProperty(
398
+ len_constraints_by_property=len_constraints_by_property,
399
+ patterns_by_property=patterns_by_property,
400
+ set_of_primitives_by_property=set_constraints.set_of_primitives_by_property,
401
+ set_of_enumeration_literals_by_property=(
402
+ set_constraints.set_of_enumeration_literals_by_property
403
+ )
404
+ )
405
+ # fmt: on
406
+
407
+ if len(errors) > 0:
408
+ return None, errors
409
+
410
+ return result, None
411
+
412
+
413
+ @ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
414
+ def merge_constraints_with_ancestors(
415
+ symbol_table: intermediate.SymbolTable,
416
+ constraints_by_class: Mapping[intermediate.ClassUnion, ConstraintsByProperty],
417
+ ) -> Tuple[
418
+ Optional[MutableMapping[intermediate.ClassUnion, ConstraintsByProperty]],
419
+ Optional[Error],
420
+ ]:
421
+ """
422
+ Merge the constraints over all the classes with their ancestors.
423
+
424
+ Usually, when you generate a schema, you do *not* want to inherit the constraints
425
+ over the properties. Most schema engines will do that for you, and you want to be
426
+ as explicit as possible in the schema for readability (whereas merged constraints
427
+ might not be as readable, since you do not explicitly see their origin).
428
+
429
+ However, for some applications we indeed want to stack the constraints and merge
430
+ them. For example, this is the case when we (semi-)automatically generate test
431
+ data. In those cases, you should use this function.
432
+
433
+ The length constraints are merged by picking the smaller interval that fits.
434
+ Patterns are simply stacked together.
435
+ """
436
+ new_constraints_by_class: MutableMapping[
437
+ intermediate.ClassUnion, ConstraintsByProperty
438
+ ] = collections.OrderedDict()
439
+
440
+ for our_type in symbol_table.our_types_topologically_sorted:
441
+ if not isinstance(
442
+ our_type, (intermediate.AbstractClass, intermediate.ConcreteClass)
443
+ ):
444
+ continue
445
+
446
+ this_constraints_by_props = constraints_by_class[our_type]
447
+
448
+ new_len_constraints_by_property: MutableMapping[
449
+ intermediate.Property, LenConstraint
450
+ ] = collections.OrderedDict()
451
+
452
+ new_patterns_by_property: MutableMapping[
453
+ intermediate.Property, Sequence[PatternConstraint]
454
+ ] = collections.OrderedDict()
455
+
456
+ new_set_of_primitives_by_property: MutableMapping[
457
+ intermediate.Property, SetOfPrimitivesConstraint
458
+ ] = collections.OrderedDict()
459
+
460
+ new_set_of_enum_literals_by_property: MutableMapping[
461
+ intermediate.Property, SetOfEnumerationLiteralsConstraint
462
+ ] = collections.OrderedDict()
463
+
464
+ for prop in our_type.properties:
465
+ # region Merge len constraints
466
+
467
+ len_constraints = []
468
+
469
+ this_len_constraint = (
470
+ this_constraints_by_props.len_constraints_by_property.get(prop, None)
471
+ )
472
+ if this_len_constraint is not None:
473
+ len_constraints.append(this_len_constraint)
474
+
475
+ for parent in our_type.inheritances:
476
+ # NOTE (mristin, 2022-05-15):
477
+ # Assume here that all the ancestors already inherited their constraints
478
+ # due to the topological order in the iteration.
479
+ that_constraints_by_props = new_constraints_by_class[parent]
480
+
481
+ that_len_constraint = (
482
+ that_constraints_by_props.len_constraints_by_property.get(
483
+ prop, None
484
+ )
485
+ )
486
+ if that_len_constraint is not None:
487
+ len_constraints.append(that_len_constraint)
488
+
489
+ min_value = None
490
+ max_value = None
491
+
492
+ for len_constraint in len_constraints:
493
+ if min_value is None:
494
+ min_value = len_constraint.min_value
495
+ else:
496
+ if len_constraint.min_value is not None:
497
+ min_value = max(len_constraint.min_value, min_value)
498
+
499
+ if max_value is None:
500
+ max_value = len_constraint.max_value
501
+ else:
502
+ if len_constraint.max_value is not None:
503
+ max_value = min(len_constraint.max_value, max_value)
504
+
505
+ if (
506
+ min_value is not None
507
+ and max_value is not None
508
+ and min_value > max_value
509
+ ):
510
+ return None, Error(
511
+ our_type.parsed.node,
512
+ f"We could not stack the length constraints "
513
+ f"on the property {prop.name} as they are contradicting: "
514
+ f"min_value == {min_value} and max_value == {max_value}. "
515
+ f"Please check the invariants and the invariants of all "
516
+ f"the ancestors.",
517
+ )
518
+
519
+ if min_value is not None or max_value is not None:
520
+ new_len_constraints_by_property[prop] = LenConstraint(
521
+ min_value=min_value, max_value=max_value
522
+ )
523
+
524
+ # endregion
525
+
526
+ # region Merge patterns
527
+
528
+ # NOTE (mristin, 2022-05-15):
529
+ # The following logic has quadratic time complexity, but it seems that
530
+ # the runtime is currently no problem in practice.
531
+
532
+ patterns = [] # type: List[PatternConstraint]
533
+
534
+ this_patterns = this_constraints_by_props.patterns_by_property.get(
535
+ prop, None
536
+ )
537
+ if this_patterns is not None:
538
+ patterns.extend(this_patterns)
539
+
540
+ set_of_this_patterns = (
541
+ set()
542
+ if this_patterns is None
543
+ else set(this_pattern.pattern for this_pattern in this_patterns)
544
+ )
545
+
546
+ for parent in our_type.inheritances:
547
+ # NOTE (mristin, 2022-05-15):
548
+ # Assume here that all the ancestors already inherited their constraints
549
+ # due to the topological order in the iteration.
550
+ that_constraints_by_props = new_constraints_by_class[parent]
551
+
552
+ that_patterns = that_constraints_by_props.patterns_by_property.get(
553
+ prop, None
554
+ )
555
+
556
+ if that_patterns is not None:
557
+ for that_pattern in that_patterns:
558
+ # NOTE (mristin, 2022-06-15):
559
+ # We have to make sure that we do not inherit the same pattern
560
+ # from the parent.
561
+ #
562
+ # This is particularly important if the inherited property is a
563
+ # constrained primitive. In that case, if we didn't check for
564
+ # the duplicates, we would inherit the same pattern multiple
565
+ # times as we can not distinguish whether the pattern
566
+ # comes from an invariant of the parent or an invariant of
567
+ # the constrained primitive.
568
+ if that_pattern.pattern not in set_of_this_patterns:
569
+ patterns.append(that_pattern)
570
+
571
+ if len(patterns) > 0:
572
+ new_patterns_by_property[prop] = patterns
573
+
574
+ # endregion
575
+
576
+ # region Merge sets of primitives
577
+
578
+ sets_of_primitives = [] # type: List[SetOfPrimitivesConstraint]
579
+
580
+ # fmt: off
581
+ this_set_of_primitives = (
582
+ this_constraints_by_props.set_of_primitives_by_property.get(prop, None)
583
+ )
584
+ # fmt: on
585
+
586
+ if this_set_of_primitives is not None:
587
+ sets_of_primitives.append(this_set_of_primitives)
588
+
589
+ for parent in our_type.inheritances:
590
+ # NOTE (mristin, 2022-07-08):
591
+ # Assume here that all the ancestors already inherited their constraints
592
+ # due to the topological order in the iteration.
593
+
594
+ that_constraints_by_props = new_constraints_by_class[parent]
595
+
596
+ # fmt: off
597
+ that_set_of_primitives = (
598
+ that_constraints_by_props.set_of_primitives_by_property.get(
599
+ prop, None)
600
+ )
601
+ # fmt: on
602
+
603
+ if that_set_of_primitives is not None:
604
+ sets_of_primitives.append(that_set_of_primitives)
605
+
606
+ if len(sets_of_primitives) > 0:
607
+ # fmt: off
608
+ new_set_of_primitives_by_property[prop] = (
609
+ infer_for_schema_set.intersect_set_of_primitives_constraints(
610
+ constraints=sets_of_primitives)
611
+ )
612
+ # fmt: on
613
+
614
+ # endregion
615
+
616
+ # region Merge sets of enumeration literals
617
+
618
+ sets_of_enum_literals = [] # type: List[SetOfEnumerationLiteralsConstraint]
619
+
620
+ # fmt: off
621
+ this_set_of_enum_literals = (
622
+ this_constraints_by_props.set_of_enumeration_literals_by_property.get(
623
+ prop, None
624
+ )
625
+ )
626
+ # fmt: on
627
+
628
+ if this_set_of_enum_literals is not None:
629
+ sets_of_enum_literals.append(this_set_of_enum_literals)
630
+
631
+ for parent in our_type.inheritances:
632
+ # NOTE (mristin, 2022-07-08):
633
+ # Assume here that all the ancestors already inherited their constraints
634
+ # due to the topological order in the iteration.
635
+
636
+ that_constraints_by_props = new_constraints_by_class[parent]
637
+
638
+ # fmt: off
639
+ that_set_of_enum_literals = (
640
+ that_constraints_by_props
641
+ .set_of_enumeration_literals_by_property
642
+ .get(
643
+ prop, None
644
+ )
645
+ )
646
+ # fmt: on
647
+
648
+ if that_set_of_enum_literals is not None:
649
+ sets_of_enum_literals.append(that_set_of_enum_literals)
650
+
651
+ if len(sets_of_enum_literals) > 0:
652
+ # fmt: off
653
+ new_set_of_enum_literals_by_property[prop] = (
654
+ infer_for_schema_set
655
+ .intersect_set_of_enumeration_literals_constraints(
656
+ constraints=sets_of_enum_literals
657
+ )
658
+ )
659
+ # fmt: on
660
+
661
+ # endregion
662
+
663
+ new_constraints_by_class[our_type] = ConstraintsByProperty(
664
+ len_constraints_by_property=new_len_constraints_by_property,
665
+ patterns_by_property=new_patterns_by_property,
666
+ set_of_primitives_by_property=new_set_of_primitives_by_property,
667
+ set_of_enumeration_literals_by_property=new_set_of_enum_literals_by_property,
668
+ )
669
+
670
+ for our_type, constraints_by_property in new_constraints_by_class.items():
671
+ for (
672
+ prop,
673
+ set_of_primitives,
674
+ ) in constraints_by_property.set_of_primitives_by_property.items():
675
+ if len(set_of_primitives.literals) == 0:
676
+ return None, Error(
677
+ prop.parsed.node,
678
+ f"The property {prop.name!r} of our type {our_type.name!r} "
679
+ f"is constrained to an empty set of primitive literals",
680
+ )
681
+
682
+ for (
683
+ prop,
684
+ set_of_enum_literals,
685
+ ) in constraints_by_property.set_of_enumeration_literals_by_property.items():
686
+ if len(set_of_enum_literals.literals) == 0:
687
+ return None, Error(
688
+ prop.parsed.node,
689
+ f"The property {prop.name!r} of our type {our_type.name!r} "
690
+ f"is constrained to an empty set of enumeration literals",
691
+ )
692
+
693
+ return new_constraints_by_class, None