Esempio n. 1
0
def _load_question_dict(question):
    # type: (Dict[str, Any]) -> Tuple[str, QuestionMeta]
    """Create a question from a dictionary which contains a template.

    :return the name of the question
    """
    # Perform series of validations on the question.
    # Try to have meaningful error messages.

    # Check has instance data
    instance_data = question.get('instance')
    if not instance_data:
        raise QuestionValidationException("Missing instance data")

    # name validation
    given_question_name = instance_data.get('instanceName')
    if not given_question_name or not validate_question_name(
            given_question_name):
        raise QuestionValidationException(
            "Invalid question name: {}".format(given_question_name))
    question_name = str(given_question_name)  # type: str

    # description validation
    question_description = instance_data.get(
        'description', '').strip()  # type: str
    if not question_description:
        raise QuestionValidationException(
            "Missing description for question '{}'".format(question_name))
    if not question_description.endswith('.'):
        question_description += '.'

    # Extend description if we can
    long_description = instance_data.get(
        'longDescription', '').strip()  # type: str
    if long_description:
        if not long_description.endswith('.'):
            long_description += '.'
        question_description = "\n\n".join(
            [question_description, long_description])

    # Extract question tags
    tags = sorted(map(str, instance_data.get('tags', [])))
    _tags.update(tags)

    # Validate question variables
    ivars = instance_data.get('variables')
    variables = _process_variables(question_name, ivars)

    # Compute docstring
    docstring = _compute_docstring(question_description, variables, ivars)

    # Make new Question class
    question_class = QuestionMeta(question_name, (QuestionBase,), {
        'docstring': docstring,
        'description': question_description,
        'tags': tags,
        'template': deepcopy(question),
        'variables': variables,
    })
    return question_name, question_class
Esempio n. 2
0
def test_validate_question_name():
    assert validate_name('goodname')
    for name in [42, 'x' * 151, '/', '/etc']:
        with pytest.raises(QuestionValidationException):
            assert validate_question_name(name)
Esempio n. 3
0
def _load_question_dict(question, session):
    # type: (Dict[str, Any], Session) -> Tuple[str, QuestionMeta]
    """Create a question from a dictionary which contains a template.

    :return the name of the question
    """
    # Perform series of validations on the question.
    # Try to have meaningful error messages.

    # Check has instance data
    instance_data = question.get("instance")
    if not instance_data:
        raise QuestionValidationException("Missing instance data")

    # name validation
    given_question_name = instance_data.get("instanceName")
    if not given_question_name or not validate_question_name(
            given_question_name):
        raise QuestionValidationException(
            "Invalid question name: {}".format(given_question_name))
    question_name = str(given_question_name)  # type: str

    # description validation
    question_description = instance_data.get("description",
                                             "").strip()  # type: str
    if not question_description:
        raise QuestionValidationException(
            "Missing description for question '{}'".format(question_name))
    if not question_description.endswith("."):
        question_description += "."

    # Extend description if we can
    long_description = instance_data.get("longDescription",
                                         "").strip()  # type: str
    if long_description:
        if not long_description.endswith("."):
            long_description += "."
        question_description = "\n\n".join(
            [question_description, long_description])

    # Extract question tags
    tags = sorted(map(str, instance_data.get("tags", [])))
    _tags.update(tags)

    # Validate question variables
    ivars = instance_data.get("variables", {})
    ordered_variable_names = instance_data.get("orderedVariableNames", [])
    variables = _process_variables(question_name, ivars,
                                   ordered_variable_names)

    # Compute docstring
    docstring = _compute_docstring(question_description, variables, ivars)

    # Make new Question class
    question_class = QuestionMeta(
        question_name,
        (QuestionBase, ),
        {
            "docstring": docstring,
            "description": question_description,
            "session": session,
            "tags": tags,
            "template": deepcopy(question),
            "variables": variables,
        },
    )
    return question_name, question_class
Esempio n. 4
0
def test_validate_question_name():
    assert validate_name("goodname")
    for name in [42, "x" * 151, "/", "/etc"]:
        with pytest.raises(QuestionValidationException):
            assert validate_question_name(name)
Esempio n. 5
0
def _load_question_dict(question,
                        question_path=None,
                        module_name=bfq.__name__):
    # type: (Dict, Optional[str], str) -> str
    """Create a question from a dictionary which contains a template.

    :return the name of the question
    """
    # Perform series of validations on the question.
    # Try to have meaningful error messages.

    # Check has instance data
    instance_data = question.get('instance')
    if not instance_data:
        raise QuestionValidationException(
            "Missing instance data in question (file: {})".format(
                question_path))

    # name validation
    given_question_name = instance_data.get('instanceName')
    if not given_question_name or not validate_question_name(
            given_question_name):
        raise QuestionValidationException(
            "Invalid question name: {}".format(given_question_name))
    question_name = str(given_question_name)  # type: str

    # description validation
    question_description = instance_data.get('description')
    if not question_description:
        raise QuestionValidationException(
            "Missing description for question '{}'".format(question_name))

    # Extend description if we can
    long_description = instance_data.get('longDescription')
    if long_description:
        question_description = "\n".join(
            [question_description, long_description])

    # Extract question tags
    tags = sorted(map(str, instance_data.get('tags', [])))
    _tags.update(tags)

    # Validate question variables
    ivars = instance_data.get('variables')
    variables = _process_variables(question_name, ivars)

    # Compute docstring
    docstring = _compute_docstring(question_description, ivars)

    # Make new Question class and set it in the specified module
    module = sys.modules[module_name]
    setattr(
        module, question_name,
        QuestionMeta(
            question_name, (QuestionBase, ), {
                'docstring': docstring,
                'description': question_description,
                'module': module_name,
                'tags': tags,
                'template': deepcopy(question),
                'variables': variables,
            }))

    return question_name