aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/model/util.py
blob: db2ef14bbb4e330e32f29ab7b5cebc344d3d6f5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Copyright (c) 2023 Cisco and/or its affiliates.
# 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.

"""Module hosting few utility functions useful when dealing with modelled data.

This is for storing varied utility functions, which are too short and diverse
to be put into more descriptive modules.
"""


from robot.libraries.BuiltIn import BuiltIn


def descend(parent_node, key, default_factory=None):
    """Return a sub-node, create and insert it when it does not exist.

    Without this function:
        child_node = parent_node.get(key, dict())
        parent_node[key] = child_node

    With this function:
        child_node = descend(parent_node, key)

    New code is shorter and avoids the need to type key and parent_node twice.

    :param parent_node: Reference to inner node of a larger structure
        we want to descend from.
    :param key: Key of the maybe existing child node.
    :param default_factory: If the key does not exist, call this
        to create a new value to be inserted under the key.
        None means dict. The other popular option is list.
    :type parent_node: dict
    :type key: str
    :type default_factory: Optional[Callable[[], object]]
    :returns: The reference to (maybe just created) child node.
    :rtype: object
    """
    if key not in parent_node:
        factory = dict if default_factory is None else default_factory
        parent_node[key] = factory()
    return parent_node[key]


def get_export_data():
    """Return data member of ExportJson library instance.

    This assumes the data has been initialized already.
    Return None if Robot is not running.

    :returns: Current library instance's raw data field.
    :rtype: Optional[dict]
    :raises AttributeError: If library is not imported yet.
    """
    instance = BuiltIn().get_library_instance(
        u"resources.libraries.python.model.ExportJson"
    )
    if instance is None:
        return None
    return instance.data