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.
- aas_core_codegen/__init__.py +6 -0
- aas_core_codegen/__main__.py +8 -0
- aas_core_codegen/common.py +500 -0
- aas_core_codegen/cpp/__init__.py +1 -0
- aas_core_codegen/cpp/aas_common/__init__.py +6 -0
- aas_core_codegen/cpp/aas_common/_generate.py +713 -0
- aas_core_codegen/cpp/common.py +681 -0
- aas_core_codegen/cpp/constants/__init__.py +6 -0
- aas_core_codegen/cpp/constants/_generate.py +568 -0
- aas_core_codegen/cpp/description.py +654 -0
- aas_core_codegen/cpp/enhancing/__init__.py +4 -0
- aas_core_codegen/cpp/enhancing/_generate.py +993 -0
- aas_core_codegen/cpp/iteration/__init__.py +6 -0
- aas_core_codegen/cpp/iteration/_generate.py +2332 -0
- aas_core_codegen/cpp/jsonization/__init__.py +6 -0
- aas_core_codegen/cpp/jsonization/_generate.py +2619 -0
- aas_core_codegen/cpp/main.py +694 -0
- aas_core_codegen/cpp/naming.py +170 -0
- aas_core_codegen/cpp/optionaling.py +557 -0
- aas_core_codegen/cpp/pattern/__init__.py +6 -0
- aas_core_codegen/cpp/pattern/_generate.py +508 -0
- aas_core_codegen/cpp/revm/__init__.py +6 -0
- aas_core_codegen/cpp/revm/_generate.py +1149 -0
- aas_core_codegen/cpp/stringification/__init__.py +5 -0
- aas_core_codegen/cpp/stringification/_generate.py +955 -0
- aas_core_codegen/cpp/structure/__init__.py +7 -0
- aas_core_codegen/cpp/structure/_generate.py +1503 -0
- aas_core_codegen/cpp/transpilation.py +1383 -0
- aas_core_codegen/cpp/unrolling.py +159 -0
- aas_core_codegen/cpp/verification/__init__.py +6 -0
- aas_core_codegen/cpp/verification/_generate.py +3073 -0
- aas_core_codegen/cpp/visitation/__init__.py +6 -0
- aas_core_codegen/cpp/visitation/_generate.py +521 -0
- aas_core_codegen/cpp/wstringification/__init__.py +5 -0
- aas_core_codegen/cpp/wstringification/_generate.py +586 -0
- aas_core_codegen/cpp/xmlization/__init__.py +6 -0
- aas_core_codegen/cpp/xmlization/_generate.py +5373 -0
- aas_core_codegen/cpp/yielding.py +201 -0
- aas_core_codegen/csharp/__init__.py +1 -0
- aas_core_codegen/csharp/common.py +224 -0
- aas_core_codegen/csharp/constants/__init__.py +5 -0
- aas_core_codegen/csharp/constants/_generate.py +409 -0
- aas_core_codegen/csharp/copying/__init__.py +4 -0
- aas_core_codegen/csharp/copying/_generate.py +498 -0
- aas_core_codegen/csharp/description.py +1103 -0
- aas_core_codegen/csharp/enhancing/__init__.py +4 -0
- aas_core_codegen/csharp/enhancing/_generate.py +667 -0
- aas_core_codegen/csharp/jsonization/__init__.py +4 -0
- aas_core_codegen/csharp/jsonization/_generate.py +1630 -0
- aas_core_codegen/csharp/main.py +421 -0
- aas_core_codegen/csharp/naming.py +157 -0
- aas_core_codegen/csharp/reporting/__init__.py +4 -0
- aas_core_codegen/csharp/reporting/_generate.py +266 -0
- aas_core_codegen/csharp/stringification/__init__.py +4 -0
- aas_core_codegen/csharp/stringification/_generate.py +243 -0
- aas_core_codegen/csharp/structure/__init__.py +6 -0
- aas_core_codegen/csharp/structure/_generate.py +1341 -0
- aas_core_codegen/csharp/transpilation.py +990 -0
- aas_core_codegen/csharp/unrolling.py +211 -0
- aas_core_codegen/csharp/verification/__init__.py +6 -0
- aas_core_codegen/csharp/verification/_generate.py +1457 -0
- aas_core_codegen/csharp/visitation/__init__.py +5 -0
- aas_core_codegen/csharp/visitation/_generate.py +579 -0
- aas_core_codegen/csharp/xmlization/__init__.py +4 -0
- aas_core_codegen/csharp/xmlization/_generate.py +1980 -0
- aas_core_codegen/golang/__init__.py +1 -0
- aas_core_codegen/golang/aas_common/__init__.py +4 -0
- aas_core_codegen/golang/aas_common/_generate.py +152 -0
- aas_core_codegen/golang/common.py +303 -0
- aas_core_codegen/golang/constants/__init__.py +5 -0
- aas_core_codegen/golang/constants/_generate.py +339 -0
- aas_core_codegen/golang/description.py +501 -0
- aas_core_codegen/golang/enhancing/__init__.py +4 -0
- aas_core_codegen/golang/enhancing/_generate.py +527 -0
- aas_core_codegen/golang/jsonization/__init__.py +4 -0
- aas_core_codegen/golang/jsonization/_generate.py +1740 -0
- aas_core_codegen/golang/main.py +368 -0
- aas_core_codegen/golang/naming.py +412 -0
- aas_core_codegen/golang/pointering.py +631 -0
- aas_core_codegen/golang/reporting/__init__.py +4 -0
- aas_core_codegen/golang/reporting/_generate.py +218 -0
- aas_core_codegen/golang/stringification/__init__.py +4 -0
- aas_core_codegen/golang/stringification/_generate.py +394 -0
- aas_core_codegen/golang/structure/__init__.py +6 -0
- aas_core_codegen/golang/structure/_generate.py +1493 -0
- aas_core_codegen/golang/transpilation.py +1191 -0
- aas_core_codegen/golang/unrolling.py +159 -0
- aas_core_codegen/golang/verification/__init__.py +6 -0
- aas_core_codegen/golang/verification/_generate.py +1513 -0
- aas_core_codegen/golang/xmlization/__init__.py +4 -0
- aas_core_codegen/golang/xmlization/_generate.py +2507 -0
- aas_core_codegen/infer_for_schema/__init__.py +21 -0
- aas_core_codegen/infer_for_schema/_inline.py +693 -0
- aas_core_codegen/infer_for_schema/_len.py +527 -0
- aas_core_codegen/infer_for_schema/_pattern.py +311 -0
- aas_core_codegen/infer_for_schema/_set.py +394 -0
- aas_core_codegen/infer_for_schema/_stringify.py +201 -0
- aas_core_codegen/infer_for_schema/_types.py +135 -0
- aas_core_codegen/infer_for_schema/match.py +122 -0
- aas_core_codegen/intermediate/__init__.py +78 -0
- aas_core_codegen/intermediate/_hierarchy.py +397 -0
- aas_core_codegen/intermediate/_stringify.py +989 -0
- aas_core_codegen/intermediate/_translate.py +5128 -0
- aas_core_codegen/intermediate/_types.py +2901 -0
- aas_core_codegen/intermediate/construction.py +750 -0
- aas_core_codegen/intermediate/doc.py +344 -0
- aas_core_codegen/intermediate/pattern_verification.py +428 -0
- aas_core_codegen/intermediate/revm.py +985 -0
- aas_core_codegen/intermediate/type_inference.py +2266 -0
- aas_core_codegen/java/__init__.py +1 -0
- aas_core_codegen/java/common.py +197 -0
- aas_core_codegen/java/constants/__init__.py +5 -0
- aas_core_codegen/java/constants/_generate.py +334 -0
- aas_core_codegen/java/copying/__init__.py +4 -0
- aas_core_codegen/java/copying/_generate.py +502 -0
- aas_core_codegen/java/description.py +774 -0
- aas_core_codegen/java/enhancing/__init__.py +4 -0
- aas_core_codegen/java/enhancing/_generate.py +820 -0
- aas_core_codegen/java/generation/__init__.py +5 -0
- aas_core_codegen/java/generation/_generate.py +285 -0
- aas_core_codegen/java/jsonization/__init__.py +4 -0
- aas_core_codegen/java/jsonization/_generate.py +1472 -0
- aas_core_codegen/java/main.py +438 -0
- aas_core_codegen/java/naming.py +187 -0
- aas_core_codegen/java/optional.py +514 -0
- aas_core_codegen/java/reporting/__init__.py +4 -0
- aas_core_codegen/java/reporting/_generate.py +248 -0
- aas_core_codegen/java/stringification/__init__.py +4 -0
- aas_core_codegen/java/stringification/_generate.py +212 -0
- aas_core_codegen/java/structure/__init__.py +6 -0
- aas_core_codegen/java/structure/_generate.py +1767 -0
- aas_core_codegen/java/transpilation.py +1111 -0
- aas_core_codegen/java/verification/__init__.py +6 -0
- aas_core_codegen/java/verification/_generate.py +1536 -0
- aas_core_codegen/java/visitation/__init__.py +5 -0
- aas_core_codegen/java/visitation/_generate.py +689 -0
- aas_core_codegen/java/xmlization/__init__.py +4 -0
- aas_core_codegen/java/xmlization/_generate.py +2274 -0
- aas_core_codegen/jsonld/__init__.py +1 -0
- aas_core_codegen/jsonld/main.py +455 -0
- aas_core_codegen/jsonschema/__init__.py +1 -0
- aas_core_codegen/jsonschema/main.py +982 -0
- aas_core_codegen/main.py +245 -0
- aas_core_codegen/naming.py +133 -0
- aas_core_codegen/opcua/__init__.py +1 -0
- aas_core_codegen/opcua/main.py +1525 -0
- aas_core_codegen/opcua/naming.py +126 -0
- aas_core_codegen/parse/__init__.py +46 -0
- aas_core_codegen/parse/_rules.py +796 -0
- aas_core_codegen/parse/_stringify.py +532 -0
- aas_core_codegen/parse/_translate.py +3940 -0
- aas_core_codegen/parse/_types.py +973 -0
- aas_core_codegen/parse/retree/__init__.py +46 -0
- aas_core_codegen/parse/retree/_fix.py +434 -0
- aas_core_codegen/parse/retree/_parse.py +1143 -0
- aas_core_codegen/parse/retree/_render.py +298 -0
- aas_core_codegen/parse/retree/_stringify.py +199 -0
- aas_core_codegen/parse/retree/_types.py +362 -0
- aas_core_codegen/parse/retree/_visitor.py +70 -0
- aas_core_codegen/parse/tree.py +1303 -0
- aas_core_codegen/protobuf/__init__.py +1 -0
- aas_core_codegen/protobuf/common.py +225 -0
- aas_core_codegen/protobuf/description.py +1102 -0
- aas_core_codegen/protobuf/main.py +115 -0
- aas_core_codegen/protobuf/naming.py +143 -0
- aas_core_codegen/protobuf/structure/__init__.py +6 -0
- aas_core_codegen/protobuf/structure/_generate.py +502 -0
- aas_core_codegen/py.typed +1 -0
- aas_core_codegen/python/__init__.py +1 -0
- aas_core_codegen/python/aas_common/__init__.py +4 -0
- aas_core_codegen/python/aas_common/_generate.py +63 -0
- aas_core_codegen/python/common.py +406 -0
- aas_core_codegen/python/constants/__init__.py +5 -0
- aas_core_codegen/python/constants/_generate.py +377 -0
- aas_core_codegen/python/description.py +508 -0
- aas_core_codegen/python/jsonization/__init__.py +4 -0
- aas_core_codegen/python/jsonization/_generate.py +1391 -0
- aas_core_codegen/python/main.py +323 -0
- aas_core_codegen/python/naming.py +255 -0
- aas_core_codegen/python/stringification/__init__.py +4 -0
- aas_core_codegen/python/stringification/_generate.py +129 -0
- aas_core_codegen/python/structure/__init__.py +6 -0
- aas_core_codegen/python/structure/_generate.py +1801 -0
- aas_core_codegen/python/transpilation.py +958 -0
- aas_core_codegen/python/unrolling.py +156 -0
- aas_core_codegen/python/verification/__init__.py +6 -0
- aas_core_codegen/python/verification/_generate.py +1471 -0
- aas_core_codegen/python/xmlization/__init__.py +4 -0
- aas_core_codegen/python/xmlization/_generate.py +3003 -0
- aas_core_codegen/python_protobuf/__init__.py +1 -0
- aas_core_codegen/python_protobuf/main.py +1424 -0
- aas_core_codegen/python_protobuf/naming.py +85 -0
- aas_core_codegen/rdf_shacl/__init__.py +1 -0
- aas_core_codegen/rdf_shacl/_description.py +351 -0
- aas_core_codegen/rdf_shacl/common.py +206 -0
- aas_core_codegen/rdf_shacl/main.py +114 -0
- aas_core_codegen/rdf_shacl/naming.py +145 -0
- aas_core_codegen/rdf_shacl/rdf.py +435 -0
- aas_core_codegen/rdf_shacl/shacl.py +453 -0
- aas_core_codegen/run.py +124 -0
- aas_core_codegen/smoke/__init__.py +1 -0
- aas_core_codegen/smoke/main.py +219 -0
- aas_core_codegen/specific_implementations.py +72 -0
- aas_core_codegen/stringify.py +333 -0
- aas_core_codegen/typescript/__init__.py +1 -0
- aas_core_codegen/typescript/aas_common/__init__.py +4 -0
- aas_core_codegen/typescript/aas_common/_generate.py +472 -0
- aas_core_codegen/typescript/common.py +340 -0
- aas_core_codegen/typescript/constants/__init__.py +5 -0
- aas_core_codegen/typescript/constants/_generate.py +347 -0
- aas_core_codegen/typescript/description.py +530 -0
- aas_core_codegen/typescript/jsonization/__init__.py +4 -0
- aas_core_codegen/typescript/jsonization/_generate.py +1510 -0
- aas_core_codegen/typescript/main.py +258 -0
- aas_core_codegen/typescript/naming.py +189 -0
- aas_core_codegen/typescript/stringification/__init__.py +4 -0
- aas_core_codegen/typescript/stringification/_generate.py +367 -0
- aas_core_codegen/typescript/structure/__init__.py +6 -0
- aas_core_codegen/typescript/structure/_generate.py +2500 -0
- aas_core_codegen/typescript/transpilation.py +1051 -0
- aas_core_codegen/typescript/unrolling.py +159 -0
- aas_core_codegen/typescript/verification/__init__.py +6 -0
- aas_core_codegen/typescript/verification/_generate.py +1578 -0
- aas_core_codegen/xsd/__init__.py +1 -0
- aas_core_codegen/xsd/main.py +1187 -0
- aas_core_codegen/xsd/naming.py +83 -0
- aas_core_codegen/yielding/__init__.py +1 -0
- aas_core_codegen/yielding/flow.py +139 -0
- aas_core_codegen/yielding/linear.py +754 -0
- aas_core_codegen-0.0.16.dist-info/METADATA +211 -0
- aas_core_codegen-0.0.16.dist-info/RECORD +604 -0
- aas_core_codegen-0.0.16.dist-info/WHEEL +5 -0
- aas_core_codegen-0.0.16.dist-info/entry_points.txt +3 -0
- aas_core_codegen-0.0.16.dist-info/licenses/AUTHORS +9 -0
- aas_core_codegen-0.0.16.dist-info/licenses/LICENSE +23 -0
- aas_core_codegen-0.0.16.dist-info/top_level.txt +2 -0
- dev/continuous_integration/__init__.py +1 -0
- dev/continuous_integration/check_help_in_readme.py +208 -0
- dev/continuous_integration/check_init_and_pyproject_consistent.py +154 -0
- dev/continuous_integration/precommit.py +400 -0
- dev/dev_scripts/__init__.py +1 -0
- dev/dev_scripts/compare_rendered_regexes_against_source_py.py +42 -0
- dev/dev_scripts/copy_to_aas_core3_cpp.py +100 -0
- dev/dev_scripts/copy_to_aas_core3_java.py +90 -0
- dev/dev_scripts/download_latest_aas_core_meta_v3.py +114 -0
- dev/dev_scripts/draw_bipartite_graph_based_on_lines.py +37 -0
- dev/dev_scripts/run_tests_with_rerecord.py +69 -0
- dev/dev_scripts/update_to_aas_core_meta.py +174 -0
- dev/integration_tests/input/jsonschema/boilerplate/main.py +55 -0
- dev/integration_tests/input/meta_model.py +38 -0
- dev/integration_tests/input/python/boilerplate/main.py +153 -0
- dev/integration_tests/main.py +258 -0
- dev/test_data/csharp/test_structure/concrete_class_with_descendants/meta_model.py +15 -0
- dev/test_data/csharp/test_structure/constructor_without_arguments/all_properties_optional/meta_model.py +9 -0
- dev/test_data/csharp/test_structure/constructor_without_arguments/no_properties/meta_model.py +6 -0
- dev/test_data/csharp/test_verification/builtin_functions/len/on_list/meta_model.py +20 -0
- dev/test_data/csharp/test_verification/builtin_functions/len/on_str/meta_model.py +16 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/as_prefix/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/as_suffix/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_group_with_quantifier/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_the_middle/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/in_union/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/single_utf32_literal/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/with_quantifier_within_group/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_as_literal/with_quantifier_without_group/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/at_the_beginning/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/at_the_end/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/in_the_middle/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/multiple/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/single/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/literal/single_with_quantifier/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/mixed_with_non_utf32/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/more_than_two_high_surrogates/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/multiple_utf32_ranges/meta_model.py +8 -0
- 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
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/same_high_surrogate/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/same_high_surrogate_with_quantifier/meta_model.py +8 -0
- dev/test_data/csharp/test_verification/pattern_verification/utf32_in_character_set/range/two_high_surrogates/meta_model.py +8 -0
- dev/test_data/intermediate/expected/class/empty/meta_model.py +6 -0
- dev/test_data/intermediate/expected/class/implementation_specific_method/meta_model.py +8 -0
- dev/test_data/intermediate/expected/class/inheritance/meta_model.py +41 -0
- dev/test_data/intermediate/expected/class/methods_with_contracts/meta_model.py +15 -0
- dev/test_data/intermediate/expected/class/only_method_no_property/meta_model.py +7 -0
- dev/test_data/intermediate/expected/class/only_property_no_method/meta_model.py +9 -0
- dev/test_data/intermediate/expected/constant/constant_set/of_enum/meta_model.py +12 -0
- dev/test_data/intermediate/expected/constant/constant_set/of_str/meta_model.py +4 -0
- dev/test_data/intermediate/expected/constant/constant_set/with_description/meta_model.py +6 -0
- dev/test_data/intermediate/expected/constant/constant_set/with_superset_of/meta_model.py +14 -0
- dev/test_data/intermediate/expected/constant/constant_str/only_value/meta_model.py +7 -0
- dev/test_data/intermediate/expected/constant/constant_str/with_description/meta_model.py +5 -0
- dev/test_data/intermediate/expected/documentation/docstring_with_special_characters_in_literal/meta_model.py +20 -0
- dev/test_data/intermediate/expected/documentation/docstring_with_special_characters_outside_literal/meta_model.py +20 -0
- dev/test_data/intermediate/expected/empty/meta_model.py +2 -0
- dev/test_data/intermediate/expected/enumeration/meta_model.py +9 -0
- dev/test_data/intermediate/expected/interface/basic/meta_model.py +14 -0
- dev/test_data/intermediate/expected/interface/empty/meta_model.py +7 -0
- dev/test_data/intermediate/expected/interface/inheritance/meta_model.py +27 -0
- dev/test_data/intermediate/expected/interface/method_signature/meta_model.py +10 -0
- dev/test_data/intermediate/expected/interface/only_constructor/meta_model.py +11 -0
- dev/test_data/intermediate/expected/method/non_mutating/implementation_specific/meta_model.py +12 -0
- dev/test_data/intermediate/expected/method/non_mutating/understood/meta_model.py +11 -0
- dev/test_data/intermediate/expected/type_annotation/atomic/meta_model.py +9 -0
- dev/test_data/intermediate/expected/type_annotation/subscripted/class/meta_model.py +13 -0
- dev/test_data/intermediate/expected/type_annotation/subscripted/primitive/meta_model.py +9 -0
- dev/test_data/intermediate/unexpected/constant_set/of_enum/enumeration_literals_in_subset_outside_of_superset/meta_model.py +20 -0
- dev/test_data/intermediate/unexpected/constant_set/of_enum/invalid_literal/meta_model.py +11 -0
- dev/test_data/intermediate/unexpected/constant_set/of_enum/mismatch_between_enumeration_and_literal/meta_model.py +30 -0
- dev/test_data/intermediate/unexpected/constant_set/of_enum/mismatch_in_enumerations_between_subset_and_superset/meta_model.py +21 -0
- dev/test_data/intermediate/unexpected/constant_set/of_str/literals_in_subset_outside_of_superset/meta_model.py +18 -0
- dev/test_data/intermediate/unexpected/constant_set/of_str/mismatch_between_type_annotation_and_literals/meta_model.py +10 -0
- dev/test_data/intermediate/unexpected/constant_set/of_str/superset_and_subset_mismatch_in_type/meta_model.py +12 -0
- dev/test_data/intermediate/unexpected/constraints/dangling_constraintref/meta_model.py +18 -0
- dev/test_data/intermediate/unexpected/constraints/duplicate_constraints/meta_model.py +20 -0
- dev/test_data/intermediate/unexpected/documentation/unexpected_documentation_elements/meta_model.py +34 -0
- dev/test_data/intermediate/unexpected/invariant/class_invariant_uses_re/meta_model.py +10 -0
- dev/test_data/intermediate/unexpected/invariant/invariant_of_constrained_primitive_uses_re/meta_model.py +7 -0
- dev/test_data/intermediate/unexpected/invariant/unexpected_argument_count_to_len/meta_model.py +20 -0
- dev/test_data/intermediate/unexpected/invariant/unhandled_built_in_function/meta_model.py +16 -0
- dev/test_data/intermediate/unexpected/method_definitions/non_constant_default/meta_model.py +7 -0
- dev/test_data/intermediate/unexpected/optional_constructor_arguments_wo_default/default_non_none/meta_model.py +16 -0
- dev/test_data/intermediate/unexpected/optional_constructor_arguments_wo_default/no_default/meta_model.py +16 -0
- dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/after_inheritance/meta_model.py +58 -0
- dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/type_missmatch/meta_model.py +9 -0
- dev/test_data/intermediate/unexpected/properties_and_constructor_arguments_do_not_match/within_class/meta_model.py +22 -0
- dev/test_data/jsonschema/test_main/regression_when_len_constraints_on_inherited_property/meta_model.py +28 -0
- dev/test_data/opcua/test_main/abstract_and_concrete_classes/meta_model.py +37 -0
- dev/test_data/opcua/test_main/classes_with_invariants/meta_model.py +21 -0
- dev/test_data/opcua/test_main/concrete_class_with_descendant/meta_model.py +27 -0
- dev/test_data/opcua/test_main/concrete_class_with_enum/meta_model.py +21 -0
- dev/test_data/opcua/test_main/concrete_class_with_list_of_instances/meta_model.py +21 -0
- dev/test_data/opcua/test_main/concrete_class_with_primitive_attributes/meta_model.py +41 -0
- dev/test_data/opcua/test_main/concrete_class_with_string/meta_model.py +13 -0
- dev/test_data/opcua/test_main/constrained_primitive/meta_model.py +20 -0
- dev/test_data/opcua/test_main/multiple_inheritance/meta_model.py +25 -0
- dev/test_data/parse/expected/constant/constant_set/of_enum/meta_model.py +12 -0
- dev/test_data/parse/expected/constant/constant_set/of_str/meta_model.py +4 -0
- dev/test_data/parse/expected/constant/constant_set/with_description/meta_model.py +6 -0
- dev/test_data/parse/expected/constant/constant_set/with_superset_of/meta_model.py +14 -0
- dev/test_data/parse/expected/constant/constant_str/only_value/meta_model.py +7 -0
- dev/test_data/parse/expected/constant/constant_str/with_description/meta_model.py +5 -0
- dev/test_data/parse/expected/enum/ok/meta_model.py +15 -0
- dev/test_data/parse/expected/implementation_specific_class/properties_and_methods_in_implementation_specific_class/meta_model.py +17 -0
- dev/test_data/parse/expected/inheritance/basic/meta_model.py +11 -0
- dev/test_data/parse/expected/inheritance/diamond/meta_model.py +26 -0
- dev/test_data/parse/expected/inheritance/inheritance_from_concrete_class/meta_model.py +10 -0
- dev/test_data/parse/expected/invariants/in_relation/meta_model.py +16 -0
- dev/test_data/parse/expected/method/arguments/meta_model.py +7 -0
- dev/test_data/parse/expected/method/basic/meta_model.py +7 -0
- dev/test_data/parse/expected/method/contracts/condition_as_keyword_argument/meta_model.py +8 -0
- dev/test_data/parse/expected/method/contracts/condition_as_positional_argument/meta_model.py +8 -0
- dev/test_data/parse/expected/method/contracts/description_as_keyword_argument/meta_model.py +8 -0
- dev/test_data/parse/expected/method/contracts/description_as_positional_argument/meta_model.py +8 -0
- dev/test_data/parse/expected/method/contracts/multiple_contracts_in_order/meta_model.py +17 -0
- dev/test_data/parse/expected/method/contracts/postcondition/basic/meta_model.py +10 -0
- dev/test_data/parse/expected/method/contracts/postcondition/snapshot/with_keyword_arguments/meta_model.py +9 -0
- dev/test_data/parse/expected/method/contracts/postcondition/snapshot/with_positional_arguments/meta_model.py +9 -0
- dev/test_data/parse/expected/method/default/meta_model.py +9 -0
- dev/test_data/parse/expected/method/description/meta_model.py +8 -0
- dev/test_data/parse/expected/method/is_implementation_specific/meta_model.py +8 -0
- dev/test_data/parse/expected/method/non_mutating/meta_model.py +11 -0
- dev/test_data/parse/expected/method/returns_none/meta_model.py +7 -0
- dev/test_data/parse/expected/method/returns_something/meta_model.py +7 -0
- dev/test_data/parse/expected/single_class/description/meta_model.py +12 -0
- dev/test_data/parse/expected/single_class/empty/meta_model.py +6 -0
- dev/test_data/parse/expected/single_class/property/description/meta_model.py +14 -0
- dev/test_data/parse/expected/single_class/property/mandatory/meta_model.py +6 -0
- dev/test_data/parse/expected/single_class/property/optional/meta_model.py +6 -0
- dev/test_data/parse/expected/single_class/property/recursion_to_entity/meta_model.py +6 -0
- dev/test_data/parse/unexpected/class_decorators/non_name_decorator/meta_model.py +7 -0
- dev/test_data/parse/unexpected/class_decorators/unknown_decorator/meta_model.py +7 -0
- dev/test_data/parse/unexpected/class_definitions/is_abstract_and_implementation_specific/meta_model.py +8 -0
- dev/test_data/parse/unexpected/class_definitions/unexpected_docstring_before_a_method/meta_model.py +11 -0
- dev/test_data/parse/unexpected/class_definitions/unexpected_docstring_for_a_pass/meta_model.py +9 -0
- dev/test_data/parse/unexpected/class_definitions/unexpected_double_description_for_a_property/meta_model.py +10 -0
- dev/test_data/parse/unexpected/class_inheritances/inheriting_from_implementation_specific_parent/meta_model.py +20 -0
- dev/test_data/parse/unexpected/class_inheritances/non_name_super_class/meta_model.py +6 -0
- dev/test_data/parse/unexpected/enum/expression_as_assignment_value/meta_model.py +6 -0
- dev/test_data/parse/unexpected/enum/non_assignment/meta_model.py +8 -0
- dev/test_data/parse/unexpected/enum/non_string_literal/meta_model.py +6 -0
- dev/test_data/parse/unexpected/enum/unexpected_inheritance/meta_model.py +6 -0
- dev/test_data/parse/unexpected/method_contracts/contract/non_lambda_condition/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/contract/non_string_literal_description/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/contract/without_any_arguments/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/contract/without_condition/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/postcondition/OLD_in_postcondition_without_snapshot/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/postcondition/argument_missing_in_function/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/precondition/argument_missing_in_function/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/argument_missing_in_function/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/capture_not_a_lambda/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/invalid_name/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/name_not_a_string_literal/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/without_a_capture/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_contracts/snapshot/without_a_name/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/non_mutating/non_mutating_constructor/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/non_mutating/non_mutating_verification_function/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/non_name_decorator/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/unknown_call_decorator/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_decorators/unknown_name_decorator/meta_model.py +8 -0
- dev/test_data/parse/unexpected/method_definitions/argument_with_final/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/argument_without_a_type_annotation/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/default_for_self/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/dunder/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/init_with_return_type/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_keyword_only_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_positional_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_type_annotation_for_self/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_variable_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/with_variable_keyword_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/without_arguments/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/without_self/meta_model.py +7 -0
- dev/test_data/parse/unexpected/method_definitions/without_type_annotation_for_result/meta_model.py +7 -0
- dev/test_data/parse/unexpected/property_definitions/final_without_subscript/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/nested_final/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/non_simple/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/unexpected_assignment/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/unexpected_non_name_property/meta_model.py +6 -0
- dev/test_data/parse/unexpected/property_definitions/without_type_annotation/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/constant_set_with_a_non_set_subset/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_inheritance/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_a_property/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_an_argument/meta_model.py +7 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_reference_in_type_annotation_of_constant_set/meta_model.py +6 -0
- dev/test_data/parse/unexpected/symbol_table/dangling_subset_in_constant_set/meta_model.py +4 -0
- dev/test_data/parse/unexpected/symbol_table/inheritance_from_non_class/meta_model.py +10 -0
- dev/test_data/parse_retree/expected/character_set/common_escaping/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/complementing/double_caret/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/complementing/multiple_ranges/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/complementing/suffix_dash/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/escape_first_caret/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/literals_which_need_no_escaping_in_characters_set_but_need_escaping_outside/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/multiple_ranges/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/single_literal/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/single_range/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/unescaped_dash/only_dash/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/unescaped_dash/prefix_dash/source.py +1 -0
- dev/test_data/parse_retree/expected/character_set/unescaped_dash/suffix_dash/source.py +1 -0
- dev/test_data/parse_retree/expected/dot/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/group/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/group_in_a_group/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/group_of_union_of_empty_concatenations/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/regex/source.py +1 -0
- dev/test_data/parse_retree/expected/empty/union_of_empty_concatenations/source.py +1 -0
- dev/test_data/parse_retree/expected/escaped_literals/source.py +1 -0
- dev/test_data/parse_retree/expected/formatted_value/at_the_beginning/source.py +1 -0
- dev/test_data/parse_retree/expected/formatted_value/at_the_end/source.py +1 -0
- dev/test_data/parse_retree/expected/formatted_value/in_the_middle/source.py +1 -0
- dev/test_data/parse_retree/expected/formatted_value/single_formatted_value/source.py +1 -0
- dev/test_data/parse_retree/expected/literal/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/at_least_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/at_least_one/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/at_most_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/exactly_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/maybe/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/greedy/zero_or_more/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/at_least_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/at_least_one/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/at_most_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/exactly_3/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/maybe/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/non_greedy/zero_or_more/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/on_a_character_set/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/on_a_formatted_value/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/on_a_group/source.py +1 -0
- dev/test_data/parse_retree/expected/quantifier/on_a_literal/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/double_end_symbol/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/double_start_symbol/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/end_symbol_in_the_middle/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/only_start_symbol/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/only_stop_symbol/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/start_symbol_at_the_beginning/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/start_symbol_in_the_middle/source.py +1 -0
- dev/test_data/parse_retree/expected/start_and_stop_symbols/stop_symbol_at_the_end/source.py +1 -0
- dev/test_data/parse_retree/expected/union/of_character_sets/source.py +1 -0
- dev/test_data/parse_retree/expected/union/of_groups/source.py +1 -0
- dev/test_data/parse_retree/expected/union/of_string_literals/source.py +1 -0
- dev/test_data/parse_retree/expected/union/within_group/source.py +1 -0
- dev/test_data/parse_retree/expected/whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/Uxxxxxxxx_out_of_range/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/only_backslash/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_Uxxxxxxxx/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_uxxxx/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/short_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unexpected_escaping/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/digit/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_digit/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/not_word/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/character_literal/unhandled/word/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/Uxxxxxxxx_out_of_range/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/only_backslash/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_Uxxxxxxxx/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_uxxxx/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/short_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unexpected_escaping/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/digit/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_digit/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/not_word/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/whitespace/source.py +1 -0
- dev/test_data/parse_retree/unexpected/improper_escaping/range_character/unhandled/word/source.py +1 -0
- dev/test_data/parse_retree/unexpected/invalid_character_range/source.py +1 -0
- dev/test_data/parse_retree/unexpected/invalid_quantifier/at_least_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/invalid_quantifier/between_3_and_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/invalid_quantifier/exactly_x/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unhandled_group_directives/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/character_set/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/group/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/group_of_union_of_empty_concatenations/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/quantifier/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/quantifier_with_comma/source.py +1 -0
- dev/test_data/parse_retree/unexpected/unterminated/quantifier_with_number_and_comma/source.py +1 -0
- dev/test_data/proto/test_main/expected/abstract_and_concrete_classes/meta_model.py +37 -0
- dev/test_data/proto/test_main/expected/concrete_class_with_descendants/meta_model.py +30 -0
- dev/test_data/proto/test_main/expected/concrete_class_with_enum/meta_model.py +21 -0
- dev/test_data/proto/test_main/expected/concrete_class_with_list_of_instances/meta_model.py +21 -0
- dev/test_data/proto/test_main/expected/concrete_class_with_primitive_attributes/meta_model.py +41 -0
- dev/test_data/python_protobuf/test_main/abstract_and_concrete_classes/expected_output/pbization.py +532 -0
- dev/test_data/python_protobuf/test_main/abstract_and_concrete_classes/meta_model.py +37 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_descendant/expected_output/pbization.py +527 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_descendant/meta_model.py +27 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_enum/expected_output/pbization.py +290 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_enum/meta_model.py +21 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_list_of_instances/expected_output/pbization.py +328 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_list_of_instances/meta_model.py +23 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_primitive_attributes/expected_output/pbization.py +274 -0
- dev/test_data/python_protobuf/test_main/concrete_class_with_primitive_attributes/meta_model.py +41 -0
- dev/test_data/rdf_shacl/test_main/expected/regression_when_lang_string_class_is_missing/meta_model.py +29 -0
- dev/test_data/rdf_shacl/test_main/expected/regression_when_len_constraints_on_inherited_property/meta_model.py +27 -0
- dev/test_data/rdf_shacl/test_main/unexpected/regression_len_constraint_on_class_property/meta_model.py +61 -0
- dev/test_data/real_meta_models/aas_core_meta.v3.py +5721 -0
- dev/test_data/smoke/test_main/unexpected/infer_for_schema_error/meta_model.py +12 -0
- dev/test_data/smoke/test_main/unexpected/intermediate_error/meta_model.py +18 -0
- dev/test_data/smoke/test_main/unexpected/parse_error/meta_model.py +5 -0
- dev/test_data/smoke/test_main/unexpected/pattern_verification_unparsable_regex/direct_match/meta_model.py +8 -0
- dev/test_data/smoke/test_main/unexpected/type_error/meta_model.py +18 -0
- dev/tests/__init__.py +1 -0
- dev/tests/common.py +197 -0
- dev/tests/cpp/__init__.py +0 -0
- dev/tests/cpp/test_common.py +32 -0
- dev/tests/cpp/test_main.py +144 -0
- dev/tests/cpp/test_pattern.py +188 -0
- dev/tests/cpp/test_verification.py +189 -0
- dev/tests/cpp/test_yielding.py +225 -0
- dev/tests/csharp/__init__.py +0 -0
- dev/tests/csharp/live_test_main.py +109 -0
- dev/tests/csharp/test_common.py +28 -0
- dev/tests/csharp/test_description.py +684 -0
- dev/tests/csharp/test_main.py +129 -0
- dev/tests/csharp/test_structure.py +93 -0
- dev/tests/csharp/test_verification.py +82 -0
- dev/tests/description.py +29 -0
- dev/tests/golang/__init__.py +0 -0
- dev/tests/golang/test_common.py +78 -0
- dev/tests/golang/test_main.py +128 -0
- dev/tests/infer_for_schema/__init__.py +0 -0
- dev/tests/infer_for_schema/common.py +47 -0
- dev/tests/infer_for_schema/test_len_on_properties.py +955 -0
- dev/tests/infer_for_schema/test_len_on_self.py +580 -0
- dev/tests/infer_for_schema/test_patterns_on_properties.py +686 -0
- dev/tests/infer_for_schema/test_patterns_on_self.py +258 -0
- dev/tests/infer_for_schema/test_property_in_set_of_enumeration_literals.py +600 -0
- dev/tests/infer_for_schema/test_property_in_set_of_primitives.py +549 -0
- dev/tests/intermediate/__init__.py +0 -0
- dev/tests/intermediate/test_constructor.py +719 -0
- dev/tests/intermediate/test_hierarchy.py +221 -0
- dev/tests/intermediate/test_revm.py +134 -0
- dev/tests/intermediate/test_translate.py +337 -0
- dev/tests/intermediate/test_type_inference.py +333 -0
- dev/tests/intermediate/test_types.py +169 -0
- dev/tests/java/__init__.py +0 -0
- dev/tests/java/test_common.py +20 -0
- dev/tests/java/test_description.py +128 -0
- dev/tests/java/test_main.py +234 -0
- dev/tests/jsonld_context/test_main.py +79 -0
- dev/tests/opcua/__init__.py +3 -0
- dev/tests/opcua/test_main.py +110 -0
- dev/tests/our_jsonschema/__init__.py +3 -0
- dev/tests/our_jsonschema/test_main.py +232 -0
- dev/tests/parse/__init__.py +0 -0
- dev/tests/parse/test_parse.py +503 -0
- dev/tests/parse/test_retree.py +272 -0
- dev/tests/proto/__init__.py +0 -0
- dev/tests/proto/test_main.py +112 -0
- dev/tests/python/__init__.py +0 -0
- dev/tests/python/test_common.py +124 -0
- dev/tests/python/test_main.py +126 -0
- dev/tests/python/test_xml_playground.py +254 -0
- dev/tests/python_protobuf/__init__.py +0 -0
- dev/tests/python_protobuf/test_main.py +111 -0
- dev/tests/rdf_shacl/__init__.py +0 -0
- dev/tests/rdf_shacl/test_common.py +32 -0
- dev/tests/rdf_shacl/test_description.py +223 -0
- dev/tests/rdf_shacl/test_main.py +194 -0
- dev/tests/smoke/__init__.py +0 -0
- dev/tests/smoke/test_main.py +83 -0
- dev/tests/test_common.py +94 -0
- dev/tests/typescript/__init__.py +0 -0
- dev/tests/typescript/test_common.py +108 -0
- dev/tests/typescript/test_main.py +125 -0
- dev/tests/xsd/__init__.py +0 -0
- dev/tests/xsd/test_main.py +227 -0
- dev/tests/yielding/__init__.py +0 -0
- 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
|