예제 #1
0
    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,
        )
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
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, "")
예제 #5
0
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, "")
예제 #6
0
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, "")
예제 #7
0
    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)