Ejemplo n.º 1
0
 def vocab_defs(self):
     return {
         splitext(basename(content_file))[0]: list(
             chain(*(map(str.strip,
                         i.lower().split('|'))
                     for i in read_lines(content_file))))
         for content_file in
         glob(join(self.folder, 'vocab', self.lang, '*.voc')) +
         glob(join(self.folder, 'regex', self.lang, '*.rx'))
     }
Ejemplo n.º 2
0
class PadatiousTestCreator(TestCreator):
    intent_files = Lazy(
        lambda s: glob(join(s.folder, 'vocab', s.lang, '*.intent')) + glob(
            join(s.folder, 'locale', s.lang, '*.intent')))
    intent_names = Lazy(
        lambda s:
        {basename(intent_file): intent_file
         for intent_file in s.intent_files})
    intent_file = Lazy(lambda s: s.intent_names.get(s.intent_name, ''))
    entities = Lazy(
        lambda s: {
            splitext(basename(entity_file))[0]: read_lines(entity_file)
            for entity_file in glob(join(
                s.folder, 'vocab', s.lang, '*.entity')) + glob(
                    join(s.folder, 'locale', s.lang, '*.entity'))
        })

    intent_lines = Lazy(lambda s: read_lines(s.intent_file))
    entity_names = Lazy(lambda s: set(
        re.findall(r'(?<={)[a-z_]+(?=})', '\n'.join(s.intent_lines))))

    @Lazy
    @serialized
    def entities_str(self) -> str:
        if not self.entities:
            return
        yield '=== Entity Examples ==='
        for entity_name, lines in sorted(self.entities.items()):
            sample = ', '.join(lines)
            yield '{}: {}'.format(entity_name,
                                  sample[:50] + '...' * (len(sample) > 50))

    @Lazy
    @serialized
    def intent_str(self) -> str:
        shuffle(self.intent_lines)
        yield '=== Intent Examples ==='
        yield '\n'.join(self.intent_lines[:6] + ['...'] *
                        (len(self.intent_lines) > 6))

    @Lazy
    def utterance_data(self) -> dict:
        utterance_data = {}
        utterance_left = self.utterance

        print()
        print('=== Entity Tags ===')
        for entity_name in sorted(self.entity_names):
            entity_value = ask_input(
                entity_name + ':', lambda x: not x or x in utterance_left,
                'Response must be in the remaining utterance: ' +
                utterance_left)
            if entity_value:
                utterance_data[entity_name] = entity_value
                utterance_left = utterance_left.replace(entity_value, '')
        return utterance_data

    @Lazy
    def test_case(self) -> {}:
        if self.intent_name not in self.intent_names:
            return {}

        print()
        print(self.intent_str)
        print()
        if self.entities_str:
            print(self.entities_str)
            print()

        test_case = {'utterance': self.utterance}
        if self.entity_names and self.utterance_data:
            test_case['intent'] = self.utterance_data
        test_case['intent_type'] = self.intent_name
        if self.expected_dialog:
            test_case['expected_dialog'] = self.expected_dialog
        return test_case