If you have used FAVE before, please read
+usage/whats-new to familiarize yourself
+with the differences between the current and legacy versions of FAVE.
Work is ongoing to publish FAVE as a debian package, but no other package system is supported at the moment. If you would like to package FAVE for your system, please feel free to contribute!
+
Work is ongoing to publish FAVE as a debian package, but no other package system is supported at the moment. If you would like to package FAVE for your system, please feel free to contribute
diff --git a/docs/code/align/aligner.rst b/docs/code/align/aligner.md
similarity index 54%
rename from docs/code/align/aligner.rst
rename to docs/code/align/aligner.md
index 5b4e893..befa0e9 100644
--- a/docs/code/align/aligner.rst
+++ b/docs/code/align/aligner.md
@@ -1,5 +1,6 @@
-FAVE Aligner module
-===================
+# FAVE Aligner module
+```{eval-rst}
.. automodule:: fave.align.aligner
:members:
+```
diff --git a/docs/code/align/index.rst b/docs/code/align/index.md
similarity index 60%
rename from docs/code/align/index.rst
rename to docs/code/align/index.md
index 1d6255f..c60c483 100644
--- a/docs/code/align/index.rst
+++ b/docs/code/align/index.md
@@ -1,9 +1,9 @@
-FAVE Align module
-=================
+# FAVE Align module
The FAVE Align module contains classes for the manipulation of transcripts
and alignment objects. It contains two files.
-.. toctree::
- aligner
- transcriptprocessor
+```{toctree}
+aligner
+transcriptprocessor
+```
diff --git a/docs/code/align/transcriptprocessor.md b/docs/code/align/transcriptprocessor.md
new file mode 100644
index 0000000..b82360f
--- /dev/null
+++ b/docs/code/align/transcriptprocessor.md
@@ -0,0 +1,6 @@
+# FAVE TranscriptProcessor module
+
+```{eval-rst}
+.. automodule:: fave.align.transcriptprocessor
+ :members:
+```
diff --git a/docs/code/align/transcriptprocessor.rst b/docs/code/align/transcriptprocessor.rst
deleted file mode 100644
index d5a26ec..0000000
--- a/docs/code/align/transcriptprocessor.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-FAVE TranscriptProcessor module
-===============================
-
-.. automodule:: fave.align.transcriptprocessor
- :members:
diff --git a/docs/code/cmudictionary.md b/docs/code/cmudictionary.md
new file mode 100644
index 0000000..19d1898
--- /dev/null
+++ b/docs/code/cmudictionary.md
@@ -0,0 +1,6 @@
+# FAVE CMU Dictionary module
+
+```{eval-rst}
+.. automodule:: fave.cmudictionary
+ :members:
+```
diff --git a/docs/code/cmudictionary.rst b/docs/code/cmudictionary.rst
deleted file mode 100644
index ca74086..0000000
--- a/docs/code/cmudictionary.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-FAVE CMU Dictionary module
-==========================
-
-.. automodule:: fave.cmudictionary
- :members:
diff --git a/docs/code/extract/esps.rst b/docs/code/extract/esps.md
similarity index 51%
rename from docs/code/extract/esps.rst
rename to docs/code/extract/esps.md
index fb38b95..c54a1b7 100644
--- a/docs/code/extract/esps.rst
+++ b/docs/code/extract/esps.md
@@ -1,5 +1,6 @@
-FAVE esps module
-==========================
+# FAVE esps module
+```{eval-rst}
.. automodule:: fave.extract.esps
:members:
+```
diff --git a/docs/code/extract/index.rst b/docs/code/extract/index.md
similarity index 61%
rename from docs/code/extract/index.rst
rename to docs/code/extract/index.md
index af27ecd..10f3ffe 100644
--- a/docs/code/extract/index.rst
+++ b/docs/code/extract/index.md
@@ -1,12 +1,12 @@
-FAVE Extract module
-===================
+# FAVE Extract module
The FAVE Extract module contains functions and classes for extracting acoustic
measurements of vowels from aligned audio. It contains a number of files.
-.. toctree::
- esps
- mahalanobis
- plotnik
- remeasure
- vowel
+```{toctree}
+esps
+mahalanobis
+plotnik
+remeasure
+vowel
+```
diff --git a/docs/code/extract/mahalanobis.rst b/docs/code/extract/mahalanobis.md
similarity index 52%
rename from docs/code/extract/mahalanobis.rst
rename to docs/code/extract/mahalanobis.md
index 5ebc960..b37aa56 100644
--- a/docs/code/extract/mahalanobis.rst
+++ b/docs/code/extract/mahalanobis.md
@@ -1,5 +1,6 @@
-FAVE Mahalanobis module
-=======================
+# FAVE Mahalanobis module
+```{eval-rst}
.. automodule:: fave.extract.mahalanobis
:members:
+```
diff --git a/docs/code/extract/plotnik.rst b/docs/code/extract/plotnik.md
similarity index 55%
rename from docs/code/extract/plotnik.rst
rename to docs/code/extract/plotnik.md
index 2e58806..1b8d125 100644
--- a/docs/code/extract/plotnik.rst
+++ b/docs/code/extract/plotnik.md
@@ -1,5 +1,6 @@
-FAVE Plotnik module
-===================
+# FAVE Plotnik module
+```{eval-rst}
.. automodule:: fave.extract.plotnik
:members:
+```
diff --git a/docs/code/extract/remeasure.rst b/docs/code/extract/remeasure.md
similarity index 51%
rename from docs/code/extract/remeasure.rst
rename to docs/code/extract/remeasure.md
index 716c31f..b95fe91 100644
--- a/docs/code/extract/remeasure.rst
+++ b/docs/code/extract/remeasure.md
@@ -1,5 +1,6 @@
-FAVE Remeasure module
-==========================
+# FAVE Remeasure module
+```{eval-rst}
.. automodule:: fave.extract.remeasure
:members:
+```
diff --git a/docs/code/extract/vowel.rst b/docs/code/extract/vowel.md
similarity index 51%
rename from docs/code/extract/vowel.rst
rename to docs/code/extract/vowel.md
index 500cee6..49e4601 100644
--- a/docs/code/extract/vowel.rst
+++ b/docs/code/extract/vowel.md
@@ -1,5 +1,6 @@
-FAVE Vowel module
-==========================
+# FAVE Vowel module
+```{eval-rst}
.. automodule:: fave.extract.vowel
:members:
+```
diff --git a/docs/code/index.md b/docs/code/index.md
new file mode 100644
index 0000000..80a0b79
--- /dev/null
+++ b/docs/code/index.md
@@ -0,0 +1,10 @@
+# Module documentation
+
+This section documents the internals of FAVE. If you are a programmer who wants to use FAVE as a module in your scripts or would like to contribute to FAVE as a developer, these documents will be useful to you. End users will find the {doc}`usage <../usage/index>` section more helpful.
+
+```{toctree}
+fave.align
+fave.extract
+fave.cmudictionary
+fave.praat
+```
diff --git a/docs/code/index.rst b/docs/code/index.rst
deleted file mode 100644
index 0354d5a..0000000
--- a/docs/code/index.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-Module documentation
-====================
-
-This section documents the internals of FAVE. If you are a programmer who wants to use FAVE as a module in your scripts or would like to contribute to FAVE as a developer, these documents will be useful to you. End users will find the :doc:`usage <../usage/index>` section more helpful.
-
-.. toctree::
- fave.align
- fave.extract
- fave.cmudictionary
- fave.praat
diff --git a/docs/code/praat.rst b/docs/code/praat.md
similarity index 51%
rename from docs/code/praat.rst
rename to docs/code/praat.md
index 8cb3b87..069e77c 100644
--- a/docs/code/praat.rst
+++ b/docs/code/praat.md
@@ -1,5 +1,6 @@
-FAVE Praat module
-=================
+# FAVE Praat module
+```{eval-rst}
.. automodule:: fave.praat
:members:
+```
diff --git a/docs/conf.py b/docs/conf.py
index 9fd2a62..255e028 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -57,7 +57,7 @@
# 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.napoleon']
+extensions = ['sphinx.ext.autodoc','sphinx.ext.napoleon', "myst_parser"]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000..98de552
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,29 @@
+# Forced Alignment and Vowel Extraction (FAVE)
+
+This website documents the FAVE software, version 2.
+
+```{warning}
+If you have used FAVE before, please read
+[usage/whats-new](usage/whats-new.rst) to familiarize yourself
+with the differences between the current and legacy versions of FAVE.
+```
+
+
+## Guides and documentation
+
+### For Users
+
+```{toctree} maxdepth: 2
+usage/index
+```
+
+### For Developers
+
+```{toctree} maxdepth: 2
+code/index
+```
+
+
+
diff --git a/docs/index.rst b/docs/index.rst
deleted file mode 100644
index c4fe4d0..0000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,27 +0,0 @@
-.. Forced Alignment and Vowel Extraction documentation master file, created by
- sphinx-quickstart on Thu May 14 23:03:08 2020.
- You can adapt this file completely to your liking, but it should at least
- contain the root `toctree` directive.
-
-Forced Alignment and Vowel Extraction (FAVE)
-============================================
-
-This website documents the FAVE software, version 2.
-
-.. warning::
- If you have used FAVE before, please read :doc:`usage/whats-new` to familiarize yourself with the differences between the current and legacy versions of FAVE.
-
-Guides and documentation
-------------------------
-.. toctree::
- :maxdepth: 2
-
- usage/index
- code/index
-
-Indices
--------
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 27ef656..da3fba6 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,2 +1,3 @@
jinja2==3.0.0
sphinx-pyproject==0.1.0
+myst-parser~=0.18
diff --git a/docs/usage/cli_startup/cli_setup.md b/docs/usage/cli_startup/cli_setup.md
new file mode 100644
index 0000000..e69de29
diff --git a/docs/usage/index.md b/docs/usage/index.md
new file mode 100644
index 0000000..b348fb2
--- /dev/null
+++ b/docs/usage/index.md
@@ -0,0 +1,11 @@
+# FAVE User Guides
+
+This section contains user guides for learning how to align and extract data with FAVE.
+
+```{toctree}
+:maxdepth: 2
+
+whats-new
+installation
+quickstart
+```
diff --git a/docs/usage/index.rst b/docs/usage/index.rst
deleted file mode 100644
index 4d9f1c9..0000000
--- a/docs/usage/index.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-FAVE User Guides
-================
-
-This section contains user guides for learning how to align and extract data with FAVE.
-
-.. toctree::
- :maxdepth: 2
-
- whats-new
- installation
- quickstart
diff --git a/docs/usage/installation.md b/docs/usage/installation.md
new file mode 100644
index 0000000..4cd5b39
--- /dev/null
+++ b/docs/usage/installation.md
@@ -0,0 +1,27 @@
+# Installing FAVE 2
+
+## Required software
+
+FAVE sometimes requires other software libraries in order to work.
+
+ - FAVE-align requires [SoX](http://sox.sourceforge.net/) and [HTK](https://htk.eng.cam.ac.uk/).
+ - FAVE-extract requires [Praat](https://www.fon.hum.uva.nl/praat/).
+
+You will need to manually install these if they are not already installed on your computer.
+
+```{warning}
+Mac users: HTK might need slight modification before it works. See [this bug report](https://github.com/JoFrhwld/FAVE/issues/48).
+```
+
+
+## Install with PIP
+
+FAVE is available on the Python Package Index (PyPI) as `fave`. You can install it using:
+
+```console
+python3 -m pip install fave
+```
+
+### Other package managers
+
+Work is ongoing to publish FAVE as a debian package, but no other package system is supported at the moment. If you would like to package FAVE for your system, please feel free to [contribute](../contributing)
diff --git a/docs/usage/installation.rst b/docs/usage/installation.rst
deleted file mode 100644
index bc8ebdc..0000000
--- a/docs/usage/installation.rst
+++ /dev/null
@@ -1,27 +0,0 @@
-Installing FAVE 2
-=================
-
-Required software
------------------
-
-FAVE sometimes requires other software libraries in order to work.
- * FAVE-align requires `SoX `_ and `HTK `_.
- * FAVE-extract requires `Praat `_.
-
-You will need to manually install these if they are not already installed on your computer.
-
-.. warning::
- Mac users: HTK might need slight modification before it works. See `this bug report `_.
-
-Install with PIP
-----------------
-
-FAVE is available on the Python Package Index (PyPI) as ``fave``. You can install it using:
-
-.. code-block:: console
-
- python3 -m pip install fave
-
-Other package managers
-^^^^^^^^^^^^^^^^^^^^^^
-Work is ongoing to publish FAVE as a debian package, but no other package system is supported at the moment. If you would like to package FAVE for your system, please feel free to :doc:`contribute <../contributing>`!
diff --git a/docs/usage/quickstart.md b/docs/usage/quickstart.md
new file mode 100644
index 0000000..8ae76dc
--- /dev/null
+++ b/docs/usage/quickstart.md
@@ -0,0 +1,31 @@
+# Quickstart guide to using FAVE 2.0
+
+1. Install FAVE and its dependencies according to {doc}`the directions `.
+
+2. Download the `FAAValign.py` and `extractFormants.py` scripts.
+
+3. Check your transcription for out-of-dictionary words
+
+```{code-block} console
+:caption: Check for out-of-dictionary words
+
+python3 FAAValign.py --check unknown_words.txt AudioFile.wav TranscriptionFile.txt OutputAlignment.TextGrid
+```
+
+4. Open `unknown_words.txt` and create a transcription for each word listed.
+
+5. Align your audio and transcripts including your new transcriptions:
+
+```{code-block} console
+:caption: Begin forced alignment
+
+python3 FAAValign.py --import custom_dictionary.txt AudioFile.wav TranscriptionFile.txt OutputAlignment.TextGrid
+```
+
+6. Extract formant data using the default settings:
+
+```{code-block} console
+:caption: Extract formant data
+
+python3 extractFormants.py AudioFile.wav Alignment.TextGrid OutputFileName.tsv
+```
diff --git a/docs/usage/quickstart.rst b/docs/usage/quickstart.rst
deleted file mode 100644
index c9fdb1b..0000000
--- a/docs/usage/quickstart.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-Quickstart guide to using FAVE 2.0
-==================================
-
- #. Install FAVE and its dependencies according to :doc:`the directions `.
- #. Download the ``FAAValign.py`` and ``extractFormants.py`` scripts.
- #. Check your transcription for out-of-dictionary words
-
- .. code-block:: console
- :caption: Check for out-of-dictionary words
-
- python3 FAAValign.py --check unknown_words.txt AudioFile.wav TranscriptionFile.txt OutputAlignment.TextGrid
- #. Open ``unknown_words.txt`` and create a transcription for each word listed.
- #. Align your audio and transcripts including your new transcriptions:
-
- .. code-block:: console
- :caption: Begin forced alignment
-
- python3 FAAValign.py --import custom_dictionary.txt AudioFile.wav TranscriptionFile.txt OutputAlignment.TextGrid
- #. Extract formant data using the default settings:
-
- .. code-block:: console
- :caption: Extract formant data
-
- python3 extractFormants.py AudioFile.wav Alignment.TextGrid OutputFileName.tsv
diff --git a/docs/usage/whats-new.md b/docs/usage/whats-new.md
new file mode 100644
index 0000000..c9aa071
--- /dev/null
+++ b/docs/usage/whats-new.md
@@ -0,0 +1,149 @@
+# What's new in version 2
+
+Version 2.0.0 of FAVE was released February 10, 2022 replacing 1.3.1 which was released in October 2020. Like many software packages, FAVE follows the [semantic versioning](https://semver.org/) system, and the change from version 1 to version 2 means that this update introduces **changes that will break existing workflows**. The maintainers have made every attempt to keep the interface as similar to version 1 as possible, but long-time users will need to review and update their internal documentation and software to account for these new changes. To help this process, the FAVE maintainers have written this migration guide.
+
+```{contents}
+```
+
+## Updating software
+
+### Check your python version
+
+```{note}
+We say FAVE runs on Python 3, but that's a little vague. Python 3.0 is 14 years old and like Python 2 no longer receives security updates. In order to run FAVE 2 you need at least Python 3.8, and we recommend using the latest stable version of Python.
+```
+
+You can check your current version of python using:
+
+```{code-block} console
+:caption: Check your python version
+
+python --version
+```
+
+If that command outputs a version 3.8 or higher (so 3.9, 3.10, etc.) then you have the proper python version installed.
+
+If you get a version like 2.7, you should see if you *also* have Python 3 on your system:
+
+```{code-block} console
+:caption: Check Python 3 specifically
+
+python3 --version
+```
+
+If that command outputs a version greater than 3.8, then you have a proper version. If it outputs a version *less* than that, like 3.5 or 3.7, you will need to install a newer version of python.
+
+If the command fails, then you do not have any python 3 version installed and you will need to install a compatible version.
+
+```{note}
+You can download the latest python version from [the Python Software Foundation website](https://www.python.org/downloads/). Once downloaded, install as instructed, and then go through the above steps again to check that the installation was successful.
+```
+
+### Installing FAVE
+
+Install FAVE using Python's built-in software package manager pip:
+
+```{code-block} console
+:caption: Install FAVE using pip
+
+python3 -m pip install fave
+```
+
+```{note}
+Older versions of FAVE could simply be downloaded and ran. Unlike previous versions FAVE 2 needs to be *installed*.
+```
+
+## Aligning and extracting with FAVE 2
+
+```{warning}
+The argument order and behavior has changed in version 2. Double check the documentation to make sure that you're using the right commands.
+```
+
+FAVE can still be run as a command-line program using `FAAValign.py` and `extractFormants.py`, but the location and syntax for these files have changed slightly. These scripts come with help documentation. In a terminal, navigate to the FAVE folder (containing files like LICENSE and README) and run one of the following commands for details on how to run the script.
+
+```{code-block} console
+:caption: Usage help from command line
+
+python3 fave/FAAValign.py --help
+python3 fave/extractformants.py --help
+```
+
+```{note}
+Development is ongoing to have these scripts installed system wide, but as of 2.0.1, you may still need to download them and run them directly.
+```
+
+### Aligning using FAAValign.py
+
+Before aligning, you should check the transcription for out-of-dictionary words. For this you use the `-c` or `--check` flag, followed by the name of a file where any unknown words should be listed.
+
+```{code-block} console
+:caption: Check for unknown transcriptions
+
+python3 fave/FAAValign.py --check unknown_words.txt AudioFile.wav TranscriptionFile.txt OutputAlignment.TextGrid
+```
+
+You can then create your own transcriptions for these words, and include them in the aligning process using the `-i` or `-import` flag.
+
+```{code-block} console
+:caption: Include custom dictionary file
+
+python3 fave/FAAValign.py --import custom_dictionary.txt AudioFile.wav TranscriptionFile.txt OutputAlignment.TextGrid
+```
+
+```{note}
+It is best to *always* specify the sound file, transcript file, and output file.
+
+If the transcript file or output file are omitted, FAVE will do its best to assume a sensible name based on the sound file name, but this may not always work.
+
+If you run into errors, try specifying the transcript and output file names.
+```
+
+### Getting vowel data using extractFormants.py
+
+Formant data for vowels can be extracted using:
+
+```{code-block} console
+:caption: Extract formant data
+
+python3 fave/extractFormants.py AudioFile.wav Alignment.TextGrid OutputFileName.tsv
+```
+
+If you used the Montral Forced Aligner to align your transcript, you should include the `--mfa` flag when extracting formant data.
+
+```{code-block} console
+:caption: Extract data from MFA alignment
+
+python3 fave/extractFormants.py --mfa AudioFile.wav Alignment.TextGrid OutPutFileName.tsv
+```
+
+```{note}
+The formant extraction process is *highly* customizable and these can be configured from the command line using flags. To see a list of all the configuration options, run the script with the `-h` or `--help` flags.
+```
+
+## The FAVE Python module
+
+```{note}
+The documentation of FAVE's API is in {doc}`the code documentation section <../code/index>`.
+```
+
+New to version 2 is the ability to `import` FAVE as a python module. This allows you to use FAVE in custom scripts for things like batch alignment, extraction, or customizing the behavior during alignment.
+
+```{code-block} python
+:caption: Example of loading a FAVE module
+
+from fave.align import TranscriptProcessor
+```
+
+## Frequently Asked Questions
+
+### What was wrong with the old FAVE?
+
+FAVE is written in the Python programming language. Python v2 was released in 2000 and was the langauge FAVE was written for. In 2006 development began on Python v3 which was released in 2008. Python 2 was scheduled to reach end-of-life in 2015, 7 years after the release of Python 3. In 2014, that sunset date was extended to 2020, and on January 1, 2020, 12 years after the release of Python 3, the developers announced that Python 2 was no longer supported. It would not receive bug fixes, and any security vulnerabilities would not be fixed. All users who had not already migrated to Python 3 were instructed to do so as soon as possible. As of August 2022, Python 3.10.4 is the current stable version. You can read [the full history from the Python Software Foundation](https://www.python.org/doc/sunset-python-2/).
+
+FAVE, being written for Python 2, was not compatible with the latest versions of Python. [Continuing to use Python 2 increases security risks](https://www.darkreading.com/vulnerabilities-threats/continued-use-of-python-2-will-heighten-security-risks) and it would be irresponsible to ask researchers holding sensitive personal data to introduce a security risk into their systems when other options are available. In 2020, maintainers Josef Freuhwald and Christian Brickhouse began rewriting FAVE to be compatible with Python 3. This migration was completed and released as FAVE 2.0.0 in February 2022.
+
+### Why does the new version work differently?
+
+FAVE is old software, and as software ages it accumulates changes that make it more complex. Bandaids, duct tape, patches, and other fixes are applied as needed to make sure the code keeps running for those who rely on it. Over time, the people who introduced and understood why and how these quick fixes worked leave, and often the knowledge leaves with them. What remains is a large, complex program that is hard to fix and even harder to add new features to. Among software programmers, this is known as [techincal debt](https://en.wikipedia.org/wiki/Technical_debt). FAVE was not migrated to Python 3 sooner because doing so was risky. The size and complexity of the program made it likely that even small changes might cause problems in other areas, and so the software was left as-is until the deprecation of Python 2 forced migration.
+
+To avoid this situation in the future, the migration to Python 3 also included changes which made the code easier to maintain. Since maintainers would be reading through all of the code to make sure it worked with Python 3, it was a good time to start repaying technical debt. The code was restructured so that it could easily be imported into python scripts as a module, and new workflows were created to allow for easier installation of the program and its dependencies. These improvements came with trade-offs, and in order to structure the code in a way that made it easy to udnerstand, maintain, and build new features on top of, we needed to make some changes to the previous interface.
diff --git a/docs/usage/whats-new.rst b/docs/usage/whats-new.rst
deleted file mode 100644
index 19c0d1d..0000000
--- a/docs/usage/whats-new.rst
+++ /dev/null
@@ -1,135 +0,0 @@
-What's new in version 2
-=======================
-
-Version 2.0.0 of FAVE was released February 10, 2022 replacing 1.3.1 which was released in October 2020. Like many software packages, FAVE follows the `semantic versioning `_ system, and the change from version 1 to version 2 means that this update introduces **changes that will break existing workflows**. The maintainers have made every attempt to keep the interface as similar to version 1 as possible, but long-time users will need to review and update their internal documentation and software to account for these new changes. To help this process, the FAVE maintainers have written this migration guide.
-
-.. contents::
-
-Updating software
------------------
-
-Check your python version
-^^^^^^^^^^^^^^^^^^^^^^^^^
-.. note::
- We say FAVE runs on Python 3, but that's a little vague. Python 3.0 is 14 years old and like Python 2 no longer receives security updates. In order to run FAVE 2 you need at least Python 3.8, and we recommend using the latest stable version of Python.
-
-You can check your current version of python using:
-
-.. code-block:: console
- :caption: Check your python version
-
- python --version
-
-If that command outputs a version 3.8 or higher (so 3.9, 3.10, etc.) then you have the proper python version installed.
-
-If you get a version like 2.7, you should see if you *also* have Python 3 on your system:
-
-.. code-block:: console
- :caption: Check Python 3 specifically
-
- python3 --version
-
-If that command outputs a version greater than 3.8, then you have a proper version. If it outputs a version *less* than that, like 3.5 or 3.7, you will need to install a newer version of python.
-
-If the command fails, then you do not have any python 3 version installed and you will need to install a compatible version.
-
-.. note::
- You can download the latest python version from `the Python Software Foundation website `_. Once downloaded, install as instructed, and then go through the above steps again to check that the installation was successful.
-
-Installing FAVE
-^^^^^^^^^^^^^^^
-Install FAVE using Python's built-in software package manager pip:
-
-.. code-block:: console
- :caption: Install FAVE using pip
-
- python3 -m pip install fave
-
-.. note::
- Older versions of FAVE could simply be downloaded and ran. Unlike previous versions FAVE 2 needs to be *installed*.
-
-Aligning and extracting with FAVE 2
------------------------------------
-.. warning::
- The argument order and behavior has changed in version 2. Double check the documentation to make sure that you're using the right commands.
-
-FAVE can still be run as a command-line program using ``FAAValign.py`` and ``extractFormants.py``, but the location and syntax for these files have changed slightly. These scripts come with help documentation. In a terminal, navigate to the FAVE folder (containing files like LICENSE and README) and run one of the following commands for details on how to run the script.
-
-.. code-block:: console
- :caption: Usage help from command line
-
- python3 fave/FAAValign.py --help
- python3 fave/extractformants.py --help
-
-.. note::
- Development is ongoing to have these scripts installed system wide, but as of 2.0.1, you may still need to download them and run them directly.
-
-Aligning using FAAValign.py
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Before aligning, you should check the transcription for out-of-dictionary words. For this you use the ``-c`` or ``--check`` flag, followed by the name of a file where any unknown words should be listed.
-
-.. code-block:: console
- :caption: Check for unknown transcriptions
-
- python3 fave/FAAValign.py --check unknown_words.txt AudioFile.wav TranscriptionFile.txt OutputAlignment.TextGrid
-
-You can then create your own transcriptions for these words, and include them in the aligning process using the ``-i`` or ``-import`` flag.
-
-.. code-block:: console
- :caption: Include custom dictionary file
-
- python3 fave/FAAValign.py --import custom_dictionary.txt AudioFile.wav TranscriptionFile.txt OutputAlignment.TextGrid
-
-.. note::
- It is best to *always* specify the sound file, transcript file, and output file.
-
- If the transcript file or output file are omitted, FAVE will do its best to assume a sensible name based on the sound file name, but this may not always work.
-
- If you run into errors, try specifying the transcript and output file names.
-
-Getting vowel data using extractFormants.py
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Formant data for vowels can be extracted using:
-
-.. code-block:: console
- :caption: Extract formant data
-
- python3 fave/extractFormants.py AudioFile.wav Alignment.TextGrid OutputFileName.tsv
-
-If you used the Montral Forced Aligner to align your transcript, you should include the ``--mfa`` flag when extracting formant data.
-
-.. code-block:: console
- :caption: Extract data from MFA alignment
-
- python3 fave/extractFormants.py --mfa AudioFile.wav Alignment.TextGrid OutPutFileName.tsv
-
-.. note::
- The formant extraction process is *highly* customizable and these can be configured from the command line using flags. To see a list of all the configuration options, run the script with the ``-h`` or ``--help`` flags.
-
-The FAVE Python module
-----------------------
-
-.. note::
- The documentation of FAVE's API is in :doc:`the code documentation section <../code/index>`.
-
-New to version 2 is the ability to ``import`` FAVE as a python module. This allows you to use FAVE in custom scripts for things like batch alignment, extraction, or customizing the behavior during alignment.
-
-.. code-block:: python
- :caption: Example of loading a FAVE module
-
- from fave.align import TranscriptProcessor
-
-Frequently Asked Questions
---------------------------
-
-What was wrong with the old FAVE?
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-FAVE is written in the Python programming language. Python v2 was released in 2000 and was the langauge FAVE was written for. In 2006 development began on Python v3 which was released in 2008. Python 2 was scheduled to reach end-of-life in 2015, 7 years after the release of Python 3. In 2014, that sunset date was extended to 2020, and on January 1, 2020, 12 years after the release of Python 3, the developers announced that Python 2 was no longer supported. It would not receive bug fixes, and any security vulnerabilities would not be fixed. All users who had not already migrated to Python 3 were instructed to do so as soon as possible. As of August 2022, Python 3.10.4 is the current stable version. You can read `the full history from the Python Software Foundation `_.
-
-FAVE, being written for Python 2, was not compatible with the latest versions of Python. `Continuing to use Python 2 increases security risks `_ and it would be irresponsible to ask researchers holding sensitive personal data to introduce a security risk into their systems when other options are available. In 2020, maintainers Josef Freuhwald and Christian Brickhouse began rewriting FAVE to be compatible with Python 3. This migration was completed and released as FAVE 2.0.0 in February 2022.
-
-Why does the new version work differently?
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-FAVE is old software, and as software ages it accumulates changes that make it more complex. Bandaids, duct tape, patches, and other fixes are applied as needed to make sure the code keeps running for those who rely on it. Over time, the people who introduced and understood why and how these quick fixes worked leave, and often the knowledge leaves with them. What remains is a large, complex program that is hard to fix and even harder to add new features to. Among software programmers, this is known as `techincal debt `_. FAVE was not migrated to Python 3 sooner because doing so was risky. The size and complexity of the program made it likely that even small changes might cause problems in other areas, and so the software was left as-is until the deprecation of Python 2 forced migration.
-
-To avoid this situation in the future, the migration to Python 3 also included changes which made the code easier to maintain. Since maintainers would be reading through all of the code to make sure it worked with Python 3, it was a good time to start repaying technical debt. The code was restructured so that it could easily be imported into python scripts as a module, and new workflows were created to allow for easier installation of the program and its dependencies. These improvements came with trade-offs, and in order to structure the code in a way that made it easy to udnerstand, maintain, and build new features on top of, we needed to make some changes to the previous interface.
diff --git a/poetry.lock b/poetry.lock
index 212709a..c2a50ea 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -229,6 +229,36 @@ typing-extensions = ">=3.7.4.1"
all = ["pytz (>=2019.1)"]
dates = ["pytz (>=2019.1)"]
+[[package]]
+name = "exceptiongroup"
+version = "1.2.0"
+description = "Backport of PEP 654 (exception groups)"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"},
+ {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"},
+]
+
+[package.extras]
+test = ["pytest (>=6)"]
+
+[[package]]
+name = "flake8"
+version = "5.0.4"
+description = "the modular source code checker: pep8 pyflakes and co"
+optional = false
+python-versions = ">=3.6.1"
+files = [
+ {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"},
+ {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"},
+]
+
+[package.dependencies]
+mccabe = ">=0.7.0,<0.8.0"
+pycodestyle = ">=2.9.0,<2.10.0"
+pyflakes = ">=2.5.0,<2.6.0"
+
[[package]]
name = "idna"
version = "3.6"
@@ -270,6 +300,17 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link
perf = ["ipython"]
testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"]
+[[package]]
+name = "iniconfig"
+version = "2.0.0"
+description = "brain-dead simple config-ini parsing"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
+ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
+]
+
[[package]]
name = "isort"
version = "5.13.2"
@@ -347,6 +388,30 @@ files = [
{file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"},
]
+[[package]]
+name = "markdown-it-py"
+version = "3.0.0"
+description = "Python port of markdown-it. Markdown parsing, done right!"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
+ {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
+]
+
+[package.dependencies]
+mdurl = ">=0.1,<1.0"
+
+[package.extras]
+benchmarking = ["psutil", "pytest", "pytest-benchmark"]
+code-style = ["pre-commit (>=3.0,<4.0)"]
+compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
+linkify = ["linkify-it-py (>=1,<3)"]
+plugins = ["mdit-py-plugins"]
+profiling = ["gprof2dot"]
+rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
+testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
+
[[package]]
name = "markupsafe"
version = "2.1.5"
@@ -427,6 +492,62 @@ files = [
{file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
]
+[[package]]
+name = "mdit-py-plugins"
+version = "0.4.0"
+description = "Collection of plugins for markdown-it-py"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"},
+ {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"},
+]
+
+[package.dependencies]
+markdown-it-py = ">=1.0.0,<4.0.0"
+
+[package.extras]
+code-style = ["pre-commit"]
+rtd = ["myst-parser", "sphinx-book-theme"]
+testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+description = "Markdown URL utilities"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
+ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
+]
+
+[[package]]
+name = "myst-parser"
+version = "2.0.0"
+description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser,"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"},
+ {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"},
+]
+
+[package.dependencies]
+docutils = ">=0.16,<0.21"
+jinja2 = "*"
+markdown-it-py = ">=3.0,<4.0"
+mdit-py-plugins = ">=0.4,<1.0"
+pyyaml = "*"
+sphinx = ">=6,<8"
+
+[package.extras]
+code-style = ["pre-commit (>=3.0,<4.0)"]
+linkify = ["linkify-it-py (>=2.0,<3.0)"]
+rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"]
+testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"]
+testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"]
+
[[package]]
name = "natsort"
version = "8.4.0"
@@ -505,6 +626,43 @@ files = [
docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
+[[package]]
+name = "pluggy"
+version = "1.4.0"
+description = "plugin and hook calling mechanisms for python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"},
+ {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"},
+]
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[package]]
+name = "pycodestyle"
+version = "2.9.1"
+description = "Python style guide checker"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"},
+ {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"},
+]
+
+[[package]]
+name = "pyflakes"
+version = "2.5.0"
+description = "passive checker of Python programs"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"},
+ {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"},
+]
+
[[package]]
name = "pygments"
version = "2.17.2"
@@ -549,6 +707,28 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""
spelling = ["pyenchant (>=3.2,<4.0)"]
testutils = ["gitpython (>3)"]
+[[package]]
+name = "pytest"
+version = "7.4.4"
+description = "pytest: simple powerful testing with Python"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
+ {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=0.12,<2.0"
+tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
+
+[package.extras]
+testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+
[[package]]
name = "pytz"
version = "2024.1"
@@ -560,6 +740,66 @@ files = [
{file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"},
]
+[[package]]
+name = "pyyaml"
+version = "6.0.1"
+description = "YAML parser and emitter for Python"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"},
+ {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"},
+ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
+ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
+ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
+ {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
+ {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
+ {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
+ {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
+ {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"},
+ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
+ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
+ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
+ {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
+ {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
+ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
+ {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
+ {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
+ {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"},
+ {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"},
+ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
+ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
+ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
+ {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
+ {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
+ {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
+ {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
+ {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"},
+ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
+ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
+ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
+ {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
+ {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
+ {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
+ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
+]
+
[[package]]
name = "requests"
version = "2.31.0"
@@ -909,4 +1149,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
[metadata]
lock-version = "2.0"
python-versions = ">=3.8,<4.0"
-content-hash = "1c9d783c07301363c92506c8107b6e83b6e56afb14c8daf4c4c5eeee4d56be77"
+content-hash = "95f046f7cc2f7ddf5b1510afabdbb21ffb96f4e67e147ad989a5c5a4625a62ba"
diff --git a/pyproject.toml b/pyproject.toml
index 8c9e115..11d1ace 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -27,6 +27,9 @@ sphinx = "^7"
sphinx_pyproject = "0.1"
jinja2 = "~3.0"
pylint = "^2.5.2"
+myst-parser = "^2"
+pytest = "^7"
+flake8 = "^5"
[build-system]
requires = ["poetry>=1.1"]