def _new_rule_part(self, name: Text, source_name: Optional[Text]) -> None: self._add_current_stories_to_result() self.current_step_builder = StoryStepBuilder(name, source_name, is_rule=True)
def _new_story_part(self, name: Text, source_name: Text): self._add_current_stories_to_result() self.current_step_builder = StoryStepBuilder(name, source_name)
class StoryReader: """Helper class to read a story file.""" def __init__( self, domain: Optional[Domain] = None, source_name: Optional[Text] = None, ) -> None: """Constructor for the StoryReader. Args: domain: Domain object. source_name: Name of the training data source. """ self.story_steps = [] self.current_step_builder: Optional[StoryStepBuilder] = None self.domain = domain self.source_name = source_name self._is_parsing_conditions = False def read_from_file(self, filename: Text, skip_validation: bool = False) -> List[StoryStep]: """Reads stories or rules from file. Args: filename: Path to the story/rule file. skip_validation: `True` if file validation should be skipped. Returns: `StoryStep`s read from `filename`. """ raise NotImplementedError @staticmethod def is_stories_file(filename: Union[Text, Path]) -> bool: """Checks if the specified file is a story file. Args: filename: File to check. Returns: `True` if specified file is a story file, `False` otherwise. """ raise NotImplementedError def _add_current_stories_to_result(self) -> None: if self.current_step_builder: self.current_step_builder.flush() self.story_steps.extend(self.current_step_builder.story_steps) def _new_story_part(self, name: Text, source_name: Optional[Text]) -> None: self._add_current_stories_to_result() self.current_step_builder = StoryStepBuilder(name, source_name) def _new_rule_part(self, name: Text, source_name: Optional[Text]) -> None: self._add_current_stories_to_result() self.current_step_builder = StoryStepBuilder(name, source_name, is_rule=True) def _parse_events(self, event_name: Text, parameters: Dict[Text, Any]) -> Optional[List["Event"]]: # add 'name' only if event is not a SlotSet, # because there might be a slot with slot_key='name' if "name" not in parameters and event_name != SlotSet.type_name: parameters["name"] = event_name parsed_events = Event.from_story_string(event_name, parameters, default=ActionExecuted) if parsed_events is None: raise StoryParseError("Unknown event '{}'. It is Neither an event " "nor an action).".format(event_name)) return parsed_events def _add_event(self, event_name: Text, parameters: Dict[Text, Any]) -> None: parsed_events = self._parse_events(event_name, parameters) if self.current_step_builder is None: raise StoryParseError("Failed to handle event '{}'. There is no " "started story block available. " "".format(event_name)) for p in parsed_events: if self._is_parsing_conditions: self.current_step_builder.add_event_as_condition(p) else: self.current_step_builder.add_event(p) def _add_checkpoint(self, name: Text, conditions: Optional[Dict[Text, Any]]) -> None: # Ensure story part already has a name if not self.current_step_builder: raise StoryParseError("Checkpoint '{}' is at an invalid location. " "Expected a story start.".format(name)) self.current_step_builder.add_checkpoint(name, conditions)
class StoryReader: """Helper class to read a story file.""" def __init__( self, domain: Optional[Domain] = None, template_vars: Optional[Dict] = None, use_e2e: bool = False, source_name: Text = None, unfold_or_utterances: bool = True, ) -> None: """Constructor for the StoryReader. Args: domain: Domain object. template_vars: Template variables to be replaced. use_e2e: Specifies whether to use the e2e parser or not. source_name: Name of the training data source. unfold_or_utterances: Identifies if the user utterance is a part of OR statement. This parameter is used only to simplify the conversation from MD story files. Don't use it other ways, because it ends up in a invalid story that cannot be user for real training. Default value is `True`, which preserves the expected behavior of the reader. """ self.story_steps = [] self.current_step_builder: Optional[StoryStepBuilder] = None self.domain = domain self.template_variables = template_vars if template_vars else {} self.use_e2e = use_e2e self.source_name = source_name self.unfold_or_utterances = unfold_or_utterances self._is_parsing_conditions = False def read_from_file(self, filename: Text) -> List[StoryStep]: raise NotImplementedError def _add_current_stories_to_result(self): if self.current_step_builder: self.current_step_builder.flush() self.story_steps.extend(self.current_step_builder.story_steps) def _new_story_part(self, name: Text, source_name: Text): self._add_current_stories_to_result() self.current_step_builder = StoryStepBuilder(name, source_name) def _new_rule_part(self, name: Text, source_name: Text): self._add_current_stories_to_result() self.current_step_builder = StoryStepBuilder(name, source_name, is_rule=True) def _add_event(self, event_name: Text, parameters: Dict[Text, Any]) -> None: # add 'name' only if event is not a SlotSet, # because there might be a slot with slot_key='name' if "name" not in parameters and event_name != SlotSet.type_name: parameters["name"] = event_name parsed_events = Event.from_story_string(event_name, parameters, default=ActionExecuted) if parsed_events is None: raise StoryParseError("Unknown event '{}'. It is Neither an event " "nor an action).".format(event_name)) if self.current_step_builder is None: raise StoryParseError("Failed to handle event '{}'. There is no " "started story block available. " "".format(event_name)) for p in parsed_events: _map_legacy_event_names(p) if self._is_parsing_conditions: self.current_step_builder.add_event_as_condition(p) else: self.current_step_builder.add_event(p) def _add_checkpoint(self, name: Text, conditions: Optional[Dict[Text, Any]]) -> None: # Ensure story part already has a name if not self.current_step_builder: raise StoryParseError("Checkpoint '{}' is at an invalid location. " "Expected a story start.".format(name)) self.current_step_builder.add_checkpoint(name, conditions)