def reads(self, string: Text, **kwargs: Any) -> "TrainingData": """Reads TrainingData in YAML format from a string. Args: string: String with YAML training data. **kwargs: Keyword arguments. Returns: New `TrainingData` object with parsed training data. """ from rasa.nlu.training_data import TrainingData from rasa.validator import Validator self.validate(string) yaml_content = io_utils.read_yaml(string) if not Validator.validate_training_data_format_version( yaml_content, self.filename): return TrainingData() for key, value in yaml_content.items(): # pytype: disable=attribute-error if key == KEY_NLU: self._parse_nlu(value) elif key == KEY_RESPONSES: self.responses = value return TrainingData( self.training_examples, self.entity_synonyms, self.regex_features, self.lookup_tables, self.responses, )
def read_from_parsed_yaml( self, parsed_content: Dict[Text, Union[Dict, List]]) -> List[StoryStep]: """Read stories from parsed YAML. Args: parsed_content: The parsed YAML as a dictionary. Returns: The parsed stories or rules. """ from rasa.validator import Validator if not Validator.validate_training_data_format_version( parsed_content, self.source_name): return [] for key, parser_class in { KEY_STORIES: StoryParser, KEY_RULES: RuleParser, }.items(): data = parsed_content.get(key, []) parser = parser_class.from_reader(self) parser.parse_data(data) self.story_steps.extend(parser.get_steps()) return self.story_steps
def read_from_parsed_yaml( self, parsed_content: Dict[Text, Union[Dict, List]]) -> List[StoryStep]: """Read stories from parsed YAML. Args: parsed_content: The parsed YAML as a dictionary. Returns: The parsed stories or rules. """ from rasa.validator import Validator if not Validator.validate_training_data_format_version( parsed_content, self.source_name): return [] stories = parsed_content.get(KEY_STORIES, []) self._parse_data(stories, is_rule_data=False) rules = parsed_content.get(KEY_RULES, []) self._parse_data(rules, is_rule_data=True) self._add_current_stories_to_result() return self.story_steps
async def test_invalid_training_data_format_version_warns(): invalid_version_1 = {KEY_TRAINING_DATA_FORMAT_VERSION: 2.0} invalid_version_2 = {KEY_TRAINING_DATA_FORMAT_VERSION: "Rasa"} for version in [invalid_version_1, invalid_version_2]: with pytest.warns(UserWarning): assert Validator.validate_training_data_format_version(version, "")
async def test_future_training_data_format_version_not_compatible(): next_minor = str(Version(LATEST_TRAINING_DATA_FORMAT_VERSION).next_minor()) incompatible_version = {KEY_TRAINING_DATA_FORMAT_VERSION: next_minor} with pytest.warns(UserWarning): assert not Validator.validate_training_data_format_version( incompatible_version, "")
async def test_compatible_training_data_format_version(): prev_major = str(Version("1.0")) compatible_version_1 = {KEY_TRAINING_DATA_FORMAT_VERSION: prev_major} compatible_version_2 = { KEY_TRAINING_DATA_FORMAT_VERSION: LATEST_TRAINING_DATA_FORMAT_VERSION } for version in [compatible_version_1, compatible_version_2]: with pytest.warns(None): assert Validator.validate_training_data_format_version(version, "")
def from_yaml(cls, yaml: Text, original_filename: Text = "") -> "Domain": from rasa.validator import Validator try: validate_yaml_schema(yaml, DOMAIN_SCHEMA_FILE) except InvalidYamlFileError as e: raise InvalidDomain(str(e)) data = rasa.utils.io.read_yaml(yaml) if not Validator.validate_training_data_format_version(data, original_filename): return Domain.empty() return cls.from_dict(data)