API Reference¶
This reference is organised into sections relating to the different concepts you’re likely to encounter when using Sybil.
Sybils¶
See the Sybil concept definition for information.
- class sybil.Sybil(parsers: Sequence[Callable[[sybil.Document], Iterable[sybil.Region]]], pattern: str | None = None, patterns: Sequence[str] = (), exclude: str | None = None, excludes: Sequence[str] = (), filenames: Collection[str] = (), path: str = '.', setup: Callable[[Dict[str, Any]], None] | None = None, teardown: Callable[[Dict[str, Any]], None] | None = None, fixtures: Sequence[str] = (), encoding: str = 'utf-8', document_types: Mapping[str | None, Type[Document]] | None = None, name: str = '')¶
An object to provide test runner integration for discovering examples in documentation and ensuring they are correct.
- Parameters:
parsers – A sequence of callable parsers.
path –
The path in which source files are found, relative to the path of the Python source file in which this class is instantiated. Absolute paths can also be passed.
Note
This is ignored when using the pytest integration.
pattern – An optional
patternused to match source files that will be parsed for examples.patterns – An optional sequence of
patternsused to match source paths that will be parsed for examples.exclude – An optional
patternfor source file names that will be excluded when looking for examples.excludes – An optional sequence of
patternsfor source paths that will be excluded when looking for examples.filenames – An optional collection of file names that, if found anywhere within the root
pathor its sub-directories, will be parsed for examples.setup – An optional callable that will be called once before any examples from a
Documentare evaluated. If provided, it is called with the document’snamespace.teardown – An optional callable that will be called after all the examples from a
Documenthave been evaluated. If provided, it is called with the document’snamespace.fixtures – An optional sequence of strings specifying the names of fixtures to be requested when using the pytest integration. The fixtures will be inserted into the document’s
namespacebefore any examples for that document are evaluated. All scopes of fixture are supported.encoding – An optional string specifying the encoding to be used when decoding documentation source files.
document_types – A mapping of file extension to
Documentsubclass such that custom evaluation can be performed per document type.name – A name to use in test identifiers so that the identifier indicates which
Sybilthat test was discovered by.
- __add__(other: Sybil) SybilCollection¶
Sybilinstances can be concatenated into aSybilCollection.
Documents¶
See the Document concept definition for information.
- class sybil.Document(text: str, path: str)¶
This is Sybil’s representation of a documentation source file. It will be instantiated by Sybil and provided to each parser in turn.
Different types of document can be handled by subclassing to provide the required
evaluation. The required file extensions, such as'.py', can then be mapped to these subclasses usingSybil'sdocument_typesparameter.- namespace: Dict[str, Any]¶
This dictionary is the namespace in which all examples parsed from this document will be evaluated.
- classmethod parse(path: str, *parsers: Callable[[sybil.Document], Iterable[sybil.Region]], encoding: str = 'utf-8') Document¶
Read the text from the supplied path and parse it into a document using the supplied parsers.
- line_column(position: int) str¶
Return a line and column location in this document based on a character position.
- push_evaluator(evaluator: Callable[[sybil.Example], str | None]) None¶
Push an
Evaluatoronto this document’s stack of evaluators if it is not already in that stack.When evaluating an
Example, any evaluators in the stack will be tried in order, starting with the most recently pushed. If an evaluator raises aNotEvaluatedexception, then the next evaluator in the stack will be attempted.If the stack is empty or all evaluators present raise
NotEvaluated, then the example’s evaluator will be used. This is the most common case!
- class sybil.document.PythonDocument(text: str, path: str)¶
A
Documenttype that imports the document’s source file as a Python module, making names within it available in the document’snamespace.
- class sybil.document.PythonDocStringDocument(text: str, path: str)¶
A
PythonDocumentsubclass that only considers the text of docstrings in the document’s source.- classmethod parse(path: str, *parsers: Callable[[sybil.Document], Iterable[sybil.Region]], encoding: str = 'utf-8') Document¶
Read the text from the supplied path to a Python source file and parse any docstrings it contains into a document using the supplied parsers.
Regions¶
See the Region concept definition for information.
- class sybil.Region(start: int, end: int, parsed: Any = None, evaluator: Callable[[sybil.Example], str | None] | None = None, lexemes: Dict[str, Any] | None = None)¶
Parsers should yield instances of this class for each example they discover in a documentation source file.
- Parameters:
- lexemes: LexemeMapping¶
The lexemes extracted from the region.
Lexing¶
See the Lexer concept definition for information.
- sybil.typing.Lexer¶
The signature for a lexer. Lexers must not set
parsedorevaluatoron theRegioninstances they return.
- class sybil.parsers.abstract.lexers.BlockLexer(start_pattern: Pattern[str], end_pattern_template: str, mapping: Dict[str, str] | None = None)¶
This is a base class useful for any
Lexerthat must handle block-style languages such as ReStructured Text or MarkDown.It yields a sequence of
Regionobjects for each case where thestart_patternmatches. AsourceLexemeis created from the text between the end of the start pattern and the start of the end pattern.- Parameters:
start_pattern – This is used to match the start of the block. Any named groups will be returned in the
lexemesdictof resultingRegionobjects. If aprefixnamed group forms part of the match, this will be template substituted into theend_pattern_templatebefore it is compiled.end_pattern_template – This is used to match the end of any block found by the
start_pattern. It is templated with anyprefixgroup from thestart_patternMatchandlen_prefix, the length of that prefix, before being compiled into aPattern.mapping – If provided, this is used to rename lexemes from the keys in the mapping to their values. Only mapped lexemes will be returned in any
Regionobjects.
Parsing¶
See the Parser concept definition for information.
- class sybil.parsers.abstract.codeblock.AbstractCodeBlockParser(lexers: Sequence[Callable[[sybil.Document], Iterable[sybil.Region]]], language: str | None = None, evaluator: Callable[[sybil.Example], str | None] | None = None)¶
An abstract parser for use when evaluating blocks of code.
- Parameters:
lexers – A sequence of
Lexerobjects that will be applied in turn to eachDocumentthat is parsed. TheRegionobjects returned by these lexers must have both anargumentsstring, containing the language of the lexed region, and asourceLexemecontaining the source code of the lexed region.language – The language that this parser should look for. Lexed regions which don’t have this language in their
argumentslexeme will be ignored.evaluator – The evaluator to use for evaluating code blocks in the specified language. You can also override the
evaluate()method below.
- class sybil.parsers.abstract.doctest.DocTestStringParser(evaluator: ~sybil.evaluators.doctest.DocTestEvaluator = <sybil.evaluators.doctest.DocTestEvaluator object>)¶
This isn’t a true
Parserin that it must be called with astrcontaining the doctest example’s source and the file name that the example came from.- evaluator: DocTestEvaluator¶
The evaluator to use for any doctests found in the supplied source string.
- class sybil.parsers.abstract.skip.AbstractSkipParser(lexers: Sequence[Callable[[sybil.Document], Iterable[sybil.Region]]])¶
An abstract parser for skipping subsequent examples.
- class sybil.parsers.abstract.clear.AbstractClearNamespaceParser(lexers: Sequence[Callable[[sybil.Document], Iterable[sybil.Region]]])¶
An abstract parser for clearing the
namespace.
ReST Parsing and Lexing¶
See the Lexer and Parser concept definitions for information.
- class sybil.parsers.rest.lexers.DirectiveLexer(directive: str, arguments: str = '', mapping: Dict[str, str] | None = None)¶
A
BlockLexerfor ReST directives that extracts the following lexemes:- Parameters:
directive – a
strcontaining a regular expression pattern to match directive names.arguments – a
strcontaining a regular expression pattern to match directive arguments.mapping – If provided, this is used to rename lexemes from the keys in the mapping to their values. Only mapped lexemes will be returned in any
Regionobjects.
- class sybil.parsers.rest.lexers.DirectiveInCommentLexer(directive: str, arguments: str = '', mapping: Dict[str, str] | None = None)¶
A
BlockLexerfor faux ReST directives in comments such as:.. not-really-a-directive: some-argument Source here...
It extracts the following lexemes:
- Parameters:
directive – a
strcontaining a regular expression pattern to match directive names.arguments – a
strcontaining a regular expression pattern to match directive arguments.mapping – If provided, this is used to rename lexemes from the keys in the mapping to their values. Only mapped lexemes will be returned in any
Regionobjects.
- class sybil.parsers.rest.CodeBlockParser(language: str | None = None, evaluator: Callable[[sybil.Example], str | None] | None = None)¶
A
Parserfor Code blocks examples.- Parameters:
language – The language that this parser should look for.
evaluator – The evaluator to use for evaluating code blocks in the specified language. You can also override the
evaluate()method below.
- class sybil.parsers.rest.PythonCodeBlockParser(future_imports: Sequence[str] = ())¶
A
Parserfor Python Code blocks examples.- Parameters:
future_imports – An optional sequence of strings that will be turned into
from __future__ import ...statements and prepended to the code in each of the examples found by this parser.
- class sybil.parsers.rest.DocTestParser(optionflags: int = 0)¶
A
Parserfor doctest examples.- Parameters:
optionflags – doctest option flags to use when evaluating the examples found by this parser.
- class sybil.parsers.rest.DocTestDirectiveParser(optionflags: int = 0)¶
A
Parserfordoctestdirectives.- Parameters:
optionflags – doctest option flags to use when evaluating the examples found by this parser.
- class sybil.parsers.rest.ClearNamespaceParser¶
A
Parserfor clear-namespace instructions.
Markdown Parsing and Lexing¶
See the Lexer and Parser concept definitions for information.
- class sybil.parsers.markdown.lexers.RawFencedCodeBlockLexer(info_pattern: Pattern[str] = re.compile('$\\n', re.MULTILINE), mapping: Dict[str, str] | None = None)¶
A
Lexerfor Markdown fenced code blocks allowing flexible lexing of the whole info line along with more complicated prefixes.The following lexemes are extracted:
- Parameters:
info_pattern – a
re.Patternto match the info line and any required prefix that follows it.mapping – If provided, this is used to rename lexemes from the keys in the mapping to their values. Only mapped lexemes will be returned in any
Regionobjects.
- class sybil.parsers.markdown.lexers.FencedCodeBlockLexer(language: str, mapping: Dict[str, str] | None = None)¶
A
Lexerfor Markdown fenced code blocks where a language is specified.RawFencedCodeBlockLexercan be used if the whole info line, or a more complicated prefix, is required.The following lexemes are extracted:
- class sybil.parsers.markdown.lexers.DirectiveInHTMLCommentLexer(directive: str, arguments: str = '.*?', mapping: Dict[str, str] | None = None)¶
A
BlockLexerfor faux directives in HTML-style Markdown comments such as:<!--- not-really-a-directive: some-argument Source here... --->It extracts the following lexemes:
- Parameters:
directive – a
strcontaining a regular expression pattern to match directive names.arguments – a
strcontaining a regular expression pattern to match directive arguments.mapping – If provided, this is used to rename lexemes from the keys in the mapping to their values. Only mapped lexemes will be returned in any
Regionobjects.
- class sybil.parsers.markdown.CodeBlockParser(language: str | None = None, evaluator: Callable[[sybil.Example], str | None] | None = None)¶
A
Parserfor Code blocks examples.- Parameters:
language – The language that this parser should look for.
evaluator – The evaluator to use for evaluating code blocks in the specified language. You can also override the
evaluate()method below.
- class sybil.parsers.markdown.PythonCodeBlockParser(future_imports: Sequence[str] = (), doctest_optionflags: int = 0)¶
A
Parserfor Python Code blocks examples.- Parameters:
future_imports – An optional list of strings that will be turned into
from __future__ import ...statements and prepended to the code in each of the examples found by this parser.doctest_optionflags – doctest option flags to use when evaluating the doctest examples found by this parser.
- class sybil.parsers.markdown.ClearNamespaceParser¶
A
Parserfor clear-namespace instructions.
MyST Parsing and Lexing¶
See the Lexer and Parser concept definitions for information.
- class sybil.parsers.myst.lexers.DirectiveLexer(directive: str, arguments: str = '.*', mapping: Dict[str, str] | None = None)¶
A
Lexerfor MyST directives such as:```{directivename} arguments --- key1: val1 key2: val2 --- This is directive content ```
The following lexemes are extracted:
- Parameters:
directive – a
strcontaining a regular expression pattern to match directive names.arguments – a
strcontaining a regular expression pattern to match directive arguments.mapping – If provided, this is used to rename lexemes from the keys in the mapping to their values. Only mapped lexemes will be returned in any
Regionobjects.
- class sybil.parsers.myst.lexers.DirectiveInPercentCommentLexer(directive: str, arguments: str = '.*', mapping: Dict[str, str] | None = None)¶
A
BlockLexerfor faux MyST directives in %-style Markdown comments such as:% not-really-a-directive: some-argument % % Source here...
It extracts the following lexemes:
- Parameters:
directive – a
strcontaining a regular expression pattern to match directive names.arguments – a
strcontaining a regular expression pattern to match directive arguments.mapping – If provided, this is used to rename lexemes from the keys in the mapping to their values. Only mapped lexemes will be returned in any
Regionobjects.
- class sybil.parsers.myst.CodeBlockParser(language: str | None = None, evaluator: Callable[[sybil.Example], str | None] | None = None)¶
A
Parserfor Code blocks examples.- Parameters:
language – The language that this parser should look for.
evaluator – The evaluator to use for evaluating code blocks in the specified language. You can also override the
evaluate()method below.
- class sybil.parsers.myst.PythonCodeBlockParser(future_imports: Sequence[str] = (), doctest_optionflags: int = 0)¶
A
Parserfor Python Code blocks examples.- Parameters:
future_imports – An optional list of strings that will be turned into
from __future__ import ...statements and prepended to the code in each of the examples found by this parser.doctest_optionflags – doctest option flags to use when evaluating the doctest examples found by this parser.
- class sybil.parsers.myst.DocTestDirectiveParser(optionflags: int = 0)¶
A
Parserfor doctest directive examples.- Parameters:
optionflags – doctest option flags to use when evaluating the examples found by this parser.
- class sybil.parsers.myst.ClearNamespaceParser¶
A
Parserfor clear-namespace instructions.
Evaluation¶
See the Evaluator concept definition for information.
- class sybil.Example(document: Document, line: int, column: int, region: Region, namespace: Dict[str, Any])¶
This represents a particular example from a documentation source file. It is assembled from the
DocumentandRegionthe example comes from and is passed to the region’s evaluator.
- class sybil.example.NotEvaluated¶
An exception that can be raised by an
Evaluatorpreviouslypushedonto the document to indicate that it is not evaluating the current example and that a previously pushed evaluator, or theRegionevaluator if no others have been pushed, should be used to evaluate theExampleinstead.
- class sybil.evaluators.doctest.DocTestEvaluator(optionflags: int = 0)¶
The
Evaluatorto use forRegionsyielded by aDocTestStringParser.- Parameters:
optionflags – doctest option flags to use when evaluating examples.
- class sybil.evaluators.python.PythonEvaluator(future_imports: Sequence[str] = ())¶
The
Evaluatorto use forRegionscontaining Python source code.- Parameters:
future_imports – A sequence of strings naming future import options, for example
'annotations', that should be used at the top of eachExamplebeing evaluated.