├── .deepsource.toml ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .pre-commit-config.yaml ├── CHANGELOG.md ├── README.md ├── images ├── jut-download.png ├── jut-head.png └── jut-tail.png ├── jut ├── __init__.py └── cli.py ├── poetry.lock ├── pyproject.toml ├── requirements.txt └── tests ├── __init__.py ├── integration ├── __init__.py └── test_cli.py ├── test1_all.ipynb └── unit ├── __init__.py └── test_jut.py /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [[analyzers]] 4 | name = "python" 5 | enabled = true 6 | 7 | [analyzers.meta] 8 | runtime_version = "3.x.x" 9 | 10 | [[analyzers]] 11 | name = "test-coverage" 12 | enabled = true -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: run-tests 2 | on: [push, pull_request] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | strategy: 7 | matrix: 8 | python-version: ['3.6', '3.7', '3.8', '3.9', 'pypy-3.8', '3.10'] 9 | steps: 10 | - uses: actions/checkout@v2 11 | - name: Set up Python ${{ matrix.python-version }} 12 | uses: actions/setup-python@v2 13 | with: 14 | python-version: ${{ matrix.python-version }} 15 | 16 | - name: Install poetry 17 | uses: snok/install-poetry@v1 18 | with: 19 | virtualenvs-create: true 20 | virtualenvs-in-project: true 21 | 22 | - name: Load cached venv 23 | id: cached-poetry-dependencies 24 | uses: actions/cache@v2 25 | with: 26 | path: .venv 27 | key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} 28 | 29 | - name: Install dependencies 30 | if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' 31 | run: poetry install --no-interaction --no-root 32 | 33 | - name: Run Mypy 34 | run: | 35 | source $VENV 36 | mypy jut 37 | 38 | - name: Report tests 39 | run: | 40 | # Generate coverage report in xml format 41 | source $VENV 42 | pytest -s -v --cov=jut --cov-report=term-missing tests/ 43 | coverage report 44 | coverage xml 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .mypy_cache/ 2 | dist/ 3 | __pycache__/ 4 | venv/ 5 | *.pyc 6 | .DS_Store 7 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v2.3.0 4 | hooks: 5 | - id: check-yaml 6 | - id: end-of-file-fixer 7 | - id: trailing-whitespace 8 | 9 | - repo: https://github.com/psf/black 10 | rev: 19.3b0 11 | hooks: 12 | - id: black 13 | 14 | - repo: https://github.com/pre-commit/mirrors-isort 15 | rev: v5.6.4 16 | hooks: 17 | - id: isort 18 | additional_dependencies: 19 | - toml 20 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | Changelog 2 | --- 3 | ## 0.0.24 (20-11-2021) 4 | 5 | ### Changes 6 | 7 | - Add pypy3.8 support 8 | 9 | 10 | ## 0.0.23 (20-11-2021) 11 | 12 | ### Changes 13 | 14 | - Add support for Python 3.10 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | `jut - JUpyter notebook Terminal viewer`. 2 | 3 | The command line tool view the IPython/Jupyter notebook in the terminal. 4 | 5 | ### Install 6 | 7 | `pip install jut` 8 | 9 | ### Usage 10 | 11 | ``` shell 12 | $jut --help 13 | Usage: cli.py [OPTIONS] PATH 14 | 15 | Options: 16 | -he, --head INTEGER RANGE Display first n cells. Default is 10 17 | -t, --tail INTEGER RANGE Display last n cells 18 | -p, --single-page Should the result be in a single page? 19 | -f, --full-display Should all the contents in the file displayed? 20 | --force-colors Force colored output even if stdout is not a 21 | terminal 22 | 23 | -s, --start INTEGER RANGE Display the cells starting from the cell number 24 | -e, --end INTEGER RANGE Display the cells till the cell number 25 | --exclude-output-cells Exclude the notebook output cells from the output 26 | --no-cell-border Don't display the result in a cell with border 27 | --help Show this message and exit. 28 | ``` 29 | 30 | ### ASCIICinema Demo (First version) 31 | 32 | [![asciicast](https://asciinema.org/a/400349.svg)](https://asciinema.org/a/400349) 33 | 34 | Note: Command line arguments may be different, use `jut --help` to get upto date command line options 35 | 36 | ### Display first five cells 37 | 38 | ![jut-head-example](https://raw.githubusercontent.com/kracekumar/jut/main/images/jut-head.png) 39 | 40 | ### Display last five cells 41 | 42 | ![jut-tail-example](https://raw.githubusercontent.com/kracekumar/jut/main/images/jut-tail.png) 43 | 44 | ### Download the file and display first five cells 45 | 46 | ![jut-download-url](https://raw.githubusercontent.com/kracekumar/jut/main/images/jut-download.png) 47 | 48 | 49 | ### Usage 50 | 51 | ``` shell 52 | $jut debug/file.ipynb 53 | ... 54 | $jut https://raw.githubusercontent.com/fastai/fastbook/master/06_multicat.ipynb --tail 10 55 | ... 56 | ``` 57 | -------------------------------------------------------------------------------- /images/jut-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kracekumar/jut/cb688eef4defede6ba27c12d9a42ae9c54c5b71d/images/jut-download.png -------------------------------------------------------------------------------- /images/jut-head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kracekumar/jut/cb688eef4defede6ba27c12d9a42ae9c54c5b71d/images/jut-head.png -------------------------------------------------------------------------------- /images/jut-tail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kracekumar/jut/cb688eef4defede6ba27c12d9a42ae9c54c5b71d/images/jut-tail.png -------------------------------------------------------------------------------- /jut/__init__.py: -------------------------------------------------------------------------------- 1 | """Render and formatter code. 2 | """ 3 | 4 | import io 5 | from enum import Enum 6 | from pathlib import Path, PosixPath 7 | from typing import Any, Optional, Union 8 | 9 | import nbformat # type: ignore 10 | from pydantic import (BaseModel, PositiveInt, ValidationError, root_validator, 11 | validator) 12 | from rich.columns import Columns 13 | from rich.console import Console, RenderGroup 14 | from rich.markdown import Markdown 15 | from rich.panel import Panel 16 | from rich.syntax import Syntax 17 | from rich.theme import Theme 18 | 19 | 20 | class ParsingException(Exception): 21 | """Exception to raise during parsing""" 22 | 23 | 24 | class RenderingException(Exception): 25 | """Exception to raise during rendering.""" 26 | 27 | 28 | class CellType(Enum): 29 | MARKDOWN = "markdown" 30 | CODE = "code" 31 | RAW = "raw" 32 | 33 | 34 | OUTPUT_TYPES_TO_LEXER_NAMES = { 35 | "text": "python", 36 | "text/plain": "python", 37 | "text/html": "html", 38 | "application/vnd.jupyter.widget-view+json": "json", 39 | "application/x-ipynb+json": "json", 40 | "application/vnd.geo+json": "json", 41 | "application/geo+json": "json", 42 | "application/geo+json": "json", 43 | "application/vnd.plotly.v1+json": "json", 44 | "application/vdom.v1+json": "json", 45 | "image/png": "png", 46 | "image/jpg": "jpg", 47 | "text/latex": "latex", 48 | "image/svg+xml": "svg", 49 | "image/jpeg": "jpeg", 50 | "image/gif": "gif", 51 | "application/pdf": "pdf", 52 | } 53 | 54 | 55 | def can_render_in_terminal(mime_type: str): 56 | """Can the mime_type be rendered in the terminal as it is? 57 | 58 | Parameters 59 | ---------- 60 | mime_type: mime_type of the cell content. 61 | """ 62 | return mime_type not in ("png", "jpg", "jpeg", "gif", "svg", "pdf", "latex") 63 | 64 | 65 | class Config(BaseModel): 66 | """Input config passed by the user.""" 67 | 68 | input_file: PosixPath 69 | head: PositiveInt 70 | tail: Optional[PositiveInt] 71 | single_page: bool 72 | full_display: bool 73 | force_colors: bool 74 | start: Optional[PositiveInt] 75 | end: Optional[PositiveInt] 76 | exclude_output_cells: bool 77 | no_cell_border: bool 78 | 79 | class Config: 80 | arbitrary_types_allowed = True 81 | 82 | def is_cell_range(self): 83 | return self.start <= self.end 84 | 85 | @validator("input_file") 86 | def validate_input_file(cls, val): 87 | if isinstance(val, PosixPath): 88 | if val.exists() and val.is_dir(): 89 | raise ValueError(f"input_file: {val} is not the notebook") 90 | 91 | return val 92 | 93 | @classmethod 94 | def validate_tail(cls, values): 95 | val = values.get("tail") 96 | if val is not None: 97 | if val > 0: 98 | if values.get("head"): 99 | values["head"] = None 100 | 101 | if values.get("start"): 102 | values["start"] = None 103 | 104 | if values.get("end"): 105 | values["end"] = None 106 | 107 | return values 108 | 109 | @classmethod 110 | def validate_cell_range(cls, values): 111 | start, end = values.get("start"), values.get("end") 112 | if start is None or end is None: 113 | return values 114 | 115 | if start >= 0 and end >= 0: 116 | if start >= end: 117 | raise ValueError( 118 | f"--start should be greater than --end. Received, start: {start}, end: {end}" 119 | ) 120 | 121 | if start <= end: 122 | values["head"] = None 123 | values["tail"] = None 124 | 125 | return values 126 | 127 | @root_validator 128 | def validate_all(cls, values): 129 | values = cls.validate_tail(values) 130 | values = cls.validate_cell_range(values) 131 | return values 132 | 133 | 134 | class FormatMixin: 135 | """Formatting specific methods""" 136 | 137 | def format_index(self, index: int, source_type="input") -> str: 138 | """Given cell prefix format based on the source_type.""" 139 | if source_type == "input": 140 | return f"[green]In [/][bold green][{index}]: [/bold green]" 141 | elif source_type == "output": 142 | return f"[red]Out [/][bold red][{index}]: [/bold red]" 143 | return "{index}" 144 | 145 | def format_markdown(self, index, cell, config): 146 | """Format the markdown cell content. Render only input and leave out output.""" 147 | panels = [] 148 | panels.append(self.format_index(index, source_type="input")) 149 | source = self.get_source_text(cell) 150 | if config.no_cell_border: 151 | panels.append("\n") 152 | panels.append(Markdown(source)) 153 | panels.append("\n") 154 | else: 155 | panels.append(Panel(Markdown(source))) 156 | return panels 157 | 158 | def format_code(self, index, cell, config): 159 | """Format the code block. Print both the source and output.""" 160 | panels = [] 161 | panels.append(self.format_index(index, source_type="input")) 162 | code = Syntax(self.get_source_text(cell), lexer_name="python") 163 | if config.no_cell_border: 164 | panels.append("\n") 165 | panels.append(code) 166 | panels.append("\n") 167 | else: 168 | panels.append(Panel(code)) 169 | if not config.exclude_output_cells: 170 | for output in cell.get("outputs"): 171 | panels.append(self.format_index(index, source_type="output")) 172 | output_text, lexer_name = self.get_output_text(output) 173 | if can_render_in_terminal(lexer_name): 174 | code = Syntax(output_text, lexer_name=lexer_name) 175 | if config.no_cell_border: 176 | panels.append("\n") 177 | panels.append(code) 178 | panels.append("\n") 179 | else: 180 | panels.append(Panel(code)) 181 | else: 182 | panels.append( 183 | Panel(f"[bold red] Not rendering {lexer_name} [/bold red]") 184 | ) 185 | return panels 186 | 187 | def format_raw(self, index, cell, config): 188 | """Format raw code block. Render only input source.""" 189 | panels = [] 190 | panels.append(self.format_index(index)) 191 | text = self.get_source_text(cell) 192 | if config.no_cell_border: 193 | panels.append("\n") 194 | panels.append(text) 195 | panels.append("\n") 196 | else: 197 | panels.append(Panel(text)) 198 | return panels 199 | 200 | def get_source_text(self, cell): 201 | return cell.get("source") 202 | 203 | def get_output_text(self, output): 204 | """Given a output cell, extract proper output content.""" 205 | if output["output_type"] == "stream": 206 | return output.get("text"), OUTPUT_TYPES_TO_LEXER_NAMES["text"] 207 | elif output["output_type"] == "execute_result": 208 | plain = output.get("data", {}).get("text/plain") 209 | return plain, OUTPUT_TYPES_TO_LEXER_NAMES["text/plain"] 210 | elif output["output_type"] == "display_data": 211 | for key, lexer_name in OUTPUT_TYPES_TO_LEXER_NAMES.items(): 212 | if key in ("text", "text/plain"): 213 | continue 214 | 215 | val = output.get("data", {}).get(key) 216 | if val: 217 | return str(val), lexer_name 218 | 219 | return "", OUTPUT_TYPES_TO_LEXER_NAMES["text"] 220 | 221 | 222 | class Render(FormatMixin): 223 | def __init__(self, config: Config): 224 | self.config = config 225 | self.node = None 226 | custom_theme = Theme( 227 | {"info": "dim cyan", "warning": "magenta", "danger": "bold red"} 228 | ) 229 | if config.force_colors: 230 | self.console = Console( 231 | theme=custom_theme, force_terminal=config.force_colors 232 | ) 233 | else: 234 | self.console = Console(theme=custom_theme) 235 | 236 | def parse_notebook(self): 237 | """Parse the notebook content.""" 238 | try: 239 | self.node = nbformat.read(self.config.input_file, as_version=4) 240 | except nbformat.reader.NotJSONError as exc: 241 | raise ParsingException( 242 | f"{self.config.input_file.name} is not a proper notebook" 243 | ) 244 | 245 | def iter_cells(self): 246 | block = None 247 | if self.config.full_display: 248 | block = self.node.cells 249 | start = 0 250 | elif self.config.head: 251 | block = self.node.cells[: self.config.head] 252 | start = 0 253 | elif self.config.tail: 254 | block = self.node.cells[-self.config.tail :] 255 | start = max(len(self.node.cells) - self.config.tail, 0) 256 | elif self.config.is_cell_range(): 257 | block = self.node.cells[self.config.start - 1 : self.config.end] 258 | start = self.config.start - 1 259 | 260 | for cell in block: 261 | start += 1 262 | yield start, cell 263 | 264 | def format_cell(self, index, cell): 265 | cell_type = cell.get("cell_type") 266 | if cell_type == CellType.MARKDOWN.value: 267 | return self.format_markdown(index, cell, self.config) 268 | elif cell_type == CellType.CODE.value: 269 | return self.format_code(index, cell, self.config) 270 | elif cell_type == CellType.RAW.value: 271 | return self.format_raw(index, cell, self.config) 272 | 273 | def render_cell(self, panels): 274 | self.console.print(*panels) 275 | 276 | def _render_to_terminal(self): 277 | for index, cell in self.iter_cells(): 278 | panels = self.format_cell(index, cell) 279 | self.render_cell(panels) 280 | 281 | def render_to_terminal(self): 282 | if self.config.single_page: 283 | with self.console.pager(): 284 | self._render_to_terminal() 285 | else: 286 | self._render_to_terminal() 287 | 288 | def render(self): 289 | self.parse_notebook() 290 | self.render_to_terminal() 291 | -------------------------------------------------------------------------------- /jut/cli.py: -------------------------------------------------------------------------------- 1 | """CLI interface 2 | """ 3 | import logging 4 | import sys 5 | from pathlib import Path 6 | from urllib.error import HTTPError 7 | from urllib.parse import urlparse 8 | from urllib.request import urlretrieve 9 | 10 | import click 11 | import rich 12 | 13 | from jut import (Config, ParsingException, Render, RenderingException, 14 | ValidationError) 15 | 16 | logger = logging.getLogger(__name__) 17 | 18 | 19 | def parse_path(path: str): 20 | """Given a path return a tuple of (URL, local_file_path). 21 | At any given point, either url or local_path will be present. 22 | """ 23 | # Note: It's a simpler solution only draw back is URL like foo.com/mydrive/notebook.ipynb will be treated as file. 24 | parts = urlparse(path) 25 | if parts.scheme and parts.netloc: 26 | return path, "" 27 | return "", path 28 | 29 | 30 | def download_url(url): 31 | url_parts = urlparse(url) 32 | try: 33 | destination = url_parts.path.split("/")[-1] 34 | urlretrieve(url, destination) 35 | except HTTPError: 36 | logger.info(f'Failed to download the file in the URL" {url}') 37 | exit(-1) 38 | return destination 39 | 40 | 41 | @click.command() 42 | @click.argument("path", type=str) 43 | @click.option( 44 | "-he", 45 | "--head", 46 | type=click.IntRange(min=1), 47 | default=10, 48 | help="Display first n cells. Default is 10", 49 | ) 50 | @click.option( 51 | "-t", 52 | "--tail", 53 | type=click.IntRange(min=1), 54 | default=None, 55 | help="Display last n cells", 56 | ) 57 | @click.option( 58 | "-p", 59 | "--single-page", 60 | type=bool, 61 | default=False, 62 | is_flag=True, 63 | help="Should the result be in a single page?", 64 | ) 65 | @click.option( 66 | "-f", 67 | "--full-display", 68 | type=bool, 69 | default=False, 70 | is_flag=True, 71 | help="Should all the contents in the file displayed?", 72 | ) 73 | @click.option( 74 | "--force-colors", 75 | type=bool, 76 | default=False, 77 | is_flag=True, 78 | help="Force colored output even if stdout is not a terminal", 79 | ) 80 | @click.option( 81 | "-s", 82 | "--start", 83 | type=click.IntRange(min=1), 84 | default=None, 85 | help="Display the cells starting from the cell number", 86 | ) 87 | @click.option( 88 | "-e", 89 | "--end", 90 | type=click.IntRange(min=1), 91 | default=None, 92 | help="Display the cells till the cell number", 93 | ) 94 | @click.option( 95 | "--exclude-output-cells", 96 | type=bool, 97 | help="Exclude the notebook output cells from the output", 98 | default=False, 99 | is_flag=True, 100 | ) 101 | @click.option( 102 | "--no-cell-border", 103 | type=bool, 104 | help="Don't display the result in a cell with border", 105 | default=False, 106 | is_flag=True, 107 | ) 108 | def display( 109 | path, 110 | head, 111 | tail, 112 | single_page, 113 | full_display, 114 | force_colors, 115 | start, 116 | end, 117 | exclude_output_cells, 118 | no_cell_border, 119 | ): 120 | destination_file = None 121 | url, input_file = parse_path(path) 122 | 123 | if url: 124 | destination_file = download_url(url) 125 | destination_file = Path(destination_file) 126 | 127 | if input_file: 128 | destination_file = Path(input_file) 129 | 130 | if not destination_file.exists(): 131 | click.echo( 132 | f"PATH: {path} should be URL or path to a local file. The file is missing.", 133 | err=True, 134 | ) 135 | ctx = click.get_current_context() 136 | click.echo(display.get_help(ctx)) 137 | exit(-1) 138 | 139 | try: 140 | config = Config( 141 | input_file=destination_file, 142 | head=head, 143 | tail=tail, 144 | single_page=single_page, 145 | full_display=full_display, 146 | force_colors=force_colors, 147 | start=start, 148 | end=end, 149 | exclude_output_cells=exclude_output_cells, 150 | no_cell_border=no_cell_border, 151 | ) 152 | render = Render(config) 153 | render.render() 154 | 155 | if url: 156 | Path(destination_file).unlink() 157 | except (ValidationError, ParsingException, RenderingException) as e: 158 | rich.print(e) 159 | exit(-1) 160 | 161 | 162 | def main(): 163 | display() 164 | 165 | 166 | if __name__ == "__main__": 167 | main() 168 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "appdirs" 3 | version = "1.4.4" 4 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 5 | category = "dev" 6 | optional = false 7 | python-versions = "*" 8 | 9 | [[package]] 10 | name = "appnope" 11 | version = "0.1.2" 12 | description = "Disable App Nap on macOS >= 10.9" 13 | category = "dev" 14 | optional = false 15 | python-versions = "*" 16 | 17 | [[package]] 18 | name = "argon2-cffi" 19 | version = "21.1.0" 20 | description = "The secure Argon2 password hashing algorithm." 21 | category = "dev" 22 | optional = false 23 | python-versions = ">=3.5" 24 | 25 | [package.dependencies] 26 | cffi = ">=1.0.0" 27 | 28 | [package.extras] 29 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "furo", "wheel", "pre-commit"] 30 | docs = ["sphinx", "furo"] 31 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] 32 | 33 | [[package]] 34 | name = "astroid" 35 | version = "2.8.2" 36 | description = "An abstract syntax tree for Python with inference support." 37 | category = "dev" 38 | optional = false 39 | python-versions = "~=3.6" 40 | 41 | [package.dependencies] 42 | lazy-object-proxy = ">=1.4.0" 43 | typed-ast = {version = ">=1.4.0,<1.5", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} 44 | typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} 45 | wrapt = ">=1.11,<1.13" 46 | 47 | [[package]] 48 | name = "async-generator" 49 | version = "1.10" 50 | description = "Async generators and context managers for Python 3.5+" 51 | category = "dev" 52 | optional = false 53 | python-versions = ">=3.5" 54 | 55 | [[package]] 56 | name = "atomicwrites" 57 | version = "1.4.0" 58 | description = "Atomic file writes." 59 | category = "dev" 60 | optional = false 61 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 62 | 63 | [[package]] 64 | name = "attrs" 65 | version = "21.2.0" 66 | description = "Classes Without Boilerplate" 67 | category = "main" 68 | optional = false 69 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 70 | 71 | [package.extras] 72 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] 73 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 74 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] 75 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] 76 | 77 | [[package]] 78 | name = "backcall" 79 | version = "0.2.0" 80 | description = "Specifications for callback functions passed in to an API" 81 | category = "dev" 82 | optional = false 83 | python-versions = "*" 84 | 85 | [[package]] 86 | name = "backports.entry-points-selectable" 87 | version = "1.1.0" 88 | description = "Compatibility shim providing selectable entry points for older implementations" 89 | category = "dev" 90 | optional = false 91 | python-versions = ">=2.7" 92 | 93 | [package.dependencies] 94 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 95 | 96 | [package.extras] 97 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 98 | testing = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-checkdocs (>=2.4)", "pytest-enabler (>=1.0.1)"] 99 | 100 | [[package]] 101 | name = "black" 102 | version = "20.8b1" 103 | description = "The uncompromising code formatter." 104 | category = "dev" 105 | optional = false 106 | python-versions = ">=3.6" 107 | 108 | [package.dependencies] 109 | appdirs = "*" 110 | click = ">=7.1.2" 111 | dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} 112 | mypy-extensions = ">=0.4.3" 113 | pathspec = ">=0.6,<1" 114 | regex = ">=2020.1.8" 115 | toml = ">=0.10.1" 116 | typed-ast = ">=1.4.0" 117 | typing-extensions = ">=3.7.4" 118 | 119 | [package.extras] 120 | colorama = ["colorama (>=0.4.3)"] 121 | d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] 122 | 123 | [[package]] 124 | name = "bleach" 125 | version = "4.1.0" 126 | description = "An easy safelist-based HTML-sanitizing tool." 127 | category = "dev" 128 | optional = false 129 | python-versions = ">=3.6" 130 | 131 | [package.dependencies] 132 | packaging = "*" 133 | six = ">=1.9.0" 134 | webencodings = "*" 135 | 136 | [[package]] 137 | name = "cffi" 138 | version = "1.14.6" 139 | description = "Foreign Function Interface for Python calling C code." 140 | category = "dev" 141 | optional = false 142 | python-versions = "*" 143 | 144 | [package.dependencies] 145 | pycparser = "*" 146 | 147 | [[package]] 148 | name = "cfgv" 149 | version = "3.3.1" 150 | description = "Validate configuration and produce human readable error messages." 151 | category = "dev" 152 | optional = false 153 | python-versions = ">=3.6.1" 154 | 155 | [[package]] 156 | name = "click" 157 | version = "7.1.2" 158 | description = "Composable command line interface toolkit" 159 | category = "main" 160 | optional = false 161 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 162 | 163 | [[package]] 164 | name = "colorama" 165 | version = "0.4.4" 166 | description = "Cross-platform colored terminal text." 167 | category = "main" 168 | optional = false 169 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 170 | 171 | [[package]] 172 | name = "commonmark" 173 | version = "0.9.1" 174 | description = "Python parser for the CommonMark Markdown spec" 175 | category = "main" 176 | optional = false 177 | python-versions = "*" 178 | 179 | [package.extras] 180 | test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] 181 | 182 | [[package]] 183 | name = "coverage" 184 | version = "6.0.1" 185 | description = "Code coverage measurement for Python" 186 | category = "dev" 187 | optional = false 188 | python-versions = ">=3.6" 189 | 190 | [package.extras] 191 | toml = ["tomli"] 192 | 193 | [[package]] 194 | name = "dataclasses" 195 | version = "0.8" 196 | description = "A backport of the dataclasses module for Python 3.6" 197 | category = "main" 198 | optional = false 199 | python-versions = ">=3.6, <3.7" 200 | 201 | [[package]] 202 | name = "decorator" 203 | version = "5.1.0" 204 | description = "Decorators for Humans" 205 | category = "main" 206 | optional = false 207 | python-versions = ">=3.5" 208 | 209 | [[package]] 210 | name = "defusedxml" 211 | version = "0.7.1" 212 | description = "XML bomb protection for Python stdlib modules" 213 | category = "dev" 214 | optional = false 215 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 216 | 217 | [[package]] 218 | name = "distlib" 219 | version = "0.3.3" 220 | description = "Distribution utilities" 221 | category = "dev" 222 | optional = false 223 | python-versions = "*" 224 | 225 | [[package]] 226 | name = "entrypoints" 227 | version = "0.3" 228 | description = "Discover and load entry points from installed packages." 229 | category = "dev" 230 | optional = false 231 | python-versions = ">=2.7" 232 | 233 | [[package]] 234 | name = "filelock" 235 | version = "3.3.0" 236 | description = "A platform independent file lock." 237 | category = "dev" 238 | optional = false 239 | python-versions = ">=3.6" 240 | 241 | [package.extras] 242 | docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] 243 | testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] 244 | 245 | [[package]] 246 | name = "identify" 247 | version = "2.3.0" 248 | description = "File identification library for Python" 249 | category = "dev" 250 | optional = false 251 | python-versions = ">=3.6.1" 252 | 253 | [package.extras] 254 | license = ["editdistance-s"] 255 | 256 | [[package]] 257 | name = "importlib-metadata" 258 | version = "4.8.1" 259 | description = "Read metadata from Python packages" 260 | category = "main" 261 | optional = false 262 | python-versions = ">=3.6" 263 | 264 | [package.dependencies] 265 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 266 | zipp = ">=0.5" 267 | 268 | [package.extras] 269 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 270 | perf = ["ipython"] 271 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] 272 | 273 | [[package]] 274 | name = "importlib-resources" 275 | version = "5.2.2" 276 | description = "Read resources from Python packages" 277 | category = "dev" 278 | optional = false 279 | python-versions = ">=3.6" 280 | 281 | [package.dependencies] 282 | zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} 283 | 284 | [package.extras] 285 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 286 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] 287 | 288 | [[package]] 289 | name = "iniconfig" 290 | version = "1.1.1" 291 | description = "iniconfig: brain-dead simple config-ini parsing" 292 | category = "dev" 293 | optional = false 294 | python-versions = "*" 295 | 296 | [[package]] 297 | name = "ipykernel" 298 | version = "5.5.6" 299 | description = "IPython Kernel for Jupyter" 300 | category = "dev" 301 | optional = false 302 | python-versions = ">=3.5" 303 | 304 | [package.dependencies] 305 | appnope = {version = "*", markers = "platform_system == \"Darwin\""} 306 | ipython = ">=5.0.0" 307 | ipython-genutils = "*" 308 | jupyter-client = "*" 309 | tornado = ">=4.2" 310 | traitlets = ">=4.1.0" 311 | 312 | [package.extras] 313 | test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "jedi (<=0.17.2)"] 314 | 315 | [[package]] 316 | name = "ipython" 317 | version = "7.16.1" 318 | description = "IPython: Productive Interactive Computing" 319 | category = "dev" 320 | optional = false 321 | python-versions = ">=3.6" 322 | 323 | [package.dependencies] 324 | appnope = {version = "*", markers = "sys_platform == \"darwin\""} 325 | backcall = "*" 326 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 327 | decorator = "*" 328 | jedi = ">=0.10" 329 | pexpect = {version = "*", markers = "sys_platform != \"win32\""} 330 | pickleshare = "*" 331 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" 332 | pygments = "*" 333 | traitlets = ">=4.2" 334 | 335 | [package.extras] 336 | all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.14)", "pygments", "qtconsole", "requests", "testpath"] 337 | doc = ["Sphinx (>=1.3)"] 338 | kernel = ["ipykernel"] 339 | nbconvert = ["nbconvert"] 340 | nbformat = ["nbformat"] 341 | notebook = ["notebook", "ipywidgets"] 342 | parallel = ["ipyparallel"] 343 | qtconsole = ["qtconsole"] 344 | test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] 345 | 346 | [[package]] 347 | name = "ipython-genutils" 348 | version = "0.2.0" 349 | description = "Vestigial utilities from IPython" 350 | category = "main" 351 | optional = false 352 | python-versions = "*" 353 | 354 | [[package]] 355 | name = "ipywidgets" 356 | version = "7.6.5" 357 | description = "IPython HTML widgets for Jupyter" 358 | category = "dev" 359 | optional = false 360 | python-versions = "*" 361 | 362 | [package.dependencies] 363 | ipykernel = ">=4.5.1" 364 | ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} 365 | ipython-genutils = ">=0.2.0,<0.3.0" 366 | jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} 367 | nbformat = ">=4.2.0" 368 | traitlets = ">=4.3.1" 369 | widgetsnbextension = ">=3.5.0,<3.6.0" 370 | 371 | [package.extras] 372 | test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] 373 | 374 | [[package]] 375 | name = "isort" 376 | version = "5.9.3" 377 | description = "A Python utility / library to sort Python imports." 378 | category = "dev" 379 | optional = false 380 | python-versions = ">=3.6.1,<4.0" 381 | 382 | [package.extras] 383 | pipfile_deprecated_finder = ["pipreqs", "requirementslib"] 384 | requirements_deprecated_finder = ["pipreqs", "pip-api"] 385 | colors = ["colorama (>=0.4.3,<0.5.0)"] 386 | plugins = ["setuptools"] 387 | 388 | [[package]] 389 | name = "jedi" 390 | version = "0.18.0" 391 | description = "An autocompletion tool for Python that can be used for text editors." 392 | category = "dev" 393 | optional = false 394 | python-versions = ">=3.6" 395 | 396 | [package.dependencies] 397 | parso = ">=0.8.0,<0.9.0" 398 | 399 | [package.extras] 400 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 401 | testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] 402 | 403 | [[package]] 404 | name = "jinja2" 405 | version = "3.0.2" 406 | description = "A very fast and expressive template engine." 407 | category = "dev" 408 | optional = false 409 | python-versions = ">=3.6" 410 | 411 | [package.dependencies] 412 | MarkupSafe = ">=2.0" 413 | 414 | [package.extras] 415 | i18n = ["Babel (>=2.7)"] 416 | 417 | [[package]] 418 | name = "jsonschema" 419 | version = "4.0.0" 420 | description = "An implementation of JSON Schema validation for Python" 421 | category = "main" 422 | optional = false 423 | python-versions = "*" 424 | 425 | [package.dependencies] 426 | attrs = ">=17.4.0" 427 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 428 | pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" 429 | 430 | [package.extras] 431 | format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] 432 | format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] 433 | 434 | [[package]] 435 | name = "jupyter" 436 | version = "1.0.0" 437 | description = "Jupyter metapackage. Install all the Jupyter components in one go." 438 | category = "dev" 439 | optional = false 440 | python-versions = "*" 441 | 442 | [package.dependencies] 443 | ipykernel = "*" 444 | ipywidgets = "*" 445 | jupyter-console = "*" 446 | nbconvert = "*" 447 | notebook = "*" 448 | qtconsole = "*" 449 | 450 | [[package]] 451 | name = "jupyter-client" 452 | version = "7.0.6" 453 | description = "Jupyter protocol implementation and client libraries" 454 | category = "dev" 455 | optional = false 456 | python-versions = ">=3.6.1" 457 | 458 | [package.dependencies] 459 | entrypoints = "*" 460 | jupyter-core = ">=4.6.0" 461 | nest-asyncio = ">=1.5" 462 | python-dateutil = ">=2.1" 463 | pyzmq = ">=13" 464 | tornado = ">=4.1" 465 | traitlets = "*" 466 | 467 | [package.extras] 468 | doc = ["myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] 469 | test = ["codecov", "coverage", "ipykernel", "ipython", "mock", "mypy", "pre-commit", "pytest", "pytest-asyncio", "pytest-cov", "pytest-timeout", "jedi (<0.18)"] 470 | 471 | [[package]] 472 | name = "jupyter-console" 473 | version = "6.4.0" 474 | description = "Jupyter terminal console" 475 | category = "dev" 476 | optional = false 477 | python-versions = ">=3.6" 478 | 479 | [package.dependencies] 480 | ipykernel = "*" 481 | ipython = "*" 482 | jupyter-client = "*" 483 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" 484 | pygments = "*" 485 | 486 | [package.extras] 487 | test = ["pexpect"] 488 | 489 | [[package]] 490 | name = "jupyter-core" 491 | version = "4.8.1" 492 | description = "Jupyter core package. A base package on which Jupyter projects rely." 493 | category = "main" 494 | optional = false 495 | python-versions = ">=3.6" 496 | 497 | [package.dependencies] 498 | pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} 499 | traitlets = "*" 500 | 501 | [[package]] 502 | name = "jupyterlab-pygments" 503 | version = "0.1.2" 504 | description = "Pygments theme using JupyterLab CSS variables" 505 | category = "dev" 506 | optional = false 507 | python-versions = "*" 508 | 509 | [package.dependencies] 510 | pygments = ">=2.4.1,<3" 511 | 512 | [[package]] 513 | name = "jupyterlab-widgets" 514 | version = "1.0.2" 515 | description = "A JupyterLab extension." 516 | category = "dev" 517 | optional = false 518 | python-versions = ">=3.6" 519 | 520 | [[package]] 521 | name = "lazy-object-proxy" 522 | version = "1.6.0" 523 | description = "A fast and thorough lazy object proxy." 524 | category = "dev" 525 | optional = false 526 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 527 | 528 | [[package]] 529 | name = "markupsafe" 530 | version = "2.0.1" 531 | description = "Safely add untrusted strings to HTML/XML markup." 532 | category = "dev" 533 | optional = false 534 | python-versions = ">=3.6" 535 | 536 | [[package]] 537 | name = "mccabe" 538 | version = "0.6.1" 539 | description = "McCabe checker, plugin for flake8" 540 | category = "dev" 541 | optional = false 542 | python-versions = "*" 543 | 544 | [[package]] 545 | name = "mistune" 546 | version = "0.8.4" 547 | description = "The fastest markdown parser in pure Python" 548 | category = "dev" 549 | optional = false 550 | python-versions = "*" 551 | 552 | [[package]] 553 | name = "mypy" 554 | version = "0.812" 555 | description = "Optional static typing for Python" 556 | category = "dev" 557 | optional = false 558 | python-versions = ">=3.5" 559 | 560 | [package.dependencies] 561 | mypy-extensions = ">=0.4.3,<0.5.0" 562 | typed-ast = ">=1.4.0,<1.5.0" 563 | typing-extensions = ">=3.7.4" 564 | 565 | [package.extras] 566 | dmypy = ["psutil (>=4.0)"] 567 | 568 | [[package]] 569 | name = "mypy-extensions" 570 | version = "0.4.3" 571 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 572 | category = "dev" 573 | optional = false 574 | python-versions = "*" 575 | 576 | [[package]] 577 | name = "nbclient" 578 | version = "0.5.4" 579 | description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." 580 | category = "dev" 581 | optional = false 582 | python-versions = ">=3.6.1" 583 | 584 | [package.dependencies] 585 | async-generator = {version = "*", markers = "python_version < \"3.7\""} 586 | jupyter-client = ">=6.1.5" 587 | nbformat = ">=5.0" 588 | nest-asyncio = "*" 589 | traitlets = ">=4.2" 590 | 591 | [package.extras] 592 | dev = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] 593 | sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] 594 | test = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] 595 | 596 | [[package]] 597 | name = "nbconvert" 598 | version = "6.0.7" 599 | description = "Converting Jupyter Notebooks" 600 | category = "dev" 601 | optional = false 602 | python-versions = ">=3.6" 603 | 604 | [package.dependencies] 605 | bleach = "*" 606 | defusedxml = "*" 607 | entrypoints = ">=0.2.2" 608 | jinja2 = ">=2.4" 609 | jupyter-core = "*" 610 | jupyterlab-pygments = "*" 611 | mistune = ">=0.8.1,<2" 612 | nbclient = ">=0.5.0,<0.6.0" 613 | nbformat = ">=4.4" 614 | pandocfilters = ">=1.4.1" 615 | pygments = ">=2.4.1" 616 | testpath = "*" 617 | traitlets = ">=4.2" 618 | 619 | [package.extras] 620 | all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] 621 | docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] 622 | serve = ["tornado (>=4.0)"] 623 | test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)"] 624 | webpdf = ["pyppeteer (==0.2.2)"] 625 | 626 | [[package]] 627 | name = "nbformat" 628 | version = "5.1.2" 629 | description = "The Jupyter Notebook format" 630 | category = "main" 631 | optional = false 632 | python-versions = ">=3.5" 633 | 634 | [package.dependencies] 635 | ipython-genutils = "*" 636 | jsonschema = ">=2.4,<2.5.0 || >2.5.0" 637 | jupyter-core = "*" 638 | traitlets = ">=4.1" 639 | 640 | [package.extras] 641 | fast = ["fastjsonschema"] 642 | test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] 643 | 644 | [[package]] 645 | name = "nest-asyncio" 646 | version = "1.5.1" 647 | description = "Patch asyncio to allow nested event loops" 648 | category = "dev" 649 | optional = false 650 | python-versions = ">=3.5" 651 | 652 | [[package]] 653 | name = "nodeenv" 654 | version = "1.6.0" 655 | description = "Node.js virtual environment builder" 656 | category = "dev" 657 | optional = false 658 | python-versions = "*" 659 | 660 | [[package]] 661 | name = "notebook" 662 | version = "6.4.4" 663 | description = "A web-based notebook environment for interactive computing" 664 | category = "dev" 665 | optional = false 666 | python-versions = ">=3.6" 667 | 668 | [package.dependencies] 669 | argon2-cffi = "*" 670 | ipykernel = "*" 671 | ipython-genutils = "*" 672 | jinja2 = "*" 673 | jupyter-client = ">=5.3.4" 674 | jupyter-core = ">=4.6.1" 675 | nbconvert = "*" 676 | nbformat = "*" 677 | prometheus-client = "*" 678 | pyzmq = ">=17" 679 | Send2Trash = ">=1.5.0" 680 | terminado = ">=0.8.3" 681 | tornado = ">=6.1" 682 | traitlets = ">=4.2.1" 683 | 684 | [package.extras] 685 | docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] 686 | json-logging = ["json-logging"] 687 | test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] 688 | 689 | [[package]] 690 | name = "packaging" 691 | version = "21.0" 692 | description = "Core utilities for Python packages" 693 | category = "dev" 694 | optional = false 695 | python-versions = ">=3.6" 696 | 697 | [package.dependencies] 698 | pyparsing = ">=2.0.2" 699 | 700 | [[package]] 701 | name = "pandocfilters" 702 | version = "1.5.0" 703 | description = "Utilities for writing pandoc filters in python" 704 | category = "dev" 705 | optional = false 706 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 707 | 708 | [[package]] 709 | name = "parameterized" 710 | version = "0.8.1" 711 | description = "Parameterized testing with any Python test framework" 712 | category = "main" 713 | optional = false 714 | python-versions = "*" 715 | 716 | [package.extras] 717 | dev = ["jinja2"] 718 | 719 | [[package]] 720 | name = "parso" 721 | version = "0.8.2" 722 | description = "A Python Parser" 723 | category = "dev" 724 | optional = false 725 | python-versions = ">=3.6" 726 | 727 | [package.extras] 728 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 729 | testing = ["docopt", "pytest (<6.0.0)"] 730 | 731 | [[package]] 732 | name = "pathspec" 733 | version = "0.9.0" 734 | description = "Utility library for gitignore style pattern matching of file paths." 735 | category = "dev" 736 | optional = false 737 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 738 | 739 | [[package]] 740 | name = "pexpect" 741 | version = "4.8.0" 742 | description = "Pexpect allows easy control of interactive console applications." 743 | category = "dev" 744 | optional = false 745 | python-versions = "*" 746 | 747 | [package.dependencies] 748 | ptyprocess = ">=0.5" 749 | 750 | [[package]] 751 | name = "pickleshare" 752 | version = "0.7.5" 753 | description = "Tiny 'shelve'-like database with concurrency support" 754 | category = "dev" 755 | optional = false 756 | python-versions = "*" 757 | 758 | [[package]] 759 | name = "platformdirs" 760 | version = "2.4.0" 761 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 762 | category = "dev" 763 | optional = false 764 | python-versions = ">=3.6" 765 | 766 | [package.extras] 767 | docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] 768 | test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] 769 | 770 | [[package]] 771 | name = "pluggy" 772 | version = "1.0.0" 773 | description = "plugin and hook calling mechanisms for python" 774 | category = "dev" 775 | optional = false 776 | python-versions = ">=3.6" 777 | 778 | [package.dependencies] 779 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 780 | 781 | [package.extras] 782 | dev = ["pre-commit", "tox"] 783 | testing = ["pytest", "pytest-benchmark"] 784 | 785 | [[package]] 786 | name = "pre-commit" 787 | version = "2.15.0" 788 | description = "A framework for managing and maintaining multi-language pre-commit hooks." 789 | category = "dev" 790 | optional = false 791 | python-versions = ">=3.6.1" 792 | 793 | [package.dependencies] 794 | cfgv = ">=2.0.0" 795 | identify = ">=1.0.0" 796 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 797 | importlib-resources = {version = "*", markers = "python_version < \"3.7\""} 798 | nodeenv = ">=0.11.1" 799 | pyyaml = ">=5.1" 800 | toml = "*" 801 | virtualenv = ">=20.0.8" 802 | 803 | [[package]] 804 | name = "prometheus-client" 805 | version = "0.11.0" 806 | description = "Python client for the Prometheus monitoring system." 807 | category = "dev" 808 | optional = false 809 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 810 | 811 | [package.extras] 812 | twisted = ["twisted"] 813 | 814 | [[package]] 815 | name = "prompt-toolkit" 816 | version = "3.0.19" 817 | description = "Library for building powerful interactive command lines in Python" 818 | category = "dev" 819 | optional = false 820 | python-versions = ">=3.6.1" 821 | 822 | [package.dependencies] 823 | wcwidth = "*" 824 | 825 | [[package]] 826 | name = "ptyprocess" 827 | version = "0.7.0" 828 | description = "Run a subprocess in a pseudo terminal" 829 | category = "dev" 830 | optional = false 831 | python-versions = "*" 832 | 833 | [[package]] 834 | name = "py" 835 | version = "1.10.0" 836 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 837 | category = "dev" 838 | optional = false 839 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 840 | 841 | [[package]] 842 | name = "pycparser" 843 | version = "2.20" 844 | description = "C parser in Python" 845 | category = "dev" 846 | optional = false 847 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 848 | 849 | [[package]] 850 | name = "pydantic" 851 | version = "1.8.1" 852 | description = "Data validation and settings management using python 3.6 type hinting" 853 | category = "main" 854 | optional = false 855 | python-versions = ">=3.6.1" 856 | 857 | [package.dependencies] 858 | dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} 859 | typing-extensions = ">=3.7.4.3" 860 | 861 | [package.extras] 862 | dotenv = ["python-dotenv (>=0.10.4)"] 863 | email = ["email-validator (>=1.0.3)"] 864 | 865 | [[package]] 866 | name = "pygments" 867 | version = "2.10.0" 868 | description = "Pygments is a syntax highlighting package written in Python." 869 | category = "main" 870 | optional = false 871 | python-versions = ">=3.5" 872 | 873 | [[package]] 874 | name = "pylint" 875 | version = "2.11.1" 876 | description = "python code static checker" 877 | category = "dev" 878 | optional = false 879 | python-versions = "~=3.6" 880 | 881 | [package.dependencies] 882 | astroid = ">=2.8.0,<2.9" 883 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 884 | isort = ">=4.2.5,<6" 885 | mccabe = ">=0.6,<0.7" 886 | platformdirs = ">=2.2.0" 887 | toml = ">=0.7.1" 888 | typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} 889 | 890 | [[package]] 891 | name = "pyparsing" 892 | version = "2.4.7" 893 | description = "Python parsing module" 894 | category = "dev" 895 | optional = false 896 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 897 | 898 | [[package]] 899 | name = "pyrsistent" 900 | version = "0.18.0" 901 | description = "Persistent/Functional/Immutable data structures" 902 | category = "main" 903 | optional = false 904 | python-versions = ">=3.6" 905 | 906 | [[package]] 907 | name = "pytest" 908 | version = "6.2.5" 909 | description = "pytest: simple powerful testing with Python" 910 | category = "dev" 911 | optional = false 912 | python-versions = ">=3.6" 913 | 914 | [package.dependencies] 915 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 916 | attrs = ">=19.2.0" 917 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 918 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 919 | iniconfig = "*" 920 | packaging = "*" 921 | pluggy = ">=0.12,<2.0" 922 | py = ">=1.8.2" 923 | toml = "*" 924 | 925 | [package.extras] 926 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 927 | 928 | [[package]] 929 | name = "pytest-cov" 930 | version = "2.12.1" 931 | description = "Pytest plugin for measuring coverage." 932 | category = "dev" 933 | optional = false 934 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 935 | 936 | [package.dependencies] 937 | coverage = ">=5.2.1" 938 | pytest = ">=4.6" 939 | toml = "*" 940 | 941 | [package.extras] 942 | testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] 943 | 944 | [[package]] 945 | name = "python-dateutil" 946 | version = "2.8.2" 947 | description = "Extensions to the standard Python datetime module" 948 | category = "dev" 949 | optional = false 950 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 951 | 952 | [package.dependencies] 953 | six = ">=1.5" 954 | 955 | [[package]] 956 | name = "pywin32" 957 | version = "301" 958 | description = "Python for Window Extensions" 959 | category = "main" 960 | optional = false 961 | python-versions = "*" 962 | 963 | [[package]] 964 | name = "pywinpty" 965 | version = "1.1.4" 966 | description = "Pseudo terminal support for Windows from Python." 967 | category = "dev" 968 | optional = false 969 | python-versions = ">=3.6" 970 | 971 | [[package]] 972 | name = "pyyaml" 973 | version = "5.4.1" 974 | description = "YAML parser and emitter for Python" 975 | category = "dev" 976 | optional = false 977 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 978 | 979 | [[package]] 980 | name = "pyzmq" 981 | version = "22.3.0" 982 | description = "Python bindings for 0MQ" 983 | category = "dev" 984 | optional = false 985 | python-versions = ">=3.6" 986 | 987 | [package.dependencies] 988 | cffi = {version = "*", markers = "implementation_name == \"pypy\""} 989 | py = {version = "*", markers = "implementation_name == \"pypy\""} 990 | 991 | [[package]] 992 | name = "qtconsole" 993 | version = "5.1.1" 994 | description = "Jupyter Qt console" 995 | category = "dev" 996 | optional = false 997 | python-versions = ">= 3.6" 998 | 999 | [package.dependencies] 1000 | ipykernel = ">=4.1" 1001 | ipython-genutils = "*" 1002 | jupyter-client = ">=4.1" 1003 | jupyter-core = "*" 1004 | pygments = "*" 1005 | pyzmq = ">=17.1" 1006 | qtpy = "*" 1007 | traitlets = "*" 1008 | 1009 | [package.extras] 1010 | doc = ["Sphinx (>=1.3)"] 1011 | test = ["flaky", "pytest", "pytest-qt"] 1012 | 1013 | [[package]] 1014 | name = "qtpy" 1015 | version = "1.11.2" 1016 | description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5, PyQt4 and PySide) and additional custom QWidgets." 1017 | category = "dev" 1018 | optional = false 1019 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" 1020 | 1021 | [[package]] 1022 | name = "regex" 1023 | version = "2021.10.8" 1024 | description = "Alternative regular expression module, to replace re." 1025 | category = "dev" 1026 | optional = false 1027 | python-versions = "*" 1028 | 1029 | [[package]] 1030 | name = "rich" 1031 | version = "9.13.0" 1032 | description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" 1033 | category = "main" 1034 | optional = false 1035 | python-versions = ">=3.6,<4.0" 1036 | 1037 | [package.dependencies] 1038 | colorama = ">=0.4.0,<0.5.0" 1039 | commonmark = ">=0.9.0,<0.10.0" 1040 | dataclasses = {version = ">=0.7,<0.9", markers = "python_version >= \"3.6\" and python_version < \"3.7\""} 1041 | pygments = ">=2.6.0,<3.0.0" 1042 | typing-extensions = ">=3.7.4,<4.0.0" 1043 | 1044 | [package.extras] 1045 | jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] 1046 | 1047 | [[package]] 1048 | name = "send2trash" 1049 | version = "1.8.0" 1050 | description = "Send file to trash natively under Mac OS X, Windows and Linux." 1051 | category = "dev" 1052 | optional = false 1053 | python-versions = "*" 1054 | 1055 | [package.extras] 1056 | nativelib = ["pyobjc-framework-cocoa", "pywin32"] 1057 | objc = ["pyobjc-framework-cocoa"] 1058 | win32 = ["pywin32"] 1059 | 1060 | [[package]] 1061 | name = "six" 1062 | version = "1.16.0" 1063 | description = "Python 2 and 3 compatibility utilities" 1064 | category = "main" 1065 | optional = false 1066 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1067 | 1068 | [[package]] 1069 | name = "terminado" 1070 | version = "0.12.1" 1071 | description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." 1072 | category = "dev" 1073 | optional = false 1074 | python-versions = ">=3.6" 1075 | 1076 | [package.dependencies] 1077 | ptyprocess = {version = "*", markers = "os_name != \"nt\""} 1078 | pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} 1079 | tornado = ">=4" 1080 | 1081 | [package.extras] 1082 | test = ["pytest"] 1083 | 1084 | [[package]] 1085 | name = "testpath" 1086 | version = "0.5.0" 1087 | description = "Test utilities for code working with files and commands" 1088 | category = "dev" 1089 | optional = false 1090 | python-versions = ">= 3.5" 1091 | 1092 | [package.extras] 1093 | test = ["pytest", "pathlib2"] 1094 | 1095 | [[package]] 1096 | name = "toml" 1097 | version = "0.10.2" 1098 | description = "Python Library for Tom's Obvious, Minimal Language" 1099 | category = "dev" 1100 | optional = false 1101 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 1102 | 1103 | [[package]] 1104 | name = "tornado" 1105 | version = "6.1" 1106 | description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." 1107 | category = "dev" 1108 | optional = false 1109 | python-versions = ">= 3.5" 1110 | 1111 | [[package]] 1112 | name = "traitlets" 1113 | version = "4.3.3" 1114 | description = "Traitlets Python config system" 1115 | category = "main" 1116 | optional = false 1117 | python-versions = "*" 1118 | 1119 | [package.dependencies] 1120 | decorator = "*" 1121 | ipython-genutils = "*" 1122 | six = "*" 1123 | 1124 | [package.extras] 1125 | test = ["pytest", "mock"] 1126 | 1127 | [[package]] 1128 | name = "typed-ast" 1129 | version = "1.4.3" 1130 | description = "a fork of Python 2 and 3 ast modules with type comment support" 1131 | category = "dev" 1132 | optional = false 1133 | python-versions = "*" 1134 | 1135 | [[package]] 1136 | name = "typing-extensions" 1137 | version = "3.10.0.2" 1138 | description = "Backported and Experimental Type Hints for Python 3.5+" 1139 | category = "main" 1140 | optional = false 1141 | python-versions = "*" 1142 | 1143 | [[package]] 1144 | name = "virtualenv" 1145 | version = "20.8.1" 1146 | description = "Virtual Python Environment builder" 1147 | category = "dev" 1148 | optional = false 1149 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 1150 | 1151 | [package.dependencies] 1152 | "backports.entry-points-selectable" = ">=1.0.4" 1153 | distlib = ">=0.3.1,<1" 1154 | filelock = ">=3.0.0,<4" 1155 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 1156 | importlib-resources = {version = ">=1.0", markers = "python_version < \"3.7\""} 1157 | platformdirs = ">=2,<3" 1158 | six = ">=1.9.0,<2" 1159 | 1160 | [package.extras] 1161 | docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] 1162 | testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] 1163 | 1164 | [[package]] 1165 | name = "wcwidth" 1166 | version = "0.2.5" 1167 | description = "Measures the displayed width of unicode strings in a terminal" 1168 | category = "dev" 1169 | optional = false 1170 | python-versions = "*" 1171 | 1172 | [[package]] 1173 | name = "webencodings" 1174 | version = "0.5.1" 1175 | description = "Character encoding aliases for legacy web content" 1176 | category = "dev" 1177 | optional = false 1178 | python-versions = "*" 1179 | 1180 | [[package]] 1181 | name = "widgetsnbextension" 1182 | version = "3.5.1" 1183 | description = "IPython HTML widgets for Jupyter" 1184 | category = "dev" 1185 | optional = false 1186 | python-versions = "*" 1187 | 1188 | [package.dependencies] 1189 | notebook = ">=4.4.1" 1190 | 1191 | [[package]] 1192 | name = "wrapt" 1193 | version = "1.12.1" 1194 | description = "Module for decorators, wrappers and monkey patching." 1195 | category = "dev" 1196 | optional = false 1197 | python-versions = "*" 1198 | 1199 | [[package]] 1200 | name = "zipp" 1201 | version = "3.6.0" 1202 | description = "Backport of pathlib-compatible object wrapper for zip files" 1203 | category = "main" 1204 | optional = false 1205 | python-versions = ">=3.6" 1206 | 1207 | [package.extras] 1208 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 1209 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] 1210 | 1211 | [metadata] 1212 | lock-version = "1.1" 1213 | python-versions = "^3.6.1" 1214 | content-hash = "bd5c42eea471b0859d58cb408d2dd81dd2456a72efd5f8675e26b4f5b3d6e244" 1215 | 1216 | [metadata.files] 1217 | appdirs = [ 1218 | {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, 1219 | {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, 1220 | ] 1221 | appnope = [ 1222 | {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, 1223 | {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, 1224 | ] 1225 | argon2-cffi = [ 1226 | {file = "argon2-cffi-21.1.0.tar.gz", hash = "sha256:f710b61103d1a1f692ca3ecbd1373e28aa5e545ac625ba067ff2feca1b2bb870"}, 1227 | {file = "argon2_cffi-21.1.0-cp35-abi3-macosx_10_14_x86_64.whl", hash = "sha256:217b4f0f853ccbbb5045242946ad2e162e396064575860141b71a85eb47e475a"}, 1228 | {file = "argon2_cffi-21.1.0-cp35-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fa7e7d1fc22514a32b1761fdfa1882b6baa5c36bb3ef557bdd69e6fc9ba14a41"}, 1229 | {file = "argon2_cffi-21.1.0-cp35-abi3-win32.whl", hash = "sha256:e4d8f0ae1524b7b0372a3e574a2561cbdddb3fdb6c28b70a72868189bda19659"}, 1230 | {file = "argon2_cffi-21.1.0-cp35-abi3-win_amd64.whl", hash = "sha256:65213a9174320a1aee03fe826596e0620783966b49eb636955958b3074e87ff9"}, 1231 | {file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-macosx_10_7_x86_64.whl", hash = "sha256:245f64a203012b144b7b8c8ea6d468cb02b37caa5afee5ba4a10c80599334f6a"}, 1232 | {file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4ad152c418f7eb640eac41ac815534e6aa61d1624530b8e7779114ecfbf327f8"}, 1233 | {file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:bc513db2283c385ea4da31a2cd039c33380701f376f4edd12fe56db118a3b21a"}, 1234 | {file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c7a7c8cc98ac418002090e4add5bebfff1b915ea1cb459c578cd8206fef10378"}, 1235 | {file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:165cadae5ac1e26644f5ade3bd9c18d89963be51d9ea8817bd671006d7909057"}, 1236 | {file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:566ffb581bbd9db5562327aee71b2eda24a1c15b23a356740abe3c011bbe0dcb"}, 1237 | ] 1238 | astroid = [ 1239 | {file = "astroid-2.8.2-py3-none-any.whl", hash = "sha256:9eaeaf92b3e21b70bec1a262e7eb118d2e96294892a5de595c92a12adc80dfc2"}, 1240 | {file = "astroid-2.8.2.tar.gz", hash = "sha256:304e99c129794f2cfda584a12b71fde85205da950e2f330f4be09150525ae949"}, 1241 | ] 1242 | async-generator = [ 1243 | {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, 1244 | {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, 1245 | ] 1246 | atomicwrites = [ 1247 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 1248 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 1249 | ] 1250 | attrs = [ 1251 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, 1252 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, 1253 | ] 1254 | backcall = [ 1255 | {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, 1256 | {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, 1257 | ] 1258 | "backports.entry-points-selectable" = [ 1259 | {file = "backports.entry_points_selectable-1.1.0-py2.py3-none-any.whl", hash = "sha256:a6d9a871cde5e15b4c4a53e3d43ba890cc6861ec1332c9c2428c92f977192acc"}, 1260 | {file = "backports.entry_points_selectable-1.1.0.tar.gz", hash = "sha256:988468260ec1c196dab6ae1149260e2f5472c9110334e5d51adcb77867361f6a"}, 1261 | ] 1262 | black = [ 1263 | {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, 1264 | ] 1265 | bleach = [ 1266 | {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, 1267 | {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, 1268 | ] 1269 | cffi = [ 1270 | {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, 1271 | {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, 1272 | {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, 1273 | {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, 1274 | {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, 1275 | {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, 1276 | {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, 1277 | {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, 1278 | {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, 1279 | {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, 1280 | {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, 1281 | {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, 1282 | {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, 1283 | {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, 1284 | {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, 1285 | {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, 1286 | {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, 1287 | {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, 1288 | {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, 1289 | {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, 1290 | {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, 1291 | {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, 1292 | {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, 1293 | {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, 1294 | {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, 1295 | {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, 1296 | {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, 1297 | {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, 1298 | {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, 1299 | {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, 1300 | {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, 1301 | {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, 1302 | {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, 1303 | {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, 1304 | {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, 1305 | {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, 1306 | {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, 1307 | {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, 1308 | {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, 1309 | {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, 1310 | {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, 1311 | {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, 1312 | {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, 1313 | {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, 1314 | {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, 1315 | ] 1316 | cfgv = [ 1317 | {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, 1318 | {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, 1319 | ] 1320 | click = [ 1321 | {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, 1322 | {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, 1323 | ] 1324 | colorama = [ 1325 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 1326 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 1327 | ] 1328 | commonmark = [ 1329 | {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, 1330 | {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, 1331 | ] 1332 | coverage = [ 1333 | {file = "coverage-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:abe8207dfb8a61ded9cd830d26c1073c8218fc0ae17eb899cfe8ec0fafae6e22"}, 1334 | {file = "coverage-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83faa3692e8306b20293889714fdf573d10ef5efc5843bd7c7aea6971487bd6a"}, 1335 | {file = "coverage-6.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f82a17f2a77958f3eef40ad385fc82d4c6ba9a77a51a174efe03ce75daebbc16"}, 1336 | {file = "coverage-6.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b06f4f1729e2963281d9cd6e65e6976bf27b44d4c07ac5b47223ce45f822cec"}, 1337 | {file = "coverage-6.0.1-cp310-cp310-win32.whl", hash = "sha256:7600fac458f74c68b097379f76f3a6e3a630493fc7fc94b6508fedd9d498c194"}, 1338 | {file = "coverage-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:2c5f39d1556e75fc3c4fb071f9e7cfa618895a999a0de763a541d730775d0d5f"}, 1339 | {file = "coverage-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3edbb3ec580c73e5a264f5d04f30245bc98eff1a26765d46c5c65134f0a0e2f7"}, 1340 | {file = "coverage-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea452a2d83964d08232ade470091015e7ab9b8f53acbec10f2210fbab4ce7e43"}, 1341 | {file = "coverage-6.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1770d24f45f1f2daeae34cfa3b33fcb29702153544cd2ad40d58399dd4ff53b5"}, 1342 | {file = "coverage-6.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ad7182a82843f9f85487f44567c8c688f16c906bdb8d0e44ae462aed61cb8f1b"}, 1343 | {file = "coverage-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:9d242a2434801ef5125330deddb4cddba8990c9a49b3dec99dca17dd7eefba5a"}, 1344 | {file = "coverage-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e66c50f0ab445fec920a9f084914ea1776a809e3016c3738519048195f851bbb"}, 1345 | {file = "coverage-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5b1ceacb86e0a9558061dcc6baae865ed25933ea57effea644f21657cdce19bc"}, 1346 | {file = "coverage-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e15ab5afbee34abf716fece80ea33ea09a82e7450512f022723b1a82ec9a4e"}, 1347 | {file = "coverage-6.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6873f3f954d3e3ab8b1881f4e5307cc19f70c9f931c41048d9f7e6fd946eabe7"}, 1348 | {file = "coverage-6.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0898d6948b31df13391cd40568de8f35fa5901bc922c5ae05cf070587cb9c666"}, 1349 | {file = "coverage-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9c416ba03844608f45661a5b48dc59c6b5e89956efe388564dd138ca8caf540b"}, 1350 | {file = "coverage-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:66fe33e9e0df58675e08e83fe257f89e7f625e7633ea93d0872154e09cce2724"}, 1351 | {file = "coverage-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:353a50f123f0185cdb7a1e1e3e2cfb9d1fd7e293cfaf68eedaf5bd8e02e3ec32"}, 1352 | {file = "coverage-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b81a4e667c45b13658b84f9b8f1d32ef86d5405fabcbd181b76b9e51d295f397"}, 1353 | {file = "coverage-6.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:17426808e8e0824f864876312d41961223bf5e503bf8f1f846735279a60ea345"}, 1354 | {file = "coverage-6.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e11cca9eb5c9b3eaad899728ee2ce916138399ee8cbbccaadc1871fecb750827"}, 1355 | {file = "coverage-6.0.1-cp38-cp38-win32.whl", hash = "sha256:0a7e55cc9f7efa22d5cc9966276ec7a40a8803676f6ccbfdc06a486fba9aa9ee"}, 1356 | {file = "coverage-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:4eb9cd910ca8e243f930243a9940ea1a522e32435d15668445753d087c30ee12"}, 1357 | {file = "coverage-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:83682b73785d2e078e0b5f63410b8125b122e1a22422640c57edd4011c950f3e"}, 1358 | {file = "coverage-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b45f89a8ef65c29195f8f28dbe215f44ccb29d934f3e862d2a5c12e38698a793"}, 1359 | {file = "coverage-6.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73880a80fad0597eca43e213e5e1711bf6c0fcdb7eb6b01b3b17841ebe5a7f8d"}, 1360 | {file = "coverage-6.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f398d38e6ebc2637863db1d7be3d4f9c5174e7d24bb3b0716cdb1f204669cbcf"}, 1361 | {file = "coverage-6.0.1-cp39-cp39-win32.whl", hash = "sha256:1864bdf9b2ccb43e724051bc23a1c558daf101ad4488ede1945f2a8be1facdad"}, 1362 | {file = "coverage-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:c9c413c4397d4cdc7ca89286158d240ce524f9667b52c9a64dd7e13d16cf8815"}, 1363 | {file = "coverage-6.0.1-pp36-none-any.whl", hash = "sha256:65da6e3e8325291f012921bbf71fea0a97824e1c573981871096aac6e2cf0ec5"}, 1364 | {file = "coverage-6.0.1-pp37-none-any.whl", hash = "sha256:07efe1fbd72e67df026ad5109bcd216acbbd4a29d5208b3dab61779bae6b7b26"}, 1365 | {file = "coverage-6.0.1.tar.gz", hash = "sha256:3490ff6dbf3f7accf0750136ed60ae1f487bccc1f097740e3b21262bc9c89854"}, 1366 | ] 1367 | dataclasses = [ 1368 | {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, 1369 | {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, 1370 | ] 1371 | decorator = [ 1372 | {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"}, 1373 | {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"}, 1374 | ] 1375 | defusedxml = [ 1376 | {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, 1377 | {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, 1378 | ] 1379 | distlib = [ 1380 | {file = "distlib-0.3.3-py2.py3-none-any.whl", hash = "sha256:c8b54e8454e5bf6237cc84c20e8264c3e991e824ef27e8f1e81049867d861e31"}, 1381 | {file = "distlib-0.3.3.zip", hash = "sha256:d982d0751ff6eaaab5e2ec8e691d949ee80eddf01a62eaa96ddb11531fe16b05"}, 1382 | ] 1383 | entrypoints = [ 1384 | {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, 1385 | {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, 1386 | ] 1387 | filelock = [ 1388 | {file = "filelock-3.3.0-py3-none-any.whl", hash = "sha256:bbc6a0382fe8ec4744ecdf6683a2e07f65eb10ff1aff53fc02a202565446cde0"}, 1389 | {file = "filelock-3.3.0.tar.gz", hash = "sha256:8c7eab13dc442dc249e95158bcc12dec724465919bdc9831fdbf0660f03d1785"}, 1390 | ] 1391 | identify = [ 1392 | {file = "identify-2.3.0-py2.py3-none-any.whl", hash = "sha256:d1e82c83d063571bb88087676f81261a4eae913c492dafde184067c584bc7c05"}, 1393 | {file = "identify-2.3.0.tar.gz", hash = "sha256:fd08c97f23ceee72784081f1ce5125c8f53a02d3f2716dde79a6ab8f1039fea5"}, 1394 | ] 1395 | importlib-metadata = [ 1396 | {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, 1397 | {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, 1398 | ] 1399 | importlib-resources = [ 1400 | {file = "importlib_resources-5.2.2-py3-none-any.whl", hash = "sha256:2480d8e07d1890056cb53c96e3de44fead9c62f2ba949b0f2e4c4345f4afa977"}, 1401 | {file = "importlib_resources-5.2.2.tar.gz", hash = "sha256:a65882a4d0fe5fbf702273456ba2ce74fe44892c25e42e057aca526b702a6d4b"}, 1402 | ] 1403 | iniconfig = [ 1404 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 1405 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 1406 | ] 1407 | ipykernel = [ 1408 | {file = "ipykernel-5.5.6-py3-none-any.whl", hash = "sha256:66f824af1ef4650e1e2f6c42e1423074321440ef79ca3651a6cfd06a4e25e42f"}, 1409 | {file = "ipykernel-5.5.6.tar.gz", hash = "sha256:4ea44b90ae1f7c38987ad58ea0809562a17c2695a0499644326f334aecd369ec"}, 1410 | ] 1411 | ipython = [ 1412 | {file = "ipython-7.16.1-py3-none-any.whl", hash = "sha256:2dbcc8c27ca7d3cfe4fcdff7f45b27f9a8d3edfa70ff8024a71c7a8eb5f09d64"}, 1413 | {file = "ipython-7.16.1.tar.gz", hash = "sha256:9f4fcb31d3b2c533333893b9172264e4821c1ac91839500f31bd43f2c59b3ccf"}, 1414 | ] 1415 | ipython-genutils = [ 1416 | {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, 1417 | {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, 1418 | ] 1419 | ipywidgets = [ 1420 | {file = "ipywidgets-7.6.5-py2.py3-none-any.whl", hash = "sha256:d258f582f915c62ea91023299603be095de19afb5ee271698f88327b9fe9bf43"}, 1421 | {file = "ipywidgets-7.6.5.tar.gz", hash = "sha256:00974f7cb4d5f8d494c19810fedb9fa9b64bffd3cda7c2be23c133a1ad3c99c5"}, 1422 | ] 1423 | isort = [ 1424 | {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, 1425 | {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, 1426 | ] 1427 | jedi = [ 1428 | {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, 1429 | {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, 1430 | ] 1431 | jinja2 = [ 1432 | {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, 1433 | {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, 1434 | ] 1435 | jsonschema = [ 1436 | {file = "jsonschema-4.0.0-py3-none-any.whl", hash = "sha256:c773028c649441ab980015b5b622f4cd5134cf563daaf0235ca4b73cc3734f20"}, 1437 | {file = "jsonschema-4.0.0.tar.gz", hash = "sha256:bc51325b929171791c42ebc1c70b9713eb134d3bb8ebd5474c8b659b15be6d86"}, 1438 | ] 1439 | jupyter = [ 1440 | {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, 1441 | {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, 1442 | {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, 1443 | ] 1444 | jupyter-client = [ 1445 | {file = "jupyter_client-7.0.6-py3-none-any.whl", hash = "sha256:074bdeb1ffaef4a3095468ee16313938cfdc48fc65ca95cc18980b956c2e5d79"}, 1446 | {file = "jupyter_client-7.0.6.tar.gz", hash = "sha256:8b6e06000eb9399775e0a55c52df6c1be4766666209c22f90c2691ded0e338dc"}, 1447 | ] 1448 | jupyter-console = [ 1449 | {file = "jupyter_console-6.4.0-py3-none-any.whl", hash = "sha256:7799c4ea951e0e96ba8260575423cb323ea5a03fcf5503560fa3e15748869e27"}, 1450 | {file = "jupyter_console-6.4.0.tar.gz", hash = "sha256:242248e1685039cd8bff2c2ecb7ce6c1546eb50ee3b08519729e6e881aec19c7"}, 1451 | ] 1452 | jupyter-core = [ 1453 | {file = "jupyter_core-4.8.1-py3-none-any.whl", hash = "sha256:8dd262ec8afae95bd512518eb003bc546b76adbf34bf99410e9accdf4be9aa3a"}, 1454 | {file = "jupyter_core-4.8.1.tar.gz", hash = "sha256:ef210dcb4fca04de07f2ead4adf408776aca94d17151d6f750ad6ded0b91ea16"}, 1455 | ] 1456 | jupyterlab-pygments = [ 1457 | {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, 1458 | {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, 1459 | ] 1460 | jupyterlab-widgets = [ 1461 | {file = "jupyterlab_widgets-1.0.2-py3-none-any.whl", hash = "sha256:f5d9efface8ec62941173ba1cffb2edd0ecddc801c11ae2931e30b50492eb8f7"}, 1462 | {file = "jupyterlab_widgets-1.0.2.tar.gz", hash = "sha256:7885092b2b96bf189c3a705cc3c412a4472ec5e8382d0b47219a66cccae73cfa"}, 1463 | ] 1464 | lazy-object-proxy = [ 1465 | {file = "lazy-object-proxy-1.6.0.tar.gz", hash = "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726"}, 1466 | {file = "lazy_object_proxy-1.6.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b"}, 1467 | {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win32.whl", hash = "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e"}, 1468 | {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93"}, 1469 | {file = "lazy_object_proxy-1.6.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741"}, 1470 | {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587"}, 1471 | {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4"}, 1472 | {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win32.whl", hash = "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f"}, 1473 | {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3"}, 1474 | {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981"}, 1475 | {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2"}, 1476 | {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd"}, 1477 | {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837"}, 1478 | {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653"}, 1479 | {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3"}, 1480 | {file = "lazy_object_proxy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8"}, 1481 | {file = "lazy_object_proxy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf"}, 1482 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad"}, 1483 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43"}, 1484 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a"}, 1485 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61"}, 1486 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b"}, 1487 | ] 1488 | markupsafe = [ 1489 | {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, 1490 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, 1491 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, 1492 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, 1493 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, 1494 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, 1495 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, 1496 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, 1497 | {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, 1498 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, 1499 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, 1500 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, 1501 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, 1502 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, 1503 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, 1504 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, 1505 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, 1506 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, 1507 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, 1508 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, 1509 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, 1510 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, 1511 | {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, 1512 | {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, 1513 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, 1514 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, 1515 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, 1516 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, 1517 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, 1518 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, 1519 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, 1520 | {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, 1521 | {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, 1522 | {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, 1523 | ] 1524 | mccabe = [ 1525 | {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, 1526 | {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, 1527 | ] 1528 | mistune = [ 1529 | {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, 1530 | {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, 1531 | ] 1532 | mypy = [ 1533 | {file = "mypy-0.812-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a26f8ec704e5a7423c8824d425086705e381b4f1dfdef6e3a1edab7ba174ec49"}, 1534 | {file = "mypy-0.812-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28fb5479c494b1bab244620685e2eb3c3f988d71fd5d64cc753195e8ed53df7c"}, 1535 | {file = "mypy-0.812-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:9743c91088d396c1a5a3c9978354b61b0382b4e3c440ce83cf77994a43e8c521"}, 1536 | {file = "mypy-0.812-cp35-cp35m-win_amd64.whl", hash = "sha256:d7da2e1d5f558c37d6e8c1246f1aec1e7349e4913d8fb3cb289a35de573fe2eb"}, 1537 | {file = "mypy-0.812-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4eec37370483331d13514c3f55f446fc5248d6373e7029a29ecb7b7494851e7a"}, 1538 | {file = "mypy-0.812-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d65cc1df038ef55a99e617431f0553cd77763869eebdf9042403e16089fe746c"}, 1539 | {file = "mypy-0.812-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:61a3d5b97955422964be6b3baf05ff2ce7f26f52c85dd88db11d5e03e146a3a6"}, 1540 | {file = "mypy-0.812-cp36-cp36m-win_amd64.whl", hash = "sha256:25adde9b862f8f9aac9d2d11971f226bd4c8fbaa89fb76bdadb267ef22d10064"}, 1541 | {file = "mypy-0.812-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:552a815579aa1e995f39fd05dde6cd378e191b063f031f2acfe73ce9fb7f9e56"}, 1542 | {file = "mypy-0.812-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:499c798053cdebcaa916eef8cd733e5584b5909f789de856b482cd7d069bdad8"}, 1543 | {file = "mypy-0.812-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5873888fff1c7cf5b71efbe80e0e73153fe9212fafdf8e44adfe4c20ec9f82d7"}, 1544 | {file = "mypy-0.812-cp37-cp37m-win_amd64.whl", hash = "sha256:9f94aac67a2045ec719ffe6111df543bac7874cee01f41928f6969756e030564"}, 1545 | {file = "mypy-0.812-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d23e0ea196702d918b60c8288561e722bf437d82cb7ef2edcd98cfa38905d506"}, 1546 | {file = "mypy-0.812-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:674e822aa665b9fd75130c6c5f5ed9564a38c6cea6a6432ce47eafb68ee578c5"}, 1547 | {file = "mypy-0.812-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:abf7e0c3cf117c44d9285cc6128856106183938c68fd4944763003decdcfeb66"}, 1548 | {file = "mypy-0.812-cp38-cp38-win_amd64.whl", hash = "sha256:0d0a87c0e7e3a9becdfbe936c981d32e5ee0ccda3e0f07e1ef2c3d1a817cf73e"}, 1549 | {file = "mypy-0.812-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7ce3175801d0ae5fdfa79b4f0cfed08807af4d075b402b7e294e6aa72af9aa2a"}, 1550 | {file = "mypy-0.812-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b09669bcda124e83708f34a94606e01b614fa71931d356c1f1a5297ba11f110a"}, 1551 | {file = "mypy-0.812-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:33f159443db0829d16f0a8d83d94df3109bb6dd801975fe86bacb9bf71628e97"}, 1552 | {file = "mypy-0.812-cp39-cp39-win_amd64.whl", hash = "sha256:3f2aca7f68580dc2508289c729bd49ee929a436208d2b2b6aab15745a70a57df"}, 1553 | {file = "mypy-0.812-py3-none-any.whl", hash = "sha256:2f9b3407c58347a452fc0736861593e105139b905cca7d097e413453a1d650b4"}, 1554 | {file = "mypy-0.812.tar.gz", hash = "sha256:cd07039aa5df222037005b08fbbfd69b3ab0b0bd7a07d7906de75ae52c4e3119"}, 1555 | ] 1556 | mypy-extensions = [ 1557 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 1558 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 1559 | ] 1560 | nbclient = [ 1561 | {file = "nbclient-0.5.4-py3-none-any.whl", hash = "sha256:95a300c6fbe73721736cf13972a46d8d666f78794b832866ed7197a504269e11"}, 1562 | {file = "nbclient-0.5.4.tar.gz", hash = "sha256:6c8ad36a28edad4562580847f9f1636fe5316a51a323ed85a24a4ad37d4aefce"}, 1563 | ] 1564 | nbconvert = [ 1565 | {file = "nbconvert-6.0.7-py3-none-any.whl", hash = "sha256:39e9f977920b203baea0be67eea59f7b37a761caa542abe80f5897ce3cf6311d"}, 1566 | {file = "nbconvert-6.0.7.tar.gz", hash = "sha256:cbbc13a86dfbd4d1b5dee106539de0795b4db156c894c2c5dc382062bbc29002"}, 1567 | ] 1568 | nbformat = [ 1569 | {file = "nbformat-5.1.2-py3-none-any.whl", hash = "sha256:3949fdc8f5fa0b1afca16fb307546e78494fa7a7bceff880df8168eafda0e7ac"}, 1570 | {file = "nbformat-5.1.2.tar.gz", hash = "sha256:1d223e64a18bfa7cdf2db2e9ba8a818312fc2a0701d2e910b58df66809385a56"}, 1571 | ] 1572 | nest-asyncio = [ 1573 | {file = "nest_asyncio-1.5.1-py3-none-any.whl", hash = "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c"}, 1574 | {file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"}, 1575 | ] 1576 | nodeenv = [ 1577 | {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, 1578 | {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, 1579 | ] 1580 | notebook = [ 1581 | {file = "notebook-6.4.4-py3-none-any.whl", hash = "sha256:33488bdcc5cbef23c3cfa12cd51b0b5459a211945b5053d17405980611818149"}, 1582 | {file = "notebook-6.4.4.tar.gz", hash = "sha256:26b0095c568e307a310fd78818ad8ebade4f00462dada4c0e34cbad632b9085d"}, 1583 | ] 1584 | packaging = [ 1585 | {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, 1586 | {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, 1587 | ] 1588 | pandocfilters = [ 1589 | {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, 1590 | {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, 1591 | ] 1592 | parameterized = [ 1593 | {file = "parameterized-0.8.1-py2.py3-none-any.whl", hash = "sha256:9cbb0b69a03e8695d68b3399a8a5825200976536fe1cb79db60ed6a4c8c9efe9"}, 1594 | {file = "parameterized-0.8.1.tar.gz", hash = "sha256:41bbff37d6186430f77f900d777e5bb6a24928a1c46fb1de692f8b52b8833b5c"}, 1595 | ] 1596 | parso = [ 1597 | {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, 1598 | {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, 1599 | ] 1600 | pathspec = [ 1601 | {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, 1602 | {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, 1603 | ] 1604 | pexpect = [ 1605 | {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, 1606 | {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, 1607 | ] 1608 | pickleshare = [ 1609 | {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, 1610 | {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, 1611 | ] 1612 | platformdirs = [ 1613 | {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, 1614 | {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, 1615 | ] 1616 | pluggy = [ 1617 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 1618 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 1619 | ] 1620 | pre-commit = [ 1621 | {file = "pre_commit-2.15.0-py2.py3-none-any.whl", hash = "sha256:a4ed01000afcb484d9eb8d504272e642c4c4099bbad3a6b27e519bd6a3e928a6"}, 1622 | {file = "pre_commit-2.15.0.tar.gz", hash = "sha256:3c25add78dbdfb6a28a651780d5c311ac40dd17f160eb3954a0c59da40a505a7"}, 1623 | ] 1624 | prometheus-client = [ 1625 | {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"}, 1626 | {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"}, 1627 | ] 1628 | prompt-toolkit = [ 1629 | {file = "prompt_toolkit-3.0.19-py3-none-any.whl", hash = "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"}, 1630 | {file = "prompt_toolkit-3.0.19.tar.gz", hash = "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"}, 1631 | ] 1632 | ptyprocess = [ 1633 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, 1634 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, 1635 | ] 1636 | py = [ 1637 | {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, 1638 | {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, 1639 | ] 1640 | pycparser = [ 1641 | {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, 1642 | {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, 1643 | ] 1644 | pydantic = [ 1645 | {file = "pydantic-1.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0c40162796fc8d0aa744875b60e4dc36834db9f2a25dbf9ba9664b1915a23850"}, 1646 | {file = "pydantic-1.8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:fff29fe54ec419338c522b908154a2efabeee4f483e48990f87e189661f31ce3"}, 1647 | {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:fbfb608febde1afd4743c6822c19060a8dbdd3eb30f98e36061ba4973308059e"}, 1648 | {file = "pydantic-1.8.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:eb8ccf12295113ce0de38f80b25f736d62f0a8d87c6b88aca645f168f9c78771"}, 1649 | {file = "pydantic-1.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:20d42f1be7c7acc352b3d09b0cf505a9fab9deb93125061b376fbe1f06a5459f"}, 1650 | {file = "pydantic-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dde4ca368e82791de97c2ec019681ffb437728090c0ff0c3852708cf923e0c7d"}, 1651 | {file = "pydantic-1.8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3bbd023c981cbe26e6e21c8d2ce78485f85c2e77f7bab5ec15b7d2a1f491918f"}, 1652 | {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:830ef1a148012b640186bf4d9789a206c56071ff38f2460a32ae67ca21880eb8"}, 1653 | {file = "pydantic-1.8.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:fb77f7a7e111db1832ae3f8f44203691e15b1fa7e5a1cb9691d4e2659aee41c4"}, 1654 | {file = "pydantic-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:3bcb9d7e1f9849a6bdbd027aabb3a06414abd6068cb3b21c49427956cce5038a"}, 1655 | {file = "pydantic-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2287ebff0018eec3cc69b1d09d4b7cebf277726fa1bd96b45806283c1d808683"}, 1656 | {file = "pydantic-1.8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4bbc47cf7925c86a345d03b07086696ed916c7663cb76aa409edaa54546e53e2"}, 1657 | {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:6388ef4ef1435364c8cc9a8192238aed030595e873d8462447ccef2e17387125"}, 1658 | {file = "pydantic-1.8.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:dd4888b300769ecec194ca8f2699415f5f7760365ddbe243d4fd6581485fa5f0"}, 1659 | {file = "pydantic-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:8fbb677e4e89c8ab3d450df7b1d9caed23f254072e8597c33279460eeae59b99"}, 1660 | {file = "pydantic-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2f2736d9a996b976cfdfe52455ad27462308c9d3d0ae21a2aa8b4cd1a78f47b9"}, 1661 | {file = "pydantic-1.8.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:3114d74329873af0a0e8004627f5389f3bb27f956b965ddd3e355fe984a1789c"}, 1662 | {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:258576f2d997ee4573469633592e8b99aa13bda182fcc28e875f866016c8e07e"}, 1663 | {file = "pydantic-1.8.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c17a0b35c854049e67c68b48d55e026c84f35593c66d69b278b8b49e2484346f"}, 1664 | {file = "pydantic-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8bc082afef97c5fd3903d05c6f7bb3a6af9fc18631b4cc9fedeb4720efb0c58"}, 1665 | {file = "pydantic-1.8.1-py3-none-any.whl", hash = "sha256:e3f8790c47ac42549dc8b045a67b0ca371c7f66e73040d0197ce6172b385e520"}, 1666 | {file = "pydantic-1.8.1.tar.gz", hash = "sha256:26cf3cb2e68ec6c0cfcb6293e69fb3450c5fd1ace87f46b64f678b0d29eac4c3"}, 1667 | ] 1668 | pygments = [ 1669 | {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, 1670 | {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, 1671 | ] 1672 | pylint = [ 1673 | {file = "pylint-2.11.1-py3-none-any.whl", hash = "sha256:0f358e221c45cbd4dad2a1e4b883e75d28acdcccd29d40c76eb72b307269b126"}, 1674 | {file = "pylint-2.11.1.tar.gz", hash = "sha256:2c9843fff1a88ca0ad98a256806c82c5a8f86086e7ccbdb93297d86c3f90c436"}, 1675 | ] 1676 | pyparsing = [ 1677 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 1678 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 1679 | ] 1680 | pyrsistent = [ 1681 | {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, 1682 | {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d"}, 1683 | {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2"}, 1684 | {file = "pyrsistent-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1"}, 1685 | {file = "pyrsistent-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7"}, 1686 | {file = "pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396"}, 1687 | {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710"}, 1688 | {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35"}, 1689 | {file = "pyrsistent-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f"}, 1690 | {file = "pyrsistent-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2"}, 1691 | {file = "pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427"}, 1692 | {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef"}, 1693 | {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c"}, 1694 | {file = "pyrsistent-0.18.0-cp38-cp38-win32.whl", hash = "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78"}, 1695 | {file = "pyrsistent-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b"}, 1696 | {file = "pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4"}, 1697 | {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680"}, 1698 | {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426"}, 1699 | {file = "pyrsistent-0.18.0-cp39-cp39-win32.whl", hash = "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b"}, 1700 | {file = "pyrsistent-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea"}, 1701 | {file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"}, 1702 | ] 1703 | pytest = [ 1704 | {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, 1705 | {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, 1706 | ] 1707 | pytest-cov = [ 1708 | {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, 1709 | {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, 1710 | ] 1711 | python-dateutil = [ 1712 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 1713 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 1714 | ] 1715 | pywin32 = [ 1716 | {file = "pywin32-301-cp35-cp35m-win32.whl", hash = "sha256:93367c96e3a76dfe5003d8291ae16454ca7d84bb24d721e0b74a07610b7be4a7"}, 1717 | {file = "pywin32-301-cp35-cp35m-win_amd64.whl", hash = "sha256:9635df6998a70282bd36e7ac2a5cef9ead1627b0a63b17c731312c7a0daebb72"}, 1718 | {file = "pywin32-301-cp36-cp36m-win32.whl", hash = "sha256:c866f04a182a8cb9b7855de065113bbd2e40524f570db73ef1ee99ff0a5cc2f0"}, 1719 | {file = "pywin32-301-cp36-cp36m-win_amd64.whl", hash = "sha256:dafa18e95bf2a92f298fe9c582b0e205aca45c55f989937c52c454ce65b93c78"}, 1720 | {file = "pywin32-301-cp37-cp37m-win32.whl", hash = "sha256:98f62a3f60aa64894a290fb7494bfa0bfa0a199e9e052e1ac293b2ad3cd2818b"}, 1721 | {file = "pywin32-301-cp37-cp37m-win_amd64.whl", hash = "sha256:fb3b4933e0382ba49305cc6cd3fb18525df7fd96aa434de19ce0878133bf8e4a"}, 1722 | {file = "pywin32-301-cp38-cp38-win32.whl", hash = "sha256:88981dd3cfb07432625b180f49bf4e179fb8cbb5704cd512e38dd63636af7a17"}, 1723 | {file = "pywin32-301-cp38-cp38-win_amd64.whl", hash = "sha256:8c9d33968aa7fcddf44e47750e18f3d034c3e443a707688a008a2e52bbef7e96"}, 1724 | {file = "pywin32-301-cp39-cp39-win32.whl", hash = "sha256:595d397df65f1b2e0beaca63a883ae6d8b6df1cdea85c16ae85f6d2e648133fe"}, 1725 | {file = "pywin32-301-cp39-cp39-win_amd64.whl", hash = "sha256:87604a4087434cd814ad8973bd47d6524bd1fa9e971ce428e76b62a5e0860fdf"}, 1726 | ] 1727 | pywinpty = [ 1728 | {file = "pywinpty-1.1.4-cp36-none-win_amd64.whl", hash = "sha256:fb975976ad92be44801de95fdf2b0366747767cb0528478553aff85dd63ebb09"}, 1729 | {file = "pywinpty-1.1.4-cp37-none-win_amd64.whl", hash = "sha256:5d25b30a2f87105778bc2f57cb1271f58aaa25568921ef042faf001b3b0a7307"}, 1730 | {file = "pywinpty-1.1.4-cp38-none-win_amd64.whl", hash = "sha256:c5c3550100689632f6663f39865ef8716835dab1838a9eb9b472644af92673f8"}, 1731 | {file = "pywinpty-1.1.4-cp39-none-win_amd64.whl", hash = "sha256:ad60a336d92ac38e2159320db6d5999c4c2726a141c3ed3f9694021feb6a234e"}, 1732 | {file = "pywinpty-1.1.4.tar.gz", hash = "sha256:cc700c9d5a9fcebf677ac93a4943ca9a24db6e2f11a5f0e7e8e226184c5036f7"}, 1733 | ] 1734 | pyyaml = [ 1735 | {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, 1736 | {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, 1737 | {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, 1738 | {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, 1739 | {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, 1740 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, 1741 | {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, 1742 | {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, 1743 | {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, 1744 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, 1745 | {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, 1746 | {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, 1747 | {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, 1748 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, 1749 | {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, 1750 | {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, 1751 | {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, 1752 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, 1753 | {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, 1754 | {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, 1755 | {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, 1756 | ] 1757 | pyzmq = [ 1758 | {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd"}, 1759 | {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149"}, 1760 | {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93"}, 1761 | {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea"}, 1762 | {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f"}, 1763 | {file = "pyzmq-22.3.0-cp310-cp310-win32.whl", hash = "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d"}, 1764 | {file = "pyzmq-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd"}, 1765 | {file = "pyzmq-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268"}, 1766 | {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e"}, 1767 | {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0"}, 1768 | {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364"}, 1769 | {file = "pyzmq-22.3.0-cp36-cp36m-win32.whl", hash = "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9"}, 1770 | {file = "pyzmq-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b"}, 1771 | {file = "pyzmq-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70"}, 1772 | {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df"}, 1773 | {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7"}, 1774 | {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c"}, 1775 | {file = "pyzmq-22.3.0-cp37-cp37m-win32.whl", hash = "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d"}, 1776 | {file = "pyzmq-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d"}, 1777 | {file = "pyzmq-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a"}, 1778 | {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0"}, 1779 | {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8"}, 1780 | {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74"}, 1781 | {file = "pyzmq-22.3.0-cp38-cp38-win32.whl", hash = "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7"}, 1782 | {file = "pyzmq-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45"}, 1783 | {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356"}, 1784 | {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973"}, 1785 | {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36"}, 1786 | {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57"}, 1787 | {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2"}, 1788 | {file = "pyzmq-22.3.0-cp39-cp39-win32.whl", hash = "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b"}, 1789 | {file = "pyzmq-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2"}, 1790 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f"}, 1791 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf"}, 1792 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb"}, 1793 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115"}, 1794 | {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"}, 1795 | ] 1796 | qtconsole = [ 1797 | {file = "qtconsole-5.1.1-py3-none-any.whl", hash = "sha256:73994105b0369bb99f4164df4a131010f3c7b33a7b5169c37366358d8744675b"}, 1798 | {file = "qtconsole-5.1.1.tar.gz", hash = "sha256:bbc34bca14f65535afcb401bc74b752bac955e5313001ba640383f7e5857dc49"}, 1799 | ] 1800 | qtpy = [ 1801 | {file = "QtPy-1.11.2-py2.py3-none-any.whl", hash = "sha256:83c502973e9fdd7b648d8267a421229ea3d9a0651c22e4c65a4d9228479c39b6"}, 1802 | {file = "QtPy-1.11.2.tar.gz", hash = "sha256:d6e4ae3a41f1fcb19762b58f35ad6dd443b4bdc867a4cb81ef10ccd85403c92b"}, 1803 | ] 1804 | regex = [ 1805 | {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072"}, 1806 | {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51feefd58ac38eb91a21921b047da8644155e5678e9066af7bcb30ee0dca7361"}, 1807 | {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e"}, 1808 | {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01"}, 1809 | {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39079ebf54156be6e6902f5c70c078f453350616cfe7bfd2dd15bdb3eac20ccc"}, 1810 | {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff24897f6b2001c38a805d53b6ae72267025878d35ea225aa24675fbff2dba7f"}, 1811 | {file = "regex-2021.10.8-cp310-cp310-win32.whl", hash = "sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7"}, 1812 | {file = "regex-2021.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:45cb0f7ff782ef51bc79e227a87e4e8f24bc68192f8de4f18aae60b1d60bc152"}, 1813 | {file = "regex-2021.10.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fab3ab8aedfb443abb36729410403f0fe7f60ad860c19a979d47fb3eb98ef820"}, 1814 | {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3"}, 1815 | {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d52c5e089edbdb6083391faffbe70329b804652a53c2fdca3533e99ab0580d9"}, 1816 | {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838"}, 1817 | {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287"}, 1818 | {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92"}, 1819 | {file = "regex-2021.10.8-cp36-cp36m-win32.whl", hash = "sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f"}, 1820 | {file = "regex-2021.10.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee"}, 1821 | {file = "regex-2021.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb2baff66b7d2267e07ef71e17d01283b55b3cc51a81b54cc385e721ae172ba4"}, 1822 | {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e527ab1c4c7cf2643d93406c04e1d289a9d12966529381ce8163c4d2abe4faf"}, 1823 | {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c98b013273e9da5790ff6002ab326e3f81072b4616fd95f06c8fa733d2745f"}, 1824 | {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55ef044899706c10bc0aa052f2fc2e58551e2510694d6aae13f37c50f3f6ff61"}, 1825 | {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e"}, 1826 | {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a37305eb3199d8f0d8125ec2fb143ba94ff6d6d92554c4b8d4a8435795a6eccd"}, 1827 | {file = "regex-2021.10.8-cp37-cp37m-win32.whl", hash = "sha256:2efd47704bbb016136fe34dfb74c805b1ef5c7313aef3ce6dcb5ff844299f432"}, 1828 | {file = "regex-2021.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca"}, 1829 | {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59"}, 1830 | {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741"}, 1831 | {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354"}, 1832 | {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f"}, 1833 | {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d"}, 1834 | {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3"}, 1835 | {file = "regex-2021.10.8-cp38-cp38-win32.whl", hash = "sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593"}, 1836 | {file = "regex-2021.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1"}, 1837 | {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991"}, 1838 | {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3"}, 1839 | {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb"}, 1840 | {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4786dae85c1f0624ac77cb3813ed99267c9adb72e59fdc7297e1cf4d6036d493"}, 1841 | {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6ce4f3d3c48f9f402da1ceb571548133d3322003ce01b20d960a82251695d2"}, 1842 | {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e3e2cea8f1993f476a6833ef157f5d9e8c75a59a8d8b0395a9a6887a097243b"}, 1843 | {file = "regex-2021.10.8-cp39-cp39-win32.whl", hash = "sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b"}, 1844 | {file = "regex-2021.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700"}, 1845 | {file = "regex-2021.10.8.tar.gz", hash = "sha256:26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a"}, 1846 | ] 1847 | rich = [ 1848 | {file = "rich-9.13.0-py3-none-any.whl", hash = "sha256:9004f6449c89abadf689dad6f92393e760b8c3a8a8c4ea6d8d474066307c0e66"}, 1849 | {file = "rich-9.13.0.tar.gz", hash = "sha256:d59e94a0e3e686f0d268fe5c7060baa1bd6744abca71b45351f5850a3aaa6764"}, 1850 | ] 1851 | send2trash = [ 1852 | {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, 1853 | {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, 1854 | ] 1855 | six = [ 1856 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1857 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1858 | ] 1859 | terminado = [ 1860 | {file = "terminado-0.12.1-py3-none-any.whl", hash = "sha256:09fdde344324a1c9c6e610ee4ca165c4bb7f5bbf982fceeeb38998a988ef8452"}, 1861 | {file = "terminado-0.12.1.tar.gz", hash = "sha256:b20fd93cc57c1678c799799d117874367cc07a3d2d55be95205b1a88fa08393f"}, 1862 | ] 1863 | testpath = [ 1864 | {file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"}, 1865 | {file = "testpath-0.5.0.tar.gz", hash = "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417"}, 1866 | ] 1867 | toml = [ 1868 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 1869 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 1870 | ] 1871 | tornado = [ 1872 | {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, 1873 | {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, 1874 | {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, 1875 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, 1876 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, 1877 | {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, 1878 | {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, 1879 | {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, 1880 | {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, 1881 | {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, 1882 | {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, 1883 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, 1884 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, 1885 | {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, 1886 | {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, 1887 | {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, 1888 | {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, 1889 | {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, 1890 | {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, 1891 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, 1892 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, 1893 | {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, 1894 | {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, 1895 | {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, 1896 | {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, 1897 | {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, 1898 | {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, 1899 | {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, 1900 | {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, 1901 | {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, 1902 | {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, 1903 | {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, 1904 | {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, 1905 | {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, 1906 | {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, 1907 | {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, 1908 | {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, 1909 | {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, 1910 | {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, 1911 | {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, 1912 | {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, 1913 | ] 1914 | traitlets = [ 1915 | {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, 1916 | {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, 1917 | ] 1918 | typed-ast = [ 1919 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, 1920 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, 1921 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, 1922 | {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, 1923 | {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, 1924 | {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, 1925 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, 1926 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, 1927 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, 1928 | {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, 1929 | {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, 1930 | {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, 1931 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, 1932 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, 1933 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, 1934 | {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, 1935 | {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, 1936 | {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, 1937 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, 1938 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, 1939 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, 1940 | {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, 1941 | {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, 1942 | {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, 1943 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, 1944 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, 1945 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, 1946 | {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, 1947 | {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, 1948 | {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, 1949 | ] 1950 | typing-extensions = [ 1951 | {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, 1952 | {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, 1953 | {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, 1954 | ] 1955 | virtualenv = [ 1956 | {file = "virtualenv-20.8.1-py2.py3-none-any.whl", hash = "sha256:10062e34c204b5e4ec5f62e6ef2473f8ba76513a9a617e873f1f8fb4a519d300"}, 1957 | {file = "virtualenv-20.8.1.tar.gz", hash = "sha256:bcc17f0b3a29670dd777d6f0755a4c04f28815395bca279cdcb213b97199a6b8"}, 1958 | ] 1959 | wcwidth = [ 1960 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 1961 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 1962 | ] 1963 | webencodings = [ 1964 | {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, 1965 | {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, 1966 | ] 1967 | widgetsnbextension = [ 1968 | {file = "widgetsnbextension-3.5.1-py2.py3-none-any.whl", hash = "sha256:bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd"}, 1969 | {file = "widgetsnbextension-3.5.1.tar.gz", hash = "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7"}, 1970 | ] 1971 | wrapt = [ 1972 | {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, 1973 | ] 1974 | zipp = [ 1975 | {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, 1976 | {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, 1977 | ] 1978 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "jut" 3 | version = "0.0.24" 4 | description = "Render Jupyter Notebook in the terminal" 5 | authors = ["kracekumar "] 6 | license = "MIT" 7 | readme = "README.md" 8 | repository = "https://github.com/kracekumar/jut/" 9 | 10 | [tool.poetry.dependencies] 11 | python = "^3.6.1" 12 | nbformat = "5.1.2" 13 | click = "7.1.2" 14 | rich = "9.13.0" 15 | pydantic = "1.8.1" 16 | 17 | [tool.poetry.dev-dependencies] 18 | black = "20.8b1" 19 | isort = "^5.7.0" 20 | pytest = "^6.2.2" 21 | parameterized = "^0.8.1" 22 | jupyter = "^1.0.0" 23 | pytest-cov = "^2.11.1" 24 | pre-commit = "^2.11.1" 25 | mypy = "^0.812" 26 | pylint = "^2.7.2" 27 | 28 | [build-system] 29 | requires = ["poetry-core>=1.0.0"] 30 | build-backend = "poetry.core.masonry.api" 31 | 32 | [tool.poetry.scripts] 33 | jut = "jut.cli:main" 34 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | attrs==21.2.0; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5" 2 | click==7.1.2; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") 3 | colorama==0.4.4; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0" 4 | commonmark==0.9.1; python_version >= "3.6" and python_version < "4.0" 5 | dataclasses==0.8; python_version >= "3.6" and python_version < "3.7" and python_full_version >= "3.6.1" 6 | decorator==5.1.0; python_version >= "3.5" 7 | importlib-metadata==4.8.1; python_version < "3.8" and python_version >= "3.6" 8 | ipython-genutils==0.2.0; python_version >= "3.5" 9 | jsonschema==4.0.0; python_version >= "3.5" 10 | jupyter-core==4.8.1; python_version >= "3.6" 11 | nbformat==5.1.2; python_version >= "3.5" 12 | pydantic==1.8.1; python_full_version >= "3.6.1" 13 | pygments==2.10.0; python_version >= "3.6" and python_version < "4.0" 14 | pyrsistent==0.18.0; python_version >= "3.6" 15 | pywin32==301; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_version >= "3.6" 16 | rich==9.13.0; python_version >= "3.6" and python_version < "4.0" 17 | six==1.16.0; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5" 18 | traitlets==4.3.3; python_version >= "3.6" 19 | typing-extensions==3.10.0.2; python_version >= "3.6" and python_version < "3.8" and python_full_version >= "3.6.1" 20 | zipp==3.6.0; python_version < "3.8" and python_version >= "3.6" 21 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | """Tests 2 | """ 3 | -------------------------------------------------------------------------------- /tests/integration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kracekumar/jut/cb688eef4defede6ba27c12d9a42ae9c54c5b71d/tests/integration/__init__.py -------------------------------------------------------------------------------- /tests/integration/test_cli.py: -------------------------------------------------------------------------------- 1 | from click.testing import CliRunner 2 | from parameterized import parameterized 3 | 4 | from jut.cli import display 5 | 6 | 7 | @parameterized.expand( 8 | [ 9 | ("tests/test1_all.ipynb", 0), 10 | ("tests/test1_all.ipynb --single-page --full-display --force-colors", 0), 11 | ( 12 | "https://raw.githubusercontent.com/fastai/fastbook/master/06_multicat.ipynb", 13 | 0, 14 | ), 15 | ("tests/test1_all.ipynb --tail 1", 0), 16 | ("tests/test1_all.ipynb --exclude-output-cells", 0), 17 | ("tests/test1_all.ipynb --start 1 --end 3", 0), 18 | # Failure cases 19 | ("--head 5", 2), 20 | ("tests/test1_all2.ipynb --start 1 --end 3", -1), 21 | ("tests/test1_all.ipynb --start 10 --end 3", -1), 22 | ("https://httpbin.org/status/404", -1), 23 | ] 24 | ) 25 | def test_display(args, exit_code): 26 | runner = CliRunner() 27 | result = runner.invoke(display, args) 28 | assert result.exit_code == exit_code 29 | -------------------------------------------------------------------------------- /tests/test1_all.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "hundred-celtic", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "this is code\n" 14 | ] 15 | } 16 | ], 17 | "source": [ 18 | "print('this is code')" 19 | ] 20 | }, 21 | { 22 | "cell_type": "markdown", 23 | "id": "dying-return", 24 | "metadata": {}, 25 | "source": [ 26 | "### this is markdown" 27 | ] 28 | }, 29 | { 30 | "cell_type": "raw", 31 | "id": "legislative-charter", 32 | "metadata": {}, 33 | "source": [ 34 | "this is raw NBConvert" 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "id": "assumed-danish", 40 | "metadata": {}, 41 | "source": [ 42 | "![Python logo](https://www.python.org/static/community_logos/python-powered-w-200x80.png)" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 2, 48 | "id": "everyday-passing", 49 | "metadata": {}, 50 | "outputs": [], 51 | "source": [ 52 | "x = 23" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 3, 58 | "id": "imperial-cargo", 59 | "metadata": {}, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "text/plain": [ 64 | "23" 65 | ] 66 | }, 67 | "execution_count": 3, 68 | "metadata": {}, 69 | "output_type": "execute_result" 70 | } 71 | ], 72 | "source": [ 73 | "x" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 3, 79 | "id": "swedish-scanning", 80 | "metadata": {}, 81 | "outputs": [ 82 | { 83 | "data": { 84 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAesAAAFVCAYAAADPM8ekAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFJ1JREFUeJzt3W+MXWWh7/HftDOFzp9SL46JuWLHU2vkTwM61Ysh1r5o\nk1bI1QrFdmRKZTSWqLcyEaQIFhABFcO5CW1S5YWhvLA1QDQmJt6GVBLE2ENCCS00JzRQDhewBW1n\nT2lnoPu+OPeMIjD/3DPz7M7n86qz99O9n92nK9+91tqzdkO1Wq0GACjWjKmeAAAwPLEGgMKJNQAU\nTqwBoHBiDQCFE2sAKFzjcHe+8cYbueGGG/Liiy9mcHAw69evz/vf//587WtfS0dHR5JkzZo1WbFi\nRXbs2JHt27enqakp69evz5IlSyZh+gBw6msY7vesH3zwwezfvz8bN27MkSNH8vnPfz5f//rXU6lU\nsm7duqFxhw8fzpe//OU89NBDOX78eNasWZMHH3wwTU1Nk/EaAOCUNuye9YoVK7J8+fIkycmTJ9PY\n2Ji9e/fmwIED2blzZzo6OrJx48Y8+eST6ezsTGNjY1pbW9PR0ZH9+/fnvPPOm5QXAQCnsmFjPXv2\n7CRJpVLJhg0b8q1vfSsDAwNZtWpVzjnnnGzdujX33HNPzj777LS1tQ39vebm5vT19U3szAFgmhjx\nA2YvvfRSrrzyyqxcuTIXX3xxli5dmnPOOSdJsnTp0jzzzDNpa2tLpVIZ+jv9/f2ZM2fOiE/uSqcA\nMLJh96wPHz6cnp6efO9738uFF16YJOnp6clNN92UhQsX5rHHHsu5556bhQsX5u67787AwEBOnDiR\nAwcOZMGCBSM+eUNDQw4dsgder9rb26xfnbJ29c361a/29raRB72DYWO9devWHD16NFu2bMnmzZvT\n0NCQjRs35vbbb09TU1Pa29tz6623pqWlJd3d3enq6kq1Wk1vb29mzZo1rgkBAG817KfBJ4N3h/XL\nu/v6Ze3qm/WrX+Pds3ZRFAAo3LCHwSfaCy+8kFdfrYw47owz5qa1tXUSZgQA5ZnSWK/5X/+a0874\n4Ijj/se/NOSaq788CTMCgPJMaaxnn/H+nH5mx4jjGptenvjJAEChnLMGgMKJNQAUTqwBoHBiDQCF\nE2sAKJxYA0DhxBoACifWAFA4sQaAwok1ABROrAGgcGINAIUTawAonFgDQOHEGgAKJ9YAUDixBoDC\niTUAFE6sAaBwYg0AhRNrACicWANA4cQaAAon1gBQOLEGgMKJNQAUTqwBoHBiDQCFE2sAKJxYA0Dh\nxBoACifWAFA4sQaAwok1ABROrAGgcGINAIUTawAonFgDQOHEGgAKJ9YAUDixBoDCiTUAFE6sAaBw\nYg0AhRNrACicWANA4cQaAAon1gBQOLEGgMKJNQAUrnG4O994443ccMMNefHFFzM4OJj169fnwx/+\ncK6//vrMmDEjCxYsyKZNm5IkO3bsyPbt29PU1JT169dnyZIlkzF/ADjlDRvrX//613nPe96TH/3o\nRzl69Gg+97nP5aMf/Wh6e3uzaNGibNq0KTt37swFF1yQbdu25aGHHsrx48ezZs2aXHTRRWlqapqs\n1wEAp6xhY71ixYosX748SfLmm29m5syZ2bdvXxYtWpQkWbx4cR599NHMmDEjnZ2daWxsTGtrazo6\nOrJ///6cd955E/8KAOAUN2ysZ8+enSSpVCrZsGFDrrnmmvzwhz8cur+lpSWVSiX9/f1pa2sbur25\nuTl9fX01m2Rz82lpb28beSCTzrrUL2tX36zf9DJsrJPkpZdeyje+8Y1cccUVufjii/PjH/946L7+\n/v7MmTMnra2tqVQqb7u9Vo4dO5FDh2oXf2qjvb3NutQpa1ffrF/9Gu+brGE/DX748OH09PTk2muv\nzcqVK5MkZ599dnbv3p0keeSRR9LZ2ZmFCxfm8ccfz8DAQPr6+nLgwIEsWLBgXBMCAN5q2D3rrVu3\n5ujRo9myZUs2b96choaGfPe7381tt92WwcHBzJ8/P8uXL09DQ0O6u7vT1dWVarWa3t7ezJo1a7Je\nAwCc0hqq1Wp1qp582bq7cvqZI++Bf+y9L+ebX+mahBkxFg7F1S9rV9+sX/2akMPgAMDUE2sAKJxY\nA0DhxBoACifWAFA4sQaAwok1ABROrAGgcGINAIUTawAonFgDQOHEGgAKJ9YAUDixBoDCiTUAFE6s\nAaBwYg0AhRNrACicWANA4cQaAAon1gBQOLEGgMKJNQAUTqwBoHBiDQCFE2sAKJxYA0DhxBoACifW\nAFA4sQaAwok1ABROrAGgcGINAIUTawAonFgDQOHEGgAKJ9YAUDixBoDCiTUAFE6sAaBwYg0AhRNr\nACicWANA4cQaAAon1gBQOLEGgMKJNQAUTqwBoHBiDQCFE2sAKJxYA0DhxBoACifWAFC4UcV6z549\n6e7uTpI8/fTTWbx4cdauXZu1a9fmt7/9bZJkx44dufTSS7N69ers2rVrwiYMANNN40gD7r333vzq\nV79KS0tLkuSpp57KVVddlXXr1g2NOXz4cLZt25aHHnoox48fz5o1a3LRRRelqalpwiYOANPFiHvW\n8+bNy+bNm4d+3rt3b3bt2pUrrrgiN954Y/r7+/Pkk0+ms7MzjY2NaW1tTUdHR/bv3z+hEweA6WLE\nWC9btiwzZ84c+vn888/Pddddl/vvvz9nnXVW7rnnnlQqlbS1tQ2NaW5uTl9f38TMGACmmREPg/+j\npUuXDoV56dKlue222/LJT34ylUplaEx/f3/mzJlTs0k2N5+W9va2kQcy6axL/bJ29c36TS9jjnVP\nT09uuummLFy4MI899ljOPffcLFy4MHfffXcGBgZy4sSJHDhwIAsWLKjZJI8dO5FDh+ypl6a9vc26\n1ClrV9+sX/0a75usMcf65ptvzve///00NTWlvb09t956a1paWtLd3Z2urq5Uq9X09vZm1qxZ45oQ\nAPBWDdVqtTpVT75s3V05/cyR98A/9t6X882vdE3CjBgL7+7rl7Wrb9avfo13z9pFUQCgcGINAIUT\nawAonFgDQOHEGgAKJ9YAUDixBoDCiTUAFE6sAaBwYg0AhRNrACicWANA4cQaAAon1gBQOLEGgMKJ\nNQAUTqwBoHBiDQCFE2sAKJxYA0DhxBoACifWAFA4sQaAwok1ABROrAGgcGINAIUTawAonFgDQOHE\nGgAKJ9YAUDixBoDCiTUAFE6sAaBwYg0AhRNrACicWANA4cQaAAon1gBQOLEGgMKJNQAUTqwBoHBi\nDQCFE2sAKJxYA0DhxBoACifWAFA4sQaAwok1ABROrAGgcGINAIUTawAonFgDQOHEGgAKN6pY79mz\nJ93d3UmSgwcPpqurK1dccUVuueWWoTE7duzIpZdemtWrV2fXrl0TMlkAmI5GjPW9996bG2+8MYOD\ng0mSO+64I729vbn//vtz8uTJ7Ny5M4cPH862bduyffv23HvvvfnJT34yNB4A+OeMGOt58+Zl8+bN\nQz/v3bs3ixYtSpIsXrw4f/jDH/Lkk0+ms7MzjY2NaW1tTUdHR/bv3z9xswaAaWTEWC9btiwzZ84c\n+rlarQ79uaWlJZVKJf39/Wlraxu6vbm5OX19fTWeKgBMT41j/QszZvyt7/39/ZkzZ05aW1tTqVTe\ndnutNDeflvb2tpEHMumsS/2ydvXN+k0vY471Oeeck927d+cTn/hEHnnkkVx44YVZuHBh7r777gwM\nDOTEiRM5cOBAFixYULNJHjt2IocO2VMvTXt7m3WpU9auvlm/+jXeN1ljjvV3vvOd3HTTTRkcHMz8\n+fOzfPnyNDQ0pLu7O11dXalWq+nt7c2sWbPGNSEA4K0aqn9/EnqSLVt3V04/c+Q98I+99+V88ytd\nkzAjxsK7+/pl7eqb9atf492zdlEUACicWANA4cQaAAon1gBQOLEGgMKJNQAUTqwBoHBiDQCFE2sA\nKJxYA0DhxBoACifWAFA4sQaAwok1ABROrAGgcGINAIUTawAonFgDQOHEGgAKJ9YAUDixBoDCiTUA\nFE6sAaBwYg0AhRNrACicWANA4cQaAAon1gBQOLEGgMKJNQAUTqwBoHBiDQCFE2sAKJxYA0DhxBoA\nCifWAFA4sQaAwok1ABROrAGgcGINAIUTawAonFgDQOHEGgAKJ9YAUDixBoDCiTUAFE6sAaBwYg0A\nhRNrACicWANA4cQaAAon1gBQOLEGgMKJNQAUrnG8f/ELX/hCWltbkyQf+MAHsn79+lx//fWZMWNG\nFixYkE2bNtVskgAwnY0r1gMDA0mS++67b+i2q6++Or29vVm0aFE2bdqUnTt3ZunSpbWZJQBMY+M6\nDP7MM8/k2LFj6enpybp167Jnz57s27cvixYtSpIsXrw4jz32WE0nCgDT1bj2rE8//fT09PRk1apV\nee655/LVr3411Wp16P6Wlpb09fXVbJLNzaelvb2tZo9H7ViX+mXt6pv1m17GFeuOjo7Mmzdv6M9z\n587Nvn37hu7v7+/PnDlzajPDJMeOncihQ7WLP7XR3t5mXeqUtatv1q9+jfdN1rgOgz/wwAO58847\nkySvvPJKKpVKLrroovzpT39KkjzyyCPp7Owc14QAgLca1571ZZddlo0bN6arqyszZszInXfemblz\n5+bGG2/M4OBg5s+fn+XLl9d6rgAwLY0r1k1NTbnrrrvedvu2bdv+6QkBAG/loigAUDixBoDCiTUA\nFE6sAaBwYg0AhRNrACicWANA4cQaAAon1gBQOLEGgMKJNQAUTqwBoHBiDQCFE2sAKJxYA0DhxBoA\nCifWAFA4sQaAwok1ABROrAGgcGINAIUTawAonFgDQOHEGgAKJ9YAUDixBoDCiTUAFE6sAaBwYg0A\nhRNrACicWANA4cQaAAon1gBQOLEGgMKJNQAUrnGqJzAV3nzzzTz33IFRje3o+JfMnDlzgmcEAO9u\nWsb6uecOZMOPf53mM9437LhjR/6c/33t/8z8+QsmaWYA8HbTMtZJ0nzG+9L6nv8+1dMAgBE5Zw0A\nhSt+z7p68s28eviVPPvsv49qvHPMAJxqio91/5GX829HTmbfT/848ti/vpxvr/5YPvjBecOOO3jw\n+VpNDwAmXPGxTkZ/fvnYkVfyk+170nzGS8OOe/U/ns6ZHzi7VtMDgAlVF7Eei9GE/diRVyZpNgDw\nz/MBMwAonFgDQOHEGgAKd8qds66l6smTo/7kuF8ZA2CiiPUwXu87lJ9sPzzip8tPtcuSjvba6X/5\nS2vmzHmfNykAE0ysRzCaT5ePZQ88Gd1e+FR+2chor50+2t9rTxx5APhniHUNjHYPPBn9XvhUf9nI\naH8FbjS/136qHXkAmGxiXSOjvXDLaPfCDx58vi6+bKQe5ghQ78R6ko12L3y0V1nzIbjhjfZ0wptv\nvpmkITNnjvwLEqP9d/S96UCtiPUUqOVV1kYb/7GcX671tdNH+4ZiLMEc7diDB5///4fqhz+d8Op/\nPJ3ZbWfW9LTDVJ/KAE4dNY11tVrNzTffnP3792fWrFn5wQ9+kLPOOquWT8E7qOX55aT2104fy9GE\n0QRzLGP/67WM5t+n1h8mrJdTGacKRzI4ldU01jt37szAwEB+8YtfZM+ePbnjjjuyZcuWWj4F/4Sx\nfCHKVDz3aIM5lrG1fi1j+TChL4yZXI5kcCqraawff/zxfPrTn06SnH/++Xnqqadq+fBQhKl80zNa\nI+1l/uUvrXnttcqoTydMxDn9iVDroyP18rqnm+l4FKWmsa5UKmlra/vbgzc25uTJk5kx453/o1cr\nz+dkjg/7mCePHM7xGXNH9fyv972WpKHYcVP53OY4uePGMvbYkT/X/HMCBw8+n9t+9n9yeut/G3bc\nkVcO5LSWuTUbd7zyWm786rJRfTai1g4efD7Hjvx5xHGv/d/9ue1n+0Z8LUm5r/u/3mxNV6P9/328\n8lp++v2vnBJHURqq1Wq1Vg9255135oILLsjy5cuTJEuWLMmuXbtq9fAAMC3V9Is8Pv7xj+f3v/99\nkuSJJ57IRz7ykVo+PABMSzXds/77T4MnyR133JEPfehDtXp4AJiWahprAKD2fJ81ABROrAGgcGIN\nAIUTawAo3ITHulqtZtOmTVm9enXWrl2bF1544S33P/zww7nsssuyevXq/PKXv5zo6TBGI63fz3/+\n81xyySVZu3Zt1q5dm+eee25qJsq72rNnT7q7u992u22vPrzb+tn2yvbGG2/kuuuuy5e+9KVcfvnl\nefjhh99y/5i3v+oE+93vfle9/vrrq9VqtfrEE09Ur7766qH7BgcHq8uWLav29fVVBwYGqpdeemn1\n1VdfnegpMQbDrV+1Wq1++9vfru7du3cqpsYo/OxnP6tecskl1S9+8Ytvud22Vx/ebf2qVdte6R54\n4IHq7bffXq1Wq9W//vWv1SVLlgzdN57tb8L3rIe7Xvizzz6befPmpbW1NU1NTens7Mzu3bsnekqM\nwUjXe9+7d2+2bt2arq6u/PSnP52KKTKMefPmZfPmzW+73bZXH95t/RLbXulWrFiRDRs2JElOnjyZ\nxsa/Xd17PNvfhMf63a4X/k73tbS0pK+vb6KnxBgMt35JcvHFF+eWW27Jfffdl8cff3zoCnaUYdmy\nZe/4JQa2vfrwbuuX2PZKN3v27DQ3N6dSqWTDhg255pprhu4bz/Y34bFubW1Nf3//0M9//8Uera2t\nqVT+djH6/v7+zJkzZ6KnxBgMt35JcuWVV2bu3LlpbGzMZz7zmezbt28qpskY2fbqn22vfC+99FKu\nvPLKrFy5Mp/97GeHbh/P9jfhsR7ueuHz58/P888/n6NHj2ZgYCC7d+/OBRdcMNFTYgyGW79KpZJL\nLrkkr7/+eqrVav74xz/m3HPPnaqpMozqP1yo0LZXX/5x/Wx75Tt8+HB6enpy7bXXZuXKlW+5bzzb\nX02/IvOdLFu2LI8++mhWr16d5D+vF/6b3/wmr7/+elatWpWNGzfmqquuSrVazapVq/K+9w3/xfFM\nrpHWr7e3N93d3TnttNPyqU99KosXL57iGfNOGhr+86s6bXv16Z3Wz7ZXtq1bt+bo0aPZsmVLNm/e\nnIaGhlx++eXj3v5cGxwACueiKABQOLEGgMKJNQAUTqwBoHBiDQCFE2sAKJxYA0Dh/h/uLOJdBEs5\nngAAAABJRU5ErkJggg==\n", 85 | "text/plain": [ 86 | "" 87 | ] 88 | }, 89 | "metadata": {}, 90 | "output_type": "display_data" 91 | } 92 | ], 93 | "source": [ 94 | "plt.hist(inches, 40);" 95 | ] 96 | } 97 | ], 98 | "metadata": { 99 | "kernelspec": { 100 | "display_name": "Python 3", 101 | "language": "python", 102 | "name": "python3" 103 | }, 104 | "language_info": { 105 | "codemirror_mode": { 106 | "name": "ipython", 107 | "version": 3 108 | }, 109 | "file_extension": ".py", 110 | "mimetype": "text/x-python", 111 | "name": "python", 112 | "nbconvert_exporter": "python", 113 | "pygments_lexer": "ipython3", 114 | "version": "3.8.3" 115 | } 116 | }, 117 | "nbformat": 4, 118 | "nbformat_minor": 5 119 | } 120 | -------------------------------------------------------------------------------- /tests/unit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kracekumar/jut/cb688eef4defede6ba27c12d9a42ae9c54c5b71d/tests/unit/__init__.py -------------------------------------------------------------------------------- /tests/unit/test_jut.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | import pytest 4 | from parameterized import parameterized 5 | from pydantic import ValidationError 6 | 7 | from jut import Config, ParsingException, Render 8 | 9 | config_data = [ 10 | ( 11 | { 12 | "input_file": "", 13 | "head": 0, 14 | "tail": None, 15 | "single_page": True, 16 | "full_display": True, 17 | "force_colors": True, 18 | "start": None, 19 | "end": None, 20 | "exclude_output_cells": False, 21 | "no_cell_border": True, 22 | }, 23 | ValidationError, 24 | ), 25 | ( 26 | { 27 | "input_file": Path("/tmp/foo.txt"), 28 | "head": 1, 29 | "tail": None, 30 | "single_page": True, 31 | "full_display": True, 32 | "force_colors": True, 33 | "start": None, 34 | "end": None, 35 | "exclude_output_cells": False, 36 | "no_cell_border": True, 37 | }, 38 | False, 39 | ), 40 | ( 41 | { 42 | "input_file": Path("/tmp"), 43 | "head": 0, 44 | "tail": None, 45 | "single_page": True, 46 | "full_display": True, 47 | "force_colors": True, 48 | "start": None, 49 | "end": None, 50 | "exclude_output_cells": False, 51 | "no_cell_border": True, 52 | }, 53 | ValidationError, 54 | ), 55 | ( 56 | { 57 | "input_file": Path("/tmp"), 58 | "head": None, 59 | "tail": 0, 60 | "single_page": True, 61 | "full_display": True, 62 | "force_colors": True, 63 | "start": None, 64 | "end": None, 65 | "exclude_output_cells": False, 66 | "no_cell_border": True, 67 | }, 68 | ValidationError, 69 | ), 70 | ( 71 | { 72 | "input_file": Path("/tmp"), 73 | "head": None, 74 | "tail": -1, 75 | "single_page": True, 76 | "full_display": True, 77 | "force_colors": True, 78 | "start": None, 79 | "end": None, 80 | "exclude_output_cells": False, 81 | "no_cell_border": True, 82 | }, 83 | ValidationError, 84 | ), 85 | ( 86 | { 87 | "input_file": Path("/tmp"), 88 | "head": 10, 89 | "tail": 10, 90 | "single_page": True, 91 | "full_display": True, 92 | "force_colors": True, 93 | "start": 5, 94 | "end": 10, 95 | "exclude_output_cells": False, 96 | "no_cell_border": True, 97 | }, 98 | ValidationError, 99 | ), 100 | ( 101 | { 102 | "input_file": Path("/tmp"), 103 | "head": 10, 104 | "tail": -1, 105 | "single_page": True, 106 | "full_display": True, 107 | "force_colors": True, 108 | "start": 5, 109 | "end": 10, 110 | "exclude_output_cells": False, 111 | "no_cell_border": True, 112 | }, 113 | ValidationError, 114 | ), # tail < 1 115 | ( 116 | { 117 | "input_file": Path("/tmp"), 118 | "head": 1, 119 | "tail": None, 120 | "single_page": True, 121 | "full_display": True, 122 | "force_colors": True, 123 | "start": 10, 124 | "end": 5, 125 | "exclude_output_cells": False, 126 | "no_cell_border": True, 127 | }, 128 | ValidationError, 129 | ), 130 | ( 131 | { 132 | "input_file": Path("/tmp"), 133 | "head": 1, 134 | "tail": None, 135 | "single_page": True, 136 | "full_display": True, 137 | "force_colors": True, 138 | "start": 10, 139 | "end": 15, 140 | "exclude_output_cells": False, 141 | "no_cell_border": True, 142 | }, 143 | ValidationError, 144 | ), 145 | ( 146 | { 147 | "input_file": Path("/tmp"), 148 | "head": 1, 149 | "tail": None, 150 | "single_page": True, 151 | "full_display": True, 152 | "force_colors": True, 153 | "start": 0, 154 | "end": 0, 155 | "exclude_output_cells": False, 156 | "no_cell_border": True, 157 | }, 158 | ValidationError, 159 | ), 160 | ] 161 | 162 | 163 | @parameterized.expand(config_data) 164 | def test_config(config_data, exception): 165 | if exception: 166 | with pytest.raises(exception): 167 | Config(**config_data) 168 | else: 169 | assert Config(**config_data) 170 | 171 | 172 | class TestRender: 173 | @parameterized.expand( 174 | [ 175 | ( 176 | { 177 | "input_file": Path("tests/test1_all.ipynb"), 178 | "head": 5, 179 | "tail": None, 180 | "single_page": False, 181 | "full_display": True, 182 | "force_colors": False, 183 | "start": None, 184 | "end": None, 185 | "exclude_output_cells": False, 186 | "no_cell_border": True, 187 | }, 188 | False, 189 | ), 190 | ( 191 | { 192 | "input_file": Path("jut/cli.py"), 193 | "head": 5, 194 | "tail": None, 195 | "single_page": False, 196 | "full_display": True, 197 | "force_colors": False, 198 | "start": None, 199 | "end": None, 200 | "exclude_output_cells": False, 201 | "no_cell_border": False, 202 | }, 203 | ParsingException, 204 | ), 205 | ] 206 | ) 207 | def test_parse_notebook(self, config_data, exception): 208 | if exception: 209 | with pytest.raises(exception): 210 | config = Config(**config_data) 211 | render = Render(config) 212 | render.parse_notebook() 213 | else: 214 | config = Config(**config_data) 215 | render = Render(config) 216 | render.parse_notebook() 217 | assert render.node 218 | 219 | def test_iter_cells(self): 220 | config = Config( 221 | **{ 222 | "input_file": Path("tests/test1_all.ipynb"), 223 | "head": 10, 224 | "tail": None, 225 | "single_page": False, 226 | "full_display": True, 227 | "force_colors": False, 228 | "start": None, 229 | "end": None, 230 | "exclude_output_cells": False, 231 | "no_cell_border": True, 232 | } 233 | ) 234 | render = Render(config) 235 | render.parse_notebook() 236 | cells = list(render.iter_cells()) 237 | 238 | assert len(cells) == 7 239 | --------------------------------------------------------------------------------