diff --git a/.gitignore b/.gitignore index b20694f..502f210 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ result_images # Sphinx documentation doc/_build/ .buildinfo +docs/source/_auto_examples/ # Jupyter Notebook .ipynb_checkpoints diff --git a/docs/source/_static/lw_logo.png b/docs/source/_static/lw_logo.png new file mode 100644 index 0000000..95dec4e Binary files /dev/null and b/docs/source/_static/lw_logo.png differ diff --git a/docs/source/conf.py b/docs/source/conf.py index b2357b5..45059e6 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -12,22 +12,70 @@ import os import sys +import warnings sys.path.insert(0, os.path.abspath('../..')) # -- Project information ----------------------------------------------------- project = 'pyhydrophone' -copyright = '2020, Clea Parcerisas' +copyright = '2023, Clea Parcerisas' author = 'Clea Parcerisas' +# The full version, including alpha/beta/rc tags +# pypam_version = SourceFileLoader('pyhydrophone.version', +# '../pyhydrophone/version.py').load_module() + +# release = pyhydrophone_version.__version__ +# version = pyhydrophone_version.__version__ +release = '0.1.6' +version = '0.1.6' + # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx.ext.napoleon'] +extensions = ['sphinx.ext.autodoc', # Core Sphinx library for auto html doc generation from docstrings + 'sphinx.ext.autosummary', # Create neat summary tables for modules/classes/methods etc + 'sphinx.ext.intersphinx', # Link to other project's documentation (see mapping below) + 'sphinx.ext.viewcode', # Add a link to the Python source code for classes, functions etc. + # 'sphinx_autodoc_typehints', # Automatically document param types (less noise in class signature) + 'sphinx.ext.githubpages', + 'numpydoc', # docstring examples + 'sphinx.ext.autosectionlabel', + 'sphinx_gallery.gen_gallery', + ] + + +html4_writer = True +autosummary_generate = True + +# -- Example Gallery -- +sphinx_gallery_conf = { + 'examples_dirs': '../../examples', # path to your example scripts + 'gallery_dirs': '_auto_examples', # path to where to save gallery generated output, + 'capture_repr': (), + # define which output is captured https://sphinx-gallery.github.io/stable/configuration.html#capture-repr + 'ignore_repr_types': r'matplotlib[text, axes]', +} +warnings.filterwarnings("ignore", category=UserWarning, + message='Matplotlib is currently using agg, which is a' + ' non-GUI backend, so cannot show the figure.') + +numpydoc_show_class_members = False + +# Mappings for sphinx.ext.intersphinx. Projects have to have Sphinx-generated doc! (.inv file) +intersphinx_mapping = { + "python": ("https://docs.python.org/3/", None), +} + +autosummary_generate = True # Turn on sphinx.ext.autosummary +autoclass_content = "both" # Add __init__ doc (ie. params) to class summaries +# html_show_sourcelink = False # Remove 'view source code' from top of page (for html, not python) +autodoc_inherit_docstrings = True # If no class summary, inherit base class summary + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -35,19 +83,24 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # -- Options for HTML output ------------------------------------------------- +import sphinx_rtd_theme # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -# -html_theme = 'alabaster' +html_theme = 'sphinx_rtd_theme' +html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -# html_static_path = ['_static'] +html_static_path = ['_static'] -master_doc = 'contents' +# If false, no module index is generated. +html_domain_indices = True +# If false, no index is generated. +html_use_index = True +html_use_modindex = True diff --git a/docs/source/contents.rst b/docs/source/contents.rst deleted file mode 100644 index 2a00ccb..0000000 --- a/docs/source/contents.rst +++ /dev/null @@ -1,36 +0,0 @@ -pyhydrophone |version| -====================== - -Description ------------ -pyhydrophone helps keeping together all the information of the recorder. -It makes it easier to read different hydrophones' output files and extract the information. - -Each class represents a different hydrophone. The available ones now are (others will be added): - -* SoundTrap (OceanInstruments) -* Seiche (Seiche) -* AMAR (JASCO) -* RESEA (RTSys) -* uPAM (Seiche) -* EARS -* MTE AURAL (MTE) - - -They all inherit from the main class Hydrophone. -If a certain recorder provides an output different than a regular wav file, functions to read and understand the output -are provided. -Functions to read the metadata are also provided (which is often encoded in the file name). - - -.. toctree:: - :maxdepth: 1 - :caption: Hydrophone objects - - Data Structures - - -Contact ------------- - -For any questions please relate to clea.parcerisas@vliz.be diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..ca00670 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,73 @@ +pyhydrophone |version| +====================== + +Description +----------- +pyhydrophone helps keeping together all the information of the recorder. +It makes it easier to read different hydrophones' output files and extract the information. + +Each class represents a different hydrophone. The available ones now are (others will be added): + +* SoundTrap (OceanInstruments) +* Seiche (Seiche) +* AMAR (JASCO) +* RESEA (RTSys) +* uPAM (Seiche) +* EARS +* MTE AURAL (MTE) + + +They all inherit from the main class Hydrophone. +If a certain recorder provides an output different than a regular wav file, functions to read and understand the output +are provided. +Functions to read the metadata are also provided (which is often encoded in the file name). + + +.. toctree:: + :maxdepth: 1 + :caption: Getting Started + + install + quickstart + +.. toctree:: + :caption: Hydrophone objects + :maxdepth: 1 + + data_structures + +.. toctree:: + :maxdepth: 2 + :caption: Example Gallery + + _auto_examples/index + + +Citing pyhydrophone +~~~~~~~~~~~~~~~~~~~ + +.. note:: + If you find this package useful in your research, we would appreciate citations to: + +Parcerisas (2023). lifewatch/pyhydrophone: A package to deal with hydrophone data. Zenodo. +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7588428.svg)](https://doi.org/10.5281/zenodo.7588428) + + + + +About the project +~~~~~~~~~~~~~~~~~ +This project has been funded by `LifeWatch Belgium `_. + +.. image:: _static/lw_logo.png + + +For any questions please relate to clea.parcerisas@vliz.be + + +Indices and tables +~~~~~~~~~~~~~~~~~~ + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` \ No newline at end of file diff --git a/docs/source/install.rst b/docs/source/install.rst new file mode 100644 index 0000000..0a9fd02 --- /dev/null +++ b/docs/source/install.rst @@ -0,0 +1,34 @@ +.. currentmodule:: pyhydrophone + +Install +======= + +Using pip distribution +---------------------- +.. code-block:: + + pip install pyhydrophone + + +Using git clone +--------------- + +1. Clone the package + +.. code-block:: + + git clone https://github.com/lifewatch/pyhydrophone.git + + +2. Use poetry to install the project dependencies + +.. code-block:: + + poetry install + + +3. Build the project + +.. code-block:: + + poetry build diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst new file mode 100644 index 0000000..ccc4116 --- /dev/null +++ b/docs/source/quickstart.rst @@ -0,0 +1,58 @@ +.. currentmodule:: pyhydrophone + +Introduction to pyhydrophone +============================ + +Passive acoustics monitoring is becoming more and more popular in marine environments. +Therefore, more and more underwater acoustic recorders can be found in the market. However, the output they give is not +standardized and each of them usually needs an if statement. +pyhydrophone is thus thought as a package which can be used in data analysis pipelines or scripts without having to +change the way the metadata is read for a different recorder. + +First, an object is created to represent a hydrophone with all its metadata:: + + import pyhydrophone as pyhy + + # SoundTrap + model = 'SoundTrap 300 STD' + name = 'SoundTrap' + serial_number = 67416073 + soundtrap = pyhy.soundtrap.SoundTrap(name=name, model=model, serial_number=serial_number) + + +Then this object can be used in a pipeline in a way such as:: + + wav_path = 'tests/test_data/soundtrap/67416073.210610033655.wav' + start_datetime_of_wav = soundtrap.get_name_datetime(wav_path) + + +It can also be used to for calibration:: + + import soundfile as sf + import numpy as np + + wav = sf.read(wav_path) + rms_db = 10 * np.log10(np.mean(wav**2)) + rms_db_upa = rms_db + soundtrap.end_to_end_calibration() + + +If you have a frequency dependent calibration file, it can also be used:: + + import scipy.signal as sig + + rtsys_name = 'RTSys' + rtsys_model = 'RESEA320' + rtsys_serial_number = 2003001 + rtsys_sens = -180 + rtsys_preamp = 0 + rtsys_vpp = 5 + mode = 'lowpower' + calibration_file = pathlib.Path("tests/test_data/rtsys/SN130.csv") + rtsys = pyhy.RTSys(name=rtsys_name, model=rtsys_model, serial_number=rtsys_serial_number, sensitivity=rtsys_sens,preamp_gain=rtsys_preamp, Vpp=rtsys_vpp, mode=mode, calibration_file=calibration_file) + + wav_path = 'tests/test_data/rtsys/channelA_2021-10-11_13-11-09.wav' + wav, fs = sf.read(wav_path) + frequencies, spectrum = sig.welch(wav) + frequency_increment = rtsys.freq_cal_inc(frequencies) + print(df) + diff --git a/examples/README.rst b/examples/README.rst new file mode 100644 index 0000000..da84b06 --- /dev/null +++ b/examples/README.rst @@ -0,0 +1,4 @@ +Example gallery +=============== + +This gallery is intended to present examples on how to use pyhydrophone. \ No newline at end of file diff --git a/examples/init_hydro.py b/examples/init_hydro.py index b20179c..52f42bf 100644 --- a/examples/init_hydro.py +++ b/examples/init_hydro.py @@ -1,80 +1,78 @@ """ +General hydrophone initialization +================================= + An example of how to use the classes """ import pyhydrophone as pyhy -import pyhydrophone.soundtrap Vpp = 2.0 -def main(): - # Hydrophone Setup - model = 1 - name = 'SoundTrap' - serial_number = 67416073 - - st = pyhy.SoundTrap(name, model, serial_number) - # Hydrophone Setup - sensitivity = -199.0 - preamp_gain = 1 - model = 1 - mems_sensitivity = -199.0 - name = 'AmarG3' - Vpp = 2 +# Hydrophone Setup +model = 1 +name = 'SoundTrap' +serial_number = 67416073 - am = pyhy.AmarG3(name, model, sensitivity, preamp_gain, mems_sensitivity, Vpp) +st = pyhy.SoundTrap(name, model, serial_number) - uaural = pyhy.uAural(sensitivity=-180, name='uAural', model='RX', serial_number=1, preamp_gain=12, Vpp=2.0) +# Hydrophone Setup +sensitivity = -199.0 +preamp_gain = 1 +model = 1 +mems_sensitivity = -199.0 +name = 'AmarG3' +Vpp = 2 - bk_model = 'Nexus' - bk_name = 'B&K' - preamp_gain = -170 - bk_Vpp = 2.0 - bk_test = pyhy.BruelKjaer(name=bk_name, model=bk_model, preamp_gain=preamp_gain, Vpp=bk_Vpp, serial_number=1, - type_signal='test') - bk_ref = pyhy.BruelKjaer(name=bk_name, model=bk_model, preamp_gain=preamp_gain, Vpp=bk_Vpp, serial_number=1, - type_signal='ref') +am = pyhy.AmarG3(name, model, sensitivity, preamp_gain, mems_sensitivity, Vpp) - upam_model = 'uPam' - upam_name = 'Seiche' - upam_serial_number = 'SM7213' - upam_sensitivity = -196.0 - upam_preamp_gain = 0.0 - upam_Vpp = 20.0 - upam = pyhy.uPam(name=upam_name, model=upam_name, serial_number=upam_serial_number, - sensitivity=upam_sensitivity, - preamp_gain=upam_preamp_gain, Vpp=upam_Vpp) +uaural = pyhy.uAural(sensitivity=-180, name='uAural', model='RX', serial_number=1, preamp_gain=12, Vpp=2.0) - aural_name = 'Aural' - aural_model = 'M2' - aural_serial_number = 0 - aural_sensitivity = -164.0 - aural_preamp_gain = 16.0 - aural_Vpp = 2.0 - aural = pyhy.MTE(name=aural_name, model=aural_model, serial_number=aural_serial_number, - sensitivity=aural_sensitivity, - preamp_gain=aural_preamp_gain, Vpp=aural_Vpp, string_format='%y%m%d_%H%M%S') +bk_model = 'Nexus' +bk_name = 'B&K' +preamp_gain = -170 +bk_Vpp = 2.0 +bk_test = pyhy.BruelKjaer(name=bk_name, model=bk_model, preamp_gain=preamp_gain, Vpp=bk_Vpp, serial_number=1, + type_signal='test') +bk_ref = pyhy.BruelKjaer(name=bk_name, model=bk_model, preamp_gain=preamp_gain, Vpp=bk_Vpp, serial_number=1, + type_signal='ref') - rtsys_name = 'RTSys' - rtsys_model = 'RESEA320' - rtsys_sensitivity = -180 - rtsys_preamp_gain = 0 - rtsys_Vpp = 2.0 - serial_number = 3 - rtsys = pyhy.RTSys(name=rtsys_name, model=rtsys_model, serial_number=serial_number, - sensitivity=rtsys_sensitivity, - preamp_gain=rtsys_preamp_gain, Vpp=rtsys_Vpp, mode='lowpower', channel='A') +upam_model = 'uPam' +upam_name = 'Seiche' +upam_serial_number = 'SM7213' +upam_sensitivity = -196.0 +upam_preamp_gain = 0.0 +upam_Vpp = 20.0 +upam = pyhy.uPam(name=upam_name, model=upam_name, serial_number=upam_serial_number, + sensitivity=upam_sensitivity, + preamp_gain=upam_preamp_gain, Vpp=upam_Vpp) - icListen_name = 'icListen' - icListen_model = 0 - icListen_serial_number = 0 - icListen_sensitivity = -178 - icListen_Vpp = 6 - icListen_preamp_gain = 0 - icListen = pyhy.icListen(name=icListen_name, model=icListen_model, serial_number=icListen_serial_number, - sensitivity=icListen_sensitivity, preamp_gain=icListen_preamp_gain, Vpp=icListen_Vpp) +aural_name = 'Aural' +aural_model = 'M2' +aural_serial_number = 0 +aural_sensitivity = -164.0 +aural_preamp_gain = 16.0 +aural_Vpp = 2.0 +aural = pyhy.MTE(name=aural_name, model=aural_model, serial_number=aural_serial_number, + sensitivity=aural_sensitivity, + preamp_gain=aural_preamp_gain, Vpp=aural_Vpp, string_format='%y%m%d_%H%M%S') +rtsys_name = 'RTSys' +rtsys_model = 'RESEA320' +rtsys_sensitivity = -180 +rtsys_preamp_gain = 0 +rtsys_Vpp = 2.0 +serial_number = 3 +rtsys = pyhy.RTSys(name=rtsys_name, model=rtsys_model, serial_number=serial_number, + sensitivity=rtsys_sensitivity, + preamp_gain=rtsys_preamp_gain, Vpp=rtsys_Vpp, mode='lowpower', channel='A') -if __name__ == '__main__': - main() +icListen_name = 'icListen' +icListen_model = 0 +icListen_serial_number = 0 +icListen_sensitivity = -178 +icListen_Vpp = 6 +icListen_preamp_gain = 0 +icListen = pyhy.icListen(name=icListen_name, model=icListen_model, serial_number=icListen_serial_number, + sensitivity=icListen_sensitivity, preamp_gain=icListen_preamp_gain, Vpp=icListen_Vpp) diff --git a/examples/plot_freq_calibration.py b/examples/plot_freq_calibration.py new file mode 100644 index 0000000..4050689 --- /dev/null +++ b/examples/plot_freq_calibration.py @@ -0,0 +1,46 @@ +""" +Frequency-dependent calibration +=============================== + +An example of how to use the frequency-dependent calibration functionality +""" + +import scipy.signal as sig +import pathlib +import pyhydrophone as pyhy +import soundfile as sf +import numpy as np +import matplotlib.pyplot as plt + +rtsys_name = 'RTSys' +rtsys_model = 'RESEA320' +rtsys_serial_number = 2003001 +rtsys_sens = -180 +rtsys_preamp = 0 +rtsys_vpp = 5 +mode = 'lowpower' +calibration_file = pathlib.Path("./../tests/test_data/rtsys/SN130.csv") +rtsys = pyhy.RTSys(name=rtsys_name, model=rtsys_model, serial_number=rtsys_serial_number, sensitivity=rtsys_sens, + preamp_gain=rtsys_preamp, Vpp=rtsys_vpp, mode=mode, calibration_file=calibration_file) + +wav_path = './../tests/test_data/rtsys/channelA_2021-10-11_13-11-09.wav' +wav, fs = sf.read(wav_path) +frequencies, spectrum = sig.welch(wav, nfft=1024, scaling='density', fs=fs) +spectrum_db = 10 * np.log10(spectrum) +spectrum_db_upa = spectrum_db + rtsys.end_to_end_calibration() +frequency_increment = rtsys.freq_cal_inc(frequencies) +spectrum_db_upa_corrected = spectrum_db_upa + frequency_increment['inc_value'] + +plt.figure() +rtsys.freq_cal.plot('frequency', 'sensitivity') +plt.ylabel('sensitivity [db re 1V/upa]') +plt.title('Sensitivity of the RTSys hydrophone') +plt.show() + +plt.figure() +plt.plot(frequencies, spectrum_db_upa, label='not corrected') +plt.plot(frequencies, spectrum_db_upa_corrected, label='corrected') +plt.legend() +plt.ylabel('Spectrum density [db re 1 upa**2/Hz]') +plt.xlabel('Frequency [Hz]') +plt.show() diff --git a/examples/rtsys_example.py b/examples/rtsys_example.py index e7cc516..3ccc5b5 100644 --- a/examples/rtsys_example.py +++ b/examples/rtsys_example.py @@ -1,29 +1,24 @@ """ -An example of how to use the class RTSys -""" -import argparse -import pyhydrophone as pyhy +RTSys extra functions +===================== -Vpp = 2.0 +An example of how to use the class RTSys to check the board files after a deployment +""" +import pyhydrophone as pyhy -def main(filepath): - # Hydrophone Setup - sensitivity = -180 - preamp_gain = 0 - model = 1 - serial_number = 1000 - name = 'RESEA320' - mode = 'lowpower' +Vpp = 5.0 - rtsys = pyhy.RTSys(name, model, serial_number, sensitivity, preamp_gain, Vpp, mode) - rtsys.plot_consumption_total_mission(mission_folder_path=filepath) - print('Total consumption', rtsys.compute_consumption_total_mission(mission_folder_path=filepath)) +# Hydrophone Setup +sensitivity = -180 +preamp_gain = 0 +model = 1 +serial_number = 1000 +name = 'RESEA320' +mode = 'lowpower' +folder_path = 'tests/test_data/rtsys/' -if __name__ == '__main__': - parser = argparse.ArgumentParser(description='Plot the power consumption of the mission folder') - parser.add_argument('board_path', type=str, nargs='+', help='Path to the mission folder') - args = parser.parse_args() - board_path = args.board_path[1] - main(board_path) +rtsys = pyhy.RTSys(name, model, serial_number, sensitivity, preamp_gain, Vpp, mode) +rtsys.plot_consumption_total_mission(mission_folder_path=folder_path) +print('Total consumption', rtsys.compute_consumption_total_mission(mission_folder_path=folder_path)) diff --git a/examples/soundtrap_hf.py b/examples/soundtrap_hf.py index 7b1c731..c89e0ec 100644 --- a/examples/soundtrap_hf.py +++ b/examples/soundtrap_hf.py @@ -1,3 +1,10 @@ +""" +SoundTrap High Frequency with click detector +============================================= + +This script is an example to compute temporal features and third octave levels on an Acoustic Survey +""" + import pyhydrophone as pyhy # Sound Files @@ -12,11 +19,9 @@ Vpp = 2 hydrophone = pyhy.SoundTrapHF(name, model, serial_number, Vpp) - -if __name__ == "__main__": - """ - Detect clicks on sound data - """ - # Convert the sound clips to click and save - clicks_df = hydrophone.read_HFclicks(sound_folder_path) - clicks_df.to_pickle(clicks_output_path) \ No newline at end of file +""" +Detect clicks on sound data +""" +# Convert the sound clips to click and save +clicks_df = hydrophone.read_HFclicks(sound_folder_path) +clicks_df.to_pickle(clicks_output_path) diff --git a/poetry.lock b/poetry.lock index d3d91a3..45ba9cb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -207,6 +207,64 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "contourpy" +version = "1.1.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, + {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, + {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, + {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, + {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, + {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, + {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, +] + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] + [[package]] name = "coverage" version = "7.2.7" @@ -282,6 +340,17 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] +[[package]] +name = "cycler" +version = "0.11.0" +description = "Composable style cycles" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] + [[package]] name = "docutils" version = "0.18.1" @@ -307,6 +376,63 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "fonttools" +version = "4.42.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.42.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9c456d1f23deff64ffc8b5b098718e149279abdea4d8692dba69172fb6a0d597"}, + {file = "fonttools-4.42.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:150122ed93127a26bc3670ebab7e2add1e0983d30927733aec327ebf4255b072"}, + {file = "fonttools-4.42.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48e82d776d2e93f88ca56567509d102266e7ab2fb707a0326f032fe657335238"}, + {file = "fonttools-4.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58c1165f9b2662645de9b19a8c8bdd636b36294ccc07e1b0163856b74f10bafc"}, + {file = "fonttools-4.42.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d6dc3fa91414ff4daa195c05f946e6a575bd214821e26d17ca50f74b35b0fe4"}, + {file = "fonttools-4.42.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fae4e801b774cc62cecf4a57b1eae4097903fced00c608d9e2bc8f84cd87b54a"}, + {file = "fonttools-4.42.0-cp310-cp310-win32.whl", hash = "sha256:b8600ae7dce6ec3ddfb201abb98c9d53abbf8064d7ac0c8a0d8925e722ccf2a0"}, + {file = "fonttools-4.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:57b68eab183fafac7cd7d464a7bfa0fcd4edf6c67837d14fb09c1c20516cf20b"}, + {file = "fonttools-4.42.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0a1466713e54bdbf5521f2f73eebfe727a528905ff5ec63cda40961b4b1eea95"}, + {file = "fonttools-4.42.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3fb2a69870bfe143ec20b039a1c8009e149dd7780dd89554cc8a11f79e5de86b"}, + {file = "fonttools-4.42.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae881e484702efdb6cf756462622de81d4414c454edfd950b137e9a7352b3cb9"}, + {file = "fonttools-4.42.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27ec3246a088555629f9f0902f7412220c67340553ca91eb540cf247aacb1983"}, + {file = "fonttools-4.42.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ece1886d12bb36c48c00b2031518877f41abae317e3a55620d38e307d799b7e"}, + {file = "fonttools-4.42.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:10dac980f2b975ef74532e2a94bb00e97a95b4595fb7f98db493c474d5f54d0e"}, + {file = "fonttools-4.42.0-cp311-cp311-win32.whl", hash = "sha256:83b98be5d291e08501bd4fc0c4e0f8e6e05b99f3924068b17c5c9972af6fff84"}, + {file = "fonttools-4.42.0-cp311-cp311-win_amd64.whl", hash = "sha256:e35bed436726194c5e6e094fdfb423fb7afaa0211199f9d245e59e11118c576c"}, + {file = "fonttools-4.42.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c36c904ce0322df01e590ba814d5d69e084e985d7e4c2869378671d79662a7d4"}, + {file = "fonttools-4.42.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d54e600a2bcfa5cdaa860237765c01804a03b08404d6affcd92942fa7315ffba"}, + {file = "fonttools-4.42.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01cfe02416b6d416c5c8d15e30315cbcd3e97d1b50d3b34b0ce59f742ef55258"}, + {file = "fonttools-4.42.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f81ed9065b4bd3f4f3ce8e4873cd6a6b3f4e92b1eddefde35d332c6f414acc3"}, + {file = "fonttools-4.42.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:685a4dd6cf31593b50d6d441feb7781a4a7ef61e19551463e14ed7c527b86f9f"}, + {file = "fonttools-4.42.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:329341ba3d86a36e482610db56b30705384cb23bd595eac8cbb045f627778e9d"}, + {file = "fonttools-4.42.0-cp38-cp38-win32.whl", hash = "sha256:4655c480a1a4d706152ff54f20e20cf7609084016f1df3851cce67cef768f40a"}, + {file = "fonttools-4.42.0-cp38-cp38-win_amd64.whl", hash = "sha256:6bd7e4777bff1dcb7c4eff4786998422770f3bfbef8be401c5332895517ba3fa"}, + {file = "fonttools-4.42.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9b55d2a3b360e0c7fc5bd8badf1503ca1c11dd3a1cd20f2c26787ffa145a9c7"}, + {file = "fonttools-4.42.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0df8ef75ba5791e873c9eac2262196497525e3f07699a2576d3ab9ddf41cb619"}, + {file = "fonttools-4.42.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd2363ea7728496827658682d049ffb2e98525e2247ca64554864a8cc945568"}, + {file = "fonttools-4.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40673b2e927f7cd0819c6f04489dfbeb337b4a7b10fc633c89bf4f34ecb9620"}, + {file = "fonttools-4.42.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c8bf88f9e3ce347c716921804ef3a8330cb128284eb6c0b6c4b3574f3c580023"}, + {file = "fonttools-4.42.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:703101eb0490fae32baf385385d47787b73d9ea55253df43b487c89ec767e0d7"}, + {file = "fonttools-4.42.0-cp39-cp39-win32.whl", hash = "sha256:f0290ea7f9945174bd4dfd66e96149037441eb2008f3649094f056201d99e293"}, + {file = "fonttools-4.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae7df0ae9ee2f3f7676b0ff6f4ebe48ad0acaeeeaa0b6839d15dbf0709f2c5ef"}, + {file = "fonttools-4.42.0-py3-none-any.whl", hash = "sha256:dfe7fa7e607f7e8b58d0c32501a3a7cac148538300626d1b930082c90ae7f6bd"}, + {file = "fonttools-4.42.0.tar.gz", hash = "sha256:614b1283dca88effd20ee48160518e6de275ce9b5456a3134d5f235523fc5065"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + [[package]] name = "idna" version = "3.4" @@ -348,6 +474,24 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +[[package]] +name = "importlib-resources" +version = "6.0.1" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -376,6 +520,83 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "kiwisolver" +version = "1.4.4" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, + {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, +] + [[package]] name = "markupsafe" version = "2.1.3" @@ -435,6 +656,68 @@ files = [ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] +[[package]] +name = "matplotlib" +version = "3.7.2" +description = "Python plotting package" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:2699f7e73a76d4c110f4f25be9d2496d6ab4f17345307738557d345f099e07de"}, + {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a8035ba590658bae7562786c9cc6ea1a84aa49d3afab157e414c9e2ea74f496d"}, + {file = "matplotlib-3.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f8e4a49493add46ad4a8c92f63e19d548b2b6ebbed75c6b4c7f46f57d36cdd1"}, + {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71667eb2ccca4c3537d9414b1bc00554cb7f91527c17ee4ec38027201f8f1603"}, + {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:152ee0b569a37630d8628534c628456b28686e085d51394da6b71ef84c4da201"}, + {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070f8dddd1f5939e60aacb8fa08f19551f4b0140fab16a3669d5cd6e9cb28fc8"}, + {file = "matplotlib-3.7.2-cp310-cp310-win32.whl", hash = "sha256:fdbb46fad4fb47443b5b8ac76904b2e7a66556844f33370861b4788db0f8816a"}, + {file = "matplotlib-3.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:23fb1750934e5f0128f9423db27c474aa32534cec21f7b2153262b066a581fd1"}, + {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:30e1409b857aa8a747c5d4f85f63a79e479835f8dffc52992ac1f3f25837b544"}, + {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:50e0a55ec74bf2d7a0ebf50ac580a209582c2dd0f7ab51bc270f1b4a0027454e"}, + {file = "matplotlib-3.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac60daa1dc83e8821eed155796b0f7888b6b916cf61d620a4ddd8200ac70cd64"}, + {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305e3da477dc8607336ba10bac96986d6308d614706cae2efe7d3ffa60465b24"}, + {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c308b255efb9b06b23874236ec0f10f026673ad6515f602027cc8ac7805352d"}, + {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60c521e21031632aa0d87ca5ba0c1c05f3daacadb34c093585a0be6780f698e4"}, + {file = "matplotlib-3.7.2-cp311-cp311-win32.whl", hash = "sha256:26bede320d77e469fdf1bde212de0ec889169b04f7f1179b8930d66f82b30cbc"}, + {file = "matplotlib-3.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4860132c8c05261a5f5f8467f1b269bf1c7c23902d75f2be57c4a7f2394b3e"}, + {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:a1733b8e84e7e40a9853e505fe68cc54339f97273bdfe6f3ed980095f769ddc7"}, + {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d9881356dc48e58910c53af82b57183879129fa30492be69058c5b0d9fddf391"}, + {file = "matplotlib-3.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f081c03f413f59390a80b3e351cc2b2ea0205839714dbc364519bcf51f4b56ca"}, + {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cd120fca3407a225168238b790bd5c528f0fafde6172b140a2f3ab7a4ea63e9"}, + {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c1590b90aa7bd741b54c62b78de05d4186271e34e2377e0289d943b3522273"}, + {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d2ff3c984b8a569bc1383cd468fc06b70d7b59d5c2854ca39f1436ae8394117"}, + {file = "matplotlib-3.7.2-cp38-cp38-win32.whl", hash = "sha256:5dea00b62d28654b71ca92463656d80646675628d0828e08a5f3b57e12869e13"}, + {file = "matplotlib-3.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f506a1776ee94f9e131af1ac6efa6e5bc7cb606a3e389b0ccb6e657f60bb676"}, + {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6515e878f91894c2e4340d81f0911857998ccaf04dbc1bba781e3d89cbf70608"}, + {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:71f7a8c6b124e904db550f5b9fe483d28b896d4135e45c4ea381ad3b8a0e3256"}, + {file = "matplotlib-3.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12f01b92ecd518e0697da4d97d163b2b3aa55eb3eb4e2c98235b3396d7dad55f"}, + {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7e28d6396563955f7af437894a36bf2b279462239a41028323e04b85179058b"}, + {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbcf59334ff645e6a67cd5f78b4b2cdb76384cdf587fa0d2dc85f634a72e1a3e"}, + {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:318c89edde72ff95d8df67d82aca03861240512994a597a435a1011ba18dbc7f"}, + {file = "matplotlib-3.7.2-cp39-cp39-win32.whl", hash = "sha256:ce55289d5659b5b12b3db4dc9b7075b70cef5631e56530f14b2945e8836f2d20"}, + {file = "matplotlib-3.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:2ecb5be2b2815431c81dc115667e33da0f5a1bcf6143980d180d09a717c4a12e"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdcd28360dbb6203fb5219b1a5658df226ac9bebc2542a9e8f457de959d713d0"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3cca3e842b11b55b52c6fb8bd6a4088693829acbfcdb3e815fa9b7d5c92c1b"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf577c7a6744e9e1bd3fee45fc74a02710b214f94e2bde344912d85e0c9af7c"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:936bba394682049919dda062d33435b3be211dc3dcaa011e09634f060ec878b2"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bc221ffbc2150458b1cd71cdd9ddd5bb37962b036e41b8be258280b5b01da1dd"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35d74ebdb3f71f112b36c2629cf32323adfbf42679e2751252acd468f5001c07"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717157e61b3a71d3d26ad4e1770dc85156c9af435659a25ee6407dc866cb258d"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f844d6be031948148ba49605c8b96dfe7d3711d1b63592830d650622458c11"}, + {file = "matplotlib-3.7.2.tar.gz", hash = "sha256:a8cdb91dddb04436bd2f098b8fdf4b81352e68cf4d2c6756fcc414791076569b"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.0.1" +numpy = ">=1.20" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1,<3.1" +python-dateutil = ">=2.7" + [[package]] name = "numpy" version = "1.24.4" @@ -568,6 +851,75 @@ sql-other = ["SQLAlchemy (>=1.4.16)"] test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.6.3)"] +[[package]] +name = "pillow" +version = "10.0.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, + {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, + {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, + {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, + {file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, + {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, + {file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, + {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, + {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, + {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "pluggy" version = "1.2.0" @@ -608,6 +960,20 @@ files = [ [package.extras] plugins = ["importlib-metadata"] +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pytest" version = "7.4.0" @@ -1068,4 +1434,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8, <3.12.0" -content-hash = "18d6de34dce9063a6d0ce60b9bdd589a3fa1a7659a549c974a40b69b25a829b0" +content-hash = "06e8b81b3f59ceb4b9ecf650e5d2fad861752251e142371bf53257e299dbcea0" diff --git a/pyhydrophone/amar.py b/pyhydrophone/amar.py index 8826f3a..7e6a6bf 100644 --- a/pyhydrophone/amar.py +++ b/pyhydrophone/amar.py @@ -10,6 +10,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, st calibration_file=None, **kwargs): """ Init an instance of AMARG3 + Parameters ---------- name: str @@ -35,6 +36,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, st def get_name_datetime(self, file_name): """ Get the data and time of recording from the name of the file + Parameters ---------- file_name : string @@ -48,6 +50,7 @@ def get_name_datetime(self, file_name): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string @@ -67,6 +70,7 @@ class AmarG3MEMS(AmarG3): def __init__(self, name, model, serial_number, hydroph_sensitivity, preamp_gain, mems_sensitivity, Vpp): """ Add the MEMS specs + Parameters ---------- name: str diff --git a/pyhydrophone/bruelkjaer.py b/pyhydrophone/bruelkjaer.py index 734ff27..8011cd9 100644 --- a/pyhydrophone/bruelkjaer.py +++ b/pyhydrophone/bruelkjaer.py @@ -16,6 +16,7 @@ class BruelKjaer(Hydrophone): """ Init an instance of B&K Nexus. Check well the Vpp in case you don't have a reference signal! Specially of the recorder used. + Parameters ---------- name: str @@ -63,6 +64,7 @@ def __setattr__(self, name, value): def get_name_datetime(self, file_name): """ Get the data and time of recording from the name of the file + Parameters ---------- file_name : string @@ -76,6 +78,7 @@ def get_name_datetime(self, file_name): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string @@ -93,6 +96,7 @@ def get_new_name(self, filename, new_date): def read_start_time_metadata(self, file_path): """ Return the starting time of the file by getting the last modification minus the duration of the file + Parameters ---------- file_path : string or Path @@ -111,6 +115,7 @@ def read_start_time_metadata(self, file_path): def update_calibration(self, ref_signal): """ Update the calibration + Parameters ---------- ref_signal : str or Path @@ -130,6 +135,7 @@ def calibrate(self, file_path): """ Find the beginning and ending sample of the calibration tone Returns start and end points, in seconds + Parameters ---------- file_path : string or Path @@ -164,4 +170,4 @@ def calibrate(self, file_path): self.update_calibration(first_part[start:end]) - return end \ No newline at end of file + return end diff --git a/pyhydrophone/ears.py b/pyhydrophone/ears.py index 3bf72e1..299ad82 100644 --- a/pyhydrophone/ears.py +++ b/pyhydrophone/ears.py @@ -9,6 +9,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, st calibration_file=None, **kwargs): """ Init an instance of EARs + Parameters ---------- name: str @@ -34,6 +35,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, st def get_name_datetime(self, file_name): """ Get the data and time of recording from the name of the file + Parameters ---------- file_name : string @@ -48,6 +50,7 @@ def get_name_datetime(self, file_name): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string diff --git a/pyhydrophone/hydrophone.py b/pyhydrophone/hydrophone.py index 72a5ced..9967d9b 100644 --- a/pyhydrophone/hydrophone.py +++ b/pyhydrophone/hydrophone.py @@ -53,6 +53,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, st def get_name_datetime(self, date_string): """ Read the name of the file and according to the hydrophone protocol get the date + Parameters ---------- date_string : string @@ -64,6 +65,7 @@ def get_name_datetime(self, date_string): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string @@ -115,6 +117,7 @@ def calibrate(self, file_path): """ Find the beginning and ending sample of the calibration tone Returns start and end points, in seconds + Parameters ---------- file_path : string or Path diff --git a/pyhydrophone/icListen.py b/pyhydrophone/icListen.py index 74e31a4..97d0c78 100644 --- a/pyhydrophone/icListen.py +++ b/pyhydrophone/icListen.py @@ -13,6 +13,7 @@ class icListen(Hydrophone): """ Init an instance of icListen + Parameters ---------- name: str @@ -40,6 +41,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, st def get_name_datetime(self, file_name): """ Get the data and time of recording from the name of the file + Parameters ---------- file_name : string @@ -54,6 +56,7 @@ def get_name_datetime(self, file_name): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string diff --git a/pyhydrophone/mte.py b/pyhydrophone/mte.py index 5514131..19ee628 100644 --- a/pyhydrophone/mte.py +++ b/pyhydrophone/mte.py @@ -7,6 +7,7 @@ class MTE(Hydrophone): """ Init an instance of Aural + Parameters ---------- name: str @@ -34,6 +35,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, st def get_name_datetime(self, file_name): """ Get the data and time of recording from the name of the file + Parameters ---------- file_name : string @@ -48,6 +50,7 @@ def get_name_datetime(self, file_name): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string @@ -60,4 +63,4 @@ def get_new_name(self, filename, new_date): new_date_name = datetime.strftime(new_date, "%Y%m%d_%H%M%S_%f") new_filename = filename.replace(old_date_name, new_date_name) - return new_filename \ No newline at end of file + return new_filename diff --git a/pyhydrophone/rtsys.py b/pyhydrophone/rtsys.py index b0ec346..e074388 100644 --- a/pyhydrophone/rtsys.py +++ b/pyhydrophone/rtsys.py @@ -18,6 +18,7 @@ class RTSys(Hydrophone): """ Init an instance of RTSys + Parameters ---------- name: str @@ -53,6 +54,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, mo def get_name_datetime(self, file_name): """ Get the data and time of recording from the name of the file + Parameters ---------- file_name : string @@ -67,6 +69,7 @@ def get_name_datetime(self, file_name): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string @@ -105,6 +108,7 @@ def _parse_board_file(board_file_path): def plot_consumption(self, board_file_path): """ Plot the consumption evolution from the board_file_path + Parameters ---------- board_file_path : str or Path @@ -132,6 +136,7 @@ def plot_consumption_total_mission(self, mission_folder_path, ax=None, show=True def compute_consumption(self, board_file_path): """ Calculate the total energy consumption of the file + Parameters ---------- board_file_path : str or Path @@ -147,6 +152,7 @@ def compute_consumption(self, board_file_path): def compute_consumption_total_mission(self, mission_folder_path): """ Calculate the total energy consumption of the file + Parameters ---------- mission_folder_path : str or Path @@ -168,11 +174,12 @@ def compute_consumption_total_mission(self, mission_folder_path): @staticmethod def read_header(file_path, zip_mode=False): """ - Return the parameters of the *.wav file's header as a dictionary + Return the parameters of the .wav file's header as a dictionary + Parameters ---------- file_path: Path or string - Path to the *.wav file to read the header from + Path to the .wav file to read the header from Returns ------- diff --git a/pyhydrophone/soundtrap.py b/pyhydrophone/soundtrap.py index 2633ebd..53af327 100644 --- a/pyhydrophone/soundtrap.py +++ b/pyhydrophone/soundtrap.py @@ -15,6 +15,7 @@ class SoundTrap(Hydrophone): """ Initialize a SoundTrap instance + Parameters ---------- name: str @@ -72,6 +73,7 @@ def __init__(self, name, model, serial_number, sensitivity=None, gain_type='High def read_file_specs(xmlfile_path, last_gain, date_format='%Y-%m-%dT%H:%M:%S'): """ Read the specs of the recording from the XML file and save them to the object + Parameters ---------- xmlfile_path : string or path @@ -114,6 +116,7 @@ def get_name_datetime(self, file_name): """ Get the data and time of recording from the name of the file Will convert the local in UTC. It assumes the localtime is the one from the computer + Parameters ---------- file_name : string @@ -128,6 +131,7 @@ def get_name_datetime(self, file_name): def get_xml_utc_datetime(file_path): """ Get the UTC datetime from the xml file + Parameters ---------- file_path : str or Path @@ -150,6 +154,7 @@ def get_xml_utc_datetime(file_path): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string @@ -175,6 +180,7 @@ class SoundTrapHF(SoundTrap): def __init__(self, name, model, serial_number, sensitivity=None, gain_type='High', string_format="%y%m%d%H%M%S"): """ Init a SoundTrap HF reader + Parameters ---------- name: str @@ -241,6 +247,7 @@ def read_HFfolder(self, main_folder_path, zip_mode=False, include_dirs=False): def read_HFclicks_file(self, wavfile_path, zip_mode=False): """ Read all the clicks stored in a folder with soundtrap files + Parameters ---------- wavfile_path: str @@ -279,6 +286,7 @@ def read_HFclicks_file(self, wavfile_path, zip_mode=False): def _read_HFclicks(self, bcl_path, dwv_path, xml_path): """ Read the clicks of one soundtrap file + Parameters ---------- bcl_path : str or Path diff --git a/pyhydrophone/uaural.py b/pyhydrophone/uaural.py index 3d6fae3..6829055 100644 --- a/pyhydrophone/uaural.py +++ b/pyhydrophone/uaural.py @@ -41,6 +41,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, st def get_name_datetime(self, file_name): """ Get the data and time of recording from the name of the file + Parameters ---------- file_name : string @@ -55,6 +56,7 @@ def get_name_datetime(self, file_name): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string diff --git a/pyhydrophone/upam.py b/pyhydrophone/upam.py index b3ab359..329070b 100644 --- a/pyhydrophone/upam.py +++ b/pyhydrophone/upam.py @@ -7,6 +7,7 @@ class uPam(Hydrophone): """ Init an instance of Seiche + Parameters ---------- name: str @@ -32,6 +33,7 @@ def __init__(self, name, model, serial_number, sensitivity, preamp_gain, Vpp, st def get_name_datetime(self, file_name): """ Get the data and time of recording from the name of the file + Parameters ---------- file_name : string @@ -46,6 +48,7 @@ def get_name_datetime(self, file_name): def get_new_name(self, filename, new_date): """ Replace the datetime with the appropriate one + Parameters ---------- filename : string diff --git a/pyproject.toml b/pyproject.toml index beb9cc5..c8c36f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,12 +20,16 @@ coverage = {version = "^7.2.5", optional = true} python-dotenv = {version = "^1.0.0", optional = true} pytest-cov = {version = "^4.1.0", optional = true} +[tool.poetry.group.docs] +optional = true [tool.poetry.group.docs.dependencies] sphinx = "6.1.2" numpydoc = "^1.5.0" sphinx-rtd-theme = "^1.2.2" sphinx-gallery = "^0.13.0" +pillow = "^10.0.0" +matplotlib = "^3.7.2" [build-system] requires = ["poetry>=0.12"]