def test_pop(self):
     sl = StringList(['', '', "hello", "world", '', '', '', "1234"])
     assert sl.pop(2) == "hello"
     assert sl == ['', '', "world", '', '', '', "1234"]
     assert isinstance(sl, StringList)
예제 #2
0
def _reformat_blocks(blocks: List[List[str]]):

    cursor = 1

    while cursor < len(blocks):

        if isinstance(blocks[cursor - 1],
                      (_MultilineFunction, _DecoratedFunction, _Class)):
            # Add a blank line after _Variables, a multi-line function, or a decorated function
            blocks.insert(cursor, [])
            cursor += 1

        if blocks[cursor] and blocks[cursor - 1] and re.match(
                "^[ \t]+", blocks[cursor - 1][-1]) and not re.match(
                    "^[ \t]+", blocks[cursor][0]):
            # Add a blank line after a dedent
            blocks.insert(cursor, [])
            cursor += 1

        if isinstance(blocks[cursor - 1], _Variables):
            # Add a blank line before and after _Variables
            blocks.insert(cursor - 1, [])
            blocks.insert(cursor + 1, [])
            cursor += 2

        if isinstance(blocks[cursor], _Variables):
            # Add a blank line before and after _Variables
            blocks.insert(cursor, [])
            blocks.insert(cursor + 2, [])
            cursor += 2

        if isinstance(blocks[cursor],
                      (_DecoratedFunction, _MultilineFunction)):
            # Add a blank line before a decorated function
            blocks.insert(cursor, [])
            cursor += 1

        if isinstance(blocks[cursor], _Class):

            if (cursor + 1 < len(blocks)
                    and isinstance(blocks[cursor + 1], _Function) and
                    not isinstance(blocks[cursor + 1],
                                   (_DecoratedFunction, _MultilineFunction))
                    and blocks[cursor][-1].lstrip().startswith("class")
                    and blocks[cursor + 1][0][0].isspace()):
                blocks.insert(cursor, [])
                cursor += 2
            else:
                blocks.insert(cursor, [])
                blocks.insert(cursor + 2, [])
                cursor += 3

        cursor += 1

    output = StringList()

    # Remove trailing whitespace from each block
    for block in blocks:
        if output and not block and not output[-1]:
            # Remove duplicate new lines
            continue

        output.append('\n'.join(block).rstrip())

    if not output[0]:
        output.pop(0)

    output.blankline(ensure_single=True)

    return output
예제 #3
0
    def run_html(self) -> List[nodes.Node]:
        """
		Generate output for ``HTML`` builders.
		"""

        # colours = itertools.cycle(self.delimited_get("colours", "#6ab0de"))
        colours = itertools.cycle(
            get_random_sample(self.delimited_get("colours", "blue")))
        classes = list(
            self.delimited_get(
                "class",
                "col-xl-6 col-lg-6 col-md-12 col-sm-12 col-xs-12 p-2"))

        content = StringList()
        content.append(".. panels::")
        content.indent_type = "    "
        content.indent_size = 1
        content.append(":container: container-xl pb-4 sphinx-highlights")
        content.blankline()

        for obj_name in get_random_sample(sorted(set(self.content))):
            if self.options.get("module", '') and obj_name.startswith('.'):
                obj_name = obj_name.replace('.', f"{self.options['module']}.",
                                            1)

            name_parts = obj_name.split('.')
            module = import_module('.'.join(name_parts[:-1]))
            obj = getattr(module, name_parts[-1])

            colour_class = f"highlight-{next(colours)}"
            content.append(
                f":column: {DelimitedList((*classes, colour_class)): }")

            if isinstance(obj, FunctionType):
                content.append(
                    f":func:`{'.'.join(name_parts[1:])}() <.{obj_name}>`")
            elif isinstance(obj, type):
                content.append(
                    f":class:`{'.'.join(name_parts[1:])} <.{obj_name}>`")
            else:
                content.append(
                    f":py:obj:`{'.'.join(name_parts[1:])} <.{obj_name}>`")

            content.append('^' * len(content[-1]))
            content.blankline()
            # content.append(f".. function:: {name_parts[-1]} {stringify_signature(inspect.signature(obj))}")
            content.append(format_signature(obj))
            content.blankline()
            content.append(
                inspect.cleandoc(obj.__doc__ or '').split("\n\n")[0])
            content.blankline()
            content.append(f"See more in :mod:`{module.__name__}`.")
            content.append("---")

        content.pop(-1)

        targetid = f'sphinx-highlights-{self.env.new_serialno("sphinx-highlights"):d}'
        targetnode = nodes.target('', '', ids=[targetid])

        view = ViewList(content)
        body_node = nodes.paragraph(rawsource=str(content))
        self.state.nested_parse(view, self.content_offset,
                                body_node)  # type: ignore

        sphinx_highlights_purger.add_node(self.env, body_node, targetnode,
                                          self.lineno)

        return [targetnode, body_node]