******
Verify
******

Our SDK allows you to verify that a model satisfies the constraints of the meta-model.

The verification logic is concentrated in the module :py:mod:`aas_core3_1.verification`, and all it takes is a call to :py:func:`aas_core3_1.verification.verify` function.
The function :py:func:`aas_core3_1.verification.verify` will check that constraints in the given model element are satisfied, including the recursion into children elements.
The function returns an iterator of :py:class:`aas_core3_1.verification.Error`'s, which you can use for further processing (*e.g.*, report to the user).

Here is a short example snippet:

.. testcode::

    import aas_core3_1.types as aas_types
    import aas_core3_1.verification as aas_verification

    # Prepare the environment
    environment = aas_types.Environment(
        submodels=[
            aas_types.Submodel(
                id="some-unique-global-identifier",
                submodel_elements=[
                    aas_types.Property(
                        # The ID-shorts must be proper variable names,
                        # but there is a whitespace (" ") in this ID-short.
                        id_short = "some Property",
                        value_type=aas_types.DataTypeDefXSD.INT,
                        value="1984"
                    )
                ]
            )
        ]
    )

    for error in aas_verification.verify(environment):
        print(f"{error.path}: {error.cause}")

Expected output:

.. testoutput::

        .submodels[0].submodel_elements[0].id_short: ID-short of Referables shall only feature letters, digits, hyphen (``-``) and  underscore (``_``); starting mandatory with a letter, and not ending with a hyphen, *I.e.* ``^[a-zA-Z][a-zA-Z0-9_-]*[a-zA-Z0-9_]+$``.

Limit the Number of Reported Errors
===================================

Since the function :py:func:`aas_core3_1.verification.verify` gives you an iterator, you can use :py:mod:`itertools` on it.

Here is a snippet which reports only the first 10 errors:

.. code-block:: python3

    # ... code from above ...

    import itertools

    for error in itertools.islice(
            aas_verification.verify(environment),
            10
    ):
        print(f"{error.path}: {error.cause}")


Omitted Constraints
===================

Not all constraints specified in the meta-model can be verified.
Some constraints require external dependencies such as an AAS registry.
Verifying the constraints with external dependencies is out-of-scope of our SDK, as we still lack standardized interfaces to those dependencies.

However, all the constraints which need no external dependency are verified.
For a full list of exception, please see the description of the module :py:mod:`aas_core3_1.types`.
