# Copyright 2019-2020, Collabora, Ltd.
# SPDX-License-Identifier: Apache-2.0
"""
Miscellaneous visitors to apply to an estimate.
For all of these visitors, given a project task called ``ESTIMATE`` and a visitor
function named ``visitor``, you apply the visitor as follows:
.. code-block:: python
ESTIMATE.apply_visitor(visitor)
.. seealso:
:meth:`ballparker.types.Task.apply_visitor`
The method that applies visitors.
"""
[docs]def anonymize(task, parent=None):
r"""
Visit with a visitor that replaces task descriptions with systematic but anonymous names.
Replaces each description with a dotted-decimal "item number".
Useful for sharing test cases, bug reproductions, etc:
the overall structure of the estimate remains, but the contents
of each task's description is removed.
Use like: ``ESTIMATE.apply_visitor(anonymize)``
>>> from ballparker.dsl import *
>>> estimate = project(
... "a",
... grouping("b",
... "bc",
... ("bd", S)))
>>> estimate.apply_visitor(anonymize)
>>> estimate.to_dsl()
"project(\n ('1'),\n grouping('2',\n ('2.1'),\n ('2.2', S)))"
"""
base_desc = "" if not parent else task.description + '.'
for i, subtask in enumerate(task.subtasks, 1):
subtask.description = f'{base_desc}{i}'