docs: def _gen_prov(self):
          """
          Extracts provenance information from the pipeline into a PipelineProv
          object
  
          Returns
          -------
          prov : dict[str, *]
              A dictionary containing the provenance information to record
              for the pipeline
          """
          # Export worfklow graph to node-link data format
          wf_dict = nx_json.node_link_data(self.workflow._graph)
          # Replace references to Node objects with the node's provenance
          # information and convert to a dict organised by node name to allow it
          # to be compared more easily. Also change link node-references from
          # node index to node ID so it is not dependent on the order the nodes
          # are written to the dictionary (which for Python < 3.7 is guaranteed
          # to be the same between identical runs)
          for link in wf_dict['links']:
              if int(networkx_version.split('.')[0]) < 2:  # @UndefinedVariable
                  link['source'] = wf_dict['nodes'][link['source']]['id'].name
                  link['target'] = wf_dict['nodes'][link['target']]['id'].name
              else:
                  link['source'] = link['source'].name
                  link['target'] = link['target'].name
          wf_dict['nodes'] = {n['id'].name: n['id'].prov
                              for n in wf_dict['nodes']}
          # Roundtrip to JSON to convert any tuples into lists so dictionaries
          # can be compared directly
          wf_dict = json.loads(json.dumps(wf_dict))
          dependency_versions = {d: extract_package_version(d)
                                 for d in ARCANA_DEPENDENCIES}
          pkg_versions = {'arcana': __version__}
          pkg_versions.update((k, v) for k, v in dependency_versions.items()
                              if v is not None)
          prov = {
              '__prov_version__': PROVENANCE_VERSION,
              'name': self.name,
              'workflow': wf_dict,
              'study': self.study.prov,
              'pkg_versions': pkg_versions,
              'python_version': sys.version,
              'joined_ids': self._joined_ids()}
          return prov