Source code for aiida.cmdline.commands.cmd_data.cmd_export

# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved.                     #
# This file is part of the AiiDA code.                                    #
#                                                                         #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida-core #
# For further information on the license, see the LICENSE.txt file        #
# For further information please visit http://www.aiida.net               #
###########################################################################
"""
This module provides export functionality to all data types
"""

import click
from aiida.cmdline.utils import echo
from aiida.cmdline.params import options

EXPORT_OPTIONS = [
    click.option(
        '--reduce-symmetry/--no-reduce-symmetry',
        'reduce_symmetry',
        is_flag=True,
        default=None,
        help='Do (default) or do not perform symmetry reduction.'
    ),
    click.option(
        '--parameter-data',
        type=click.INT,
        default=None,
        help='ID of the Dict to be exported alongside the'
        ' StructureData instance. By default, if StructureData'
        ' originates from a calculation with single'
        ' Dict in the output, aforementioned'
        ' Dict is picked automatically. Instead, the'
        ' option is used in the case the calculation produces'
        ' more than a single instance of Dict.'
    ),
    click.option(
        '--dump-aiida-database/--no-dump-aiida-database',
        'dump_aiida_database',
        is_flag=True,
        default=None,
        help='Export (default) or do not export AiiDA database to the CIF file.'
    ),
    click.option(
        '--exclude-external-contents/--no-exclude-external-contents',
        'exclude_external_contents',
        is_flag=True,
        default=None,
        help='Do not (default) or do save the contents for external resources even if URIs are provided'
    ),
    click.option('--gzip/--no-gzip', is_flag=True, default=None, help='Do or do not (default) gzip large files.'),
    click.option(
        '--gzip-threshold',
        type=click.INT,
        default=None,
        help='Specify the minimum size of exported file which should'
        ' be gzipped.'
    ),
    click.option(
        '-o',
        '--output',
        type=click.STRING,
        default=None,
        help='If present, store the output directly on a file '
        'with the given name. It is essential to use this option '
        'if more than one file needs to be created.'
    ),
    options.FORCE(help='Overwrite files without checking.'),
]


[docs]def export_options(func): for option in reversed(EXPORT_OPTIONS): func = option(func) return func
[docs]def data_export(node, output_fname, fileformat, other_args=None, overwrite=False): """ Depending on the parameters, either print the (single) output file on screen, or store the file(s) on disk. :param node: the Data node to print or store on disk :param output_fname: The filename to store the main file. If empty or None, print instead :param fileformat: a string to pass to the _exportcontent method :param other_args: a dictionary with additional kwargs to pass to _exportcontent :param overwrite: if False, stops if any file already exists (when output_fname is not empty :note: this function calls directly sys.exit(1) when an error occurs (or e.g. if check_overwrite is True and a file already exists). """ if other_args is None: other_args = {} try: # pylint: disable=protected-access if output_fname: try: node.export(output_fname, fileformat=fileformat, overwrite=overwrite, **other_args) except OSError as err: echo.echo_critical(f'OSError while exporting file:\n{err}') else: filetext, extra_files = node._exportcontent(fileformat, main_file_name=output_fname, **other_args) if extra_files: echo.echo_critical( 'This format requires to write more than one file.\n' 'You need to pass the -o option to specify a file name.' ) else: echo.echo(filetext.decode('utf-8')) except TypeError as err: # This typically occurs for parameters that are passed down to the # methods in, e.g., BandsData, but they are not accepted echo.echo_critical( f'TypeError, perhaps a parameter is not supported by the specific format?\nError message: {err}' )