Repository: Avaiga/taipy
File: taipy/core/reason/reason.py (Python)

Code before:
# Copyright 2021-2024 Avaiga Private Limited
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
# specific language governing permissions and limitations under the License.

from typing import Any, Optional


class Reason:
    """
    A reason holds the reason why specific actions cannot be performed.

    Attributes:
        reason (str): The reason why the action cannot be performed.
    """

    def __init__(self, reason: str):
        self._reason = reason

    @property
    def reason(self) -> str:
        return self._reason

    def __str__(self) -> str:
        return self._reason

    def __repr__(self) -> str:
        return self._reason

    def __hash__(self) -> int:
        return hash(self._reason)

    def __eq__(self, value: Any) -> bool:
        return isinstance(value, Reason) and value._reason == self._reason



Review comment (suggestion):
```suggestion
    A reason explains why a specific action cannot be performed.
    
    This is a parent class aiming at being implemented by specific sub-classes.
    
    Because Taipy applications are natively multiuser, asynchronous, and dynamic, 
    some functions might not be called in some specific contexts. You can protect 
    such calls by calling other methods that return `Reasons^` objects. A `Reasons^` 
    object acts like a boolean: True if the action can be performed and False otherwise. 
    If the action cannot be performed, the `Reasons^` object holds all the reasons why 
    the action cannot be performed as a list of `Reason` objects.
```

Code after:
# Copyright 2021-2024 Avaiga Private Limited
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
# specific language governing permissions and limitations under the License.

from typing import Any, Optional


class Reason:
    """
    A reason explains why a specific action cannot be performed.

    This is a parent class aiming at being implemented by specific sub-classes.

    Because Taipy applications are natively multiuser, asynchronous, and dynamic,
    some functions might not be called in some specific contexts. You can protect
    such calls by calling other methods that return a Reasons object. It acts like a
    boolean: True if the operation can be performed and False otherwise.
    If the action cannot be performed, the Reasons object holds all the `reasons as a list
    of `Reason` objects. Each `Reason` holds an explanation of why the operation cannot be
    performed.

    Attributes:
        reason (str): The English representation of the reason why the action cannot be performed.
    """

    def __init__(self, reason: str):
        self._reason = reason

    def __str__(self) -> str:
        return self._reason

    def __repr__(self) -> str:
        return self._reason

    def __hash__(self) -> int: