| 77 | |
| 78 | |
| 79 | class RenderDataTree: |
| 80 | def __init__( |
| 81 | self, |
| 82 | node: DataTree, |
| 83 | style=None, |
| 84 | childiter: type = list, |
| 85 | maxlevel: int | None = None, |
| 86 | maxchildren: int | None = None, |
| 87 | ): |
| 88 | """ |
| 89 | Render tree starting at `node`. |
| 90 | Keyword Args: |
| 91 | style (AbstractStyle): Render Style. |
| 92 | childiter: Child iterator. Note, due to the use of node.children.values(), |
| 93 | Iterables that change the order of children cannot be used |
| 94 | (e.g., `reversed`). |
| 95 | maxlevel: Limit rendering to this depth. |
| 96 | maxchildren: Limit number of children at each node. |
| 97 | :any:`RenderDataTree` is an iterator, returning a tuple with 3 items: |
| 98 | `pre` |
| 99 | tree prefix. |
| 100 | `fill` |
| 101 | filling for multiline entries. |
| 102 | `node` |
| 103 | :any:`NodeMixin` object. |
| 104 | It is up to the user to assemble these parts to a whole. |
| 105 | |
| 106 | Examples |
| 107 | -------- |
| 108 | |
| 109 | >>> from xarray import Dataset |
| 110 | >>> from xarray.core.datatree import DataTree |
| 111 | >>> from xarray.core.datatree_render import RenderDataTree |
| 112 | >>> root = DataTree.from_dict( |
| 113 | ... { |
| 114 | ... "/": Dataset({"a": 0, "b": 1}), |
| 115 | ... "/sub0": Dataset({"c": 2, "d": 3}), |
| 116 | ... "/sub0/sub0B": Dataset({"e": 4}), |
| 117 | ... "/sub0/sub0A": Dataset({"f": 5, "g": 6}), |
| 118 | ... "/sub1": Dataset({"h": 7}), |
| 119 | ... }, |
| 120 | ... name="root", |
| 121 | ... ) |
| 122 | |
| 123 | # Simple one line: |
| 124 | |
| 125 | >>> for pre, _, node in RenderDataTree(root): |
| 126 | ... print(f"{pre}{node.name}") |
| 127 | ... |
| 128 | root |
| 129 | ├── sub0 |
| 130 | │ ├── sub0B |
| 131 | │ └── sub0A |
| 132 | └── sub1 |
| 133 | |
| 134 | # Multiline: |
| 135 | |
| 136 | >>> for pre, fill, node in RenderDataTree(root): |
no outgoing calls
no test coverage detected
searching dependent graphs…