docs: def _calculate_values(self, tree, bar_d):
          """Calculate values for drawing bars of non-leafs in ``tree``
  
          Recurses through ``tree``, replaces ``dict``s with
              ``(BarDescriptor, dict)`` so ``ProgressTree._draw`` can use
              the ``BarDescriptor``s to draw the tree
          """
          if all([
              isinstance(tree, dict),
              type(tree) != BarDescriptor
          ]):
              # Calculate value and max_value
              max_val = 0
              value = 0
              for k in tree:
                  # Get descriptor by recursing
                  bar_desc = self._calculate_values(tree[k], bar_d)
                  # Reassign to tuple of (new descriptor, tree below)
                  tree[k] = (bar_desc, tree[k])
                  value += bar_desc["value"].value
                  max_val += bar_desc.get("kwargs", {}).get("max_value", 100)
              # Merge in values from ``bar_d`` before returning descriptor
              kwargs = merge_dicts(
                  [bar_d.get("kwargs", {}),
                   dict(max_value=max_val)],
                  deepcopy=True
              )
              ret_d = merge_dicts(
                  [bar_d,
                   dict(value=Value(floor(value)), kwargs=kwargs)],
                  deepcopy=True
              )
              return BarDescriptor(ret_d)
          elif isinstance(tree, BarDescriptor):
              return tree
          else:
              raise TypeError("Unexpected type {}".format(type(tree)))