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
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)
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
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)
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