docs: def get_changed_vars(section: SoS_Step):
      '''changed vars are variables that are "shared" and therefore "provides"
      to others '''
      if 'shared' not in section.options:
          return set()
  
      changed_vars = set()
      svars = section.options['shared']
      if isinstance(svars, str):
          changed_vars.add(svars)
          svars = {svars: svars}
      elif isinstance(svars, Sequence):
          for item in svars:
              if isinstance(item, str):
                  changed_vars.add(item)
              elif isinstance(item, Mapping):
                  changed_vars |= set(item.keys())
              else:
                  raise ValueError(
                      f'Option shared should be a string, a mapping of expression, or list of string or mappings. {svars} provided'
                  )
      elif isinstance(svars, Mapping):
          changed_vars |= set(svars.keys())
      else:
          raise ValueError(
              f'Option shared should be a string, a mapping of expression, or list of string or mappings. {svars} provided'
          )
      return changed_vars