Source code for aiida_diff.parsers

Parsers provided by aiida_diff.

Register parsers via the "aiida.parsers" entry point in setup.json.
from aiida.common import exceptions
from aiida.engine import ExitCode
from aiida.orm import SinglefileData
from aiida.parsers.parser import Parser
from aiida.plugins import CalculationFactory

DiffCalculation = CalculationFactory("diff")

[docs]class DiffParser(Parser): """ Parser class for parsing output of calculation. """
[docs] def __init__(self, node): """ Initialize Parser instance Checks that the ProcessNode being passed was produced by a DiffCalculation. :param node: ProcessNode of calculation :param type node: :class:`aiida.orm.nodes.process.process.ProcessNode` """ super().__init__(node) if not issubclass(node.process_class, DiffCalculation): raise exceptions.ParsingError("Can only parse DiffCalculation")
[docs] def parse(self, **kwargs): """ Parse outputs, store results in database. :returns: an exit code, if parsing fails (or nothing if parsing succeeds) """ output_filename = self.node.get_option("output_filename") # Check that folder content is as expected files_retrieved = self.retrieved.base.repository.list_object_names() files_expected = [output_filename] # Note: set(A) <= set(B) checks whether A is a subset of B if not set(files_expected) <= set(files_retrieved): self.logger.error( f"Found files '{files_retrieved}', expected to find '{files_expected}'" ) return self.exit_codes.ERROR_MISSING_OUTPUT_FILES # add output file"Parsing '{output_filename}'") with, "rb") as handle: output_node = SinglefileData(file=handle) self.out("diff", output_node) return ExitCode(0)