Example #1
0
def test_parse_nested_traversal():
    parser = argparse.ArgumentParser()

    subparsers1 = parser.add_subparsers()
    subparser1 = subparsers1.add_parser('level1')

    subparsers2 = subparser1.add_subparsers()
    subparser2 = subparsers2.add_parser('level2')

    subparsers3 = subparser2.add_subparsers()
    subparser3 = subparsers3.add_parser('level3')

    subparser3.add_argument('foo', help='foo help')
    subparser3.add_argument('bar')

    data = parse_parser(parser)

    data3 = parser_navigate(data, 'level1 level2 level3')

    assert data3['action_groups'][0]['options'] == [
        {
            'name': ['foo'],
            'help': 'foo help',
            'default': None
        }, {
            'name': ['bar'],
            'help': '',
            'default': None
        }
    ]

    data2 = parser_navigate(data, 'level1 level2')
    assert data2['children'] == [
        {
            'name': 'level3',
            'help': '',
            'usage': 'usage: py.test level1 level2 level3 [-h] foo bar',
            'bare_usage': 'py.test level1 level2 level3 [-h] foo bar',
            'action_groups': [
                {
                    'title': 'Positional Arguments',
                    'description': None,
                    'options': [
                        {
                            'default': None,
                            'name': ['foo'],
                            'help': 'foo help'
                        }, {
                            'name': ['bar'],
                            'help': '',
                            'default': None
                        }
                    ]
                }
            ]
        }
    ]

    assert data == parser_navigate(data, '')
Example #2
0
def test_parse_nested_traversal():
    parser = argparse.ArgumentParser()

    subparsers1 = parser.add_subparsers()
    subparser1 = subparsers1.add_parser('level1')

    subparsers2 = subparser1.add_subparsers()
    subparser2 = subparsers2.add_parser('level2')

    subparsers3 = subparser2.add_subparsers()
    subparser3 = subparsers3.add_parser('level3')

    subparser3.add_argument('foo', help='foo help')
    subparser3.add_argument('bar')

    data = parse_parser(parser)

    data3 = parser_navigate(data, 'level1 level2 level3')

    assert data3['action_groups'][0]['options'] == [
        {
            'name': ['foo'],
            'help': 'foo help',
            'default': None
        }, {
            'name': ['bar'],
            'help': '',
            'default': None
        }
    ]

    data2 = parser_navigate(data, 'level1 level2')
    assert data2['children'] == [
        {
            'name': 'level3',
            'help': '',
            'usage': 'usage: py.test level1 level2 level3 [-h] foo bar',
            'bare_usage': 'py.test level1 level2 level3 [-h] foo bar',
            'action_groups': [
                {
                    'title': 'Positional Arguments',
                    'description': None,
                    'options': [
                        {
                            'default': None,
                            'name': ['foo'],
                            'help': 'foo help'
                        }, {
                            'name': ['bar'],
                            'help': '',
                            'default': None
                        }
                    ]
                }
            ]
        }
    ]

    assert data == parser_navigate(data, '')
Example #3
0
def test_parse_nested_traversal():
    parser = argparse.ArgumentParser()

    subparsers1 = parser.add_subparsers()
    subparser1 = subparsers1.add_parser('level1')

    subparsers2 = subparser1.add_subparsers()
    subparser2 = subparsers2.add_parser('level2')

    subparsers3 = subparser2.add_subparsers()
    subparser3 = subparsers3.add_parser('level3')

    subparser3.add_argument('foo', help='foo help')
    subparser3.add_argument('bar')

    data = parse_parser(parser)

    data3 = parser_navigate(data, 'level1 level2 level3')

    assert data3['args'] == [
        {
            'name': 'foo',
            'help': 'foo help',
            'metavar': None
        },
        {
            'name': 'bar',
            'help': '',
            'metavar': None
        },
    ]

    data2 = parser_navigate(data, 'level1 level2')
    assert data2['children'] == [{
        'name':
        'level3',
        'help':
        '',
        'usage':
        'usage: py.test level1 level2 level3 [-h] foo bar',
        'bare_usage':
        'py.test level1 level2 level3 [-h] foo bar',
        'args': [
            {
                'name': 'foo',
                'help': 'foo help',
                'metavar': None
            },
            {
                'name': 'bar',
                'help': '',
                'metavar': None
            },
        ],
    }]

    assert data == parser_navigate(data, '')
Example #4
0
def test_parse_nested_traversal():
    parser = argparse.ArgumentParser()

    subparsers1 = parser.add_subparsers()
    subparser1 = subparsers1.add_parser('level1')

    subparsers2 = subparser1.add_subparsers()
    subparser2 = subparsers2.add_parser('level2')

    subparsers3 = subparser2.add_subparsers()
    subparser3 = subparsers3.add_parser('level3')

    subparser3.add_argument('foo', help='foo help')
    subparser3.add_argument('bar')

    data = parse_parser(parser)

    data3 = parser_navigate(data, 'level1 level2 level3')

    assert data3['args'] == [
        {
            'name': 'foo',
            'help': 'foo help',
            'metavar': None
        }, {
            'name': 'bar',
            'help': '',
            'metavar': None
        }
    ]

    data2 = parser_navigate(data, 'level1 level2')
    assert data2['children'] == [
        {
            'name': 'level3',
            'help': '',
            'usage': 'usage: py.test level1 level2 level3 [-h] foo bar',
            'bare_usage': 'py.test level1 level2 level3 [-h] foo bar',
            'args': [
                {
                    'name': 'foo',
                    'help': 'foo help',
                    'metavar': None
                },
                {
                    'name': 'bar',
                    'help': '',
                    'metavar': None
                }
            ]
        }
    ]

    assert data == parser_navigate(data, '')
Example #5
0
    def run(self):

        if 'module' in self.options and 'func' in self.options:
            module_name = self.options['module']
            attr_name = self.options['func']
        elif 'ref' in self.options:
            _parts = self.options['ref'].split('.')
            module_name = '.'.join(_parts[0:-1])
            attr_name = _parts[-1]
        else:
            raise self.error(':module: and :func: should be specified, or :ref:')

        mod = __import__(module_name, globals(), locals(), [attr_name])
        if not hasattr(mod, attr_name):
            raise self.error('Module "%s" has no attribute "%s"\nIncorrect argparse :module: or :func: values?' % (module_name, attr_name))

        func = getattr(mod, attr_name)

        if isinstance(func, ArgumentParser):
            parser = func
        else:
            parser = func()

        if not 'path' in self.options:
            self.options['path'] = ''
        path = str(self.options['path'])

        parser.prog = self.options['prog']

        result = parse_parser(parser,
                              skip_default_values='nodefault' in self.options)
        result = parser_navigate(result, path)

        nested_content = nodes.paragraph()
        self.state.nested_parse(self.content, self.content_offset, nested_content)
        nested_content = nested_content.children

        items = []

        # add common content between
        for item in nested_content:
            if not isinstance(item, nodes.definition_list):
                items.append(item)

        if 'description' in result:
            items.append(nodes.paragraph(text=result['description']))

        items.append(nodes.literal_block(text=result['usage']))

        items.append(print_command_args_and_opts(
            print_arg_list(result, nested_content),
            print_opt_list(result, nested_content),
            print_subcommand_list(result, nested_content)
        ))

        if 'epilog' in result:
            items.append(nodes.paragraph(text=result['epilog']))

        return items
Example #6
0
 def run(self):
     if 'module' in self.options and 'func' in self.options:
         module_name = self.options['module']
         attr_name = self.options['func']
     elif 'ref' in self.options:
         _parts = self.options['ref'].split('.')
         module_name = '.'.join(_parts[0:-1])
         attr_name = _parts[-1]
     else:
         raise self.error(
             ':module: and :func: should be specified, or :ref:')
     mod = __import__(module_name, globals(), locals(), [attr_name])
     if not hasattr(mod, attr_name):
         raise self.error(
             ('Module "%s" has no attribute "%s"\n'
              'Incorrect argparse :module: or :func: values?') %
             (module_name, attr_name))
     func = getattr(mod, attr_name)
     if isinstance(func, ArgumentParser):
         parser = func
     elif 'passparser' in self.options:
         parser = ArgumentParser()
         func(parser)
     else:
         parser = func()
     if 'path' not in self.options:
         self.options['path'] = ''
     path = str(self.options['path'])
     if 'prog' in self.options:
         parser.prog = self.options['prog']
     result = parse_parser(parser,
                           skip_default_values='nodefault' in self.options)
     result = parser_navigate(result, path)
     if 'manpage' in self.options:
         return self._construct_manpage_specific_structure(result)
     nested_content = nodes.paragraph()
     self.state.nested_parse(self.content, self.content_offset,
                             nested_content)
     nested_content = nested_content.children
     items = []
     # add common content between
     for item in nested_content:
         if not isinstance(item, nodes.definition_list):
             items.append(item)
     if 'description' in result:
         items.append(self._nested_parse_paragraph(result['description']))
     items.append(nodes.literal_block(text=result['usage']))
     items.append(
         print_command_args_and_opts(
             print_arg_list(result, nested_content),
             print_opt_list(result, nested_content),
             print_subcommand_list(result, nested_content)))
     if 'epilog' in result:
         items.append(self._nested_parse_paragraph(result['epilog']))
     return items
Example #7
0
def test_parse_nested_traversal():
    parser = argparse.ArgumentParser()

    subparsers1 = parser.add_subparsers()
    subparser1 = subparsers1.add_parser("level1")

    subparsers2 = subparser1.add_subparsers()
    subparser2 = subparsers2.add_parser("level2")

    subparsers3 = subparser2.add_subparsers()
    subparser3 = subparsers3.add_parser("level3")

    subparser3.add_argument("foo", help="foo help")
    subparser3.add_argument("bar")

    data = parse_parser(parser)

    data3 = parser_navigate(data, "level1 level2 level3")

    assert data3["args"] == [
        {"name": "foo", "help": "foo help", "metavar": None},
        {"name": "bar", "help": "", "metavar": None},
    ]

    data2 = parser_navigate(data, "level1 level2")
    assert data2["children"] == [
        {
            "name": "level3",
            "help": "",
            "usage": "usage: py.test level1 level2 level3 [-h] foo bar",
            "bare_usage": "py.test level1 level2 level3 [-h] foo bar",
            "args": [
                {"name": "foo", "help": "foo help", "metavar": None},
                {"name": "bar", "help": "", "metavar": None},
            ],
        }
    ]

    assert data == parser_navigate(data, "")
Example #8
0
def test_aliased_traversal():
    parser = argparse.ArgumentParser()

    subparsers1 = parser.add_subparsers()
    subparsers1.add_parser('level1', aliases=['l1'])

    data = parse_parser(parser)

    data2 = parser_navigate(data, 'level1')

    assert(data2 == {
        'bare_usage': 'py.test level1 [-h]',
        'help': '',
        'usage': 'usage: py.test level1 [-h]',
        'name': 'level1 (l1)',
        'identifier': 'level1'})
Example #9
0
    def test_aliased_traversal():
        parser = argparse.ArgumentParser()

        subparsers1 = parser.add_subparsers()
        subparsers1.add_parser('level1', aliases=['l1'])

        data = parse_parser(parser)

        data2 = parser_navigate(data, 'level1')

        assert(data2 == {
            'bare_usage': 'py.test level1 [-h]',
            'help': '',
            'usage': 'usage: py.test level1 [-h]',
            'name': 'level1 (l1)',
            'identifier': 'level1'})
Example #10
0
    def run(self):

        mod = __import__(self.options['module'], globals(), locals(),
                         [self.options['func']])
        func = getattr(mod, self.options['func'])

        parser = func()

        if not 'path' in self.options:
            self.options['path'] = ''
        path = str(self.options['path'])

        parser.prog = self.options['prog']

        result = parse_parser(parser,
                              skip_default_values='nodefault' in self.options)
        result = parser_navigate(result, path)

        nested_content = nodes.paragraph()
        self.state.nested_parse(self.content, self.content_offset,
                                nested_content)
        nested_content = nested_content.children

        items = []

        # add common content between
        for item in nested_content:
            if not isinstance(item, nodes.definition_list):
                items.append(item)

        if 'description' in result:
            items.append(nodes.paragraph(text=result['description']))

        items.append(nodes.literal_block(text=result['usage']))

        items.append(
            print_command_args_and_opts(
                print_arg_list(result, nested_content),
                print_opt_list(result, nested_content),
                print_subcommand_list(result, nested_content)))

        if 'epilog' in result:
            items.append(nodes.paragraph(text=result['epilog']))

        return items
Example #11
0
    def run(self):

        mod = __import__(self.options['module'], globals(), locals(), self.options['module'].split('.')[-1:])
        func = get_ref(mod, self.options['func'])


        parser = func()

        if not 'path' in self.options:
            self.options['path'] = ''
        path = str(self.options['path'])

        parser.prog = self.options['prog']

        result = parse_parser(parser,
                              skip_default_values='nodefault' in self.options)
        result = parser_navigate(result, path)

        nested_content = nodes.paragraph()
        self.state.nested_parse(self.content, self.content_offset, nested_content)
        nested_content = nested_content.children

        items = []

        # add common content between
        for item in nested_content:
            if not isinstance(item, nodes.definition_list):
                items.append(item)

        if 'description' in result:
            items.append(nodes.paragraph(text=result['description']))

        items.append(nodes.literal_block(text=result['usage']))

        items.append(print_command_args_and_opts(
            print_arg_list(result, nested_content),
            print_opt_list(result, nested_content),
            print_subcommand_list(result, nested_content)
        ))

        if 'epilog' in result:
            items.append(nodes.paragraph(text=result['epilog']))

        return items
Example #12
0
    def run(self):
        if 'module' in self.options and 'func' in self.options:
            module_name = self.options['module']
            attr_name = self.options['func']
        elif 'ref' in self.options:
            _parts = self.options['ref'].split('.')
            module_name = '.'.join(_parts[0:-1])
            attr_name = _parts[-1]
        elif 'filename' in self.options and 'func' in self.options:
            mod = {}
            try:
                f = open(self.options['filename'])
            except IOError:
                # try open with abspath
                f = open(os.path.abspath(self.options['filename']))
            code = compile(f.read(), self.options['filename'], 'exec')
            exec(code, mod)
            attr_name = self.options['func']
            func = mod[attr_name]
        else:
            raise self.error(
                ':module: and :func: should be specified, or :ref:, or :filename: and :func:'
            )

        # Skip this if we're dealing with a local file, since it obviously can't be imported
        if 'filename' not in self.options:
            try:
                mod = __import__(module_name, globals(), locals(), [attr_name])
            except:
                raise self.error('Failed to import "%s" from "%s".\n%s' %
                                 (attr_name, module_name, sys.exc_info()[1]))

            if not hasattr(mod, attr_name):
                raise self.error(
                    ('Module "%s" has no attribute "%s"\n'
                     'Incorrect argparse :module: or :func: values?') %
                    (module_name, attr_name))
            func = getattr(mod, attr_name)

        if isinstance(func, ArgumentParser):
            parser = func
        elif 'passparser' in self.options:
            parser = ArgumentParser()
            func(parser)
        else:
            parser = func()
        if 'path' not in self.options:
            self.options['path'] = ''
        path = str(self.options['path'])
        if 'prog' in self.options:
            parser.prog = self.options['prog']
        result = parse_parser(parser,
                              skip_default_values='nodefault' in self.options,
                              skip_default_const_values='nodefaultconst'
                              in self.options)
        result = parser_navigate(result, path)
        if 'manpage' in self.options:
            return self._construct_manpage_specific_structure(result)

        # Handle nested content, where markdown needs to be preprocessed
        items = []
        nested_content = nodes.paragraph()
        if 'markdown' in self.options:
            from sphinxarg.markdown import parseMarkDownBlock
            items.extend(parseMarkDownBlock('\n'.join(self.content) + '\n'))
        else:
            self.state.nested_parse(self.content, self.content_offset,
                                    nested_content)
            nested_content = nested_content.children
        # add common content between
        for item in nested_content:
            if not isinstance(item, nodes.definition_list):
                items.append(item)

        markDownHelp = False
        if 'markdownhelp' in self.options:
            markDownHelp = True
        if 'description' in result and 'nodescription' not in self.options:
            if markDownHelp:
                items.extend(renderList([result['description']], True))
            else:
                items.append(
                    self._nested_parse_paragraph(result['description']))
        items.append(nodes.literal_block(text=result['usage']))
        items.extend(
            print_action_groups(result,
                                nested_content,
                                markDownHelp,
                                settings=self.state.document.settings))
        if 'nosubcommands' not in self.options:
            items.extend(
                print_subcommands(result,
                                  nested_content,
                                  markDownHelp,
                                  settings=self.state.document.settings))
        if 'epilog' in result and 'noepilog' not in self.options:
            items.append(self._nested_parse_paragraph(result['epilog']))

        # Traverse the returned nodes, modifying the title IDs as necessary to avoid repeats
        ensureUniqueIDs(items)

        return items
Example #13
0
    def run(self):
        if 'module' in self.options and 'func' in self.options:
            module_name = self.options['module']
            attr_name = self.options['func']
        elif 'ref' in self.options:
            _parts = self.options['ref'].split('.')
            module_name = '.'.join(_parts[0:-1])
            attr_name = _parts[-1]
        elif 'filename' in self.options and 'func' in self.options:
            mod = {}
            f = open(self.options['filename'])
            code = compile(f.read(), self.options['filename'], 'exec')
            exec(code, mod)
            attr_name = self.options['func']
            func = mod[attr_name]
        else:
            raise self.error(
                ':module: and :func: should be specified, or :ref:, or :filename: and :func:')

        # Skip this if we're dealing with a local file, since it obviously can't be imported
        if 'filename' not in self.options:
            try:
                mod = __import__(module_name, globals(), locals(), [attr_name])
            except:
                raise self.error('Failed to import "%s" from "%s"' % (attr_name, module_name))

            if not hasattr(mod, attr_name):
                raise self.error((
                    'Module "%s" has no attribute "%s"\n'
                    'Incorrect argparse :module: or :func: values?'
                ) % (module_name, attr_name))
            func = getattr(mod, attr_name)

        if isinstance(func, ArgumentParser):
            parser = func
        elif 'passparser' in self.options:
            parser = ArgumentParser()
            func(parser)
        else:
            parser = func()
        if 'path' not in self.options:
            self.options['path'] = ''
        path = str(self.options['path'])
        if 'prog' in self.options:
            parser.prog = self.options['prog']
        result = parse_parser(
            parser, skip_default_values='nodefault' in self.options, skip_default_const_values='nodefaultconst' in self.options)
        result = parser_navigate(result, path)
        if 'manpage' in self.options:
            return self._construct_manpage_specific_structure(result)
        nested_content = nodes.paragraph()
        self.state.nested_parse(
            self.content, self.content_offset, nested_content)
        nested_content = nested_content.children
        items = []
        # add common content between
        for item in nested_content:
            if not isinstance(item, nodes.definition_list):
                items.append(item)
        if 'description' in result:
            items.append(self._nested_parse_paragraph(result['description']))
        items.append(nodes.literal_block(text=result['usage']))
        items.append(print_command_args_and_opts(
            print_arg_list(result, nested_content),
            print_opt_list(result, nested_content),
            print_subcommand_list(result, nested_content)
        ))
        if 'epilog' in result:
            items.append(self._nested_parse_paragraph(result['epilog']))
        return items
Example #14
0
    def run(self):
        if 'module' in self.options and 'func' in self.options:
            module_name = self.options['module']
            attr_name = self.options['func']
        elif 'ref' in self.options:
            _parts = self.options['ref'].split('.')
            module_name = '.'.join(_parts[0:-1])
            attr_name = _parts[-1]
        elif 'filename' in self.options and 'func' in self.options:
            mod = {}
            try:
                f = open(self.options['filename'])
            except IOError:
                # try open with abspath
                f = open(os.path.abspath(self.options['filename']))
            code = compile(f.read(), self.options['filename'], 'exec')
            exec(code, mod)
            attr_name = self.options['func']
            func = mod[attr_name]
        else:
            raise self.error(
                ':module: and :func: should be specified, or :ref:, or :filename: and :func:')

        # Skip this if we're dealing with a local file, since it obviously can't be imported
        if 'filename' not in self.options:
            try:
                mod = __import__(module_name, globals(), locals(), [attr_name])
            except:
                raise self.error('Failed to import "%s" from "%s".\n%s' % (attr_name, module_name, sys.exc_info()[1]))

            if not hasattr(mod, attr_name):
                raise self.error((
                    'Module "%s" has no attribute "%s"\n'
                    'Incorrect argparse :module: or :func: values?'
                ) % (module_name, attr_name))
            func = getattr(mod, attr_name)

        if isinstance(func, ArgumentParser):
            parser = func
        elif 'passparser' in self.options:
            parser = ArgumentParser()
            func(parser)
        else:
            parser = func()
        if 'path' not in self.options:
            self.options['path'] = ''
        path = str(self.options['path'])
        if 'prog' in self.options:
            parser.prog = self.options['prog']
        result = parse_parser(
            parser, skip_default_values='nodefault' in self.options, skip_default_const_values='nodefaultconst' in self.options)
        result = parser_navigate(result, path)
        if 'manpage' in self.options:
            return self._construct_manpage_specific_structure(result)

        # Handle nested content, where markdown needs to be preprocessed
        items = []
        nested_content = nodes.paragraph()
        if 'markdown' in self.options:
            from sphinxarg.markdown import parseMarkDownBlock
            items.extend(parseMarkDownBlock('\n'.join(self.content) + '\n'))
        else:
            self.state.nested_parse(
                self.content, self.content_offset, nested_content)
            nested_content = nested_content.children
        # add common content between
        for item in nested_content:
            if not isinstance(item, nodes.definition_list):
                items.append(item)

        markDownHelp = False
        if 'markdownhelp' in self.options:
            markDownHelp = True
        if 'description' in result and 'nodescription' not in self.options:
            if markDownHelp:
                items.extend(renderList([result['description']], True))
            else:
                items.append(self._nested_parse_paragraph(result['description']))
        items.append(nodes.literal_block(text=result['usage']))
        items.extend(print_action_groups(result, nested_content, markDownHelp,
                                         settings=self.state.document.settings))
        if 'nosubcommands' not in self.options:
            items.extend(print_subcommands(result, nested_content, markDownHelp,
                                           settings=self.state.document.settings))
        if 'epilog' in result and 'noepilog' not in self.options:
            items.append(self._nested_parse_paragraph(result['epilog']))

        # Traverse the returned nodes, modifying the title IDs as necessary to avoid repeats
        ensureUniqueIDs(items)

        return items
Example #15
0
    def run(self):
        if 'module' in self.options and 'func' in self.options:
            module_name = self.options['module']
            attr_name = self.options['func']
        elif 'ref' in self.options:
            _parts = self.options['ref'].split('.')
            module_name = '.'.join(_parts[0:-1])
            attr_name = _parts[-1]
        else:
            raise self.error(
                ':module: and :func: should be specified, or :ref:')
        mod = __import__(module_name, globals(), locals(), [attr_name])
        file_dependency = mod.__file__

        if file_dependency.endswith('.pyc'):
            file_dependency = file_dependency[:-1]

        env = self.state.document.settings.env

        if not hasattr(env, 'argparse_usages'):
            env.argparse_usages = []

        env.argparse_usages.append({
            'docname': env.docname,
            'lineno': self.lineno,
            'dependency_file': file_dependency,
            'dependency_mtime': os.stat(file_dependency).st_mtime,
        })

        if not hasattr(mod, attr_name):
            raise self.error((
                'Module "%s" has no attribute "%s"\n'
                'Incorrect argparse :module: or :func: values?'
            ) % (module_name, attr_name))
        func = getattr(mod, attr_name)
        if isinstance(func, ArgumentParser):
            parser = func
        elif 'passparser' in self.options:
            parser = ArgumentParser()
            func(parser)
        else:
            parser = func()
        if 'path' not in self.options:
            self.options['path'] = ''
        path = str(self.options['path'])
        if 'prog' in self.options:
            parser.prog = self.options['prog']
        result = parse_parser(
            parser, skip_default_values='nodefault' in self.options)
        result = parser_navigate(result, path)
        if 'manpage' in self.options:
            return self._construct_manpage_specific_structure(result)
        nested_content = nodes.paragraph()
        self.state.nested_parse(
            self.content, self.content_offset, nested_content)
        nested_content = nested_content.children
        items = []
        # add common content between
        for item in nested_content:
            if not isinstance(item, nodes.definition_list):
                items.append(item)
        if 'description' in result:
            items.append(self._nested_parse_paragraph(result['description']))
        items.append(nodes.literal_block(text=result['usage']))

        if 'nosubcommands' in self.options:
            subcommands = None
        else:
            subcommands = print_subcommand_list(result, nested_content)

        items.append(print_command_args_and_opts(
            print_arg_list(result, nested_content),
            print_opt_list(result, nested_content),
            subcommands
        ))
        if 'epilog' in result:
            items.append(self._nested_parse_paragraph(result['epilog']))
        return items