# -*- 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 #
###########################################################################
[docs]def test_and_get_code(codename, expected_code_type, use_exceptions=False):
"""
Pass a code name and an expected code (plugin) type. Check that the
code exists, is unique, and return the Code object.
:param codename: the name of the code to load (in the form label@machine)
:param expected_code_type: a string with the plugin that is expected to
be loaded. In case no plugins exist with the given name, show all existing
plugins of that type
:param use_exceptions: if True, raise a ValueError exception instead of
calling sys.exit(1)
:return: a Code object
"""
import sys
from aiida.common.exceptions import NotExistent
from aiida.orm import Code
try:
if codename is None:
raise ValueError
code = Code.get_from_string(codename)
if code.get_input_plugin_name() != expected_code_type:
raise ValueError
except (NotExistent, ValueError):
from aiida.orm.querybuilder import QueryBuilder
qb = QueryBuilder()
qb.append(Code,
filters={'attributes.input_plugin':
{'==': expected_code_type}},
project='*')
valid_code_labels = ["{}@{}".format(c.label, c.get_computer().name)
for [c] in qb.all()]
if valid_code_labels:
msg = ("Pass as further parameter a valid code label.\n"
"Valid labels with a {} executable are:\n".format(
expected_code_type))
msg += "\n".join("* {}".format(l) for l in valid_code_labels)
if use_exceptions:
raise ValueError(msg)
else:
print >> sys.stderr, msg
sys.exit(1)
else:
msg = ("Code not valid, and no valid codes for {}.\n"
"Configure at least one first using\n"
" verdi code setup".format(
expected_code_type))
if use_exceptions:
raise ValueError(msg)
else:
print >> sys.stderr, msg
sys.exit(1)
return code