├── .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 |
--------------------------------------------------------------------------------