Source code for fairyfly_therm.cli.translate

"""Fairyfly therm translation commands."""
import click
import sys
import os
import logging
import base64
import tempfile
import uuid

from fairyfly.model import Model
from fairyfly_therm.writer import model_to_thmz as model_to_thmz_file

_logger = logging.getLogger(__name__)


@click.group(help='Commands for translating Fairyfly JSON files to THMZ files.')
def translate():
    pass


@translate.command('model-to-thmz')
@click.argument('model-file', type=click.Path(
    exists=True, file_okay=True, dir_okay=False, resolve_path=True))
@click.option(
    '--output-file', '-o', help='Optional THMZ file path to output the THMZ bytes '
    'of the translation. By default this will be printed out to stdout.',
    type=click.File('w'), default='-', show_default=True)
def model_to_thmz_cli(model_file, output_file):
    """Translate a Fairyfly Model file to an THERM THMZ file.
    \b

    Args:
        model_file: Full path to a Fairyfly Model file (FFJSON or FFpkl).
    """
    try:
        model_to_thmz(model_file, output_file)
    except Exception as e:
        _logger.exception('Model translation failed.\n{}'.format(e))
        sys.exit(1)
    else:
        sys.exit(0)


[docs] def model_to_thmz(model_file, output_file=None): """Translate a Fairyfly Model file to an THERM THMZ file. Args: model_file: Full path to a Fairyfly Model file (FFJSON or FFpkl). output_file: Optional THMZ file path to output the THMZ string of the translation. If None, the string will be returned from this function. """ # translate the Model to THMZ model = Model.from_file(model_file) if isinstance(output_file, str): folder = os.path.dirname(output_file) if not os.path.isdir(folder): os.makedirs(folder) model_to_thmz_file(model, output_file=output_file) else: if output_file is None or output_file.name == '<stdout>': # get a temporary file out_folder = tempfile.gettempdir() out_file = str(uuid.uuid4())[:6] out_file = os.path.join(out_folder, out_file) else: out_file = output_file.name thmz_file = model_to_thmz_file(model, output_file=out_file) if output_file is None or output_file.name == '<stdout>': # load file contents with open(thmz_file, 'rb') as of: # THMZ can only be read as binary f_contents = of.read() b = base64.b64encode(f_contents) base64_string = b.decode('utf-8') if output_file is None: return base64_string else: output_file.write(base64_string)