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,311 @@
|
|
|
1
|
+
"""Infer the constraints on a property based on regular expressions."""
|
|
2
|
+
from typing import (
|
|
3
|
+
Optional,
|
|
4
|
+
List,
|
|
5
|
+
MutableMapping,
|
|
6
|
+
Sequence,
|
|
7
|
+
Mapping,
|
|
8
|
+
cast,
|
|
9
|
+
Iterator,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
from icontract import require
|
|
13
|
+
|
|
14
|
+
from aas_core_codegen import intermediate
|
|
15
|
+
from aas_core_codegen.common import Identifier
|
|
16
|
+
from aas_core_codegen.infer_for_schema import match as infer_for_schema_match
|
|
17
|
+
from aas_core_codegen.infer_for_schema._types import PatternConstraint
|
|
18
|
+
from aas_core_codegen.parse import tree as parse_tree
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class PatternVerificationsByName(Mapping[Identifier, intermediate.PatternVerification]):
|
|
22
|
+
"""Map verification functions based on patterns by their names."""
|
|
23
|
+
|
|
24
|
+
# fmt: off
|
|
25
|
+
# noinspection PyAbstractClass
|
|
26
|
+
@require(
|
|
27
|
+
lambda mapping:
|
|
28
|
+
all(
|
|
29
|
+
name == func.name
|
|
30
|
+
for name, func in mapping.items()
|
|
31
|
+
)
|
|
32
|
+
)
|
|
33
|
+
# fmt: on
|
|
34
|
+
def __new__(
|
|
35
|
+
cls, mapping: Mapping[Identifier, intermediate.PatternVerification]
|
|
36
|
+
) -> "PatternVerificationsByName":
|
|
37
|
+
return cast(PatternVerificationsByName, mapping)
|
|
38
|
+
|
|
39
|
+
def __getitem__(self, k: Identifier) -> intermediate.PatternVerification:
|
|
40
|
+
# Only for type annotation
|
|
41
|
+
raise NotImplementedError()
|
|
42
|
+
|
|
43
|
+
def __iter__(self) -> Iterator[Identifier]:
|
|
44
|
+
# Only for type annotation
|
|
45
|
+
raise NotImplementedError()
|
|
46
|
+
|
|
47
|
+
def __len__(self) -> int:
|
|
48
|
+
# Only for type annotation
|
|
49
|
+
raise NotImplementedError()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def map_pattern_verifications_by_name(
|
|
53
|
+
verifications: Sequence[intermediate.Verification],
|
|
54
|
+
) -> PatternVerificationsByName:
|
|
55
|
+
"""
|
|
56
|
+
Go over all verifications and map the pattern verifications by their name.
|
|
57
|
+
|
|
58
|
+
The verifications which do not perform pattern matching are ignored.
|
|
59
|
+
"""
|
|
60
|
+
result = (
|
|
61
|
+
dict()
|
|
62
|
+
) # type: MutableMapping[Identifier, intermediate.PatternVerification]
|
|
63
|
+
|
|
64
|
+
for verification in verifications:
|
|
65
|
+
if isinstance(verification, intermediate.PatternVerification):
|
|
66
|
+
result[verification.name] = verification
|
|
67
|
+
|
|
68
|
+
return PatternVerificationsByName(result)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class _ConstraintOnProperty:
|
|
72
|
+
"""Represent a match on an expression like ``is_ID_short(self.something)``."""
|
|
73
|
+
|
|
74
|
+
def __init__(self, prop_name: Identifier, constraint: PatternConstraint) -> None:
|
|
75
|
+
"""Initialize with the given values."""
|
|
76
|
+
self.prop_name = prop_name
|
|
77
|
+
self.constraint = constraint
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _match_constraint_on_property(
|
|
81
|
+
node: parse_tree.Node, pattern_verifications_by_name: PatternVerificationsByName
|
|
82
|
+
) -> Optional[_ConstraintOnProperty]:
|
|
83
|
+
"""
|
|
84
|
+
Match the pattern constraints on a property.
|
|
85
|
+
|
|
86
|
+
Return the match, or None if not matched.
|
|
87
|
+
"""
|
|
88
|
+
if not isinstance(node, parse_tree.FunctionCall):
|
|
89
|
+
return None
|
|
90
|
+
|
|
91
|
+
if len(node.args) != 1:
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
prop_name = infer_for_schema_match.try_property(node.args[0])
|
|
95
|
+
if prop_name is None:
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
pattern_verification = pattern_verifications_by_name.get(node.name.identifier, None)
|
|
99
|
+
if pattern_verification is None:
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
return _ConstraintOnProperty(
|
|
103
|
+
prop_name=prop_name,
|
|
104
|
+
constraint=PatternConstraint(pattern=pattern_verification.pattern),
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def patterns_from_invariants(
|
|
109
|
+
cls: intermediate.Class,
|
|
110
|
+
pattern_verifications_by_name: PatternVerificationsByName,
|
|
111
|
+
) -> MutableMapping[intermediate.Property, List[PatternConstraint]]:
|
|
112
|
+
"""
|
|
113
|
+
Infer the pattern constraints for every property of the class ``cls``.
|
|
114
|
+
|
|
115
|
+
Even if a property is optional, the constraint will still be inferred, since
|
|
116
|
+
schemas usually separate constraints from defining optional/required fields
|
|
117
|
+
(*e.g.*, see JSON schema).
|
|
118
|
+
|
|
119
|
+
The constraints are not exhaustive. We only infer constraints based on invariants
|
|
120
|
+
which involve pre-defined list of functions. It might be that the actual invariants
|
|
121
|
+
are tighter.
|
|
122
|
+
|
|
123
|
+
The list of patterns means that *all* the patterns need to be satisfied, *i.e.*
|
|
124
|
+
there is a conjunction of patterns.
|
|
125
|
+
"""
|
|
126
|
+
# NOTE (mristin, 2021-11-30):
|
|
127
|
+
# We iterate only once through the invariants instead of inferring the constraints
|
|
128
|
+
# for each property individually to be able to keep linear time complexity.
|
|
129
|
+
|
|
130
|
+
constraints_on_props = [] # type: List[_ConstraintOnProperty]
|
|
131
|
+
|
|
132
|
+
for invariant in cls.invariants:
|
|
133
|
+
# NOTE (mristin, 2022-01-02):
|
|
134
|
+
# We consider only the genuine invariants of the class, and ignore
|
|
135
|
+
# the invariants of its ancestors.
|
|
136
|
+
if invariant.specified_for is not cls:
|
|
137
|
+
continue
|
|
138
|
+
|
|
139
|
+
# Match something like ``self.something is None or is_ID_short(self.something)``
|
|
140
|
+
conditional_on_prop = infer_for_schema_match.try_conditional_on_prop(
|
|
141
|
+
invariant.body
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
if conditional_on_prop is not None:
|
|
145
|
+
# Match something like
|
|
146
|
+
# ``is_ID_short(self.something) and is_MIME(self.something)``
|
|
147
|
+
if isinstance(conditional_on_prop.consequent, parse_tree.And):
|
|
148
|
+
for value_node in conditional_on_prop.consequent.values:
|
|
149
|
+
constraint_on_prop = _match_constraint_on_property(
|
|
150
|
+
node=value_node,
|
|
151
|
+
pattern_verifications_by_name=pattern_verifications_by_name,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
if (
|
|
155
|
+
constraint_on_prop is not None
|
|
156
|
+
and constraint_on_prop.prop_name
|
|
157
|
+
== conditional_on_prop.prop_name
|
|
158
|
+
):
|
|
159
|
+
constraints_on_props.append(constraint_on_prop)
|
|
160
|
+
|
|
161
|
+
# Match something like ``is_ID_short(self.something)``
|
|
162
|
+
elif isinstance(conditional_on_prop.consequent, parse_tree.FunctionCall):
|
|
163
|
+
constraint_on_prop = _match_constraint_on_property(
|
|
164
|
+
node=conditional_on_prop.consequent,
|
|
165
|
+
pattern_verifications_by_name=pattern_verifications_by_name,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
if constraint_on_prop is not None:
|
|
169
|
+
constraints_on_props.append(constraint_on_prop)
|
|
170
|
+
|
|
171
|
+
else:
|
|
172
|
+
# No match
|
|
173
|
+
pass
|
|
174
|
+
|
|
175
|
+
else:
|
|
176
|
+
# Match something like
|
|
177
|
+
# ``is_ID_short(self.something) and is_MIME(self.something)``
|
|
178
|
+
if isinstance(invariant.body, parse_tree.And):
|
|
179
|
+
for value_node in invariant.body.values:
|
|
180
|
+
constraint_on_prop = _match_constraint_on_property(
|
|
181
|
+
node=value_node,
|
|
182
|
+
pattern_verifications_by_name=pattern_verifications_by_name,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
if constraint_on_prop is not None:
|
|
186
|
+
constraints_on_props.append(constraint_on_prop)
|
|
187
|
+
|
|
188
|
+
# Match something like ``is_ID_short(self.something)``
|
|
189
|
+
elif isinstance(invariant.body, parse_tree.FunctionCall):
|
|
190
|
+
constraint_on_prop = _match_constraint_on_property(
|
|
191
|
+
node=invariant.body,
|
|
192
|
+
pattern_verifications_by_name=pattern_verifications_by_name,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
if constraint_on_prop is not None:
|
|
196
|
+
constraints_on_props.append(constraint_on_prop)
|
|
197
|
+
|
|
198
|
+
else:
|
|
199
|
+
# No match
|
|
200
|
+
pass
|
|
201
|
+
|
|
202
|
+
# endregion
|
|
203
|
+
|
|
204
|
+
# region Group the constraints by property
|
|
205
|
+
|
|
206
|
+
result = (
|
|
207
|
+
dict()
|
|
208
|
+
) # type: MutableMapping[intermediate.Property, List[PatternConstraint]]
|
|
209
|
+
|
|
210
|
+
for constraint_on_prop in constraints_on_props:
|
|
211
|
+
prop = cls.properties_by_name.get(constraint_on_prop.prop_name, None)
|
|
212
|
+
if prop is None:
|
|
213
|
+
continue
|
|
214
|
+
|
|
215
|
+
constraints_for_prop = result.get(prop, None)
|
|
216
|
+
if constraints_for_prop is None:
|
|
217
|
+
constraints_for_prop = []
|
|
218
|
+
result[prop] = constraints_for_prop
|
|
219
|
+
|
|
220
|
+
constraints_for_prop.append(constraint_on_prop.constraint)
|
|
221
|
+
|
|
222
|
+
# endregion
|
|
223
|
+
|
|
224
|
+
return result
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _match_pattern_on_self(
|
|
228
|
+
node: parse_tree.Node, pattern_verifications_by_name: PatternVerificationsByName
|
|
229
|
+
) -> Optional[PatternConstraint]:
|
|
230
|
+
"""
|
|
231
|
+
Match the pattern constraints on ``self``.
|
|
232
|
+
|
|
233
|
+
Return the match, or None if not matched.
|
|
234
|
+
"""
|
|
235
|
+
if not isinstance(node, parse_tree.FunctionCall):
|
|
236
|
+
return None
|
|
237
|
+
|
|
238
|
+
if len(node.args) != 1:
|
|
239
|
+
return None
|
|
240
|
+
|
|
241
|
+
if not isinstance(node.args[0], parse_tree.Name):
|
|
242
|
+
return None
|
|
243
|
+
|
|
244
|
+
# noinspection PyUnresolvedReferences
|
|
245
|
+
if node.args[0].identifier != "self":
|
|
246
|
+
return None
|
|
247
|
+
|
|
248
|
+
pattern_verification = pattern_verifications_by_name.get(node.name.identifier, None)
|
|
249
|
+
if pattern_verification is None:
|
|
250
|
+
return None
|
|
251
|
+
|
|
252
|
+
return PatternConstraint(pattern=pattern_verification.pattern)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
# fmt: off
|
|
256
|
+
@require(
|
|
257
|
+
lambda constrained_primitive:
|
|
258
|
+
constrained_primitive.constrainee == intermediate.PrimitiveType.STR,
|
|
259
|
+
"Infer only patterns on constrained strings"
|
|
260
|
+
)
|
|
261
|
+
# fmt: on
|
|
262
|
+
def infer_patterns_on_self(
|
|
263
|
+
constrained_primitive: intermediate.ConstrainedPrimitive,
|
|
264
|
+
pattern_verifications_by_name: PatternVerificationsByName,
|
|
265
|
+
) -> List[PatternConstraint]:
|
|
266
|
+
"""
|
|
267
|
+
Infer the pattern constraints for the constrained string ``constrained_primitive``.
|
|
268
|
+
|
|
269
|
+
The constraints are not exhaustive. We only infer constraints based on invariants
|
|
270
|
+
which involve pre-defined list of functions. It might be that the actual invariants
|
|
271
|
+
are tighter.
|
|
272
|
+
|
|
273
|
+
The list of patterns means that *all* the patterns need to be satisfied, *i.e.*
|
|
274
|
+
there is a conjunction of patterns.
|
|
275
|
+
"""
|
|
276
|
+
result = [] # type: List[PatternConstraint]
|
|
277
|
+
|
|
278
|
+
for invariant in constrained_primitive.invariants:
|
|
279
|
+
# NOTE (mristin, 2022-01-02):
|
|
280
|
+
# We consider only the genuine invariants of the constrained primitive, and
|
|
281
|
+
# ignore the invariants of its ancestors.
|
|
282
|
+
if invariant.specified_for is not constrained_primitive:
|
|
283
|
+
continue
|
|
284
|
+
|
|
285
|
+
# Match something like
|
|
286
|
+
# ``is_ID_short(self) and is_MIME(self)``
|
|
287
|
+
if isinstance(invariant.body, parse_tree.And):
|
|
288
|
+
for value_node in invariant.body.values:
|
|
289
|
+
pattern_on_self = _match_pattern_on_self(
|
|
290
|
+
node=value_node,
|
|
291
|
+
pattern_verifications_by_name=pattern_verifications_by_name,
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
if pattern_on_self is not None:
|
|
295
|
+
result.append(pattern_on_self)
|
|
296
|
+
|
|
297
|
+
# Match something like ``is_ID_short(self)``
|
|
298
|
+
elif isinstance(invariant.body, parse_tree.FunctionCall):
|
|
299
|
+
pattern_on_self = _match_pattern_on_self(
|
|
300
|
+
node=invariant.body,
|
|
301
|
+
pattern_verifications_by_name=pattern_verifications_by_name,
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
if pattern_on_self is not None:
|
|
305
|
+
result.append(pattern_on_self)
|
|
306
|
+
|
|
307
|
+
else:
|
|
308
|
+
# No match
|
|
309
|
+
pass
|
|
310
|
+
|
|
311
|
+
return result
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
"""Infer the constraints on a property based on constant sets."""
|
|
2
|
+
import collections
|
|
3
|
+
from typing import Optional, Tuple, MutableMapping, List, Mapping, Union, Sequence
|
|
4
|
+
|
|
5
|
+
from icontract import ensure, require
|
|
6
|
+
|
|
7
|
+
from aas_core_codegen.common import Identifier, Error, assert_never
|
|
8
|
+
from aas_core_codegen.infer_for_schema._types import (
|
|
9
|
+
SetOfPrimitivesConstraint,
|
|
10
|
+
SetOfEnumerationLiteralsConstraint,
|
|
11
|
+
)
|
|
12
|
+
from aas_core_codegen.parse import tree as parse_tree
|
|
13
|
+
from aas_core_codegen import intermediate
|
|
14
|
+
from aas_core_codegen.infer_for_schema import match as infer_for_schema_match
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class _PropNameInNamedContainer:
|
|
18
|
+
"""Hold the information for matches of the form ``self.something in X``."""
|
|
19
|
+
|
|
20
|
+
def __init__(
|
|
21
|
+
self, prop_name: Identifier, container_name: Identifier, node: parse_tree.IsIn
|
|
22
|
+
) -> None:
|
|
23
|
+
"""Initialize with the given values."""
|
|
24
|
+
self.prop_name = prop_name
|
|
25
|
+
self.container_name = container_name
|
|
26
|
+
self.node = node
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _match_prop_in_named_container(
|
|
30
|
+
node: parse_tree.Node,
|
|
31
|
+
) -> Optional[_PropNameInNamedContainer]:
|
|
32
|
+
"""Match the expression ``self.something in Something``."""
|
|
33
|
+
if not isinstance(node, parse_tree.IsIn):
|
|
34
|
+
return None
|
|
35
|
+
|
|
36
|
+
prop_name = infer_for_schema_match.try_property(node.member)
|
|
37
|
+
if prop_name is None:
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
if not isinstance(node.container, parse_tree.Name):
|
|
41
|
+
return None
|
|
42
|
+
|
|
43
|
+
return _PropNameInNamedContainer(
|
|
44
|
+
prop_name=prop_name, container_name=node.container.identifier, node=node
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class SetConstraintsByProperty:
|
|
49
|
+
"""Group the set constraints by the class properties."""
|
|
50
|
+
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
set_of_primitives_by_property: Mapping[
|
|
54
|
+
intermediate.Property, SetOfPrimitivesConstraint
|
|
55
|
+
],
|
|
56
|
+
set_of_enumeration_literals_by_property: Mapping[
|
|
57
|
+
intermediate.Property, SetOfEnumerationLiteralsConstraint
|
|
58
|
+
],
|
|
59
|
+
) -> None:
|
|
60
|
+
"""Initialize with the given values."""
|
|
61
|
+
self.set_of_primitives_by_property = set_of_primitives_by_property
|
|
62
|
+
# fmt: off
|
|
63
|
+
self.set_of_enumeration_literals_by_property = (
|
|
64
|
+
set_of_enumeration_literals_by_property
|
|
65
|
+
)
|
|
66
|
+
# fmt: on
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class _IntersectionOfPrimitiveSetLiterals:
|
|
70
|
+
"""Track an intersection of primitive set literals."""
|
|
71
|
+
|
|
72
|
+
# fmt: off
|
|
73
|
+
@require(
|
|
74
|
+
lambda a_type, literals:
|
|
75
|
+
all(
|
|
76
|
+
literal.a_type is a_type
|
|
77
|
+
for literal in literals
|
|
78
|
+
)
|
|
79
|
+
)
|
|
80
|
+
# fmt: on
|
|
81
|
+
def __init__(
|
|
82
|
+
self,
|
|
83
|
+
a_type: intermediate.PrimitiveType,
|
|
84
|
+
literals: Sequence[intermediate.PrimitiveSetLiteral],
|
|
85
|
+
) -> None:
|
|
86
|
+
"""Initialize with the given set."""
|
|
87
|
+
self.a_type = a_type
|
|
88
|
+
self._literals = literals
|
|
89
|
+
|
|
90
|
+
self._count_by_literal_value = {
|
|
91
|
+
literal.value: 0 for literal in literals
|
|
92
|
+
} # type: MutableMapping[Union[bool, int, float, str, bytearray], int]
|
|
93
|
+
|
|
94
|
+
self._counter = 0
|
|
95
|
+
|
|
96
|
+
# fmt: off
|
|
97
|
+
@require(
|
|
98
|
+
lambda self, literals:
|
|
99
|
+
all(
|
|
100
|
+
literal.a_type is self.a_type
|
|
101
|
+
for literal in literals
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
# fmt: on
|
|
105
|
+
def observe(self, literals: Sequence[intermediate.PrimitiveSetLiteral]) -> None:
|
|
106
|
+
"""Limit the intersection by the literals in-place."""
|
|
107
|
+
for literal in literals:
|
|
108
|
+
if literal.value in self._count_by_literal_value:
|
|
109
|
+
self._count_by_literal_value[literal.value] += 1
|
|
110
|
+
|
|
111
|
+
self._counter += 1
|
|
112
|
+
|
|
113
|
+
def compute_literals(self) -> List[intermediate.PrimitiveSetLiteral]:
|
|
114
|
+
"""Compute the literals contained in the intersection."""
|
|
115
|
+
return [
|
|
116
|
+
literal
|
|
117
|
+
for literal in self._literals
|
|
118
|
+
if self._count_by_literal_value[literal.value] == self._counter
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@require(lambda constraints: len(constraints) >= 1)
|
|
123
|
+
def intersect_set_of_primitives_constraints(
|
|
124
|
+
constraints: Sequence[SetOfPrimitivesConstraint],
|
|
125
|
+
) -> SetOfPrimitivesConstraint:
|
|
126
|
+
"""Compute the intersection over all the primitive set literals."""
|
|
127
|
+
intersection = None # type: Optional[_IntersectionOfPrimitiveSetLiterals]
|
|
128
|
+
for constraint in constraints:
|
|
129
|
+
if intersection is None:
|
|
130
|
+
intersection = _IntersectionOfPrimitiveSetLiterals(
|
|
131
|
+
a_type=constraint.a_type, literals=constraint.literals
|
|
132
|
+
)
|
|
133
|
+
else:
|
|
134
|
+
intersection.observe(literals=constraint.literals)
|
|
135
|
+
|
|
136
|
+
assert intersection is not None
|
|
137
|
+
|
|
138
|
+
return SetOfPrimitivesConstraint(
|
|
139
|
+
a_type=intersection.a_type, literals=intersection.compute_literals()
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class _IntersectionOfEnumerationLiterals:
|
|
144
|
+
"""Track an intersection of enumeration literals by their Python object ID."""
|
|
145
|
+
|
|
146
|
+
def __init__(self, literals: Sequence[intermediate.EnumerationLiteral]) -> None:
|
|
147
|
+
"""Initialize with the given set."""
|
|
148
|
+
self._literals = literals
|
|
149
|
+
|
|
150
|
+
self._count_by_literal_id = {
|
|
151
|
+
id(literal): 0 for literal in literals
|
|
152
|
+
} # type: MutableMapping[int, int]
|
|
153
|
+
|
|
154
|
+
self._counter = 0
|
|
155
|
+
|
|
156
|
+
def observe(self, literals: Sequence[intermediate.EnumerationLiteral]) -> None:
|
|
157
|
+
"""Limit the literals in the intersection."""
|
|
158
|
+
for literal in literals:
|
|
159
|
+
if id(literal) in self._count_by_literal_id:
|
|
160
|
+
self._count_by_literal_id[id(literal)] += 1
|
|
161
|
+
|
|
162
|
+
self._counter += 1
|
|
163
|
+
|
|
164
|
+
def compute_literals(self) -> List[intermediate.EnumerationLiteral]:
|
|
165
|
+
"""Compute the literals contained in the intersection."""
|
|
166
|
+
return [
|
|
167
|
+
literal
|
|
168
|
+
for literal in self._literals
|
|
169
|
+
if self._count_by_literal_id[id(literal)] == self._counter
|
|
170
|
+
]
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# fmt: off
|
|
174
|
+
@require(
|
|
175
|
+
lambda constraints:
|
|
176
|
+
all(
|
|
177
|
+
constraint.enumeration is constraints[0].enumeration
|
|
178
|
+
for constraint in constraints
|
|
179
|
+
)
|
|
180
|
+
)
|
|
181
|
+
@require(
|
|
182
|
+
lambda constraints:
|
|
183
|
+
all(
|
|
184
|
+
all(
|
|
185
|
+
id(literal) in constraint.enumeration.literal_id_set
|
|
186
|
+
for literal in constraint.literals
|
|
187
|
+
)
|
|
188
|
+
for constraint in constraints
|
|
189
|
+
)
|
|
190
|
+
)
|
|
191
|
+
@require(
|
|
192
|
+
lambda constraints:
|
|
193
|
+
len(constraints) >= 1
|
|
194
|
+
)
|
|
195
|
+
# fmt: on
|
|
196
|
+
def intersect_set_of_enumeration_literals_constraints(
|
|
197
|
+
constraints: Sequence[SetOfEnumerationLiteralsConstraint],
|
|
198
|
+
) -> SetOfEnumerationLiteralsConstraint:
|
|
199
|
+
"""Compute the intersection over all the set literals."""
|
|
200
|
+
enumeration = None # type: Optional[intermediate.Enumeration]
|
|
201
|
+
intersection = None # type: Optional[_IntersectionOfEnumerationLiterals]
|
|
202
|
+
|
|
203
|
+
for constraint in constraints:
|
|
204
|
+
if intersection is None:
|
|
205
|
+
enumeration = constraint.enumeration
|
|
206
|
+
|
|
207
|
+
intersection = _IntersectionOfEnumerationLiterals(
|
|
208
|
+
literals=constraint.literals
|
|
209
|
+
)
|
|
210
|
+
else:
|
|
211
|
+
intersection.observe(literals=constraint.literals)
|
|
212
|
+
|
|
213
|
+
assert enumeration is not None
|
|
214
|
+
assert intersection is not None
|
|
215
|
+
|
|
216
|
+
return SetOfEnumerationLiteralsConstraint(
|
|
217
|
+
enumeration=enumeration, literals=intersection.compute_literals()
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
# fmt: off
|
|
222
|
+
@ensure(lambda result: (result[0] is not None) ^ (result[1] is not None))
|
|
223
|
+
def infer_set_constraints_by_property_from_invariants(
|
|
224
|
+
cls: intermediate.Class,
|
|
225
|
+
symbol_table: intermediate.SymbolTable
|
|
226
|
+
) -> Tuple[
|
|
227
|
+
Optional[SetConstraintsByProperty],
|
|
228
|
+
Optional[List[Error]]
|
|
229
|
+
]:
|
|
230
|
+
# fmt: on
|
|
231
|
+
"""
|
|
232
|
+
Match all the named constant sets that a property needs to belong to.
|
|
233
|
+
|
|
234
|
+
Even if a property is optional, the constraint will still be inferred.
|
|
235
|
+
|
|
236
|
+
The constraints are not exhaustive. We only infer constraints based on invariants
|
|
237
|
+
which involve constant sets. It might be that the actual invariants are tighter.
|
|
238
|
+
"""
|
|
239
|
+
errors = [] # type: List[Error]
|
|
240
|
+
|
|
241
|
+
# fmt: off
|
|
242
|
+
sets_of_primitives_by_property: MutableMapping[
|
|
243
|
+
intermediate.Property,
|
|
244
|
+
List[SetOfPrimitivesConstraint]
|
|
245
|
+
] = collections.defaultdict(lambda: [])
|
|
246
|
+
# fmt: on
|
|
247
|
+
|
|
248
|
+
# fmt: off
|
|
249
|
+
sets_of_enumeration_literals_by_property: MutableMapping[
|
|
250
|
+
intermediate.Property, List[SetOfEnumerationLiteralsConstraint]
|
|
251
|
+
] = collections.defaultdict(lambda: [])
|
|
252
|
+
# fmt: on
|
|
253
|
+
|
|
254
|
+
# region Collect
|
|
255
|
+
|
|
256
|
+
for invariant in cls.invariants:
|
|
257
|
+
# NOTE (mristin, 2022-07-08):
|
|
258
|
+
# We consider only the genuine invariants of the class, and ignore
|
|
259
|
+
# the invariants of its ancestors.
|
|
260
|
+
|
|
261
|
+
if invariant.specified_for is not cls:
|
|
262
|
+
continue
|
|
263
|
+
|
|
264
|
+
# Match ``not (self.something is not None) or self.something in X``
|
|
265
|
+
conditional_on_prop = infer_for_schema_match.try_conditional_on_prop(
|
|
266
|
+
invariant.body
|
|
267
|
+
)
|
|
268
|
+
if conditional_on_prop is not None:
|
|
269
|
+
node = conditional_on_prop.consequent
|
|
270
|
+
else:
|
|
271
|
+
# Match ``self.something in X``
|
|
272
|
+
node = invariant.body
|
|
273
|
+
|
|
274
|
+
matches = [] # type: List[_PropNameInNamedContainer]
|
|
275
|
+
|
|
276
|
+
if isinstance(node, parse_tree.And):
|
|
277
|
+
for value_node in node.values:
|
|
278
|
+
match = _match_prop_in_named_container(value_node)
|
|
279
|
+
if match is not None:
|
|
280
|
+
matches.append(match)
|
|
281
|
+
else:
|
|
282
|
+
match = _match_prop_in_named_container(node)
|
|
283
|
+
if match is not None:
|
|
284
|
+
matches.append(match)
|
|
285
|
+
|
|
286
|
+
for match in matches:
|
|
287
|
+
prop = cls.properties_by_name.get(match.prop_name, None)
|
|
288
|
+
if prop is None:
|
|
289
|
+
errors.append(
|
|
290
|
+
Error(
|
|
291
|
+
match.node.member.original_node,
|
|
292
|
+
f"The property {match.prop_name!r} does not "
|
|
293
|
+
f"belong to the class {cls.name!r}"
|
|
294
|
+
)
|
|
295
|
+
)
|
|
296
|
+
continue
|
|
297
|
+
|
|
298
|
+
constant = symbol_table.constants_by_name.get(match.container_name, None)
|
|
299
|
+
if constant is None:
|
|
300
|
+
continue
|
|
301
|
+
|
|
302
|
+
type_anno = intermediate.beneath_optional(prop.type_annotation)
|
|
303
|
+
|
|
304
|
+
if isinstance(constant, intermediate.ConstantPrimitive):
|
|
305
|
+
continue
|
|
306
|
+
elif isinstance(constant, intermediate.ConstantSetOfPrimitives):
|
|
307
|
+
prop_primitive_type = intermediate.try_primitive_type(type_anno)
|
|
308
|
+
|
|
309
|
+
if prop_primitive_type is not constant.a_type:
|
|
310
|
+
errors.append(
|
|
311
|
+
Error(
|
|
312
|
+
match.node.container.original_node,
|
|
313
|
+
f"The container is a constant set "
|
|
314
|
+
f"of {constant.a_type.value}'s while "
|
|
315
|
+
f"the property {prop.name!r} in class {cls.name!r} "
|
|
316
|
+
f"has type {prop.type_annotation}"
|
|
317
|
+
)
|
|
318
|
+
)
|
|
319
|
+
continue
|
|
320
|
+
|
|
321
|
+
sets_of_primitives_by_property[prop].append(
|
|
322
|
+
SetOfPrimitivesConstraint(
|
|
323
|
+
a_type=constant.a_type,
|
|
324
|
+
literals=constant.literals
|
|
325
|
+
)
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
elif isinstance(constant, intermediate.ConstantSetOfEnumerationLiterals):
|
|
329
|
+
if not (
|
|
330
|
+
isinstance(type_anno, intermediate.OurTypeAnnotation)
|
|
331
|
+
and isinstance(type_anno.our_type, intermediate.Enumeration)
|
|
332
|
+
and (type_anno.our_type is constant.enumeration)
|
|
333
|
+
):
|
|
334
|
+
errors.append(
|
|
335
|
+
Error(
|
|
336
|
+
match.node.container.original_node,
|
|
337
|
+
f"The container is a constant set "
|
|
338
|
+
f"of enumeration literals of {constant.enumeration.name} "
|
|
339
|
+
f"while the property {prop.name!r} in class {cls.name!r} "
|
|
340
|
+
f"has type {prop.type_annotation}"
|
|
341
|
+
)
|
|
342
|
+
)
|
|
343
|
+
continue
|
|
344
|
+
|
|
345
|
+
sets_of_enumeration_literals_by_property[prop].append(
|
|
346
|
+
SetOfEnumerationLiteralsConstraint(
|
|
347
|
+
enumeration=constant.enumeration,
|
|
348
|
+
literals=constant.literals
|
|
349
|
+
)
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
else:
|
|
353
|
+
assert_never(constant)
|
|
354
|
+
|
|
355
|
+
if len(errors) > 0:
|
|
356
|
+
return None, errors
|
|
357
|
+
|
|
358
|
+
# endregion
|
|
359
|
+
|
|
360
|
+
# region Reduce
|
|
361
|
+
|
|
362
|
+
# fmt: off
|
|
363
|
+
set_of_primitives_by_property: MutableMapping[
|
|
364
|
+
intermediate.Property,
|
|
365
|
+
SetOfPrimitivesConstraint
|
|
366
|
+
] = dict()
|
|
367
|
+
# fmt: on
|
|
368
|
+
|
|
369
|
+
# fmt: off
|
|
370
|
+
set_of_enumeration_literals_by_property: MutableMapping[
|
|
371
|
+
intermediate.Property, SetOfEnumerationLiteralsConstraint
|
|
372
|
+
] = dict()
|
|
373
|
+
# fmt: on
|
|
374
|
+
|
|
375
|
+
for prop, set_of_primitives_constraints in sets_of_primitives_by_property.items():
|
|
376
|
+
set_of_primitives_by_property[prop] = intersect_set_of_primitives_constraints(
|
|
377
|
+
constraints=set_of_primitives_constraints
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
for prop, set_of_enumeration_literals_constraints in (
|
|
381
|
+
sets_of_enumeration_literals_by_property.items()
|
|
382
|
+
):
|
|
383
|
+
set_of_enumeration_literals_by_property[prop] = (
|
|
384
|
+
intersect_set_of_enumeration_literals_constraints(
|
|
385
|
+
constraints=set_of_enumeration_literals_constraints
|
|
386
|
+
)
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
# endregion
|
|
390
|
+
|
|
391
|
+
return SetConstraintsByProperty(
|
|
392
|
+
set_of_primitives_by_property=set_of_primitives_by_property,
|
|
393
|
+
set_of_enumeration_literals_by_property=set_of_enumeration_literals_by_property
|
|
394
|
+
), None
|