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

Code before:
        # Retrieve all data nodes
        all_data_nodes = tp.get_data_nodes()

        # Write the data
        dataset.write("Hello, World!")

        # Read the data
        print(dataset.read())
        ```

    Attributes:
        config_id (str): Identifier of the data node configuration. It must be a valid Python
            identifier.
        scope (Scope^): The scope of this data node.
        id (str): The unique identifier of this data node.
        name (str): A user-readable name of this data node.
        owner_id (str): The identifier of the owner (sequence_id, scenario_id, cycle_id) or
            None.
        parent_ids (Optional[Set[str]]): The set of identifiers of the parent tasks.
        last_edit_date (datetime): The date and time of the last modification.
        edits (List[Edit^]): The list of Edits (an alias for dict) containing metadata about each
            data edition including but not limited to timestamp, comments, job_id:
                timestamp: The time instant of the writing
                comments: Representation of a free text to explain or comment on a data change
                job_id: Only populated when the data node is written by a task execution and
                    corresponds to the job's id.
            Additional metadata related to the edition made to the data node can also be provided in Edits.
        version (str): The string indicates the application version of the data node to
            instantiate. If not provided, the current version is used.
        validity_period (Optional[timedelta]): The duration implemented as a timedelta since the last edit date for
            which the data node can be considered up-to-date. Once the validity period has passed, the data node is
            considered stale and relevant tasks will run even if they are skippable (see the
            [Task management page](../core/entities/task-mgt.md) for more details).
            If _validity_period_ is set to `None`, the data node is always up-to-date.
        edit_in_progress (bool): True if the data node is locked for modification. False
            otherwise.
        editor_id (Optional[str]): The identifier of the user who is currently editing the data node.
        editor_expiration_date (Optional[datetime]): The expiration date of the editor lock.
        kwargs: A dictionary of additional properties.
    """

    _ID_PREFIX = "DATANODE"
    __ID_SEPARATOR = "_"
    __logger = _TaipyLogger._get_logger()
    _REQUIRED_PROPERTIES: List[str] = []
    _MANAGER_NAME: str = "data"
    _PATH_KEY = "path"
    __EDIT_TIMEOUT = 30

    _TAIPY_PROPERTIES: Set[str] = set()


Review comment (suggestion):
```suggestion

                - timestamp: The time instant of the writing
                - comments: Representation of a free text to explain or comment on a data change
                - job_id: Only populated when the data node is written by a task execution and
                    corresponds to the job's id.
                    
```

I'm not sure if this would help the list represents correctly as a bullet list when built, but I think a bullet list is better

Code after:
        1. Create a Scenario using the `create_scenario()^` function. Related data nodes
            will be created automatically. Please refer to the `Scenario^` class for more
            information.
        2. Configure a `DataNodeConfig^` with the various configuration methods form `Config^`
            and use the `create_global_data_node()^` function as illustrated in the following
            example.

    !!! Example

        ```python
        import taipy as tp
        from taipy import Config

        # Configure a global data node
        dataset_cfg = Config.configure_data_node("my_dataset", scope=tp.Scope.GLOBAL)

        # Instantiate a global data node
        dataset = tp.create_global_data_node(dataset_cfg)

        # Retrieve the list of all data nodes
        all_data_nodes = tp.get_data_nodes()

        # Write the data
        dataset.write("Hello, World!")

        # Read the data
        print(dataset.read())
        ```

    Attributes:
        config_id (str): Identifier of the data node configuration. It must be a valid Python
            identifier.
        scope (Scope^): The scope of this data node.
        id (str): The unique identifier of this data node.
        name (str): A user-readable name of this data node.
        owner_id (str): The identifier of the owner (sequence_id, scenario_id, cycle_id) or
            None.
        parent_ids (Optional[Set[str]]): The set of identifiers of the parent tasks.
        last_edit_date (datetime): The date and time of the last modification.
        edits (List[Edit^]): The list of Edits (an alias for dict) containing metadata about each
            data edition including but not limited to:
                <ul><li>timestamp: The time instant of the writing </li>
                <li>comments: Representation of a free text to explain or comment on a data change</li>
                <li>job_id: Only populated when the data node is written by a task execution and
                    corresponds to the job's id.</li></ul>
            Additional metadata related to the edition made to the data node can also be provided in Edits.
        version (str): The string indicates the application version of the data node to
            instantiate. If not provided, the current version is used.
        validity_period (Optional[timedelta]): The duration implemented as a timedelta since the last edit date for
            which the data node can be considered up-to-date. Once the validity period has passed, the data node is
            considered stale and relevant tasks will run even if they are skippable (see the