├── .github └── workflows │ ├── plotly_ci.yaml │ └── release_deploy.yaml ├── .gitignore ├── Makefile ├── README.md ├── assets └── images │ └── example.png ├── examples ├── plotly_fig_show.py └── streamlit_fig.py ├── plotly_calplot ├── __init__.py ├── calplot.py ├── date_extractors.py ├── layout_formatter.py ├── raw_heatmap.py ├── single_year_calplot.py └── utils.py ├── poetry.lock ├── pyproject.toml ├── setup.cfg └── tests ├── __init__.py ├── test_calplot.py ├── test_date_extractors.py ├── test_layout_formatter.py ├── test_month_calplot.py ├── test_raw_heatmap.py ├── test_single_year_calplot.py └── test_utils.py /.github/workflows/plotly_ci.yaml: -------------------------------------------------------------------------------- 1 | name: Plotly Calplot CI 2 | env: 3 | ACTIONS_ALLOW_UNSECURE_COMMANDS: true 4 | on: 5 | push: 6 | branches: [main] 7 | pull_request: 8 | branches: [main] 9 | 10 | jobs: 11 | checks: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v3 16 | with: 17 | fetch-depth: 1 18 | 19 | - name: Set up Python 3.8 20 | uses: actions/setup-python@v1 21 | with: 22 | python-version: 3.8 23 | 24 | - name: Install Poetry 25 | uses: snok/install-poetry@v1 26 | 27 | - name: Cache Poetry virtualenv 28 | uses: actions/cache@v1 29 | id: cache 30 | with: 31 | path: ~/.virtualenvs 32 | key: poetry-$ 33 | restore-keys: | 34 | poetry-$ 35 | 36 | - name: Install dependencies 37 | run: poetry install 38 | 39 | - name: Run formatter 40 | run: make lint 41 | 42 | - name: Run stubs install 43 | run: make stubs 44 | 45 | - name: Run checks 46 | run: make checks 47 | 48 | deploy: 49 | runs-on: ubuntu-latest 50 | 51 | steps: 52 | - uses: actions/checkout@v3 53 | with: 54 | fetch-depth: 1 55 | 56 | - name: Set up Python 3.8 57 | uses: actions/setup-python@v1 58 | with: 59 | python-version: 3.8 60 | 61 | - name: Install Poetry 62 | uses: snok/install-poetry@v1 63 | 64 | - name: Cache Poetry virtualenv 65 | uses: actions/cache@v1 66 | id: cache 67 | with: 68 | path: ~/.virtualenvs 69 | key: poetry-$ 70 | restore-keys: | 71 | poetry-$ 72 | 73 | - name: Create dists 74 | run: poetry build 75 | 76 | - name: Publish distribution 📦 to Test PyPI 77 | uses: pypa/gh-action-pypi-publish@release/v1 78 | with: 79 | password: ${{ secrets.PLOTLY_DEV_TOKEN }} 80 | repository_url: https://test.pypi.org/legacy/ 81 | verbose: true 82 | 83 | - name: Publish distribution 📦 to PyPI 84 | if: success() 85 | uses: pypa/gh-action-pypi-publish@release/v1 86 | with: 87 | password: ${{ secrets.PLOTLY_PRD_TOKEN }} 88 | repository_url: https://upload.pypi.org/legacy/ 89 | verbose: true 90 | -------------------------------------------------------------------------------- /.github/workflows/release_deploy.yaml: -------------------------------------------------------------------------------- 1 | name: Upload Calplot to Pypi 2 | env: 3 | ACTIONS_ALLOW_UNSECURE_COMMANDS: true 4 | on: 5 | release: 6 | types: [created] 7 | workflow_dispatch: 8 | 9 | jobs: 10 | deploy: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v3 15 | with: 16 | fetch-depth: 1 17 | 18 | - name: Set up Python 3.8 19 | uses: actions/setup-python@v1 20 | with: 21 | python-version: 3.8 22 | 23 | - name: Install Poetry 24 | uses: snok/install-poetry@v1 25 | 26 | - name: Cache Poetry virtualenv 27 | uses: actions/cache@v1 28 | id: cache 29 | with: 30 | path: ~/.virtualenvs 31 | key: poetry-$ 32 | restore-keys: | 33 | poetry-$ 34 | 35 | - name: Create dists 36 | run: poetry build 37 | 38 | - name: Publish distribution 📦 to Test PyPI 39 | uses: pypa/gh-action-pypi-publish@release/v1 40 | with: 41 | password: ${{ secrets.PLOTLY_DEV_TOKEN }} 42 | repository_url: https://test.pypi.org/legacy/ 43 | skip-existing: true 44 | verbose: true 45 | 46 | - name: Publish distribution 📦 to PyPI 47 | uses: pypa/gh-action-pypi-publish@release/v1 48 | with: 49 | password: ${{ secrets.PLOTLY_PRD_TOKEN }} 50 | verbose: true 51 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | drafts/.ipynb_checkpoints/Untitled-checkpoint.ipynb 3 | drafts/Untitled.ipynb 4 | *.pyc 5 | __pycache__ 6 | 7 | 8 | # Created by https://www.toptal.com/developers/gitignore/api/python 9 | # Edit at https://www.toptal.com/developers/gitignore?templates=python 10 | 11 | ### Python ### 12 | # Byte-compiled / optimized / DLL files 13 | __pycache__/ 14 | *.py[cod] 15 | *$py.class 16 | 17 | # C extensions 18 | *.so 19 | 20 | # Distribution / packaging 21 | .Python 22 | build/ 23 | develop-eggs/ 24 | dist/ 25 | downloads/ 26 | eggs/ 27 | .eggs/ 28 | lib/ 29 | lib64/ 30 | parts/ 31 | sdist/ 32 | var/ 33 | wheels/ 34 | share/python-wheels/ 35 | *.egg-info/ 36 | .installed.cfg 37 | *.egg 38 | MANIFEST 39 | 40 | # PyInstaller 41 | # Usually these files are written by a python script from a template 42 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 43 | *.manifest 44 | *.spec 45 | 46 | # Installer logs 47 | pip-log.txt 48 | pip-delete-this-directory.txt 49 | 50 | # Unit test / coverage reports 51 | htmlcov/ 52 | .tox/ 53 | .nox/ 54 | .coverage 55 | .coverage.* 56 | .cache 57 | nosetests.xml 58 | coverage.xml 59 | *.cover 60 | *.py,cover 61 | .hypothesis/ 62 | .pytest_cache/ 63 | cover/ 64 | 65 | # Translations 66 | *.mo 67 | *.pot 68 | 69 | # Django stuff: 70 | *.log 71 | local_settings.py 72 | db.sqlite3 73 | db.sqlite3-journal 74 | 75 | # Flask stuff: 76 | instance/ 77 | .webassets-cache 78 | 79 | # Scrapy stuff: 80 | .scrapy 81 | 82 | # Sphinx documentation 83 | docs/_build/ 84 | 85 | # PyBuilder 86 | .pybuilder/ 87 | target/ 88 | 89 | # Jupyter Notebook 90 | .ipynb_checkpoints 91 | 92 | # IPython 93 | profile_default/ 94 | ipython_config.py 95 | 96 | # pyenv 97 | # For a library or package, you might want to ignore these files since the code is 98 | # intended to run in multiple environments; otherwise, check them in: 99 | # .python-version 100 | 101 | # pipenv 102 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 103 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 104 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 105 | # install all needed dependencies. 106 | #Pipfile.lock 107 | 108 | # poetry 109 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 110 | # This is especially recommended for binary packages to ensure reproducibility, and is more 111 | # commonly ignored for libraries. 112 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 113 | #poetry.lock 114 | 115 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 116 | __pypackages__/ 117 | 118 | # Celery stuff 119 | celerybeat-schedule 120 | celerybeat.pid 121 | 122 | # SageMath parsed files 123 | *.sage.py 124 | 125 | # Environments 126 | .env 127 | .venv 128 | env/ 129 | venv/ 130 | ENV/ 131 | env.bak/ 132 | venv.bak/ 133 | 134 | # Spyder project settings 135 | .spyderproject 136 | .spyproject 137 | 138 | # Rope project settings 139 | .ropeproject 140 | 141 | # mkdocs documentation 142 | /site 143 | 144 | # mypy 145 | .mypy_cache/ 146 | .dmypy.json 147 | dmypy.json 148 | 149 | # Pyre type checker 150 | .pyre/ 151 | 152 | # pytype static type analyzer 153 | .pytype/ 154 | 155 | # Cython debug symbols 156 | cython_debug/ 157 | 158 | # PyCharm 159 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 160 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 161 | # and can be added to the global gitignore or merged into this file. For a more nuclear 162 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 163 | #.idea/ 164 | 165 | # End of https://www.toptal.com/developers/gitignore/api/python 166 | .DS_Store 167 | .vscode/settings.json 168 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | package := "plotly_calplot" 2 | 3 | st_example: 4 | @poetry run streamlit run examples/streamlit_fig.py 5 | pt_example: 6 | @poetry run python3 examples/plotly_fig_show.py 7 | 8 | lint: 9 | @poetry run black . 10 | @poetry run isort . 11 | 12 | install: 13 | @curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python 14 | @poetry install 15 | 16 | checks: 17 | @poetry run flake8 . 18 | @poetry run black . 19 | @poetry run mypy plotly_calplot 20 | @poetry run mypy ./tests/**.py 21 | @poetry run pytest tests/ 22 | @poetry run poetry check 23 | 24 | stubs: 25 | @poetry run mypy --install-types --non-interactive plotly_calplot 26 | @poetry run python3 -m pip install types-pytz 27 | 28 | pypi_deploy: 29 | @poetry config pypi-token.pypi $(PLOTLY_PRD_TOKEN) 30 | @poetry build 31 | @poetry publish 32 | 33 | testpypi_deploy: 34 | @poetry config repositories.test-pypi https://test.pypi.org/legacy/ 35 | @poetry config pypi-token.test-pypi $(PLOTLY_DEV_TOKEN) 36 | @poetry build 37 | @poetry publish -r test-pypi -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Calendar Heatmap with Plotly 2 | Making it easier to visualize and costumize time relevant or time series data with plotly interaction. 3 | 4 | New to the library? Read [this Medium article](https://medium.com/@brunorosilva/5fc322125db7). 5 | 6 | This plot is a very similar to the contribuitions available on Github and Gitlab profile pages and to [Calplot](https://github.com/tomkwok/calplot) - which is a pyplot implementation of the calendar heatmap, thus it is not interactive right off the bat. 7 | 8 | The first mention I could find of this plot being made with plotly was in [this forum post](https://community.plotly.com/t/colored-calendar-heatmap-in-dash/10907/16) and it got my attention as something that should be easily available to anyone. 9 | 10 | # Installation 11 | ``` bash 12 | pip install plotly-calplot 13 | ``` 14 | 15 | # Examples 16 | 17 | In [this Medium article](https://medium.com/@brunorosilva/5fc322125db7) I covered lot's of usage methods for this library. 18 | ``` python 19 | from plotly_calplot import calplot 20 | 21 | fig = calplot(df, x="date", y="value") 22 | fig.show() 23 | # you can also adjust layout and your usual plotly stuff 24 | ``` 25 | 26 | 27 | -------------------------------------------------------------------------------- /assets/images/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunorosilva/plotly-calplot/c12cc6f55ef19fe724e7d2a6d125a8b07bd904c6/assets/images/example.png -------------------------------------------------------------------------------- /examples/plotly_fig_show.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | 4 | from plotly_calplot.calplot import calplot, month_calplot 5 | 6 | # mock setup 7 | dummy_start_date = "2019-01-01" 8 | dummy_end_date = "2022-10-03" 9 | dummy_df = pd.DataFrame( 10 | { 11 | "ds": pd.date_range(dummy_start_date, dummy_end_date, tz="Singapore"), 12 | "value": np.random.randint( 13 | -10, 14 | 30, 15 | (pd.to_datetime(dummy_end_date) - pd.to_datetime(dummy_start_date)).days 16 | + 1, 17 | ), 18 | } 19 | ) 20 | 21 | fig1 = calplot( 22 | dummy_df, 23 | x="ds", 24 | y="value", 25 | ) 26 | 27 | fig1.show() 28 | 29 | # same example by month 30 | fig2 = month_calplot( 31 | dummy_df, 32 | x="ds", 33 | y="value", 34 | ) 35 | fig2.show() 36 | -------------------------------------------------------------------------------- /examples/streamlit_fig.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import streamlit as st 4 | 5 | from plotly_calplot.calplot import calplot 6 | 7 | # mock setup 8 | dummy_start_date = "2019-01-01" 9 | dummy_end_date = "2021-10-03" 10 | dummy_df = pd.DataFrame( 11 | { 12 | "ds": pd.date_range(dummy_start_date, dummy_end_date), 13 | "value": np.random.randint( 14 | 0, 15 | 30, 16 | (pd.to_datetime(dummy_end_date) - pd.to_datetime(dummy_start_date)).days 17 | + 1, 18 | ), 19 | } 20 | ) 21 | fig = calplot( 22 | dummy_df, 23 | x="ds", 24 | y="value", 25 | ) 26 | 27 | st.plotly_chart(fig) 28 | -------------------------------------------------------------------------------- /plotly_calplot/__init__.py: -------------------------------------------------------------------------------- 1 | from .calplot import calplot, month_calplot 2 | 3 | __version__ = "0.0.2" 4 | 5 | __all__ = [ 6 | "calplot", 7 | "month_calplot", 8 | ] 9 | -------------------------------------------------------------------------------- /plotly_calplot/calplot.py: -------------------------------------------------------------------------------- 1 | from datetime import date 2 | from typing import Any, Dict, Optional, Union 3 | 4 | import numpy as np 5 | from pandas import DataFrame, Grouper, Series 6 | from plotly import graph_objects as go 7 | from plotly.subplots import make_subplots 8 | 9 | from plotly_calplot.layout_formatter import ( 10 | apply_general_colorscaling, 11 | showscale_of_heatmaps, 12 | ) 13 | from plotly_calplot.single_year_calplot import year_calplot 14 | from plotly_calplot.utils import fill_empty_with_zeros, validate_date_column 15 | 16 | 17 | def _get_subplot_layout(**kwargs: Any) -> go.Layout: 18 | """ 19 | Combines the default subplot layout with the customized parameters 20 | """ 21 | dark_theme: bool = kwargs.pop("dark_theme", False) 22 | yaxis: Dict[str, Any] = kwargs.pop("yaxis", {}) 23 | xaxis: Dict[str, Any] = kwargs.pop("xaxis", {}) 24 | 25 | def _dt(b: Any, a: Any) -> Any: 26 | return a if dark_theme else b 27 | 28 | return go.Layout( 29 | **{ 30 | "yaxis": { 31 | "showline": False, 32 | "showgrid": False, 33 | "zeroline": False, 34 | "tickmode": "array", 35 | "autorange": "reversed", 36 | **yaxis, 37 | }, 38 | "xaxis": { 39 | "showline": False, 40 | "showgrid": False, 41 | "zeroline": False, 42 | "tickmode": "array", 43 | **xaxis, 44 | }, 45 | "font": {"size": 10, "color": _dt("#9e9e9e", "#fff")}, 46 | "plot_bgcolor": _dt("#fff", "#333"), 47 | "paper_bgcolor": _dt(None, "#333"), 48 | "margin": {"t": 20, "b": 20}, 49 | "showlegend": False, 50 | **kwargs, 51 | } 52 | ) 53 | 54 | 55 | def calplot( 56 | data: DataFrame, 57 | x: str, 58 | y: str, 59 | name: str = "y", 60 | dark_theme: bool = False, 61 | month_lines_width: int = 1, 62 | month_lines_color: str = "#9e9e9e", 63 | gap: int = 1, 64 | years_title: bool = False, 65 | colorscale: str = "greens", 66 | title: str = "", 67 | month_lines: bool = True, 68 | total_height: Union[int, None] = None, 69 | space_between_plots: float = 0.08, 70 | showscale: bool = False, 71 | text: Optional[str] = None, 72 | years_as_columns: bool = False, 73 | cmap_min: Optional[float] = None, 74 | cmap_max: Optional[float] = None, 75 | start_month: int = 1, 76 | end_month: int = 12, 77 | date_fmt: str = "%Y-%m-%d", 78 | ) -> go.Figure: 79 | """ 80 | Yearly Calendar Heatmap 81 | 82 | Parameters 83 | ---------- 84 | data : DataFrame 85 | Must contain at least one date like column and 86 | one value column for displaying in the plot 87 | 88 | x : str 89 | The name of the date like column in data 90 | 91 | y : str 92 | The name of the value column in data 93 | 94 | dark_theme : bool = False 95 | Option for creating a dark themed plot 96 | 97 | month_lines: bool = True 98 | if true will plot a separation line between 99 | each month in the calendar 100 | 101 | month_lines_width : int = 1 102 | if month_lines this option controls the width of 103 | the line between each month in the calendar 104 | 105 | month_lines_color : str = "#9e9e9e" 106 | if month_lines this option controls the color of 107 | the line between each month in the calendar 108 | 109 | gap : int = 1 110 | controls the gap bewteen daily squares 111 | 112 | years_title : bool = False 113 | if true will add a title for each subplot with the 114 | correspondent year 115 | 116 | colorscale : str = "greens" 117 | controls the colorscale for the calendar, works 118 | with all the standard Plotly Colorscales and also 119 | supports custom colorscales made by the user 120 | 121 | title : str = "" 122 | title of the plot 123 | 124 | total_height : int = None 125 | if provided a value, will force the plot to have a specific 126 | height, otherwise the total height will be calculated 127 | according to the amount of years in data 128 | 129 | space_between_plots : float = 0.08 130 | controls the vertical space between the plots 131 | 132 | showscale : bool = False 133 | if True, a color legend will be created. 134 | Thanks to @ghhar98! 135 | 136 | text : Optional[str] = None 137 | The name of the column in data to include in hovertext. 138 | 139 | years_as_columns : bool = False 140 | if True will plot all years in a single line 141 | 142 | cmap_min : float = None 143 | colomap min, defaults to min value of the data 144 | 145 | cmap_max : float = None 146 | colomap max, defaults to max value of the data 147 | 148 | start_month : int = 1 149 | starting month range to plot, defaults to 1 (January) 150 | 151 | end_month : int = 12 152 | ending month range to plot, defaults to 12 (December) 153 | 154 | date_fmt : str = "%Y-%m-%d" 155 | date format for the date column in data, defaults to "%Y-%m-%d" 156 | If the date column is already in datetime format, this parameter 157 | will be ignored. 158 | """ 159 | data[x] = validate_date_column(data[x], date_fmt) 160 | unique_years = data[x].dt.year.unique() 161 | unique_years_amount = len(unique_years) 162 | if years_title: 163 | subplot_titles = unique_years.astype(str) 164 | else: 165 | subplot_titles = None 166 | 167 | # single row calplot logic 168 | if years_as_columns: 169 | rows = 1 170 | cols = unique_years_amount 171 | else: 172 | rows = unique_years_amount 173 | cols = 1 174 | 175 | # if single row calplot, the height can be constant 176 | if total_height is None: 177 | if years_as_columns: 178 | total_height = 150 179 | else: 180 | total_height = 150 * unique_years_amount 181 | 182 | fig = make_subplots( 183 | rows=rows, 184 | cols=cols, 185 | subplot_titles=subplot_titles, 186 | vertical_spacing=space_between_plots, 187 | ) 188 | 189 | # getting cmap_min and cmap_max 190 | if cmap_min is None: 191 | cmap_min = data[y].min() 192 | 193 | if cmap_max is None: 194 | cmap_max = data[y].max() 195 | 196 | data = data[ 197 | data[x].dt.month.isin(np.arange(start_month, end_month + 1, 1).tolist()) 198 | ] 199 | 200 | for i, year in enumerate(unique_years): 201 | selected_year_data = data.loc[data[x].dt.year == year] 202 | selected_year_data = fill_empty_with_zeros( 203 | selected_year_data, x, year, start_month, end_month 204 | ) 205 | 206 | year_calplot( 207 | selected_year_data, 208 | x, 209 | y, 210 | name=name, 211 | month_lines=month_lines, 212 | month_lines_width=month_lines_width, 213 | month_lines_color=month_lines_color, 214 | colorscale=colorscale, 215 | year=year, 216 | fig=fig, 217 | dark_theme=dark_theme, 218 | gap=gap, 219 | title=title, 220 | row=i, 221 | total_height=total_height, 222 | text=None if text is None else selected_year_data[text].tolist(), 223 | text_name=text, 224 | years_as_columns=years_as_columns, 225 | start_month=start_month, 226 | end_month=end_month, 227 | ) 228 | 229 | fig = apply_general_colorscaling(fig, cmap_min, cmap_max) 230 | if showscale: 231 | fig = showscale_of_heatmaps(fig) 232 | 233 | return fig 234 | 235 | 236 | def month_calplot( 237 | data: DataFrame = None, 238 | x: str = "x", 239 | y: str = "y", 240 | name: str = "y", 241 | dark_theme: bool = False, 242 | gap: int = 2, 243 | colorscale: str = "greens", 244 | title: str = "", 245 | year_height: int = 30, 246 | total_height: Union[int, None] = None, 247 | showscale: bool = False, 248 | date_fmt: str = "%Y-%m-%d", 249 | ) -> go.Figure: 250 | """ 251 | Yearly Calendar Heatmap by months (12 cols per row) 252 | 253 | Parameters 254 | ---------- 255 | data : DataFrame | None 256 | Must contain at least one date like column and 257 | one value column for displaying in the plot. If data is None, x and y will 258 | be used 259 | 260 | x : str | Iterable 261 | The name of the date like column in data or the column if data is None 262 | 263 | y : str | Iterable 264 | The name of the value column in data or the column if data is None 265 | 266 | dark_theme : bool = False 267 | Option for creating a dark themed plot 268 | 269 | gap : int = 2 270 | controls the gap bewteen monthly squares 271 | 272 | colorscale : str = "greens" 273 | controls the colorscale for the calendar, works 274 | with all the standard Plotly Colorscales and also 275 | supports custom colorscales made by the user 276 | 277 | title : str = "" 278 | title of the plot 279 | 280 | year_height: int = 30 281 | the height per year to be used if total_height is None 282 | 283 | total_height : int = None 284 | if provided a value, will force the plot to have a specific 285 | height, otherwise the total height will be calculated 286 | according to the amount of years in data 287 | 288 | showscale : bool = False 289 | wether to show the scale of the data 290 | 291 | date_fmt : str = "%Y-%m-%d" 292 | date format for the date column in data, defaults to "%Y-%m-%d" 293 | If the date column is already in datetime format, this parameter 294 | will be ignored. 295 | """ 296 | if data is None: 297 | if not isinstance(x, Series): 298 | x = Series(x, dtype="datetime64[ns]", name="x") 299 | 300 | if not isinstance(y, Series): 301 | y = Series(y, dtype="float64", name="y") 302 | 303 | data = DataFrame({x.name: x, y.name: y}) 304 | 305 | x = x.name 306 | y = y.name 307 | 308 | data[x] = validate_date_column(data[x], date_fmt) 309 | 310 | gData = data.set_index(x)[y].groupby(Grouper(freq="M")).sum() 311 | unique_years = gData.index.year.unique() 312 | unique_years_amount = len(unique_years) 313 | 314 | if total_height is None: 315 | total_height = 20 + max(10, year_height * unique_years_amount) 316 | 317 | layout = _get_subplot_layout( 318 | dark_theme=dark_theme, 319 | height=total_height, 320 | title=title, 321 | yaxis={ 322 | "tickvals": unique_years, 323 | }, 324 | xaxis={ 325 | "tickvals": list(range(1, 13)), 326 | "ticktext": [date(1900, i, 1).strftime("%b") for i in range(1, 13)], 327 | "tickangle": 45, 328 | }, 329 | ) 330 | 331 | # hovertext = _gen_hoverText(gData.index.month, gData.index.year, gData) 332 | hovertext = gData.apply(lambda x: f"{x:.0f}") 333 | 334 | cplt = go.Heatmap( 335 | x=gData.index.month, 336 | y=gData.index.year, 337 | z=gData, 338 | name=title, 339 | showscale=showscale, 340 | xgap=gap, 341 | ygap=gap, 342 | colorscale=colorscale, 343 | hoverinfo="text", 344 | text=hovertext, 345 | ) 346 | 347 | fig = go.Figure(data=cplt, layout=layout) 348 | 349 | return fig 350 | -------------------------------------------------------------------------------- /plotly_calplot/date_extractors.py: -------------------------------------------------------------------------------- 1 | from typing import Any, List, Tuple 2 | 3 | import numpy as np 4 | import pandas as pd 5 | 6 | 7 | def get_month_names( 8 | data: pd.DataFrame, x: str, start_month: int = 1, end_month: int = 12 9 | ) -> List[str]: 10 | start_month_names_filler = [None] * (start_month - 1) 11 | end_month_names_filler = [None] * (12 - end_month) 12 | month_names = list( 13 | start_month_names_filler 14 | + data[x].dt.month_name().unique().tolist() 15 | + end_month_names_filler 16 | ) 17 | return month_names 18 | 19 | 20 | def get_date_coordinates( 21 | data: pd.DataFrame, x: str 22 | ) -> Tuple[Any, List[float], List[int]]: 23 | month_days = [] 24 | for m in data[x].dt.month.unique(): 25 | month_days.append(data.loc[data[x].dt.month == m, x].max().day) 26 | 27 | month_positions = np.linspace(1.5, 50, 12) 28 | weekdays_in_year = [i.weekday() for i in data[x]] 29 | 30 | # sometimes the last week of the current year conflicts with next year's january 31 | # pandas uses ISO weeks, which will give those weeks the number 52 or 53, but this 32 | # is bad news for this plot therefore we need a correction to use Gregorian weeks, 33 | # for a more in-depth explanation check 34 | # https://stackoverflow.com/questions/44372048/python-pandas-timestamp-week-returns-52-for-first-day-of-year 35 | weeknumber_of_dates = data[x].dt.strftime("%W").astype(int).tolist() 36 | 37 | return month_positions, weekdays_in_year, weeknumber_of_dates 38 | -------------------------------------------------------------------------------- /plotly_calplot/layout_formatter.py: -------------------------------------------------------------------------------- 1 | from typing import Any, List, Optional 2 | 3 | import pandas as pd 4 | from plotly import graph_objects as go 5 | 6 | 7 | def decide_layout( 8 | dark_theme: bool, 9 | title: str, 10 | month_names: List[str], 11 | month_positions: Any, 12 | ) -> go.Layout: 13 | if dark_theme: 14 | layout = go.Layout( 15 | title=title, 16 | yaxis=dict( 17 | showline=False, 18 | showgrid=False, 19 | zeroline=False, 20 | tickmode="array", 21 | ticktext=["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], 22 | tickvals=[0, 1, 2, 3, 4, 5, 6], 23 | autorange="reversed", 24 | ), 25 | xaxis=dict( 26 | showline=False, 27 | showgrid=False, 28 | zeroline=False, 29 | tickmode="array", 30 | ticktext=month_names, 31 | tickvals=month_positions, 32 | ), 33 | font={"size": 10, "color": "#fff"}, 34 | paper_bgcolor=("#333"), 35 | plot_bgcolor=("#333"), 36 | margin=dict(t=20, b=20), 37 | showlegend=False, 38 | ) 39 | else: 40 | layout = go.Layout( 41 | title=title, 42 | yaxis=dict( 43 | showline=False, 44 | showgrid=False, 45 | zeroline=False, 46 | tickmode="array", 47 | ticktext=["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], 48 | tickvals=[0, 1, 2, 3, 4, 5, 6], 49 | autorange="reversed", 50 | ), 51 | xaxis=dict( 52 | showline=False, 53 | showgrid=False, 54 | zeroline=False, 55 | tickmode="array", 56 | ticktext=month_names, 57 | tickvals=month_positions, 58 | ), 59 | font={"size": 10, "color": "#9e9e9e"}, 60 | plot_bgcolor=("#fff"), 61 | margin=dict(t=20, b=20), 62 | showlegend=False, 63 | ) 64 | 65 | return layout 66 | 67 | 68 | def create_month_lines( 69 | cplt: List[go.Figure], 70 | month_lines_color: str, 71 | month_lines_width: int, 72 | data: pd.DataFrame, 73 | weekdays_in_year: List[float], 74 | weeknumber_of_dates: List[int], 75 | ) -> go.Figure: 76 | kwargs = dict( 77 | mode="lines", 78 | line=dict(color=month_lines_color, width=month_lines_width), 79 | hoverinfo="skip", 80 | ) 81 | for date, dow, wkn in zip(data, weekdays_in_year, weeknumber_of_dates): 82 | if date.day == 1: 83 | cplt += [go.Scatter(x=[wkn - 0.5, wkn - 0.5], y=[dow - 0.5, 6.5], **kwargs)] 84 | if dow: 85 | cplt += [ 86 | go.Scatter( 87 | x=[wkn - 0.5, wkn + 0.5], y=[dow - 0.5, dow - 0.5], **kwargs 88 | ), 89 | go.Scatter(x=[wkn + 0.5, wkn + 0.5], y=[dow - 0.5, -0.5], **kwargs), 90 | ] 91 | return cplt 92 | 93 | 94 | def update_plot_with_current_layout( 95 | fig: go.Figure, 96 | cplt: go.Figure, 97 | row: int, 98 | layout: go.Layout, 99 | total_height: Optional[int], 100 | years_as_columns: bool, 101 | ) -> go.Figure: 102 | fig.update_layout(layout) 103 | fig.update_xaxes(layout["xaxis"]) 104 | fig.update_yaxes(layout["yaxis"]) 105 | fig.update_layout(height=total_height) 106 | if years_as_columns: 107 | rows = [1] * len(cplt) 108 | cols = [(row + 1)] * len(cplt) 109 | else: 110 | rows = [(row + 1)] * len(cplt) 111 | cols = [1] * len(cplt) 112 | fig.add_traces(cplt, rows=rows, cols=cols) 113 | return fig 114 | 115 | 116 | def apply_general_colorscaling( 117 | fig: go.Figure, cmap_min: float, cmap_max: float 118 | ) -> go.Figure: 119 | return fig.update_traces( 120 | selector=dict(type="heatmap"), zmax=cmap_max, zmin=cmap_min 121 | ) 122 | 123 | 124 | def showscale_of_heatmaps(fig: go.Figure) -> go.Figure: 125 | return fig.update_traces( 126 | showscale=True, 127 | selector=dict(type="heatmap"), 128 | ) 129 | -------------------------------------------------------------------------------- /plotly_calplot/raw_heatmap.py: -------------------------------------------------------------------------------- 1 | from typing import List, Optional 2 | 3 | import numpy as np 4 | import pandas as pd 5 | from plotly import graph_objects as go 6 | 7 | 8 | def create_heatmap_without_formatting( 9 | data: pd.DataFrame, 10 | x: str, 11 | y: str, 12 | weeknumber_of_dates: List[int], 13 | weekdays_in_year: List[float], 14 | gap: int, 15 | year: int, 16 | colorscale: str, 17 | name: str, 18 | text: Optional[List[str]] = None, 19 | text_name: Optional[str] = None, 20 | ) -> List[go.Figure]: 21 | hovertemplate_extra = "" 22 | if text is not None: 23 | hovertemplate_extra = "
" 24 | if text_name is not None: 25 | hovertemplate_extra += f"{text_name}=" 26 | hovertemplate_extra += "%{text}" 27 | raw_heatmap = [ 28 | go.Heatmap( 29 | x=weeknumber_of_dates, 30 | y=weekdays_in_year, 31 | z=data[y], 32 | xgap=gap, # this 33 | ygap=gap, # and this is used to make the grid-like apperance 34 | showscale=False, 35 | colorscale=colorscale, # user can setup their colorscale 36 | text=text, 37 | hovertemplate=( 38 | "%{customdata[0]}
Week=%{x}
%{customdata[1]}=%{z}" 39 | + hovertemplate_extra 40 | ), 41 | customdata=np.stack((data[x].astype(str), [name] * data.shape[0]), axis=-1), 42 | name=str(year), 43 | ) 44 | ] 45 | return raw_heatmap 46 | -------------------------------------------------------------------------------- /plotly_calplot/single_year_calplot.py: -------------------------------------------------------------------------------- 1 | from typing import List, Optional, Union 2 | 3 | from pandas.core.frame import DataFrame 4 | from plotly import graph_objects as go 5 | 6 | from plotly_calplot.date_extractors import get_date_coordinates, get_month_names 7 | from plotly_calplot.layout_formatter import ( 8 | create_month_lines, 9 | decide_layout, 10 | update_plot_with_current_layout, 11 | ) 12 | from plotly_calplot.raw_heatmap import create_heatmap_without_formatting 13 | 14 | 15 | def year_calplot( 16 | data: DataFrame, 17 | x: str, 18 | y: str, 19 | fig: go.Figure, 20 | row: int, 21 | year: int, 22 | name: str = "y", 23 | dark_theme: bool = False, 24 | month_lines_width: int = 1, 25 | month_lines_color: str = "#9e9e9e", 26 | gap: int = 1, 27 | colorscale: str = "greens", 28 | title: str = "", 29 | month_lines: bool = True, 30 | total_height: Union[int, None] = None, 31 | text: Optional[List[str]] = None, 32 | text_name: Optional[str] = None, 33 | years_as_columns: bool = False, 34 | start_month: int = 1, 35 | end_month: int = 12, 36 | ) -> go.Figure: 37 | """ 38 | Each year is subplotted separately and added to the main plot 39 | """ 40 | 41 | month_names = get_month_names(data, x, start_month, end_month) 42 | month_positions, weekdays_in_year, weeknumber_of_dates = get_date_coordinates( 43 | data, x 44 | ) 45 | 46 | # the calendar is actually a heatmap :) 47 | cplt = create_heatmap_without_formatting( 48 | data, 49 | x, 50 | y, 51 | weeknumber_of_dates, 52 | weekdays_in_year, 53 | gap, 54 | year, 55 | colorscale, 56 | name, 57 | text=text, 58 | text_name=text_name, 59 | ) 60 | 61 | if month_lines: 62 | cplt = create_month_lines( 63 | cplt, 64 | month_lines_color, 65 | month_lines_width, 66 | data[x], 67 | weekdays_in_year, 68 | weeknumber_of_dates, 69 | ) 70 | 71 | layout = decide_layout(dark_theme, title, month_names, month_positions) 72 | fig = update_plot_with_current_layout( 73 | fig, cplt, row, layout, total_height, years_as_columns 74 | ) 75 | 76 | return fig 77 | -------------------------------------------------------------------------------- /plotly_calplot/utils.py: -------------------------------------------------------------------------------- 1 | from datetime import date, datetime, timedelta 2 | 3 | import pandas as pd 4 | from pandas.core.frame import DataFrame 5 | 6 | 7 | def fill_empty_with_zeros( 8 | selected_year_data: DataFrame, 9 | x: str, 10 | year: int, 11 | start_month: int, 12 | end_month: int, 13 | ) -> pd.DataFrame: 14 | """ 15 | Fills empty dates with zeros in the selected year data. 16 | 17 | Args: 18 | selected_year_data (DataFrame): The data for the selected year. 19 | x (str): The column name for the date values. 20 | year (int): The year for which the data is being filled. 21 | start_month (int): The starting month of the year. 22 | end_month (int): The ending month of the year. 23 | 24 | Returns: 25 | pd.DataFrame: The final DataFrame with empty dates filled with zeros. 26 | """ 27 | if end_month != 12: 28 | last_date = datetime(year, end_month + 1, 1) + timedelta(days=-1) 29 | else: 30 | last_date = datetime(year, 1, 1) + timedelta(days=-1) 31 | year_min_date = date(year=year, month=start_month, day=1) 32 | year_max_date = date(year=year, month=end_month, day=last_date.day) 33 | df = pd.DataFrame({x: pd.date_range(year_min_date, year_max_date)}) 34 | final_df = df.merge(selected_year_data, how="left") 35 | return final_df 36 | 37 | 38 | def validate_date_column(date_column: pd.Series, date_fmt: str) -> pd.Series: 39 | """ 40 | Validate the date column from a DataFrame. 41 | 42 | Parameters: 43 | data (DataFrame): The input DataFrame. 44 | x (str): The name of the column containing the date values. 45 | 46 | Returns: 47 | pd.Series: The date column extracted from the DataFrame. 48 | 49 | Raises: 50 | ValueError: If the column is not in datetime format. 51 | """ 52 | if date_column.dtype == "datetime64[ns]": 53 | return date_column 54 | elif date_column.dtype == "object": 55 | try: 56 | return pd.to_datetime(date_column, format=date_fmt) 57 | except ValueError: 58 | raise ValueError( 59 | f"Date column is not in the {date_fmt} format. Use change date_fmt parameter to match your dates." # noqa 60 | ) 61 | try: 62 | if date_column.dt.tz is not None: 63 | return date_column.dt.tz_localize(None) 64 | except Exception as e: 65 | raise Exception( 66 | f"Exception {e}\nDate column is not in datetime format or not in the right string format. Please convert it to datetime format first or use the date_fmt parameter." # noqa 67 | ) 68 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "altair" 5 | version = "4.2.0" 6 | description = "Altair: A declarative statistical visualization library for Python." 7 | category = "dev" 8 | optional = false 9 | python-versions = ">=3.7" 10 | files = [ 11 | {file = "altair-4.2.0-py3-none-any.whl", hash = "sha256:0c724848ae53410c13fa28be2b3b9a9dcb7b5caa1a70f7f217bd663bb419935a"}, 12 | {file = "altair-4.2.0.tar.gz", hash = "sha256:d87d9372e63b48cd96b2a6415f0cf9457f50162ab79dc7a31cd7e024dd840026"}, 13 | ] 14 | 15 | [package.dependencies] 16 | entrypoints = "*" 17 | jinja2 = "*" 18 | jsonschema = ">=3.0" 19 | numpy = "*" 20 | pandas = ">=0.18" 21 | toolz = "*" 22 | 23 | [package.extras] 24 | dev = ["black", "docutils", "flake8", "ipython", "m2r", "mistune (<2.0.0)", "pytest", "recommonmark", "sphinx", "vega-datasets"] 25 | 26 | [[package]] 27 | name = "appnope" 28 | version = "0.1.3" 29 | description = "Disable App Nap on macOS >= 10.9" 30 | category = "dev" 31 | optional = false 32 | python-versions = "*" 33 | files = [ 34 | {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, 35 | {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, 36 | ] 37 | 38 | [[package]] 39 | name = "argon2-cffi" 40 | version = "21.3.0" 41 | description = "The secure Argon2 password hashing algorithm." 42 | category = "dev" 43 | optional = false 44 | python-versions = ">=3.6" 45 | files = [ 46 | {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, 47 | {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, 48 | ] 49 | 50 | [package.dependencies] 51 | argon2-cffi-bindings = "*" 52 | 53 | [package.extras] 54 | dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] 55 | docs = ["furo", "sphinx", "sphinx-notfound-page"] 56 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] 57 | 58 | [[package]] 59 | name = "argon2-cffi-bindings" 60 | version = "21.2.0" 61 | description = "Low-level CFFI bindings for Argon2" 62 | category = "dev" 63 | optional = false 64 | python-versions = ">=3.6" 65 | files = [ 66 | {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, 67 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, 68 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, 69 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, 70 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, 71 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, 72 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, 73 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, 74 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, 75 | {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, 76 | {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, 77 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, 78 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, 79 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, 80 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, 81 | {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, 82 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, 83 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, 84 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, 85 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, 86 | {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, 87 | ] 88 | 89 | [package.dependencies] 90 | cffi = ">=1.0.1" 91 | 92 | [package.extras] 93 | dev = ["cogapp", "pre-commit", "pytest", "wheel"] 94 | tests = ["pytest"] 95 | 96 | [[package]] 97 | name = "asttokens" 98 | version = "2.0.5" 99 | description = "Annotate AST trees with source code positions" 100 | category = "dev" 101 | optional = false 102 | python-versions = "*" 103 | files = [ 104 | {file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"}, 105 | {file = "asttokens-2.0.5.tar.gz", hash = "sha256:9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5"}, 106 | ] 107 | 108 | [package.dependencies] 109 | six = "*" 110 | 111 | [package.extras] 112 | test = ["astroid", "pytest"] 113 | 114 | [[package]] 115 | name = "atomicwrites" 116 | version = "1.4.0" 117 | description = "Atomic file writes." 118 | category = "dev" 119 | optional = false 120 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 121 | files = [ 122 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 123 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 124 | ] 125 | 126 | [[package]] 127 | name = "attrs" 128 | version = "21.4.0" 129 | description = "Classes Without Boilerplate" 130 | category = "dev" 131 | optional = false 132 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 133 | files = [ 134 | {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, 135 | {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, 136 | ] 137 | 138 | [package.extras] 139 | dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] 140 | docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] 141 | tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] 142 | tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] 143 | 144 | [[package]] 145 | name = "backcall" 146 | version = "0.2.0" 147 | description = "Specifications for callback functions passed in to an API" 148 | category = "dev" 149 | optional = false 150 | python-versions = "*" 151 | files = [ 152 | {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, 153 | {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, 154 | ] 155 | 156 | [[package]] 157 | name = "backports.zoneinfo" 158 | version = "0.2.1" 159 | description = "Backport of the standard library zoneinfo module" 160 | category = "dev" 161 | optional = false 162 | python-versions = ">=3.6" 163 | files = [ 164 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, 165 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, 166 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, 167 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, 168 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, 169 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, 170 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, 171 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, 172 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, 173 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, 174 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, 175 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, 176 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, 177 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, 178 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, 179 | {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, 180 | ] 181 | 182 | [package.extras] 183 | tzdata = ["tzdata"] 184 | 185 | [[package]] 186 | name = "beautifulsoup4" 187 | version = "4.11.1" 188 | description = "Screen-scraping library" 189 | category = "dev" 190 | optional = false 191 | python-versions = ">=3.6.0" 192 | files = [ 193 | {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, 194 | {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, 195 | ] 196 | 197 | [package.dependencies] 198 | soupsieve = ">1.2" 199 | 200 | [package.extras] 201 | html5lib = ["html5lib"] 202 | lxml = ["lxml"] 203 | 204 | [[package]] 205 | name = "black" 206 | version = "21.12b0" 207 | description = "The uncompromising code formatter." 208 | category = "dev" 209 | optional = false 210 | python-versions = ">=3.6.2" 211 | files = [ 212 | {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, 213 | {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, 214 | ] 215 | 216 | [package.dependencies] 217 | click = ">=7.1.2" 218 | mypy-extensions = ">=0.4.3" 219 | pathspec = ">=0.9.0,<1" 220 | platformdirs = ">=2" 221 | tomli = ">=0.2.6,<2.0.0" 222 | typing-extensions = [ 223 | {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, 224 | {version = ">=3.10.0.0,<3.10.0.1 || >3.10.0.1", markers = "python_version >= \"3.10\""}, 225 | ] 226 | 227 | [package.extras] 228 | colorama = ["colorama (>=0.4.3)"] 229 | d = ["aiohttp (>=3.7.4)"] 230 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 231 | python2 = ["typed-ast (>=1.4.3)"] 232 | uvloop = ["uvloop (>=0.15.2)"] 233 | 234 | [[package]] 235 | name = "bleach" 236 | version = "5.0.0" 237 | description = "An easy safelist-based HTML-sanitizing tool." 238 | category = "dev" 239 | optional = false 240 | python-versions = ">=3.7" 241 | files = [ 242 | {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, 243 | {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, 244 | ] 245 | 246 | [package.dependencies] 247 | six = ">=1.9.0" 248 | webencodings = "*" 249 | 250 | [package.extras] 251 | dev = ["black (==22.3.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.942)", "pip-tools (==6.5.1)", "pytest (==7.1.1)", "sphinx (==4.3.2)", "tox (==3.24.5)", "twine (==4.0.0)", "wheel (==0.37.1)"] 252 | 253 | [[package]] 254 | name = "blinker" 255 | version = "1.4" 256 | description = "Fast, simple object-to-object and broadcast signaling" 257 | category = "dev" 258 | optional = false 259 | python-versions = "*" 260 | files = [ 261 | {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, 262 | ] 263 | 264 | [[package]] 265 | name = "cachetools" 266 | version = "5.0.0" 267 | description = "Extensible memoizing collections and decorators" 268 | category = "dev" 269 | optional = false 270 | python-versions = "~=3.7" 271 | files = [ 272 | {file = "cachetools-5.0.0-py3-none-any.whl", hash = "sha256:8fecd4203a38af17928be7b90689d8083603073622229ca7077b72d8e5a976e4"}, 273 | {file = "cachetools-5.0.0.tar.gz", hash = "sha256:486471dfa8799eb7ec503a8059e263db000cdda20075ce5e48903087f79d5fd6"}, 274 | ] 275 | 276 | [[package]] 277 | name = "certifi" 278 | version = "2021.10.8" 279 | description = "Python package for providing Mozilla's CA Bundle." 280 | category = "dev" 281 | optional = false 282 | python-versions = "*" 283 | files = [ 284 | {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, 285 | {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, 286 | ] 287 | 288 | [[package]] 289 | name = "cffi" 290 | version = "1.15.0" 291 | description = "Foreign Function Interface for Python calling C code." 292 | category = "dev" 293 | optional = false 294 | python-versions = "*" 295 | files = [ 296 | {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, 297 | {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, 298 | {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, 299 | {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, 300 | {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, 301 | {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, 302 | {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, 303 | {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, 304 | {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, 305 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, 306 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, 307 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, 308 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, 309 | {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, 310 | {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, 311 | {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, 312 | {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, 313 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, 314 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, 315 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, 316 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, 317 | {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, 318 | {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, 319 | {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, 320 | {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, 321 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, 322 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, 323 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, 324 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, 325 | {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, 326 | {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, 327 | {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, 328 | {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, 329 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, 330 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, 331 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, 332 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, 333 | {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, 334 | {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, 335 | {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, 336 | {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, 337 | {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, 338 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, 339 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, 340 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, 341 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, 342 | {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, 343 | {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, 344 | {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, 345 | {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, 346 | ] 347 | 348 | [package.dependencies] 349 | pycparser = "*" 350 | 351 | [[package]] 352 | name = "charset-normalizer" 353 | version = "2.0.12" 354 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 355 | category = "dev" 356 | optional = false 357 | python-versions = ">=3.5.0" 358 | files = [ 359 | {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, 360 | {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, 361 | ] 362 | 363 | [package.extras] 364 | unicode-backport = ["unicodedata2"] 365 | 366 | [[package]] 367 | name = "click" 368 | version = "8.0.4" 369 | description = "Composable command line interface toolkit" 370 | category = "dev" 371 | optional = false 372 | python-versions = ">=3.6" 373 | files = [ 374 | {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, 375 | {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, 376 | ] 377 | 378 | [package.dependencies] 379 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 380 | 381 | [[package]] 382 | name = "colorama" 383 | version = "0.4.4" 384 | description = "Cross-platform colored terminal text." 385 | category = "dev" 386 | optional = false 387 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 388 | files = [ 389 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 390 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 391 | ] 392 | 393 | [[package]] 394 | name = "coverage" 395 | version = "6.4.2" 396 | description = "Code coverage measurement for Python" 397 | category = "dev" 398 | optional = false 399 | python-versions = ">=3.7" 400 | files = [ 401 | {file = "coverage-6.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a9032f9b7d38bdf882ac9f66ebde3afb8145f0d4c24b2e600bc4c6304aafb87e"}, 402 | {file = "coverage-6.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e0524adb49c716ca763dbc1d27bedce36b14f33e6b8af6dba56886476b42957c"}, 403 | {file = "coverage-6.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4548be38a1c810d79e097a38107b6bf2ff42151900e47d49635be69943763d8"}, 404 | {file = "coverage-6.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f23876b018dfa5d3e98e96f5644b109090f16a4acb22064e0f06933663005d39"}, 405 | {file = "coverage-6.4.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fe75dcfcb889b6800f072f2af5a331342d63d0c1b3d2bf0f7b4f6c353e8c9c0"}, 406 | {file = "coverage-6.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2f8553878a24b00d5ab04b7a92a2af50409247ca5c4b7a2bf4eabe94ed20d3ee"}, 407 | {file = "coverage-6.4.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d774d9e97007b018a651eadc1b3970ed20237395527e22cbeb743d8e73e0563d"}, 408 | {file = "coverage-6.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d56f105592188ce7a797b2bd94b4a8cb2e36d5d9b0d8a1d2060ff2a71e6b9bbc"}, 409 | {file = "coverage-6.4.2-cp310-cp310-win32.whl", hash = "sha256:d230d333b0be8042ac34808ad722eabba30036232e7a6fb3e317c49f61c93386"}, 410 | {file = "coverage-6.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:5ef42e1db047ca42827a85e34abe973971c635f83aed49611b7f3ab49d0130f0"}, 411 | {file = "coverage-6.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:25b7ec944f114f70803d6529394b64f8749e93cbfac0fe6c5ea1b7e6c14e8a46"}, 412 | {file = "coverage-6.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb00521ab4f99fdce2d5c05a91bddc0280f0afaee0e0a00425e28e209d4af07"}, 413 | {file = "coverage-6.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2dff52b3e7f76ada36f82124703f4953186d9029d00d6287f17c68a75e2e6039"}, 414 | {file = "coverage-6.4.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147605e1702d996279bb3cc3b164f408698850011210d133a2cb96a73a2f7996"}, 415 | {file = "coverage-6.4.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:422fa44070b42fef9fb8dabd5af03861708cdd6deb69463adc2130b7bf81332f"}, 416 | {file = "coverage-6.4.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8af6c26ba8df6338e57bedbf916d76bdae6308e57fc8f14397f03b5da8622b4e"}, 417 | {file = "coverage-6.4.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5336e0352c0b12c7e72727d50ff02557005f79a0b8dcad9219c7c4940a930083"}, 418 | {file = "coverage-6.4.2-cp37-cp37m-win32.whl", hash = "sha256:0f211df2cba951ffcae210ee00e54921ab42e2b64e0bf2c0befc977377fb09b7"}, 419 | {file = "coverage-6.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a13772c19619118903d65a91f1d5fea84be494d12fd406d06c849b00d31bf120"}, 420 | {file = "coverage-6.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f7bd0ffbcd03dc39490a1f40b2669cc414fae0c4e16b77bb26806a4d0b7d1452"}, 421 | {file = "coverage-6.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0895ea6e6f7f9939166cc835df8fa4599e2d9b759b02d1521b574e13b859ac32"}, 422 | {file = "coverage-6.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e7ced84a11c10160c0697a6cc0b214a5d7ab21dfec1cd46e89fbf77cc66fae"}, 423 | {file = "coverage-6.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80db4a47a199c4563d4a25919ff29c97c87569130375beca3483b41ad5f698e8"}, 424 | {file = "coverage-6.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3def6791adf580d66f025223078dc84c64696a26f174131059ce8e91452584e1"}, 425 | {file = "coverage-6.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4f89d8e03c8a3757aae65570d14033e8edf192ee9298303db15955cadcff0c63"}, 426 | {file = "coverage-6.4.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6d0b48aff8e9720bdec315d67723f0babd936a7211dc5df453ddf76f89c59933"}, 427 | {file = "coverage-6.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2b20286c2b726f94e766e86a3fddb7b7e37af5d0c635bdfa7e4399bc523563de"}, 428 | {file = "coverage-6.4.2-cp38-cp38-win32.whl", hash = "sha256:d714af0bdba67739598849c9f18efdcc5a0412f4993914a0ec5ce0f1e864d783"}, 429 | {file = "coverage-6.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:5f65e5d3ff2d895dab76b1faca4586b970a99b5d4b24e9aafffc0ce94a6022d6"}, 430 | {file = "coverage-6.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a697977157adc052284a7160569b36a8bbec09db3c3220642e6323b47cec090f"}, 431 | {file = "coverage-6.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c77943ef768276b61c96a3eb854eba55633c7a3fddf0a79f82805f232326d33f"}, 432 | {file = "coverage-6.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54d8d0e073a7f238f0666d3c7c0d37469b2aa43311e4024c925ee14f5d5a1cbe"}, 433 | {file = "coverage-6.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f22325010d8824594820d6ce84fa830838f581a7fd86a9235f0d2ed6deb61e29"}, 434 | {file = "coverage-6.4.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24b04d305ea172ccb21bee5bacd559383cba2c6fcdef85b7701cf2de4188aa55"}, 435 | {file = "coverage-6.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:866ebf42b4c5dbafd64455b0a1cd5aa7b4837a894809413b930026c91e18090b"}, 436 | {file = "coverage-6.4.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e36750fbbc422c1c46c9d13b937ab437138b998fe74a635ec88989afb57a3978"}, 437 | {file = "coverage-6.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:79419370d6a637cb18553ecb25228893966bd7935a9120fa454e7076f13b627c"}, 438 | {file = "coverage-6.4.2-cp39-cp39-win32.whl", hash = "sha256:b5e28db9199dd3833cc8a07fa6cf429a01227b5d429facb56eccd765050c26cd"}, 439 | {file = "coverage-6.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:edfdabe7aa4f97ed2b9dd5dde52d2bb29cb466993bb9d612ddd10d0085a683cf"}, 440 | {file = "coverage-6.4.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:e2618cb2cf5a7cc8d698306e42ebcacd02fb7ef8cfc18485c59394152c70be97"}, 441 | {file = "coverage-6.4.2.tar.gz", hash = "sha256:6c3ccfe89c36f3e5b9837b9ee507472310164f352c9fe332120b764c9d60adbe"}, 442 | ] 443 | 444 | [package.dependencies] 445 | tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} 446 | 447 | [package.extras] 448 | toml = ["tomli"] 449 | 450 | [[package]] 451 | name = "debugpy" 452 | version = "1.6.0" 453 | description = "An implementation of the Debug Adapter Protocol for Python" 454 | category = "dev" 455 | optional = false 456 | python-versions = ">=3.7" 457 | files = [ 458 | {file = "debugpy-1.6.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:eb1946efac0c0c3d411cea0b5ac772fbde744109fd9520fb0c5a51979faf05ad"}, 459 | {file = "debugpy-1.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e3513399177dd37af4c1332df52da5da1d0c387e5927dc4c0709e26ee7302e8f"}, 460 | {file = "debugpy-1.6.0-cp310-cp310-win32.whl", hash = "sha256:5c492235d6b68f879df3bdbdb01f25c15be15682665517c2c7d0420e5658d71f"}, 461 | {file = "debugpy-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:40de9ba137d355538432209d05e0f5fe5d0498dce761c39119ad4b950b51db31"}, 462 | {file = "debugpy-1.6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0d383b91efee57dbb923ba20801130cf60450a0eda60bce25bccd937de8e323a"}, 463 | {file = "debugpy-1.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ff853e60e77e1c16f85a31adb8360bb2d98ca588d7ed645b7f0985b240bdb5e"}, 464 | {file = "debugpy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:8e972c717d95f56b6a3a7a29a5ede1ee8f2c3802f6f0e678203b0778eb322bf1"}, 465 | {file = "debugpy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a8aaeb53e87225141fda7b9081bd87155c1debc13e2f5a532d341112d1983b65"}, 466 | {file = "debugpy-1.6.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:132defb585b518955358321d0f42f6aa815aa15b432be27db654807707c70b2f"}, 467 | {file = "debugpy-1.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ee75844242b4537beb5899f3e60a578454d1f136b99e8d57ac424573797b94a"}, 468 | {file = "debugpy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:a65a2499761d47df3e9ea9567109be6e73d412e00ac3ffcf74839f3ddfcdf028"}, 469 | {file = "debugpy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:bd980d533d0ddfc451e03a3bb32acb2900049fec39afc3425b944ebf0889be62"}, 470 | {file = "debugpy-1.6.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:245c7789a012f86210847ec7ee9f38c30a30d4c2223c3e111829a76c9006a5d0"}, 471 | {file = "debugpy-1.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e3aa2368883e83e7b689ddff3cafb595f7b711f6a065886b46a96a7fef874e7"}, 472 | {file = "debugpy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:72bcfa97f3afa0064afc77ab811f48ad4a06ac330f290b675082c24437730366"}, 473 | {file = "debugpy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:30abefefd2ff5a5481162d613cb70e60e2fa80a5eb4c994717c0f008ed25d2e1"}, 474 | {file = "debugpy-1.6.0-py2.py3-none-any.whl", hash = "sha256:4de7777842da7e08652f2776c552070bbdd758557fdec73a15d7be0e4aab95ce"}, 475 | {file = "debugpy-1.6.0.zip", hash = "sha256:7b79c40852991f7b6c3ea65845ed0f5f6b731c37f4f9ad9c61e2ab4bd48a9275"}, 476 | ] 477 | 478 | [[package]] 479 | name = "decorator" 480 | version = "5.1.1" 481 | description = "Decorators for Humans" 482 | category = "dev" 483 | optional = false 484 | python-versions = ">=3.5" 485 | files = [ 486 | {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, 487 | {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, 488 | ] 489 | 490 | [[package]] 491 | name = "defusedxml" 492 | version = "0.7.1" 493 | description = "XML bomb protection for Python stdlib modules" 494 | category = "dev" 495 | optional = false 496 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 497 | files = [ 498 | {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, 499 | {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, 500 | ] 501 | 502 | [[package]] 503 | name = "entrypoints" 504 | version = "0.4" 505 | description = "Discover and load entry points from installed packages." 506 | category = "dev" 507 | optional = false 508 | python-versions = ">=3.6" 509 | files = [ 510 | {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, 511 | {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, 512 | ] 513 | 514 | [[package]] 515 | name = "executing" 516 | version = "0.8.3" 517 | description = "Get the currently executing AST node of a frame, and other information" 518 | category = "dev" 519 | optional = false 520 | python-versions = "*" 521 | files = [ 522 | {file = "executing-0.8.3-py2.py3-none-any.whl", hash = "sha256:d1eef132db1b83649a3905ca6dd8897f71ac6f8cac79a7e58a1a09cf137546c9"}, 523 | {file = "executing-0.8.3.tar.gz", hash = "sha256:c6554e21c6b060590a6d3be4b82fb78f8f0194d809de5ea7df1c093763311501"}, 524 | ] 525 | 526 | [[package]] 527 | name = "fastjsonschema" 528 | version = "2.15.3" 529 | description = "Fastest Python implementation of JSON schema" 530 | category = "dev" 531 | optional = false 532 | python-versions = "*" 533 | files = [ 534 | {file = "fastjsonschema-2.15.3-py3-none-any.whl", hash = "sha256:ddb0b1d8243e6e3abb822bd14e447a89f4ab7439342912d590444831fa00b6a0"}, 535 | {file = "fastjsonschema-2.15.3.tar.gz", hash = "sha256:0a572f0836962d844c1fc435e200b2e4f4677e4e6611a2e3bdd01ba697c275ec"}, 536 | ] 537 | 538 | [package.extras] 539 | devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] 540 | 541 | [[package]] 542 | name = "flake8" 543 | version = "4.0.1" 544 | description = "the modular source code checker: pep8 pyflakes and co" 545 | category = "dev" 546 | optional = false 547 | python-versions = ">=3.6" 548 | files = [ 549 | {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, 550 | {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, 551 | ] 552 | 553 | [package.dependencies] 554 | mccabe = ">=0.6.0,<0.7.0" 555 | pycodestyle = ">=2.8.0,<2.9.0" 556 | pyflakes = ">=2.4.0,<2.5.0" 557 | 558 | [[package]] 559 | name = "gitdb" 560 | version = "4.0.9" 561 | description = "Git Object Database" 562 | category = "dev" 563 | optional = false 564 | python-versions = ">=3.6" 565 | files = [ 566 | {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, 567 | {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, 568 | ] 569 | 570 | [package.dependencies] 571 | smmap = ">=3.0.1,<6" 572 | 573 | [[package]] 574 | name = "gitpython" 575 | version = "3.1.27" 576 | description = "GitPython is a python library used to interact with Git repositories" 577 | category = "dev" 578 | optional = false 579 | python-versions = ">=3.7" 580 | files = [ 581 | {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, 582 | {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, 583 | ] 584 | 585 | [package.dependencies] 586 | gitdb = ">=4.0.1,<5" 587 | 588 | [[package]] 589 | name = "idna" 590 | version = "3.3" 591 | description = "Internationalized Domain Names in Applications (IDNA)" 592 | category = "dev" 593 | optional = false 594 | python-versions = ">=3.5" 595 | files = [ 596 | {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, 597 | {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, 598 | ] 599 | 600 | [[package]] 601 | name = "importlib-metadata" 602 | version = "4.11.3" 603 | description = "Read metadata from Python packages" 604 | category = "dev" 605 | optional = false 606 | python-versions = ">=3.7" 607 | files = [ 608 | {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, 609 | {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, 610 | ] 611 | 612 | [package.dependencies] 613 | zipp = ">=0.5" 614 | 615 | [package.extras] 616 | docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] 617 | perf = ["ipython"] 618 | testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] 619 | 620 | [[package]] 621 | name = "importlib-resources" 622 | version = "5.6.0" 623 | description = "Read resources from Python packages" 624 | category = "dev" 625 | optional = false 626 | python-versions = ">=3.7" 627 | files = [ 628 | {file = "importlib_resources-5.6.0-py3-none-any.whl", hash = "sha256:a9dd72f6cc106aeb50f6e66b86b69b454766dd6e39b69ac68450253058706bcc"}, 629 | {file = "importlib_resources-5.6.0.tar.gz", hash = "sha256:1b93238cbf23b4cde34240dd8321d99e9bf2eb4bc91c0c99b2886283e7baad85"}, 630 | ] 631 | 632 | [package.dependencies] 633 | zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} 634 | 635 | [package.extras] 636 | docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] 637 | testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 638 | 639 | [[package]] 640 | name = "iniconfig" 641 | version = "1.1.1" 642 | description = "iniconfig: brain-dead simple config-ini parsing" 643 | category = "dev" 644 | optional = false 645 | python-versions = "*" 646 | files = [ 647 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 648 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 649 | ] 650 | 651 | [[package]] 652 | name = "ipykernel" 653 | version = "6.13.0" 654 | description = "IPython Kernel for Jupyter" 655 | category = "dev" 656 | optional = false 657 | python-versions = ">=3.7" 658 | files = [ 659 | {file = "ipykernel-6.13.0-py3-none-any.whl", hash = "sha256:2b0987af43c0d4b62cecb13c592755f599f96f29aafe36c01731aaa96df30d39"}, 660 | {file = "ipykernel-6.13.0.tar.gz", hash = "sha256:0e28273e290858393e86e152b104e5506a79c13d25b951ac6eca220051b4be60"}, 661 | ] 662 | 663 | [package.dependencies] 664 | appnope = {version = "*", markers = "platform_system == \"Darwin\""} 665 | debugpy = ">=1.0" 666 | ipython = ">=7.23.1" 667 | jupyter-client = ">=6.1.12" 668 | matplotlib-inline = ">=0.1" 669 | nest-asyncio = "*" 670 | packaging = "*" 671 | psutil = "*" 672 | tornado = ">=6.1" 673 | traitlets = ">=5.1.0" 674 | 675 | [package.extras] 676 | test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=6.0)", "pytest-cov", "pytest-timeout"] 677 | 678 | [[package]] 679 | name = "ipython" 680 | version = "8.2.0" 681 | description = "IPython: Productive Interactive Computing" 682 | category = "dev" 683 | optional = false 684 | python-versions = ">=3.8" 685 | files = [ 686 | {file = "ipython-8.2.0-py3-none-any.whl", hash = "sha256:1b672bfd7a48d87ab203d9af8727a3b0174a4566b4091e9447c22fb63ea32857"}, 687 | {file = "ipython-8.2.0.tar.gz", hash = "sha256:70e5eb132cac594a34b5f799bd252589009905f05104728aea6a403ec2519dc1"}, 688 | ] 689 | 690 | [package.dependencies] 691 | appnope = {version = "*", markers = "sys_platform == \"darwin\""} 692 | backcall = "*" 693 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 694 | decorator = "*" 695 | jedi = ">=0.16" 696 | matplotlib-inline = "*" 697 | pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} 698 | pickleshare = "*" 699 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" 700 | pygments = ">=2.4.0" 701 | setuptools = ">=18.5" 702 | stack-data = "*" 703 | traitlets = ">=5" 704 | 705 | [package.extras] 706 | all = ["Sphinx (>=1.3)", "black", "curio", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.19)", "pandas", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "testpath", "trio"] 707 | black = ["black"] 708 | doc = ["Sphinx (>=1.3)"] 709 | kernel = ["ipykernel"] 710 | nbconvert = ["nbconvert"] 711 | nbformat = ["nbformat"] 712 | notebook = ["ipywidgets", "notebook"] 713 | parallel = ["ipyparallel"] 714 | qtconsole = ["qtconsole"] 715 | test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] 716 | test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] 717 | 718 | [[package]] 719 | name = "ipython-genutils" 720 | version = "0.2.0" 721 | description = "Vestigial utilities from IPython" 722 | category = "dev" 723 | optional = false 724 | python-versions = "*" 725 | files = [ 726 | {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, 727 | {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, 728 | ] 729 | 730 | [[package]] 731 | name = "ipywidgets" 732 | version = "7.7.0" 733 | description = "IPython HTML widgets for Jupyter" 734 | category = "dev" 735 | optional = false 736 | python-versions = "*" 737 | files = [ 738 | {file = "ipywidgets-7.7.0-py2.py3-none-any.whl", hash = "sha256:e58ff58bc94d481e91ecb6e13a5cb96a87b6b8ade135e055603d0ca24593df38"}, 739 | {file = "ipywidgets-7.7.0.tar.gz", hash = "sha256:ab4a5596855a88b83761921c768707d65e5847068139bc1729ddfe834703542a"}, 740 | ] 741 | 742 | [package.dependencies] 743 | ipykernel = ">=4.5.1" 744 | ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} 745 | ipython-genutils = ">=0.2.0,<0.3.0" 746 | jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} 747 | nbformat = ">=4.2.0" 748 | traitlets = ">=4.3.1" 749 | widgetsnbextension = ">=3.6.0,<3.7.0" 750 | 751 | [package.extras] 752 | test = ["mock", "pytest (>=3.6.0)", "pytest-cov"] 753 | 754 | [[package]] 755 | name = "isort" 756 | version = "5.10.1" 757 | description = "A Python utility / library to sort Python imports." 758 | category = "dev" 759 | optional = false 760 | python-versions = ">=3.6.1,<4.0" 761 | files = [ 762 | {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, 763 | {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, 764 | ] 765 | 766 | [package.extras] 767 | colors = ["colorama (>=0.4.3,<0.5.0)"] 768 | pipfile-deprecated-finder = ["pipreqs", "requirementslib"] 769 | plugins = ["setuptools"] 770 | requirements-deprecated-finder = ["pip-api", "pipreqs"] 771 | 772 | [[package]] 773 | name = "jedi" 774 | version = "0.18.1" 775 | description = "An autocompletion tool for Python that can be used for text editors." 776 | category = "dev" 777 | optional = false 778 | python-versions = ">=3.6" 779 | files = [ 780 | {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, 781 | {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, 782 | ] 783 | 784 | [package.dependencies] 785 | parso = ">=0.8.0,<0.9.0" 786 | 787 | [package.extras] 788 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 789 | testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] 790 | 791 | [[package]] 792 | name = "jinja2" 793 | version = "3.1.1" 794 | description = "A very fast and expressive template engine." 795 | category = "dev" 796 | optional = false 797 | python-versions = ">=3.7" 798 | files = [ 799 | {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, 800 | {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, 801 | ] 802 | 803 | [package.dependencies] 804 | MarkupSafe = ">=2.0" 805 | 806 | [package.extras] 807 | i18n = ["Babel (>=2.7)"] 808 | 809 | [[package]] 810 | name = "jsonschema" 811 | version = "4.4.0" 812 | description = "An implementation of JSON Schema validation for Python" 813 | category = "dev" 814 | optional = false 815 | python-versions = ">=3.7" 816 | files = [ 817 | {file = "jsonschema-4.4.0-py3-none-any.whl", hash = "sha256:77281a1f71684953ee8b3d488371b162419767973789272434bbc3f29d9c8823"}, 818 | {file = "jsonschema-4.4.0.tar.gz", hash = "sha256:636694eb41b3535ed608fe04129f26542b59ed99808b4f688aa32dcf55317a83"}, 819 | ] 820 | 821 | [package.dependencies] 822 | attrs = ">=17.4.0" 823 | importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} 824 | pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" 825 | 826 | [package.extras] 827 | format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] 828 | format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] 829 | 830 | [[package]] 831 | name = "jupyter-client" 832 | version = "7.2.2" 833 | description = "Jupyter protocol implementation and client libraries" 834 | category = "dev" 835 | optional = false 836 | python-versions = ">=3.7" 837 | files = [ 838 | {file = "jupyter_client-7.2.2-py3-none-any.whl", hash = "sha256:44045448eadc12493d819d965eb1dc9d10d1927698adbb9b14eb9a3a4a45ba53"}, 839 | {file = "jupyter_client-7.2.2.tar.gz", hash = "sha256:8fdbad344a8baa6a413d86d25bbf87ce21cb2b4aa5a8e0413863b9754eb8eb8a"}, 840 | ] 841 | 842 | [package.dependencies] 843 | entrypoints = "*" 844 | jupyter-core = ">=4.9.2" 845 | nest-asyncio = ">=1.5.4" 846 | python-dateutil = ">=2.8.2" 847 | pyzmq = ">=22.3" 848 | tornado = ">=6.0" 849 | traitlets = "*" 850 | 851 | [package.extras] 852 | doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] 853 | test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] 854 | 855 | [[package]] 856 | name = "jupyter-core" 857 | version = "4.9.2" 858 | description = "Jupyter core package. A base package on which Jupyter projects rely." 859 | category = "dev" 860 | optional = false 861 | python-versions = ">=3.6" 862 | files = [ 863 | {file = "jupyter_core-4.9.2-py3-none-any.whl", hash = "sha256:f875e4d27e202590311d468fa55f90c575f201490bd0c18acabe4e318db4a46d"}, 864 | {file = "jupyter_core-4.9.2.tar.gz", hash = "sha256:d69baeb9ffb128b8cd2657fcf2703f89c769d1673c851812119e3a2a0e93ad9a"}, 865 | ] 866 | 867 | [package.dependencies] 868 | pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} 869 | traitlets = "*" 870 | 871 | [[package]] 872 | name = "jupyterlab-pygments" 873 | version = "0.2.0" 874 | description = "Pygments theme using JupyterLab CSS variables" 875 | category = "dev" 876 | optional = false 877 | python-versions = ">=3.7" 878 | files = [ 879 | {file = "jupyterlab_pygments-0.2.0-py2.py3-none-any.whl", hash = "sha256:8feffeec1799aaaea5b889add289e0c6dd648ea049be800fde814de46bf99f83"}, 880 | {file = "jupyterlab_pygments-0.2.0.tar.gz", hash = "sha256:2d48bcdd666043afc086af56adaf6bb79bbeffb1d73ed00ec4a2113f6cc22581"}, 881 | ] 882 | 883 | [[package]] 884 | name = "jupyterlab-widgets" 885 | version = "1.1.0" 886 | description = "A JupyterLab extension." 887 | category = "dev" 888 | optional = false 889 | python-versions = ">=3.6" 890 | files = [ 891 | {file = "jupyterlab_widgets-1.1.0-py3-none-any.whl", hash = "sha256:c2a9bd3789f120f64d73268c066ed3b000c56bc1dda217be5cdc43e7b4ebad3f"}, 892 | {file = "jupyterlab_widgets-1.1.0.tar.gz", hash = "sha256:d5f41bc1713795385f718d44dcba47e1e1473c6289f28a95aa6b2c0782ee372a"}, 893 | ] 894 | 895 | [[package]] 896 | name = "markupsafe" 897 | version = "2.1.1" 898 | description = "Safely add untrusted strings to HTML/XML markup." 899 | category = "dev" 900 | optional = false 901 | python-versions = ">=3.7" 902 | files = [ 903 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, 904 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, 905 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, 906 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, 907 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, 908 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, 909 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, 910 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, 911 | {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, 912 | {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, 913 | {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, 914 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, 915 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, 916 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, 917 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, 918 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, 919 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, 920 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, 921 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, 922 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, 923 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, 924 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, 925 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, 926 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, 927 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, 928 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, 929 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, 930 | {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, 931 | {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, 932 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, 933 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, 934 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, 935 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, 936 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, 937 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, 938 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, 939 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, 940 | {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, 941 | {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, 942 | {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, 943 | ] 944 | 945 | [[package]] 946 | name = "matplotlib-inline" 947 | version = "0.1.3" 948 | description = "Inline Matplotlib backend for Jupyter" 949 | category = "dev" 950 | optional = false 951 | python-versions = ">=3.5" 952 | files = [ 953 | {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, 954 | {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, 955 | ] 956 | 957 | [package.dependencies] 958 | traitlets = "*" 959 | 960 | [[package]] 961 | name = "mccabe" 962 | version = "0.6.1" 963 | description = "McCabe checker, plugin for flake8" 964 | category = "dev" 965 | optional = false 966 | python-versions = "*" 967 | files = [ 968 | {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, 969 | {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, 970 | ] 971 | 972 | [[package]] 973 | name = "mistune" 974 | version = "0.8.4" 975 | description = "The fastest markdown parser in pure Python" 976 | category = "dev" 977 | optional = false 978 | python-versions = "*" 979 | files = [ 980 | {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, 981 | {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, 982 | ] 983 | 984 | [[package]] 985 | name = "mypy" 986 | version = "1.7.1" 987 | description = "Optional static typing for Python" 988 | category = "dev" 989 | optional = false 990 | python-versions = ">=3.8" 991 | files = [ 992 | {file = "mypy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340"}, 993 | {file = "mypy-1.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49"}, 994 | {file = "mypy-1.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5"}, 995 | {file = "mypy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d"}, 996 | {file = "mypy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a"}, 997 | {file = "mypy-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7"}, 998 | {file = "mypy-1.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51"}, 999 | {file = "mypy-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a"}, 1000 | {file = "mypy-1.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28"}, 1001 | {file = "mypy-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42"}, 1002 | {file = "mypy-1.7.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1"}, 1003 | {file = "mypy-1.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33"}, 1004 | {file = "mypy-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb"}, 1005 | {file = "mypy-1.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea"}, 1006 | {file = "mypy-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82"}, 1007 | {file = "mypy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200"}, 1008 | {file = "mypy-1.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7"}, 1009 | {file = "mypy-1.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e"}, 1010 | {file = "mypy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9"}, 1011 | {file = "mypy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7"}, 1012 | {file = "mypy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe"}, 1013 | {file = "mypy-1.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce"}, 1014 | {file = "mypy-1.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a"}, 1015 | {file = "mypy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120"}, 1016 | {file = "mypy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6"}, 1017 | {file = "mypy-1.7.1-py3-none-any.whl", hash = "sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea"}, 1018 | {file = "mypy-1.7.1.tar.gz", hash = "sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2"}, 1019 | ] 1020 | 1021 | [package.dependencies] 1022 | mypy-extensions = ">=1.0.0" 1023 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 1024 | typing-extensions = ">=4.1.0" 1025 | 1026 | [package.extras] 1027 | dmypy = ["psutil (>=4.0)"] 1028 | install-types = ["pip"] 1029 | mypyc = ["setuptools (>=50)"] 1030 | reports = ["lxml"] 1031 | 1032 | [[package]] 1033 | name = "mypy-extensions" 1034 | version = "1.0.0" 1035 | description = "Type system extensions for programs checked with the mypy type checker." 1036 | category = "dev" 1037 | optional = false 1038 | python-versions = ">=3.5" 1039 | files = [ 1040 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 1041 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "nbclient" 1046 | version = "0.5.13" 1047 | description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." 1048 | category = "dev" 1049 | optional = false 1050 | python-versions = ">=3.7.0" 1051 | files = [ 1052 | {file = "nbclient-0.5.13-py3-none-any.whl", hash = "sha256:47ac905af59379913c1f8f541098d2550153cf8dc58553cbe18c702b181518b0"}, 1053 | {file = "nbclient-0.5.13.tar.gz", hash = "sha256:40c52c9b5e3c31faecaee69f202b3f53e38d7c1c563de0fadde9d7eda0fdafe8"}, 1054 | ] 1055 | 1056 | [package.dependencies] 1057 | jupyter-client = ">=6.1.5" 1058 | nbformat = ">=5.0" 1059 | nest-asyncio = "*" 1060 | traitlets = ">=5.0.0" 1061 | 1062 | [package.extras] 1063 | sphinx = ["Sphinx (>=1.7)", "mock", "moto", "myst-parser", "sphinx-book-theme"] 1064 | test = ["black", "check-manifest", "flake8", "ipykernel", "ipython (<8.0.0)", "ipywidgets (<8.0.0)", "mypy", "pip (>=18.1)", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "wheel (>=0.31.0)", "xmltodict"] 1065 | 1066 | [[package]] 1067 | name = "nbconvert" 1068 | version = "6.5.0" 1069 | description = "Converting Jupyter Notebooks" 1070 | category = "dev" 1071 | optional = false 1072 | python-versions = ">=3.7" 1073 | files = [ 1074 | {file = "nbconvert-6.5.0-py3-none-any.whl", hash = "sha256:c56dd0b8978a1811a5654f74c727ff16ca87dd5a43abd435a1c49b840fcd8360"}, 1075 | {file = "nbconvert-6.5.0.tar.gz", hash = "sha256:223e46e27abe8596b8aed54301fadbba433b7ffea8196a68fd7b1ff509eee99d"}, 1076 | ] 1077 | 1078 | [package.dependencies] 1079 | beautifulsoup4 = "*" 1080 | bleach = "*" 1081 | defusedxml = "*" 1082 | entrypoints = ">=0.2.2" 1083 | jinja2 = ">=3.0" 1084 | jupyter-core = ">=4.7" 1085 | jupyterlab-pygments = "*" 1086 | MarkupSafe = ">=2.0" 1087 | mistune = ">=0.8.1,<2" 1088 | nbclient = ">=0.5.0" 1089 | nbformat = ">=5.1" 1090 | packaging = "*" 1091 | pandocfilters = ">=1.4.1" 1092 | pygments = ">=2.4.1" 1093 | tinycss2 = "*" 1094 | traitlets = ">=5.0" 1095 | 1096 | [package.extras] 1097 | all = ["ipykernel", "ipython", "ipywidgets (>=7)", "nbsphinx (>=0.2.12)", "pre-commit", "pyppeteer (>=1,<1.1)", "pytest", "pytest-cov", "pytest-dependency", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "tornado (>=6.1)"] 1098 | docs = ["ipython", "nbsphinx (>=0.2.12)", "sphinx (>=1.5.1)", "sphinx-rtd-theme"] 1099 | serve = ["tornado (>=6.1)"] 1100 | test = ["ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)", "pytest", "pytest-cov", "pytest-dependency"] 1101 | webpdf = ["pyppeteer (>=1,<1.1)"] 1102 | 1103 | [[package]] 1104 | name = "nbformat" 1105 | version = "5.3.0" 1106 | description = "The Jupyter Notebook format" 1107 | category = "dev" 1108 | optional = false 1109 | python-versions = ">=3.7" 1110 | files = [ 1111 | {file = "nbformat-5.3.0-py3-none-any.whl", hash = "sha256:38856d97de49e8292e2d5d8f595e9d26f02abfd87e075d450af4511870b40538"}, 1112 | {file = "nbformat-5.3.0.tar.gz", hash = "sha256:fcc5ab8cb74e20b19570b5be809e2dba9b82836fd2761a89066ad43394ba29f5"}, 1113 | ] 1114 | 1115 | [package.dependencies] 1116 | fastjsonschema = "*" 1117 | jsonschema = ">=2.6" 1118 | jupyter-core = "*" 1119 | traitlets = ">=4.1" 1120 | 1121 | [package.extras] 1122 | test = ["check-manifest", "pre-commit", "pytest", "testpath"] 1123 | 1124 | [[package]] 1125 | name = "nest-asyncio" 1126 | version = "1.5.5" 1127 | description = "Patch asyncio to allow nested event loops" 1128 | category = "dev" 1129 | optional = false 1130 | python-versions = ">=3.5" 1131 | files = [ 1132 | {file = "nest_asyncio-1.5.5-py3-none-any.whl", hash = "sha256:b98e3ec1b246135e4642eceffa5a6c23a3ab12c82ff816a92c612d68205813b2"}, 1133 | {file = "nest_asyncio-1.5.5.tar.gz", hash = "sha256:e442291cd942698be619823a17a86a5759eabe1f8613084790de189fe9e16d65"}, 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "notebook" 1138 | version = "6.4.10" 1139 | description = "A web-based notebook environment for interactive computing" 1140 | category = "dev" 1141 | optional = false 1142 | python-versions = ">=3.6" 1143 | files = [ 1144 | {file = "notebook-6.4.10-py3-none-any.whl", hash = "sha256:49cead814bff0945fcb2ee07579259418672ac175d3dc3d8102a4b0a656ed4df"}, 1145 | {file = "notebook-6.4.10.tar.gz", hash = "sha256:2408a76bc6289283a8eecfca67e298ec83c67db51a4c2e1b713dd180bb39e90e"}, 1146 | ] 1147 | 1148 | [package.dependencies] 1149 | argon2-cffi = "*" 1150 | ipykernel = "*" 1151 | ipython-genutils = "*" 1152 | jinja2 = "*" 1153 | jupyter-client = ">=5.3.4" 1154 | jupyter-core = ">=4.6.1" 1155 | nbconvert = ">=5" 1156 | nbformat = "*" 1157 | nest-asyncio = ">=1.5" 1158 | prometheus-client = "*" 1159 | pyzmq = ">=17" 1160 | Send2Trash = ">=1.8.0" 1161 | terminado = ">=0.8.3" 1162 | tornado = ">=6.1" 1163 | traitlets = ">=4.2.1" 1164 | 1165 | [package.extras] 1166 | docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] 1167 | json-logging = ["json-logging"] 1168 | test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixsocket", "selenium"] 1169 | 1170 | [[package]] 1171 | name = "numpy" 1172 | version = "1.24.4" 1173 | description = "Fundamental package for array computing in Python" 1174 | category = "main" 1175 | optional = false 1176 | python-versions = ">=3.8" 1177 | files = [ 1178 | {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, 1179 | {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, 1180 | {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, 1181 | {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, 1182 | {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, 1183 | {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, 1184 | {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, 1185 | {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, 1186 | {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, 1187 | {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, 1188 | {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, 1189 | {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, 1190 | {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, 1191 | {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, 1192 | {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, 1193 | {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, 1194 | {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, 1195 | {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, 1196 | {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, 1197 | {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, 1198 | {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, 1199 | {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, 1200 | {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, 1201 | {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, 1202 | {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, 1203 | {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, 1204 | {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, 1205 | {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "packaging" 1210 | version = "21.3" 1211 | description = "Core utilities for Python packages" 1212 | category = "dev" 1213 | optional = false 1214 | python-versions = ">=3.6" 1215 | files = [ 1216 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 1217 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 1218 | ] 1219 | 1220 | [package.dependencies] 1221 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 1222 | 1223 | [[package]] 1224 | name = "pandas" 1225 | version = "2.0.3" 1226 | description = "Powerful data structures for data analysis, time series, and statistics" 1227 | category = "main" 1228 | optional = false 1229 | python-versions = ">=3.8" 1230 | files = [ 1231 | {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, 1232 | {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, 1233 | {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, 1234 | {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, 1235 | {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, 1236 | {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, 1237 | {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, 1238 | {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, 1239 | {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, 1240 | {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, 1241 | {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, 1242 | {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, 1243 | {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, 1244 | {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, 1245 | {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, 1246 | {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, 1247 | {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, 1248 | {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, 1249 | {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, 1250 | {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, 1251 | {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, 1252 | {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, 1253 | {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, 1254 | {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, 1255 | {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, 1256 | ] 1257 | 1258 | [package.dependencies] 1259 | numpy = [ 1260 | {version = ">=1.20.3", markers = "python_version < \"3.10\""}, 1261 | {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, 1262 | {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, 1263 | ] 1264 | python-dateutil = ">=2.8.2" 1265 | pytz = ">=2020.1" 1266 | tzdata = ">=2022.1" 1267 | 1268 | [package.extras] 1269 | all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] 1270 | aws = ["s3fs (>=2021.08.0)"] 1271 | clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] 1272 | compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] 1273 | computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] 1274 | excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] 1275 | feather = ["pyarrow (>=7.0.0)"] 1276 | fss = ["fsspec (>=2021.07.0)"] 1277 | gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] 1278 | hdf5 = ["tables (>=3.6.1)"] 1279 | html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] 1280 | mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] 1281 | output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] 1282 | parquet = ["pyarrow (>=7.0.0)"] 1283 | performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] 1284 | plot = ["matplotlib (>=3.6.1)"] 1285 | postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] 1286 | spss = ["pyreadstat (>=1.1.2)"] 1287 | sql-other = ["SQLAlchemy (>=1.4.16)"] 1288 | test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] 1289 | xml = ["lxml (>=4.6.3)"] 1290 | 1291 | [[package]] 1292 | name = "pandocfilters" 1293 | version = "1.5.0" 1294 | description = "Utilities for writing pandoc filters in python" 1295 | category = "dev" 1296 | optional = false 1297 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1298 | files = [ 1299 | {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, 1300 | {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "parso" 1305 | version = "0.8.3" 1306 | description = "A Python Parser" 1307 | category = "dev" 1308 | optional = false 1309 | python-versions = ">=3.6" 1310 | files = [ 1311 | {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, 1312 | {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, 1313 | ] 1314 | 1315 | [package.extras] 1316 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 1317 | testing = ["docopt", "pytest (<6.0.0)"] 1318 | 1319 | [[package]] 1320 | name = "pathspec" 1321 | version = "0.9.0" 1322 | description = "Utility library for gitignore style pattern matching of file paths." 1323 | category = "dev" 1324 | optional = false 1325 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 1326 | files = [ 1327 | {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, 1328 | {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, 1329 | ] 1330 | 1331 | [[package]] 1332 | name = "pexpect" 1333 | version = "4.8.0" 1334 | description = "Pexpect allows easy control of interactive console applications." 1335 | category = "dev" 1336 | optional = false 1337 | python-versions = "*" 1338 | files = [ 1339 | {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, 1340 | {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, 1341 | ] 1342 | 1343 | [package.dependencies] 1344 | ptyprocess = ">=0.5" 1345 | 1346 | [[package]] 1347 | name = "pickleshare" 1348 | version = "0.7.5" 1349 | description = "Tiny 'shelve'-like database with concurrency support" 1350 | category = "dev" 1351 | optional = false 1352 | python-versions = "*" 1353 | files = [ 1354 | {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, 1355 | {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, 1356 | ] 1357 | 1358 | [[package]] 1359 | name = "pillow" 1360 | version = "9.1.0" 1361 | description = "Python Imaging Library (Fork)" 1362 | category = "dev" 1363 | optional = false 1364 | python-versions = ">=3.7" 1365 | files = [ 1366 | {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"}, 1367 | {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"}, 1368 | {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"}, 1369 | {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"}, 1370 | {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"}, 1371 | {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"}, 1372 | {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"}, 1373 | {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"}, 1374 | {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"}, 1375 | {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"}, 1376 | {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"}, 1377 | {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"}, 1378 | {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"}, 1379 | {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"}, 1380 | {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"}, 1381 | {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"}, 1382 | {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"}, 1383 | {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"}, 1384 | {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"}, 1385 | {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"}, 1386 | {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"}, 1387 | {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"}, 1388 | {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"}, 1389 | {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"}, 1390 | {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"}, 1391 | {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"}, 1392 | {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"}, 1393 | {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"}, 1394 | {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"}, 1395 | {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"}, 1396 | {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"}, 1397 | {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"}, 1398 | {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"}, 1399 | {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"}, 1400 | {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"}, 1401 | {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"}, 1402 | {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"}, 1403 | {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, 1404 | ] 1405 | 1406 | [package.extras] 1407 | docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"] 1408 | tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] 1409 | 1410 | [[package]] 1411 | name = "platformdirs" 1412 | version = "2.5.1" 1413 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 1414 | category = "dev" 1415 | optional = false 1416 | python-versions = ">=3.7" 1417 | files = [ 1418 | {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, 1419 | {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, 1420 | ] 1421 | 1422 | [package.extras] 1423 | docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] 1424 | test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] 1425 | 1426 | [[package]] 1427 | name = "plotly" 1428 | version = "5.7.0" 1429 | description = "An open-source, interactive data visualization library for Python" 1430 | category = "main" 1431 | optional = false 1432 | python-versions = ">=3.6" 1433 | files = [ 1434 | {file = "plotly-5.7.0-py2.py3-none-any.whl", hash = "sha256:3a35131762c6567813012462e1d496e1d3898f56ab3d386b32f103f7f0c79cf1"}, 1435 | {file = "plotly-5.7.0.tar.gz", hash = "sha256:15ab20e9ed8b55f669b3d35e186eb48f9e1fe07321a1337b8b7df8d3573d265a"}, 1436 | ] 1437 | 1438 | [package.dependencies] 1439 | six = "*" 1440 | tenacity = ">=6.2.0" 1441 | 1442 | [[package]] 1443 | name = "pluggy" 1444 | version = "1.0.0" 1445 | description = "plugin and hook calling mechanisms for python" 1446 | category = "dev" 1447 | optional = false 1448 | python-versions = ">=3.6" 1449 | files = [ 1450 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 1451 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 1452 | ] 1453 | 1454 | [package.extras] 1455 | dev = ["pre-commit", "tox"] 1456 | testing = ["pytest", "pytest-benchmark"] 1457 | 1458 | [[package]] 1459 | name = "prometheus-client" 1460 | version = "0.14.1" 1461 | description = "Python client for the Prometheus monitoring system." 1462 | category = "dev" 1463 | optional = false 1464 | python-versions = ">=3.6" 1465 | files = [ 1466 | {file = "prometheus_client-0.14.1-py3-none-any.whl", hash = "sha256:522fded625282822a89e2773452f42df14b5a8e84a86433e3f8a189c1d54dc01"}, 1467 | {file = "prometheus_client-0.14.1.tar.gz", hash = "sha256:5459c427624961076277fdc6dc50540e2bacb98eebde99886e59ec55ed92093a"}, 1468 | ] 1469 | 1470 | [package.extras] 1471 | twisted = ["twisted"] 1472 | 1473 | [[package]] 1474 | name = "prompt-toolkit" 1475 | version = "3.0.29" 1476 | description = "Library for building powerful interactive command lines in Python" 1477 | category = "dev" 1478 | optional = false 1479 | python-versions = ">=3.6.2" 1480 | files = [ 1481 | {file = "prompt_toolkit-3.0.29-py3-none-any.whl", hash = "sha256:62291dad495e665fca0bda814e342c69952086afb0f4094d0893d357e5c78752"}, 1482 | {file = "prompt_toolkit-3.0.29.tar.gz", hash = "sha256:bd640f60e8cecd74f0dc249713d433ace2ddc62b65ee07f96d358e0b152b6ea7"}, 1483 | ] 1484 | 1485 | [package.dependencies] 1486 | wcwidth = "*" 1487 | 1488 | [[package]] 1489 | name = "protobuf" 1490 | version = "3.20.0" 1491 | description = "Protocol Buffers" 1492 | category = "dev" 1493 | optional = false 1494 | python-versions = ">=3.7" 1495 | files = [ 1496 | {file = "protobuf-3.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9d0f3aca8ca51c8b5e204ab92bd8afdb2a8e3df46bd0ce0bd39065d79aabcaa4"}, 1497 | {file = "protobuf-3.20.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:001c2160c03b6349c04de39cf1a58e342750da3632f6978a1634a3dcca1ec10e"}, 1498 | {file = "protobuf-3.20.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b5860b790498f233cdc8d635a17fc08de62e59d4dcd8cdb6c6c0d38a31edf2b"}, 1499 | {file = "protobuf-3.20.0-cp310-cp310-win32.whl", hash = "sha256:0b250c60256c8824219352dc2a228a6b49987e5bf94d3ffcf4c46585efcbd499"}, 1500 | {file = "protobuf-3.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:a1eebb6eb0653e594cb86cd8e536b9b083373fca9aba761ade6cd412d46fb2ab"}, 1501 | {file = "protobuf-3.20.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bc14037281db66aa60856cd4ce4541a942040686d290e3f3224dd3978f88f554"}, 1502 | {file = "protobuf-3.20.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:47257d932de14a7b6c4ae1b7dbf592388153ee35ec7cae216b87ae6490ed39a3"}, 1503 | {file = "protobuf-3.20.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbcbb068ebe67c4ff6483d2e2aa87079c325f8470b24b098d6bf7d4d21d57a69"}, 1504 | {file = "protobuf-3.20.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:542f25a4adf3691a306dcc00bf9a73176554938ec9b98f20f929a044f80acf1b"}, 1505 | {file = "protobuf-3.20.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fd7133b885e356fa4920ead8289bb45dc6f185a164e99e10279f33732ed5ce15"}, 1506 | {file = "protobuf-3.20.0-cp37-cp37m-win32.whl", hash = "sha256:8d84453422312f8275455d1cb52d850d6a4d7d714b784e41b573c6f5bfc2a029"}, 1507 | {file = "protobuf-3.20.0-cp37-cp37m-win_amd64.whl", hash = "sha256:52bae32a147c375522ce09bd6af4d2949aca32a0415bc62df1456b3ad17c6001"}, 1508 | {file = "protobuf-3.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25d2fcd6eef340082718ec9ad2c58d734429f2b1f7335d989523852f2bba220b"}, 1509 | {file = "protobuf-3.20.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:88c8be0558bdfc35e68c42ae5bf785eb9390d25915d4863bbc7583d23da77074"}, 1510 | {file = "protobuf-3.20.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:38fd9eb74b852e4ee14b16e9670cd401d147ee3f3ec0d4f7652e0c921d6227f8"}, 1511 | {file = "protobuf-3.20.0-cp38-cp38-win32.whl", hash = "sha256:7dcd84dc31ebb35ade755e06d1561d1bd3b85e85dbdbf6278011fc97b22810db"}, 1512 | {file = "protobuf-3.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:1eb13f5a5a59ca4973bcfa2fc8fff644bd39f2109c3f7a60bd5860cb6a49b679"}, 1513 | {file = "protobuf-3.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d24c81c2310f0063b8fc1c20c8ed01f3331be9374b4b5c2de846f69e11e21fb"}, 1514 | {file = "protobuf-3.20.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8be43a91ab66fe995e85ccdbdd1046d9f0443d59e060c0840319290de25b7d33"}, 1515 | {file = "protobuf-3.20.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a53d4035427b9dbfbb397f46642754d294f131e93c661d056366f2a31438263"}, 1516 | {file = "protobuf-3.20.0-cp39-cp39-win32.whl", hash = "sha256:32bf4a90c207a0b4e70ca6dd09d43de3cb9898f7d5b69c2e9e3b966a7f342820"}, 1517 | {file = "protobuf-3.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:6efe066a7135233f97ce51a1aa007d4fb0be28ef093b4f88dac4ad1b3a2b7b6f"}, 1518 | {file = "protobuf-3.20.0-py2.py3-none-any.whl", hash = "sha256:4eda68bd9e2a4879385e6b1ea528c976f59cd9728382005cc54c28bcce8db983"}, 1519 | {file = "protobuf-3.20.0.tar.gz", hash = "sha256:71b2c3d1cd26ed1ec7c8196834143258b2ad7f444efff26fdc366c6f5e752702"}, 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "psutil" 1524 | version = "5.9.0" 1525 | description = "Cross-platform lib for process and system monitoring in Python." 1526 | category = "dev" 1527 | optional = false 1528 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1529 | files = [ 1530 | {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, 1531 | {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"}, 1532 | {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"}, 1533 | {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"}, 1534 | {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"}, 1535 | {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"}, 1536 | {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"}, 1537 | {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"}, 1538 | {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"}, 1539 | {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"}, 1540 | {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"}, 1541 | {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"}, 1542 | {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"}, 1543 | {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"}, 1544 | {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"}, 1545 | {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"}, 1546 | {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"}, 1547 | {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"}, 1548 | {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"}, 1549 | {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"}, 1550 | {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"}, 1551 | {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"}, 1552 | {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"}, 1553 | {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"}, 1554 | {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"}, 1555 | {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"}, 1556 | {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"}, 1557 | {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"}, 1558 | {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"}, 1559 | {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"}, 1560 | {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"}, 1561 | {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"}, 1562 | ] 1563 | 1564 | [package.extras] 1565 | test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] 1566 | 1567 | [[package]] 1568 | name = "ptyprocess" 1569 | version = "0.7.0" 1570 | description = "Run a subprocess in a pseudo terminal" 1571 | category = "dev" 1572 | optional = false 1573 | python-versions = "*" 1574 | files = [ 1575 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, 1576 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, 1577 | ] 1578 | 1579 | [[package]] 1580 | name = "pure-eval" 1581 | version = "0.2.2" 1582 | description = "Safely evaluate AST nodes without side effects" 1583 | category = "dev" 1584 | optional = false 1585 | python-versions = "*" 1586 | files = [ 1587 | {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, 1588 | {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, 1589 | ] 1590 | 1591 | [package.extras] 1592 | tests = ["pytest"] 1593 | 1594 | [[package]] 1595 | name = "py" 1596 | version = "1.11.0" 1597 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 1598 | category = "dev" 1599 | optional = false 1600 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 1601 | files = [ 1602 | {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, 1603 | {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, 1604 | ] 1605 | 1606 | [[package]] 1607 | name = "pyarrow" 1608 | version = "7.0.0" 1609 | description = "Python library for Apache Arrow" 1610 | category = "dev" 1611 | optional = false 1612 | python-versions = ">=3.7" 1613 | files = [ 1614 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:0f15213f380539c9640cb2413dc677b55e70f04c9e98cfc2e1d8b36c770e1036"}, 1615 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:29c4e3b3be0b94d07ff4921a5e410fc690a3a066a850a302fc504de5fc638495"}, 1616 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8a9bfc8a016bcb8f9a8536d2fa14a890b340bc7a236275cd60fd4fb8b93ff405"}, 1617 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:49d431ed644a3e8f53ae2bbf4b514743570b495b5829548db51610534b6eeee7"}, 1618 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa6442a321c1e49480b3d436f7d631c895048a16df572cf71c23c6b53c45ed66"}, 1619 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b01a23cb401750092c6f7c4dcae67cd8fd6b99ae710e26f654f23508f25f25"}, 1620 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f10928745c6ff66e121552731409803bed86c66ac79c64c90438b053b5242c5"}, 1621 | {file = "pyarrow-7.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:759090caa1474cafb5e68c93a9bd6cb45d8bb8e4f2cad2f1a0cc9439bae8ae88"}, 1622 | {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e3fe34bcfc28d9c4a747adc3926d2307a04c5c50b89155946739515ccfe5eab0"}, 1623 | {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:040dce5345603e4e621bcf4f3b21f18d557852e7b15307e559bb14c8951c8714"}, 1624 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed4b647c3345ae3463d341a9d28d0260cd302fb92ecf4e2e3e0f1656d6e0e55c"}, 1625 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7fecd5d5604f47e003f50887a42aee06cb8b7bf8e8bf7dc543a22331d9ba832"}, 1626 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f2d00b892fe865e43346acb78761ba268f8bb1cbdba588816590abcb780ee3d"}, 1627 | {file = "pyarrow-7.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f439f7d77201681fd31391d189aa6b1322d27c9311a8f2fce7d23972471b02b6"}, 1628 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:3e06b0e29ce1e32f219c670c6b31c33d25a5b8e29c7828f873373aab78bf30a5"}, 1629 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:13dc05bcf79dbc1bd2de1b05d26eb64824b85883d019d81ca3c2eca9b68b5a44"}, 1630 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06183a7ff2b0c030ec0413fc4dc98abad8cf336c78c280a0b7f4bcbebb78d125"}, 1631 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:702c5a9f960b56d03569eaaca2c1a05e8728f05ea1a2138ef64234aa53cd5884"}, 1632 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7313038203df77ec4092d6363dbc0945071caa72635f365f2b1ae0dd7469865"}, 1633 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e87d1f7dc7a0b2ecaeb0c7a883a85710f5b5626d4134454f905571c04bc73d5a"}, 1634 | {file = "pyarrow-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ba69488ae25c7fde1a2ae9ea29daf04d676de8960ffd6f82e1e13ca945bb5861"}, 1635 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:11a591f11d2697c751261c9d57e6e5b0d38fdc7f0cc57f4fd6edc657da7737df"}, 1636 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:6183c700877852dc0f8a76d4c0c2ffd803ba459e2b4a452e355c2d58d48cf39f"}, 1637 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1748154714b543e6ae8452a68d4af85caf5298296a7e5d4d00f1b3021838ac6"}, 1638 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcc8f934c7847a88f13ec35feecffb61fe63bb7a3078bd98dd353762e969ce60"}, 1639 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:759f59ac77b84878dbd54d06cf6df74ff781b8e7cf9313eeffbb5ec97b94385c"}, 1640 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3e3f93ac2993df9c5e1922eab7bdea047b9da918a74e52145399bc1f0099a3"}, 1641 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:306120af554e7e137895254a3b4741fad682875a5f6403509cd276de3fe5b844"}, 1642 | {file = "pyarrow-7.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:087769dac6e567d58d59b94c4f866b3356c00d3db5b261387ece47e7324c2150"}, 1643 | {file = "pyarrow-7.0.0.tar.gz", hash = "sha256:da656cad3c23a2ebb6a307ab01d35fce22f7850059cffafcb90d12590f8f4f38"}, 1644 | ] 1645 | 1646 | [package.dependencies] 1647 | numpy = ">=1.16.6" 1648 | 1649 | [[package]] 1650 | name = "pycodestyle" 1651 | version = "2.8.0" 1652 | description = "Python style guide checker" 1653 | category = "dev" 1654 | optional = false 1655 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 1656 | files = [ 1657 | {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, 1658 | {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, 1659 | ] 1660 | 1661 | [[package]] 1662 | name = "pycparser" 1663 | version = "2.21" 1664 | description = "C parser in Python" 1665 | category = "dev" 1666 | optional = false 1667 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1668 | files = [ 1669 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, 1670 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, 1671 | ] 1672 | 1673 | [[package]] 1674 | name = "pydeck" 1675 | version = "0.7.1" 1676 | description = "Widget for deck.gl maps" 1677 | category = "dev" 1678 | optional = false 1679 | python-versions = ">=3.7" 1680 | files = [ 1681 | {file = "pydeck-0.7.1-py2.py3-none-any.whl", hash = "sha256:7fc49b00840608068b930f9269169c7c9f3198b8b4635c934ba6d887c4e54503"}, 1682 | {file = "pydeck-0.7.1.tar.gz", hash = "sha256:907601c99f7510e16d27d7cb62bfa145216d166a2b5c9c50cfe2b65b032ebd2e"}, 1683 | ] 1684 | 1685 | [package.dependencies] 1686 | ipykernel = {version = ">=5.1.2", markers = "python_version >= \"3.4\""} 1687 | ipywidgets = ">=7.0.0" 1688 | jinja2 = ">=2.10.1" 1689 | numpy = ">=1.16.4" 1690 | traitlets = ">=4.3.2" 1691 | 1692 | [package.extras] 1693 | testing = ["pytest"] 1694 | 1695 | [[package]] 1696 | name = "pyflakes" 1697 | version = "2.4.0" 1698 | description = "passive checker of Python programs" 1699 | category = "dev" 1700 | optional = false 1701 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1702 | files = [ 1703 | {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, 1704 | {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, 1705 | ] 1706 | 1707 | [[package]] 1708 | name = "pygments" 1709 | version = "2.11.2" 1710 | description = "Pygments is a syntax highlighting package written in Python." 1711 | category = "dev" 1712 | optional = false 1713 | python-versions = ">=3.5" 1714 | files = [ 1715 | {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, 1716 | {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, 1717 | ] 1718 | 1719 | [[package]] 1720 | name = "pympler" 1721 | version = "1.0.1" 1722 | description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." 1723 | category = "dev" 1724 | optional = false 1725 | python-versions = ">=3.6" 1726 | files = [ 1727 | {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"}, 1728 | {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"}, 1729 | ] 1730 | 1731 | [[package]] 1732 | name = "pyparsing" 1733 | version = "3.0.8" 1734 | description = "pyparsing module - Classes and methods to define and execute parsing grammars" 1735 | category = "dev" 1736 | optional = false 1737 | python-versions = ">=3.6.8" 1738 | files = [ 1739 | {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, 1740 | {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, 1741 | ] 1742 | 1743 | [package.extras] 1744 | diagrams = ["jinja2", "railroad-diagrams"] 1745 | 1746 | [[package]] 1747 | name = "pyrsistent" 1748 | version = "0.18.1" 1749 | description = "Persistent/Functional/Immutable data structures" 1750 | category = "dev" 1751 | optional = false 1752 | python-versions = ">=3.7" 1753 | files = [ 1754 | {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, 1755 | {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"}, 1756 | {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"}, 1757 | {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"}, 1758 | {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"}, 1759 | {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"}, 1760 | {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"}, 1761 | {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"}, 1762 | {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"}, 1763 | {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"}, 1764 | {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"}, 1765 | {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"}, 1766 | {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"}, 1767 | {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"}, 1768 | {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"}, 1769 | {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"}, 1770 | {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"}, 1771 | {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"}, 1772 | {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"}, 1773 | {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"}, 1774 | {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, 1775 | ] 1776 | 1777 | [[package]] 1778 | name = "pytest" 1779 | version = "7.1.1" 1780 | description = "pytest: simple powerful testing with Python" 1781 | category = "dev" 1782 | optional = false 1783 | python-versions = ">=3.7" 1784 | files = [ 1785 | {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, 1786 | {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, 1787 | ] 1788 | 1789 | [package.dependencies] 1790 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 1791 | attrs = ">=19.2.0" 1792 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 1793 | iniconfig = "*" 1794 | packaging = "*" 1795 | pluggy = ">=0.12,<2.0" 1796 | py = ">=1.8.2" 1797 | tomli = ">=1.0.0" 1798 | 1799 | [package.extras] 1800 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] 1801 | 1802 | [[package]] 1803 | name = "pytest-cov" 1804 | version = "3.0.0" 1805 | description = "Pytest plugin for measuring coverage." 1806 | category = "dev" 1807 | optional = false 1808 | python-versions = ">=3.6" 1809 | files = [ 1810 | {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, 1811 | {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, 1812 | ] 1813 | 1814 | [package.dependencies] 1815 | coverage = {version = ">=5.2.1", extras = ["toml"]} 1816 | pytest = ">=4.6" 1817 | 1818 | [package.extras] 1819 | testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] 1820 | 1821 | [[package]] 1822 | name = "python-dateutil" 1823 | version = "2.8.2" 1824 | description = "Extensions to the standard Python datetime module" 1825 | category = "main" 1826 | optional = false 1827 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 1828 | files = [ 1829 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 1830 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 1831 | ] 1832 | 1833 | [package.dependencies] 1834 | six = ">=1.5" 1835 | 1836 | [[package]] 1837 | name = "pytz" 1838 | version = "2023.3.post1" 1839 | description = "World timezone definitions, modern and historical" 1840 | category = "main" 1841 | optional = false 1842 | python-versions = "*" 1843 | files = [ 1844 | {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, 1845 | {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "pytz-deprecation-shim" 1850 | version = "0.1.0.post0" 1851 | description = "Shims to make deprecation of pytz easier" 1852 | category = "dev" 1853 | optional = false 1854 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" 1855 | files = [ 1856 | {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, 1857 | {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, 1858 | ] 1859 | 1860 | [package.dependencies] 1861 | "backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} 1862 | tzdata = {version = "*", markers = "python_version >= \"3.6\""} 1863 | 1864 | [[package]] 1865 | name = "pywin32" 1866 | version = "303" 1867 | description = "Python for Window Extensions" 1868 | category = "dev" 1869 | optional = false 1870 | python-versions = "*" 1871 | files = [ 1872 | {file = "pywin32-303-cp310-cp310-win32.whl", hash = "sha256:6fed4af057039f309263fd3285d7b8042d41507343cd5fa781d98fcc5b90e8bb"}, 1873 | {file = "pywin32-303-cp310-cp310-win_amd64.whl", hash = "sha256:51cb52c5ec6709f96c3f26e7795b0bf169ee0d8395b2c1d7eb2c029a5008ed51"}, 1874 | {file = "pywin32-303-cp311-cp311-win32.whl", hash = "sha256:d9b5d87ca944eb3aa4cd45516203ead4b37ab06b8b777c54aedc35975dec0dee"}, 1875 | {file = "pywin32-303-cp311-cp311-win_amd64.whl", hash = "sha256:fcf44032f5b14fcda86028cdf49b6ebdaea091230eb0a757282aa656e4732439"}, 1876 | {file = "pywin32-303-cp36-cp36m-win32.whl", hash = "sha256:aad484d52ec58008ca36bd4ad14a71d7dd0a99db1a4ca71072213f63bf49c7d9"}, 1877 | {file = "pywin32-303-cp36-cp36m-win_amd64.whl", hash = "sha256:2a09632916b6bb231ba49983fe989f2f625cea237219530e81a69239cd0c4559"}, 1878 | {file = "pywin32-303-cp37-cp37m-win32.whl", hash = "sha256:b1675d82bcf6dbc96363fca747bac8bff6f6e4a447a4287ac652aa4b9adc796e"}, 1879 | {file = "pywin32-303-cp37-cp37m-win_amd64.whl", hash = "sha256:c268040769b48a13367221fced6d4232ed52f044ffafeda247bd9d2c6bdc29ca"}, 1880 | {file = "pywin32-303-cp38-cp38-win32.whl", hash = "sha256:5f9ec054f5a46a0f4dfd72af2ce1372f3d5a6e4052af20b858aa7df2df7d355b"}, 1881 | {file = "pywin32-303-cp38-cp38-win_amd64.whl", hash = "sha256:793bf74fce164bcffd9d57bb13c2c15d56e43c9542a7b9687b4fccf8f8a41aba"}, 1882 | {file = "pywin32-303-cp39-cp39-win32.whl", hash = "sha256:7d3271c98434617a11921c5ccf74615794d97b079e22ed7773790822735cc352"}, 1883 | {file = "pywin32-303-cp39-cp39-win_amd64.whl", hash = "sha256:79cbb862c11b9af19bcb682891c1b91942ec2ff7de8151e2aea2e175899cda34"}, 1884 | ] 1885 | 1886 | [[package]] 1887 | name = "pywinpty" 1888 | version = "2.0.5" 1889 | description = "Pseudo terminal support for Windows from Python." 1890 | category = "dev" 1891 | optional = false 1892 | python-versions = ">=3.7" 1893 | files = [ 1894 | {file = "pywinpty-2.0.5-cp310-none-win_amd64.whl", hash = "sha256:f86c76e2881c37e69678cbbf178109f8da1fa8584db24d58e1b9369b0276cfcb"}, 1895 | {file = "pywinpty-2.0.5-cp37-none-win_amd64.whl", hash = "sha256:ff9b52f182650cfdf3db1b264a6fe0963eb9d996a7a1fa843ac406c1e32111f8"}, 1896 | {file = "pywinpty-2.0.5-cp38-none-win_amd64.whl", hash = "sha256:651ee1467bd7eb6f64d44dbc954b7ab7d15ab6d8adacc4e13299692c67c5d5d2"}, 1897 | {file = "pywinpty-2.0.5-cp39-none-win_amd64.whl", hash = "sha256:e59a508ae78374febada3e53b5bbc90b5ad07ae68cbfd72a2e965f9793ae04f3"}, 1898 | {file = "pywinpty-2.0.5.tar.gz", hash = "sha256:e125d3f1804d8804952b13e33604ad2ca8b9b2cac92b27b521c005d1604794f8"}, 1899 | ] 1900 | 1901 | [[package]] 1902 | name = "pyzmq" 1903 | version = "22.3.0" 1904 | description = "Python bindings for 0MQ" 1905 | category = "dev" 1906 | optional = false 1907 | python-versions = ">=3.6" 1908 | files = [ 1909 | {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd"}, 1910 | {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149"}, 1911 | {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93"}, 1912 | {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea"}, 1913 | {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f"}, 1914 | {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f907c7359ce8bf7f7e63c82f75ad0223384105f5126f313400b7e8004d9b33c3"}, 1915 | {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:902319cfe23366595d3fa769b5b751e6ee6750a0a64c5d9f757d624b2ac3519e"}, 1916 | {file = "pyzmq-22.3.0-cp310-cp310-win32.whl", hash = "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d"}, 1917 | {file = "pyzmq-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd"}, 1918 | {file = "pyzmq-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268"}, 1919 | {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e"}, 1920 | {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0"}, 1921 | {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364"}, 1922 | {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:62bcade20813796c426409a3e7423862d50ff0639f5a2a95be4b85b09a618666"}, 1923 | {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ea5a79e808baef98c48c884effce05c31a0698c1057de8fc1c688891043c1ce1"}, 1924 | {file = "pyzmq-22.3.0-cp36-cp36m-win32.whl", hash = "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9"}, 1925 | {file = "pyzmq-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b"}, 1926 | {file = "pyzmq-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70"}, 1927 | {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df"}, 1928 | {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7"}, 1929 | {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c"}, 1930 | {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:08c4e315a76ef26eb833511ebf3fa87d182152adf43dedee8d79f998a2162a0b"}, 1931 | {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:badb868fff14cfd0e200eaa845887b1011146a7d26d579aaa7f966c203736b92"}, 1932 | {file = "pyzmq-22.3.0-cp37-cp37m-win32.whl", hash = "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d"}, 1933 | {file = "pyzmq-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d"}, 1934 | {file = "pyzmq-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a"}, 1935 | {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0"}, 1936 | {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8"}, 1937 | {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74"}, 1938 | {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:468bd59a588e276961a918a3060948ae68f6ff5a7fa10bb2f9160c18fe341067"}, 1939 | {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c88fa7410e9fc471e0858638f403739ee869924dd8e4ae26748496466e27ac59"}, 1940 | {file = "pyzmq-22.3.0-cp38-cp38-win32.whl", hash = "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7"}, 1941 | {file = "pyzmq-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45"}, 1942 | {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356"}, 1943 | {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973"}, 1944 | {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36"}, 1945 | {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57"}, 1946 | {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2"}, 1947 | {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:53f4fd13976789ffafedd4d46f954c7bb01146121812b72b4ddca286034df966"}, 1948 | {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1b5d457acbadcf8b27561deeaa386b0217f47626b29672fa7bd31deb6e91e1b"}, 1949 | {file = "pyzmq-22.3.0-cp39-cp39-win32.whl", hash = "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b"}, 1950 | {file = "pyzmq-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2"}, 1951 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f"}, 1952 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf"}, 1953 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb"}, 1954 | {file = "pyzmq-22.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115"}, 1955 | {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"}, 1956 | ] 1957 | 1958 | [package.dependencies] 1959 | cffi = {version = "*", markers = "implementation_name == \"pypy\""} 1960 | py = {version = "*", markers = "implementation_name == \"pypy\""} 1961 | 1962 | [[package]] 1963 | name = "requests" 1964 | version = "2.27.1" 1965 | description = "Python HTTP for Humans." 1966 | category = "dev" 1967 | optional = false 1968 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 1969 | files = [ 1970 | {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, 1971 | {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, 1972 | ] 1973 | 1974 | [package.dependencies] 1975 | certifi = ">=2017.4.17" 1976 | charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} 1977 | idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} 1978 | urllib3 = ">=1.21.1,<1.27" 1979 | 1980 | [package.extras] 1981 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 1982 | use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] 1983 | 1984 | [[package]] 1985 | name = "semver" 1986 | version = "2.13.0" 1987 | description = "Python helper for Semantic Versioning (http://semver.org/)" 1988 | category = "dev" 1989 | optional = false 1990 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1991 | files = [ 1992 | {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, 1993 | {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, 1994 | ] 1995 | 1996 | [[package]] 1997 | name = "send2trash" 1998 | version = "1.8.0" 1999 | description = "Send file to trash natively under Mac OS X, Windows and Linux." 2000 | category = "dev" 2001 | optional = false 2002 | python-versions = "*" 2003 | files = [ 2004 | {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, 2005 | {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, 2006 | ] 2007 | 2008 | [package.extras] 2009 | nativelib = ["pyobjc-framework-Cocoa", "pywin32"] 2010 | objc = ["pyobjc-framework-Cocoa"] 2011 | win32 = ["pywin32"] 2012 | 2013 | [[package]] 2014 | name = "setuptools" 2015 | version = "68.0.0" 2016 | description = "Easily download, build, install, upgrade, and uninstall Python packages" 2017 | category = "dev" 2018 | optional = false 2019 | python-versions = ">=3.7" 2020 | files = [ 2021 | {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, 2022 | {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, 2023 | ] 2024 | 2025 | [package.extras] 2026 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] 2027 | testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] 2028 | testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] 2029 | 2030 | [[package]] 2031 | name = "six" 2032 | version = "1.16.0" 2033 | description = "Python 2 and 3 compatibility utilities" 2034 | category = "main" 2035 | optional = false 2036 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 2037 | files = [ 2038 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 2039 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 2040 | ] 2041 | 2042 | [[package]] 2043 | name = "smmap" 2044 | version = "5.0.0" 2045 | description = "A pure Python implementation of a sliding window memory map manager" 2046 | category = "dev" 2047 | optional = false 2048 | python-versions = ">=3.6" 2049 | files = [ 2050 | {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, 2051 | {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, 2052 | ] 2053 | 2054 | [[package]] 2055 | name = "soupsieve" 2056 | version = "2.3.2" 2057 | description = "A modern CSS selector implementation for Beautiful Soup." 2058 | category = "dev" 2059 | optional = false 2060 | python-versions = ">=3.6" 2061 | files = [ 2062 | {file = "soupsieve-2.3.2-py3-none-any.whl", hash = "sha256:a714129d3021ec17ce5be346b1007300558b378332c289a1a20e7d4de6ff18a5"}, 2063 | {file = "soupsieve-2.3.2.tar.gz", hash = "sha256:0bcc6d7432153063e3df09c3ac9442af3eba488715bfcad6a4c38ccb2a523124"}, 2064 | ] 2065 | 2066 | [[package]] 2067 | name = "stack-data" 2068 | version = "0.2.0" 2069 | description = "Extract data from python stack frames and tracebacks for informative displays" 2070 | category = "dev" 2071 | optional = false 2072 | python-versions = "*" 2073 | files = [ 2074 | {file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"}, 2075 | {file = "stack_data-0.2.0.tar.gz", hash = "sha256:45692d41bd633a9503a5195552df22b583caf16f0b27c4e58c98d88c8b648e12"}, 2076 | ] 2077 | 2078 | [package.dependencies] 2079 | asttokens = "*" 2080 | executing = "*" 2081 | pure-eval = "*" 2082 | 2083 | [package.extras] 2084 | tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] 2085 | 2086 | [[package]] 2087 | name = "streamlit" 2088 | version = "1.8.1" 2089 | description = "The fastest way to build data apps in Python" 2090 | category = "dev" 2091 | optional = false 2092 | python-versions = ">=3.6" 2093 | files = [ 2094 | {file = "streamlit-1.8.1-py2.py3-none-any.whl", hash = "sha256:24d19c420d760c88eafc3f9508cbbd77ddab4a99a3a3b4db06f7741531f120a5"}, 2095 | {file = "streamlit-1.8.1.tar.gz", hash = "sha256:507c84439996c6ffed150a2bdd1352b46acc8a476a1012e73241f7cc2fda3056"}, 2096 | ] 2097 | 2098 | [package.dependencies] 2099 | altair = ">=3.2.0" 2100 | attrs = "*" 2101 | blinker = "*" 2102 | cachetools = ">=4.0" 2103 | click = ">=7.0,<8.1" 2104 | gitpython = "!=3.1.19" 2105 | importlib-metadata = ">=1.4" 2106 | numpy = "*" 2107 | packaging = "*" 2108 | pandas = ">=0.21.0" 2109 | pillow = ">=6.2.0" 2110 | protobuf = ">=3.6.0,<3.11 || >3.11" 2111 | pyarrow = "*" 2112 | pydeck = ">=0.1.dev5" 2113 | pympler = ">=0.9" 2114 | python-dateutil = "*" 2115 | requests = "*" 2116 | semver = "*" 2117 | toml = "*" 2118 | tornado = ">=5.0" 2119 | tzlocal = "*" 2120 | validators = "*" 2121 | watchdog = {version = "*", markers = "platform_system != \"Darwin\""} 2122 | 2123 | [[package]] 2124 | name = "tenacity" 2125 | version = "8.0.1" 2126 | description = "Retry code until it succeeds" 2127 | category = "main" 2128 | optional = false 2129 | python-versions = ">=3.6" 2130 | files = [ 2131 | {file = "tenacity-8.0.1-py3-none-any.whl", hash = "sha256:f78f4ea81b0fabc06728c11dc2a8c01277bfc5181b321a4770471902e3eb844a"}, 2132 | {file = "tenacity-8.0.1.tar.gz", hash = "sha256:43242a20e3e73291a28bcbcacfd6e000b02d3857a9a9fff56b297a27afdc932f"}, 2133 | ] 2134 | 2135 | [package.extras] 2136 | doc = ["reno", "sphinx", "tornado (>=4.5)"] 2137 | 2138 | [[package]] 2139 | name = "terminado" 2140 | version = "0.13.3" 2141 | description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." 2142 | category = "dev" 2143 | optional = false 2144 | python-versions = ">=3.7" 2145 | files = [ 2146 | {file = "terminado-0.13.3-py3-none-any.whl", hash = "sha256:874d4ea3183536c1782d13c7c91342ef0cf4e5ee1d53633029cbc972c8760bd8"}, 2147 | {file = "terminado-0.13.3.tar.gz", hash = "sha256:94d1cfab63525993f7d5c9b469a50a18d0cdf39435b59785715539dd41e36c0d"}, 2148 | ] 2149 | 2150 | [package.dependencies] 2151 | ptyprocess = {version = "*", markers = "os_name != \"nt\""} 2152 | pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} 2153 | tornado = ">=4" 2154 | 2155 | [package.extras] 2156 | test = ["pytest"] 2157 | 2158 | [[package]] 2159 | name = "tinycss2" 2160 | version = "1.1.1" 2161 | description = "A tiny CSS parser" 2162 | category = "dev" 2163 | optional = false 2164 | python-versions = ">=3.6" 2165 | files = [ 2166 | {file = "tinycss2-1.1.1-py3-none-any.whl", hash = "sha256:fe794ceaadfe3cf3e686b22155d0da5780dd0e273471a51846d0a02bc204fec8"}, 2167 | {file = "tinycss2-1.1.1.tar.gz", hash = "sha256:b2e44dd8883c360c35dd0d1b5aad0b610e5156c2cb3b33434634e539ead9d8bf"}, 2168 | ] 2169 | 2170 | [package.dependencies] 2171 | webencodings = ">=0.4" 2172 | 2173 | [package.extras] 2174 | doc = ["sphinx", "sphinx_rtd_theme"] 2175 | test = ["coverage[toml]", "pytest", "pytest-cov", "pytest-flake8", "pytest-isort"] 2176 | 2177 | [[package]] 2178 | name = "toml" 2179 | version = "0.10.2" 2180 | description = "Python Library for Tom's Obvious, Minimal Language" 2181 | category = "dev" 2182 | optional = false 2183 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 2184 | files = [ 2185 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 2186 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 2187 | ] 2188 | 2189 | [[package]] 2190 | name = "tomli" 2191 | version = "1.2.3" 2192 | description = "A lil' TOML parser" 2193 | category = "dev" 2194 | optional = false 2195 | python-versions = ">=3.6" 2196 | files = [ 2197 | {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, 2198 | {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, 2199 | ] 2200 | 2201 | [[package]] 2202 | name = "toolz" 2203 | version = "0.11.2" 2204 | description = "List processing tools and functional utilities" 2205 | category = "dev" 2206 | optional = false 2207 | python-versions = ">=3.5" 2208 | files = [ 2209 | {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, 2210 | {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, 2211 | ] 2212 | 2213 | [[package]] 2214 | name = "tornado" 2215 | version = "6.1" 2216 | description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." 2217 | category = "dev" 2218 | optional = false 2219 | python-versions = ">= 3.5" 2220 | files = [ 2221 | {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, 2222 | {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, 2223 | {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, 2224 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, 2225 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, 2226 | {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, 2227 | {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, 2228 | {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, 2229 | {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, 2230 | {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, 2231 | {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, 2232 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, 2233 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, 2234 | {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, 2235 | {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, 2236 | {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, 2237 | {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, 2238 | {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, 2239 | {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, 2240 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, 2241 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, 2242 | {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, 2243 | {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, 2244 | {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, 2245 | {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, 2246 | {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, 2247 | {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, 2248 | {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, 2249 | {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, 2250 | {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, 2251 | {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, 2252 | {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, 2253 | {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, 2254 | {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, 2255 | {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, 2256 | {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, 2257 | {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, 2258 | {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, 2259 | {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, 2260 | {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, 2261 | {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, 2262 | ] 2263 | 2264 | [[package]] 2265 | name = "traitlets" 2266 | version = "5.1.1" 2267 | description = "Traitlets Python configuration system" 2268 | category = "dev" 2269 | optional = false 2270 | python-versions = ">=3.7" 2271 | files = [ 2272 | {file = "traitlets-5.1.1-py3-none-any.whl", hash = "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"}, 2273 | {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"}, 2274 | ] 2275 | 2276 | [package.extras] 2277 | test = ["pytest"] 2278 | 2279 | [[package]] 2280 | name = "typing-extensions" 2281 | version = "4.1.1" 2282 | description = "Backported and Experimental Type Hints for Python 3.6+" 2283 | category = "dev" 2284 | optional = false 2285 | python-versions = ">=3.6" 2286 | files = [ 2287 | {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, 2288 | {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, 2289 | ] 2290 | 2291 | [[package]] 2292 | name = "tzdata" 2293 | version = "2022.1" 2294 | description = "Provider of IANA time zone data" 2295 | category = "main" 2296 | optional = false 2297 | python-versions = ">=2" 2298 | files = [ 2299 | {file = "tzdata-2022.1-py2.py3-none-any.whl", hash = "sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9"}, 2300 | {file = "tzdata-2022.1.tar.gz", hash = "sha256:8b536a8ec63dc0751342b3984193a3118f8fca2afe25752bb9b7fffd398552d3"}, 2301 | ] 2302 | 2303 | [[package]] 2304 | name = "tzlocal" 2305 | version = "4.2" 2306 | description = "tzinfo object for the local timezone" 2307 | category = "dev" 2308 | optional = false 2309 | python-versions = ">=3.6" 2310 | files = [ 2311 | {file = "tzlocal-4.2-py3-none-any.whl", hash = "sha256:89885494684c929d9191c57aa27502afc87a579be5cdd3225c77c463ea043745"}, 2312 | {file = "tzlocal-4.2.tar.gz", hash = "sha256:ee5842fa3a795f023514ac2d801c4a81d1743bbe642e3940143326b3a00addd7"}, 2313 | ] 2314 | 2315 | [package.dependencies] 2316 | "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} 2317 | pytz-deprecation-shim = "*" 2318 | tzdata = {version = "*", markers = "platform_system == \"Windows\""} 2319 | 2320 | [package.extras] 2321 | devenv = ["black", "pyroma", "pytest-cov", "zest.releaser"] 2322 | test = ["pytest (>=4.3)", "pytest-mock (>=3.3)"] 2323 | 2324 | [[package]] 2325 | name = "urllib3" 2326 | version = "1.26.9" 2327 | description = "HTTP library with thread-safe connection pooling, file post, and more." 2328 | category = "dev" 2329 | optional = false 2330 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 2331 | files = [ 2332 | {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, 2333 | {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, 2334 | ] 2335 | 2336 | [package.extras] 2337 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] 2338 | secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] 2339 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 2340 | 2341 | [[package]] 2342 | name = "validators" 2343 | version = "0.18.2" 2344 | description = "Python Data Validation for Humans™." 2345 | category = "dev" 2346 | optional = false 2347 | python-versions = ">=3.4" 2348 | files = [ 2349 | {file = "validators-0.18.2-py3-none-any.whl", hash = "sha256:0143dcca8a386498edaf5780cbd5960da1a4c85e0719f3ee5c9b41249c4fefbd"}, 2350 | {file = "validators-0.18.2.tar.gz", hash = "sha256:37cd9a9213278538ad09b5b9f9134266e7c226ab1fede1d500e29e0a8fbb9ea6"}, 2351 | ] 2352 | 2353 | [package.dependencies] 2354 | decorator = ">=3.4.0" 2355 | six = ">=1.4.0" 2356 | 2357 | [package.extras] 2358 | test = ["flake8 (>=2.4.0)", "isort (>=4.2.2)", "pytest (>=2.2.3)"] 2359 | 2360 | [[package]] 2361 | name = "vulture" 2362 | version = "2.3" 2363 | description = "Find dead code" 2364 | category = "dev" 2365 | optional = false 2366 | python-versions = ">=3.6" 2367 | files = [ 2368 | {file = "vulture-2.3-py2.py3-none-any.whl", hash = "sha256:f39de5e6f1df1f70c3b50da54f1c8d494159e9ca3d01a9b89eac929600591703"}, 2369 | {file = "vulture-2.3.tar.gz", hash = "sha256:03d5a62bcbe9ceb9a9b0575f42d71a2d414070229f2e6f95fa6e7c71aaaed967"}, 2370 | ] 2371 | 2372 | [package.dependencies] 2373 | toml = "*" 2374 | 2375 | [[package]] 2376 | name = "watchdog" 2377 | version = "2.1.7" 2378 | description = "Filesystem events monitoring" 2379 | category = "dev" 2380 | optional = false 2381 | python-versions = ">=3.6" 2382 | files = [ 2383 | {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, 2384 | {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, 2385 | {file = "watchdog-2.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f14ce6adea2af1bba495acdde0e510aecaeb13b33f7bd2f6324e551b26688ca"}, 2386 | {file = "watchdog-2.1.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4d0e98ac2e8dd803a56f4e10438b33a2d40390a72750cff4939b4b274e7906fa"}, 2387 | {file = "watchdog-2.1.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:81982c7884aac75017a6ecc72f1a4fedbae04181a8665a34afce9539fc1b3fab"}, 2388 | {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0b4a1fe6201c6e5a1926f5767b8664b45f0fcb429b62564a41f490ff1ce1dc7a"}, 2389 | {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e6ae29b72977f2e1ee3d0b760d7ee47896cb53e831cbeede3e64485e5633cc8"}, 2390 | {file = "watchdog-2.1.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9777664848160449e5b4260e0b7bc1ae0f6f4992a8b285db4ec1ef119ffa0e2"}, 2391 | {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:19b36d436578eb437e029c6b838e732ed08054956366f6dd11875434a62d2b99"}, 2392 | {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b61acffaf5cd5d664af555c0850f9747cc5f2baf71e54bbac164c58398d6ca7b"}, 2393 | {file = "watchdog-2.1.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1e877c70245424b06c41ac258023ea4bd0c8e4ff15d7c1368f17cd0ae6e351dd"}, 2394 | {file = "watchdog-2.1.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d802d65262a560278cf1a65ef7cae4e2bc7ecfe19e5451349e4c67e23c9dc420"}, 2395 | {file = "watchdog-2.1.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b3750ee5399e6e9c69eae8b125092b871ee9e2fcbd657a92747aea28f9056a5c"}, 2396 | {file = "watchdog-2.1.7-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ed6d9aad09a2a948572224663ab00f8975fae242aa540509737bb4507133fa2d"}, 2397 | {file = "watchdog-2.1.7-py3-none-manylinux2014_armv7l.whl", hash = "sha256:b26e13e8008dcaea6a909e91d39b629a39635d1a8a7239dd35327c74f4388601"}, 2398 | {file = "watchdog-2.1.7-py3-none-manylinux2014_i686.whl", hash = "sha256:0908bb50f6f7de54d5d31ec3da1654cb7287c6b87bce371954561e6de379d690"}, 2399 | {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64.whl", hash = "sha256:bdcbf75580bf4b960fb659bbccd00123d83119619195f42d721e002c1621602f"}, 2400 | {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:81a5861d0158a7e55fe149335fb2bbfa6f48cbcbd149b52dbe2cd9a544034bbd"}, 2401 | {file = "watchdog-2.1.7-py3-none-manylinux2014_s390x.whl", hash = "sha256:03b43d583df0f18782a0431b6e9e9965c5b3f7cf8ec36a00b930def67942c385"}, 2402 | {file = "watchdog-2.1.7-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ae934e34c11aa8296c18f70bf66ed60e9870fcdb4cc19129a04ca83ab23e7055"}, 2403 | {file = "watchdog-2.1.7-py3-none-win32.whl", hash = "sha256:49639865e3db4be032a96695c98ac09eed39bbb43fe876bb217da8f8101689a6"}, 2404 | {file = "watchdog-2.1.7-py3-none-win_amd64.whl", hash = "sha256:340b875aecf4b0e6672076a6f05cfce6686935559bb6d34cebedee04126a9566"}, 2405 | {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, 2406 | {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, 2407 | ] 2408 | 2409 | [package.extras] 2410 | watchmedo = ["PyYAML (>=3.10)"] 2411 | 2412 | [[package]] 2413 | name = "wcwidth" 2414 | version = "0.2.5" 2415 | description = "Measures the displayed width of unicode strings in a terminal" 2416 | category = "dev" 2417 | optional = false 2418 | python-versions = "*" 2419 | files = [ 2420 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 2421 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 2422 | ] 2423 | 2424 | [[package]] 2425 | name = "webencodings" 2426 | version = "0.5.1" 2427 | description = "Character encoding aliases for legacy web content" 2428 | category = "dev" 2429 | optional = false 2430 | python-versions = "*" 2431 | files = [ 2432 | {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, 2433 | {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, 2434 | ] 2435 | 2436 | [[package]] 2437 | name = "widgetsnbextension" 2438 | version = "3.6.0" 2439 | description = "IPython HTML widgets for Jupyter" 2440 | category = "dev" 2441 | optional = false 2442 | python-versions = "*" 2443 | files = [ 2444 | {file = "widgetsnbextension-3.6.0-py2.py3-none-any.whl", hash = "sha256:4fd321cad39fdcf8a8e248a657202d42917ada8e8ed5dd3f60f073e0d54ceabd"}, 2445 | {file = "widgetsnbextension-3.6.0.tar.gz", hash = "sha256:e84a7a9fcb9baf3d57106e184a7389a8f8eb935bf741a5eb9d60aa18cc029a80"}, 2446 | ] 2447 | 2448 | [package.dependencies] 2449 | notebook = ">=4.4.1" 2450 | 2451 | [[package]] 2452 | name = "zipp" 2453 | version = "3.8.0" 2454 | description = "Backport of pathlib-compatible object wrapper for zip files" 2455 | category = "dev" 2456 | optional = false 2457 | python-versions = ">=3.7" 2458 | files = [ 2459 | {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, 2460 | {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, 2461 | ] 2462 | 2463 | [package.extras] 2464 | docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] 2465 | testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 2466 | 2467 | [metadata] 2468 | lock-version = "2.0" 2469 | python-versions = ">=3.8,<4.0.0" 2470 | content-hash = "b432667fa8e3dd6c84d2ba6ff5237b0d4a6ebd4d36f5ef3e3adaa2a7a84e8069" 2471 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "plotly_calplot" 3 | version = "0.1.20" 4 | description = "Calendar Plot made with Plotly" 5 | authors = ["Bruno Rodrigues Silva "] 6 | license = "MIT" 7 | repository = "https://github.com/brunorosilva/plotly-calplot" 8 | readme = "README.md" 9 | 10 | [tool.poetry.dependencies] 11 | python = ">=3.8,<4.0.0" 12 | plotly = "^5.4.0" 13 | pandas = "*" 14 | numpy = "^1.22.3" 15 | pytz = "^2023.3.post1" 16 | 17 | [tool.poetry.group.dev.dependencies] 18 | black = "^21.12b0" 19 | isort = "^5.10.1" 20 | streamlit = "^1.3.0" 21 | pytest = "^7.1.1" 22 | pytest-cov = "^3.0.0" 23 | flake8 = "^4.0.1" 24 | vulture = "^2.3" 25 | mypy = "^1.7.1" 26 | 27 | [build-system] 28 | requires = ["poetry-core>=1.0.0"] 29 | build-backend = "poetry.core.masonry.api" 30 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 90 3 | max-complexity = 12 4 | 5 | show-source = True 6 | statistics = False 7 | 8 | extend-exclude = .venv 9 | 10 | [isort] 11 | line_length = 90 12 | multi_line_output = 3 13 | include_trailing_comma = true 14 | use_parentheses = true 15 | 16 | [tool:pytest] 17 | norecursedirs = *.egg .eggs dist build docs .tox .git __pycache__ 18 | testpaths = tests 19 | addopts = 20 | --cov=plotly_calplot 21 | --cov-report=html 22 | --cov-report=xml 23 | --cov-fail-under=80 24 | console_output_style = progress 25 | 26 | [coverage:html] 27 | title = Coverage Report 28 | 29 | [mypy] 30 | # suppress errors about unsatisfied imports 31 | ignore_missing_imports=True 32 | 33 | # be strict 34 | warn_return_any = True 35 | strict_optional = True 36 | warn_no_return = True 37 | warn_redundant_casts = True 38 | warn_unused_ignores = True 39 | disallow_any_generics = True 40 | 41 | disallow_untyped_defs = True 42 | check_untyped_defs = True 43 | disallow_untyped_calls = True 44 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunorosilva/plotly-calplot/c12cc6f55ef19fe724e7d2a6d125a8b07bd904c6/tests/__init__.py -------------------------------------------------------------------------------- /tests/test_calplot.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from unittest import TestCase 3 | 4 | import pandas as pd 5 | from plotly import graph_objects as go 6 | 7 | from plotly_calplot.calplot import calplot 8 | 9 | 10 | class TestCalplot(TestCase): 11 | def setUp(self) -> None: 12 | self.one_year_sample_dataframe = pd.DataFrame( 13 | [ 14 | (datetime(2019, 1, 1), 13), 15 | (datetime(2019, 1, 1), 16), 16 | (datetime(2019, 1, 3), 5), 17 | (datetime(2019, 3, 31), 2), 18 | (datetime(2019, 4, 1), 27), 19 | (datetime(2019, 4, 2), 29), 20 | (datetime(2019, 4, 3), 20), 21 | (datetime(2019, 4, 4), 13), 22 | (datetime(2019, 4, 5), 23), 23 | (datetime(2019, 5, 30), 0), 24 | ], 25 | columns=["ds", "value"], 26 | ) 27 | self.multi_year_sample_dataframe = pd.DataFrame( 28 | [ 29 | (datetime(2019, 1, 1), 13), 30 | (datetime(2019, 1, 1), 16), 31 | (datetime(2020, 1, 3), 5), 32 | (datetime(2020, 3, 31), 2), 33 | (datetime(2021, 4, 1), 27), 34 | (datetime(2022, 4, 2), 29), 35 | (datetime(2023, 4, 3), 20), 36 | (datetime(2024, 4, 4), 13), 37 | (datetime(2024, 4, 5), 23), 38 | (datetime(2025, 5, 30), 0), 39 | ], 40 | columns=["ds", "value"], 41 | ) 42 | 43 | def test_should_create_one_year_only(self) -> None: 44 | cp = calplot(self.one_year_sample_dataframe, "ds", "value") 45 | self.assertTrue(len(cp.data) == 36) 46 | self.assertTrue(type(cp.data) == tuple) 47 | self.assertTrue(type(cp) == go.Figure) 48 | 49 | def test_should_create_multi_year(self) -> None: 50 | cp = calplot(self.multi_year_sample_dataframe, "ds", "value") 51 | 52 | self.assertTrue(len(cp.data) == 236) 53 | self.assertTrue(type(cp.data) == tuple) 54 | self.assertTrue(type(cp) == go.Figure) 55 | 56 | def test_should_create_black_theme_multi_year(self) -> None: 57 | cp = calplot(self.multi_year_sample_dataframe, "ds", "value", dark_theme=True) 58 | 59 | self.assertTrue(len(cp.data) == 236) 60 | self.assertTrue(type(cp.data) == tuple) 61 | self.assertTrue(type(cp) == go.Figure) 62 | self.assertTrue(cp.layout["paper_bgcolor"] == "#333") 63 | 64 | def test_should_create_with_years_title(self) -> None: 65 | cp = calplot(self.multi_year_sample_dataframe, "ds", "value", years_title=True) 66 | 67 | self.assertTrue(len(cp.data) == 236) 68 | self.assertTrue(type(cp.data) == tuple) 69 | self.assertTrue(type(cp) == go.Figure) 70 | -------------------------------------------------------------------------------- /tests/test_date_extractors.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from unittest import TestCase 3 | 4 | import numpy as np 5 | import pandas as pd 6 | 7 | from plotly_calplot.date_extractors import get_date_coordinates, get_month_names 8 | 9 | 10 | class TestUtils(TestCase): 11 | def setUp(self) -> None: 12 | self.sample_dataframe = pd.DataFrame( 13 | [ 14 | (datetime(2019, 1, 1), 13), 15 | (datetime(2019, 1, 1), 16), 16 | (datetime(2019, 1, 3), 5), 17 | (datetime(2019, 3, 31), 2), 18 | (datetime(2019, 4, 1), 27), 19 | (datetime(2019, 4, 2), 29), 20 | (datetime(2019, 4, 3), 20), 21 | (datetime(2019, 4, 4), 13), 22 | (datetime(2019, 4, 5), 23), 23 | (datetime(2019, 5, 30), 0), 24 | ], 25 | columns=["ds", "value"], 26 | ) 27 | 28 | def test_should_get_month_names(self) -> None: 29 | expected_result = ["January", "March", "April", "May"] 30 | month_names = get_month_names(self.sample_dataframe, "ds") 31 | 32 | self.assertTrue(len(month_names) == 4) 33 | self.assertEqual(month_names, expected_result) 34 | 35 | def test_should_get_date_right_coordinates(self) -> None: 36 | month_positions, weekdays_in_year, weeknumber_of_dates = get_date_coordinates( 37 | self.sample_dataframe, "ds" 38 | ) 39 | 40 | self.assertEqual(len(month_positions), 12) 41 | self.assertTrue(type(month_positions) == np.ndarray) 42 | self.assertEqual(len(weekdays_in_year), self.sample_dataframe.shape[0]) 43 | self.assertTrue(max(weekdays_in_year) <= 6) 44 | self.assertTrue(min(weekdays_in_year) >= 0) 45 | self.assertEqual(len(weeknumber_of_dates), self.sample_dataframe.shape[0]) 46 | self.assertTrue(max(weeknumber_of_dates) <= 53) 47 | self.assertTrue(min(weeknumber_of_dates) >= 0) 48 | -------------------------------------------------------------------------------- /tests/test_layout_formatter.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from unittest import TestCase 3 | 4 | import pandas as pd 5 | from plotly import graph_objects as go 6 | 7 | from plotly_calplot.layout_formatter import ( 8 | create_month_lines, 9 | decide_layout, 10 | update_plot_with_current_layout, 11 | ) 12 | 13 | 14 | class TestLayouting(TestCase): 15 | def setUp(self) -> None: 16 | self.sample_dataframe = pd.DataFrame( 17 | [ 18 | (datetime(2019, 1, 1), 13), 19 | (datetime(2019, 1, 1), 16), 20 | (datetime(2019, 1, 3), 5), 21 | (datetime(2019, 3, 31), 2), 22 | (datetime(2019, 4, 1), 27), 23 | (datetime(2019, 4, 2), 29), 24 | (datetime(2019, 4, 3), 20), 25 | (datetime(2019, 4, 4), 13), 26 | (datetime(2019, 4, 5), 23), 27 | (datetime(2019, 5, 30), 0), 28 | ], 29 | columns=["ds", "value"], 30 | ) 31 | 32 | self.weeknumber_of_dates = [0, 0, 0, 12, 13, 13, 13, 13, 13, 21] 33 | self.weekdays_in_year = [1.0, 1.0, 3.0, 6.0, 0.0, 1.0, 2.0, 3.0, 4.0, 3.0] 34 | 35 | def test_should_create_layout_with_black_theme(self) -> None: 36 | result_layout = decide_layout( 37 | True, "title", ["January", "March", "April"], [0, 1, 2] 38 | ) 39 | self.assertTrue(type(result_layout) == go.Layout) 40 | 41 | def test_should_create_layout_with_light_theme(self) -> None: 42 | result_layout = decide_layout( 43 | False, "title", ["January", "March", "April"], [0, 1, 2] 44 | ) 45 | self.assertTrue(type(result_layout) == go.Layout) 46 | 47 | def test_should_create_month_lines(self) -> None: 48 | result_layout = create_month_lines( 49 | [], 50 | "#333", 51 | 1, 52 | self.sample_dataframe["ds"], 53 | self.weekdays_in_year, 54 | self.weeknumber_of_dates, 55 | ) 56 | self.assertTrue(type(result_layout) == list) 57 | self.assertTrue(type(result_layout[0]) == go.Scatter) 58 | self.assertTrue(result_layout[0]["line"]["color"] == "#333") 59 | self.assertTrue(result_layout[0]["line"]["width"] == 1) 60 | self.assertTrue(result_layout[0]["mode"] == "lines") 61 | 62 | def test_should_update_plot(self) -> None: 63 | layout = go.Layout( 64 | { 65 | "font": {"color": "#9e9e9e", "size": 10}, 66 | "margin": {"b": 20, "t": 20}, 67 | "plot_bgcolor": "#fff", 68 | "showlegend": False, 69 | "title": {"text": "title"}, 70 | "xaxis": { 71 | "showgrid": False, 72 | "showline": False, 73 | "tickmode": "array", 74 | "ticktext": ["January", "March", "April"], 75 | "tickvals": [0, 1, 2], 76 | "zeroline": False, 77 | }, 78 | "yaxis": { 79 | "autorange": "reversed", 80 | "showgrid": False, 81 | "showline": False, 82 | "tickmode": "array", 83 | "ticktext": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], 84 | "tickvals": [0, 1, 2, 3, 4, 5, 6], 85 | "zeroline": False, 86 | }, 87 | } 88 | ) 89 | result = update_plot_with_current_layout(go.Figure(), [], 0, layout, 100, False) 90 | self.assertEqual(result.layout.font, layout.font) 91 | self.assertEqual(result.layout.margin, layout.margin) 92 | self.assertEqual(result.layout.plot_bgcolor, layout.plot_bgcolor) 93 | self.assertEqual(result.layout.showlegend, layout.showlegend) 94 | self.assertEqual(result.layout.title, layout.title) 95 | self.assertEqual(result.layout.xaxis, layout.xaxis) 96 | self.assertEqual(result.layout.yaxis, layout.yaxis) 97 | self.assertTrue(type(result) == go.Figure) 98 | -------------------------------------------------------------------------------- /tests/test_month_calplot.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from unittest import TestCase 3 | 4 | import pandas as pd 5 | from plotly import graph_objects as go 6 | 7 | from plotly_calplot import month_calplot 8 | 9 | 10 | class TestMonthCalplot(TestCase): 11 | def setUp(self) -> None: 12 | # Data copied on 2022-04-27 from test_calplot.py 13 | self.one_year_sample_dataframe = pd.DataFrame( 14 | [ 15 | (datetime(2019, 1, 1), 13), 16 | (datetime(2019, 1, 1), 16), 17 | (datetime(2019, 1, 3), 5), 18 | (datetime(2019, 3, 31), 2), 19 | (datetime(2019, 4, 1), 27), 20 | (datetime(2019, 4, 2), 29), 21 | (datetime(2019, 4, 3), 20), 22 | (datetime(2019, 4, 4), 13), 23 | (datetime(2019, 4, 5), 23), 24 | (datetime(2019, 5, 30), 0), 25 | ], 26 | columns=["ds", "value"], 27 | ) 28 | self.multi_year_sample_dataframe = pd.DataFrame( 29 | [ 30 | (datetime(2019, 1, 1), 13), 31 | (datetime(2019, 1, 1), 16), 32 | (datetime(2020, 1, 3), 5), 33 | (datetime(2020, 3, 31), 2), 34 | (datetime(2021, 4, 1), 27), 35 | (datetime(2022, 4, 2), 29), 36 | (datetime(2023, 4, 3), 20), 37 | (datetime(2024, 4, 4), 13), 38 | (datetime(2024, 4, 5), 23), 39 | (datetime(2025, 5, 30), 0), 40 | ], 41 | columns=["ds", "value"], 42 | ) 43 | 44 | def test_should_create_one_year_only(self) -> None: 45 | cp = month_calplot(self.one_year_sample_dataframe, "ds", "value") 46 | 47 | self.assertEqual(len(cp.data), 1) # Only one figure 48 | self.assertEqual(cp.layout.yaxis.tickvals, [2019]) # Only one year 49 | self.assertIsInstance(cp, go.Figure) 50 | self.assertIsInstance(cp.data, tuple) 51 | 52 | def test_should_create_multi_year(self) -> None: 53 | cp = month_calplot(self.multi_year_sample_dataframe, "ds", "value") 54 | 55 | self.assertEqual(len(cp.data), 1) # Only one figure 56 | self.assertEqual(len(cp.layout.yaxis.tickvals), 7) 57 | self.assertIsInstance(cp, go.Figure) 58 | self.assertIsInstance(cp.data, tuple) 59 | 60 | def test_should_create_black_theme_multi_year(self) -> None: 61 | cp = month_calplot( 62 | self.multi_year_sample_dataframe, "ds", "value", dark_theme=True 63 | ) 64 | 65 | self.assertEqual(len(cp.data), 1) # Only one figure 66 | self.assertEqual(len(cp.layout.yaxis.tickvals), 7) 67 | self.assertIsInstance(cp, go.Figure) 68 | self.assertIsInstance(cp.data, tuple) 69 | self.assertEqual(cp.layout["paper_bgcolor"], "#333") 70 | -------------------------------------------------------------------------------- /tests/test_raw_heatmap.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from unittest import TestCase 3 | from unittest.mock import MagicMock, patch 4 | 5 | import pandas as pd 6 | 7 | from plotly_calplot.raw_heatmap import create_heatmap_without_formatting 8 | 9 | 10 | class TestRawHeatmap(TestCase): 11 | def setUp(self) -> None: 12 | self.weeknumber_of_dates = [0, 0, 0, 12, 13, 13, 13, 13, 13, 21] 13 | self.weekdays_in_year = [1.0, 1.0, 3.0, 6.0, 0.0, 1.0, 2.0, 3.0, 4.0, 3.0] 14 | 15 | self.sample_dataframe = pd.DataFrame( 16 | [ 17 | (datetime(2019, 1, 1), 13), 18 | (datetime(2019, 1, 1), 16), 19 | (datetime(2019, 1, 3), 5), 20 | (datetime(2019, 3, 31), 2), 21 | (datetime(2019, 4, 1), 27), 22 | (datetime(2019, 4, 2), 29), 23 | (datetime(2019, 4, 3), 20), 24 | (datetime(2019, 4, 4), 13), 25 | (datetime(2019, 4, 5), 23), 26 | (datetime(2019, 5, 30), 0), 27 | ], 28 | columns=["ds", "value"], 29 | ) 30 | 31 | @patch("plotly_calplot.raw_heatmap.go") 32 | def test_should_create_raw_heatmap(self, hm_mock: MagicMock) -> None: 33 | hm = create_heatmap_without_formatting( 34 | self.sample_dataframe, 35 | "ds", 36 | "value", 37 | self.weeknumber_of_dates, 38 | self.weekdays_in_year, 39 | 1, 40 | 2020, 41 | "greens", 42 | "y", 43 | ) 44 | hm_mock.Heatmap.assert_called() 45 | self.assertTrue(type(hm), list) 46 | -------------------------------------------------------------------------------- /tests/test_single_year_calplot.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from unittest import TestCase 3 | 4 | import pandas as pd 5 | from plotly import graph_objects as go 6 | from plotly.subplots import make_subplots 7 | 8 | from plotly_calplot.single_year_calplot import year_calplot 9 | 10 | 11 | class TestSingleYearCalplot(TestCase): 12 | def setUp(self) -> None: 13 | self.sample_dataframe = pd.DataFrame( 14 | [ 15 | (datetime(2019, 1, 1), 13), 16 | (datetime(2019, 1, 1), 16), 17 | (datetime(2019, 1, 3), 5), 18 | (datetime(2019, 3, 31), 2), 19 | (datetime(2019, 4, 1), 27), 20 | (datetime(2019, 4, 2), 29), 21 | (datetime(2019, 4, 3), 20), 22 | (datetime(2019, 4, 4), 13), 23 | (datetime(2019, 4, 5), 23), 24 | (datetime(2019, 5, 30), 0), 25 | ], 26 | columns=["ds", "value"], 27 | ) 28 | 29 | def test_should_create_single_year_calplot(self) -> None: 30 | fig = make_subplots(1, 1) 31 | cp = year_calplot(self.sample_dataframe, "ds", "value", fig, 0, 2019) 32 | 33 | self.assertTrue(type(cp) == go.Figure) 34 | -------------------------------------------------------------------------------- /tests/test_utils.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from unittest import TestCase 3 | 4 | import pandas as pd 5 | import pytz 6 | 7 | from plotly_calplot.utils import fill_empty_with_zeros, validate_date_column 8 | 9 | 10 | class TestUtils(TestCase): 11 | def test_fill_empty_with_zeros_light_theme(self) -> None: 12 | selected_year_data = pd.DataFrame( 13 | { 14 | "ds": [ 15 | datetime(2019, 1, 5), 16 | datetime(2019, 2, 1), 17 | datetime(2019, 3, 1), 18 | ], 19 | "y": [3231, 43415, 23123], 20 | } 21 | ) 22 | 23 | final_df = fill_empty_with_zeros(selected_year_data, "ds", 2019, 1, 12) 24 | self.assertEqual(final_df.shape[0], 365) 25 | 26 | def test_fill_empty_with_zeros_dark_theme(self) -> None: 27 | selected_year_data = pd.DataFrame( 28 | { 29 | "ds": [ 30 | datetime(2019, 1, 5), 31 | datetime(2019, 2, 1), 32 | datetime(2019, 3, 1), 33 | ], 34 | "y": [3231, 43415, 23123], 35 | } 36 | ) 37 | final_df = fill_empty_with_zeros(selected_year_data, "ds", 2019, 1, 12) 38 | 39 | self.assertEqual(final_df.shape[0], 365) 40 | 41 | def test_validate_date_column_datetime64(self) -> None: 42 | date_column = pd.Series( 43 | [ 44 | datetime(2022, 1, 1), 45 | datetime(2022, 1, 2), 46 | datetime(2022, 1, 3), 47 | ] 48 | ) 49 | date_fmt = "%Y-%m-%d" 50 | 51 | result = validate_date_column(date_column, date_fmt) 52 | 53 | self.assertEqual(result.dtype, "datetime64[ns]") 54 | 55 | def test_validate_date_column_object(self) -> None: 56 | date_column = pd.Series(["2022-01-01", "2022-01-02", "2022-01-03"]) 57 | date_fmt = "%Y-%m-%d" 58 | 59 | result = validate_date_column(date_column, date_fmt) 60 | 61 | self.assertEqual(result.dtype, "datetime64[ns]") 62 | 63 | def test_validate_date_column_invalid_format(self) -> None: 64 | date_column = pd.Series(["2022-01-01", "2022-01-02", "2022-01-03"]) 65 | date_fmt = "%d-%m-%Y" 66 | 67 | with self.assertRaises(ValueError): 68 | validate_date_column(date_column, date_fmt) 69 | 70 | def test_validate_date_column_invalid_type(self) -> None: 71 | date_column = pd.Series([1, 2, 3]) 72 | date_fmt = "%Y-%m-%d" 73 | 74 | with self.assertRaises(Exception): 75 | validate_date_column(date_column, date_fmt) 76 | 77 | def test_validate_date_column_utc_tz(self) -> None: 78 | tz = pytz.UTC 79 | date_column = pd.Series( 80 | [ 81 | datetime(2022, 1, 1, tzinfo=tz), 82 | datetime(2022, 1, 2, tzinfo=tz), 83 | datetime(2022, 1, 3, tzinfo=tz), 84 | ] 85 | ) 86 | date_fmt = "%Y-%m-%d" 87 | 88 | self.assertTrue( 89 | validate_date_column(date_column, date_fmt).dtype == "datetime64[ns]" 90 | ) 91 | 92 | def test_validate_date_column_singapore_tz(self) -> None: 93 | tz = pytz.timezone("Singapore") 94 | date_column = pd.Series( 95 | [ 96 | datetime(2022, 1, 1, tzinfo=tz), 97 | datetime(2022, 1, 2, tzinfo=tz), 98 | datetime(2022, 1, 3, tzinfo=tz), 99 | ] 100 | ) 101 | date_fmt = "%Y-%m-%d" 102 | 103 | self.assertTrue( 104 | validate_date_column(date_column, date_fmt).dtype == "datetime64[ns]" 105 | ) 106 | --------------------------------------------------------------------------------