diff --git a/.github/workflows/doc_pages.yaml b/.github/workflows/doc_pages.yaml
index 4492087..b258784 100644
--- a/.github/workflows/doc_pages.yaml
+++ b/.github/workflows/doc_pages.yaml
@@ -22,7 +22,7 @@ jobs:
       uses: snok/install-poetry@v1.3
 
     - name: install
-      run: poetry install -E docs
+      run: poetry install --only main,docs
 
     - name: Build documentation.
       run: |
diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
index 3a057d5..309d7b1 100644
--- a/.github/workflows/main.yaml
+++ b/.github/workflows/main.yaml
@@ -13,15 +13,12 @@ on:
 jobs:
   lint:
     runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        python-version: [ "3.11", "3.7" ]
     steps:
       - uses: actions/checkout@v3
-      - name: Set up Python ${{ matrix.python-version }}
+      - name: Set up Python
         uses: actions/setup-python@v3
         with:
-          python-version: ${{ matrix.python-version }}
+          python-version: 3.11
       - name: Install dependencies
         run: |
           pip install tox
@@ -78,7 +75,7 @@ jobs:
       #    install your root project, if required 
       #----------------------------------------------      
       - name: Install library
-        run: poetry install --no-interaction --extras refresh
+        run: poetry install --no-interaction
 
       #----------------------------------------------
       #              coverage report   
diff --git a/poetry.lock b/poetry.lock
index 6c01336..bf12615 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,10 +1,9 @@
-# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
 
 [[package]]
 name = "alabaster"
 version = "0.7.13"
 description = "A configurable sidebar-enabled Sphinx theme"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -16,7 +15,6 @@ files = [
 name = "annotated-types"
 version = "0.6.0"
 description = "Reusable constraint types to use with typing.Annotated"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -24,11 +22,13 @@ files = [
     {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"},
 ]
 
+[package.dependencies]
+typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""}
+
 [[package]]
 name = "babel"
 version = "2.14.0"
 description = "Internationalization utilities"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -36,33 +36,16 @@ files = [
     {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"},
 ]
 
-[package.extras]
-dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
-
-[[package]]
-name = "beautifulsoup4"
-version = "4.12.2"
-description = "Screen-scraping library"
-category = "main"
-optional = false
-python-versions = ">=3.6.0"
-files = [
-    {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"},
-    {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"},
-]
-
 [package.dependencies]
-soupsieve = ">1.2"
+pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""}
 
 [package.extras]
-html5lib = ["html5lib"]
-lxml = ["lxml"]
+dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
 
 [[package]]
 name = "bioregistry"
 version = "0.10.105"
 description = "Integrated registry of biological databases and nomenclatures"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -93,7 +76,6 @@ web = ["bootstrap-flask (<=2.0.0)", "curies[fastapi]", "fastapi", "flask (<2.2.4
 name = "cachetools"
 version = "5.3.2"
 description = "Extensible memoizing collections and decorators"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -105,7 +87,6 @@ files = [
 name = "certifi"
 version = "2023.11.17"
 description = "Python package for providing Mozilla's CA Bundle."
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -117,7 +98,6 @@ files = [
 name = "chardet"
 version = "5.2.0"
 description = "Universal encoding detector for Python 3"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -129,7 +109,6 @@ files = [
 name = "charset-normalizer"
 version = "3.3.2"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-category = "main"
 optional = false
 python-versions = ">=3.7.0"
 files = [
@@ -229,7 +208,6 @@ files = [
 name = "click"
 version = "8.1.7"
 description = "Composable command line interface toolkit"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -244,7 +222,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
 name = "colorama"
 version = "0.4.6"
 description = "Cross-platform colored terminal text."
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
 files = [
@@ -256,7 +233,6 @@ files = [
 name = "coverage"
 version = "7.3.3"
 description = "Code coverage measurement for Python"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -321,7 +297,6 @@ toml = ["tomli"]
 name = "curies"
 version = "0.7.4"
 description = "Idiomatic conversion between URIs and compact URIs (CURIEs)."
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -346,7 +321,6 @@ tests = ["coverage", "pytest"]
 name = "distlib"
 version = "0.3.8"
 description = "Distribution utilities"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -358,7 +332,6 @@ files = [
 name = "docutils"
 version = "0.18.1"
 description = "Docutils -- Python Documentation Utilities"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 files = [
@@ -370,7 +343,6 @@ files = [
 name = "exceptiongroup"
 version = "1.2.0"
 description = "Backport of PEP 654 (exception groups)"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -385,7 +357,6 @@ test = ["pytest (>=6)"]
 name = "filelock"
 version = "3.13.1"
 description = "A platform independent file lock."
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -398,29 +369,10 @@ docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1
 testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"]
 typing = ["typing-extensions (>=4.8)"]
 
-[[package]]
-name = "furo"
-version = "2023.9.10"
-description = "A clean customisable Sphinx documentation theme."
-category = "main"
-optional = false
-python-versions = ">=3.8"
-files = [
-    {file = "furo-2023.9.10-py3-none-any.whl", hash = "sha256:513092538537dc5c596691da06e3c370714ec99bc438680edc1debffb73e5bfc"},
-    {file = "furo-2023.9.10.tar.gz", hash = "sha256:5707530a476d2a63b8cad83b4f961f3739a69f4b058bcf38a03a39fa537195b2"},
-]
-
-[package.dependencies]
-beautifulsoup4 = "*"
-pygments = ">=2.7"
-sphinx = ">=6.0,<8.0"
-sphinx-basic-ng = "*"
-
 [[package]]
 name = "idna"
 version = "3.6"
 description = "Internationalized Domain Names in Applications (IDNA)"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -432,7 +384,6 @@ files = [
 name = "imagesize"
 version = "1.4.1"
 description = "Getting image size from png/jpeg/jpeg2000/gif file"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -444,7 +395,6 @@ files = [
 name = "importlib-metadata"
 version = "7.0.0"
 description = "Read metadata from Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -464,7 +414,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs
 name = "iniconfig"
 version = "2.0.0"
 description = "brain-dead simple config-ini parsing"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -476,7 +425,6 @@ files = [
 name = "isodate"
 version = "0.6.1"
 description = "An ISO 8601 date/time/duration parser and formatter"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -491,7 +439,6 @@ six = "*"
 name = "jinja2"
 version = "3.1.2"
 description = "A very fast and expressive template engine."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -509,7 +456,6 @@ i18n = ["Babel (>=2.7)"]
 name = "markdown-it-py"
 version = "3.0.0"
 description = "Python port of markdown-it. Markdown parsing, done right!"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -534,7 +480,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
 name = "markupsafe"
 version = "2.1.3"
 description = "Safely add untrusted strings to HTML/XML markup."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -594,7 +539,6 @@ files = [
 name = "mdit-py-plugins"
 version = "0.4.0"
 description = "Collection of plugins for markdown-it-py"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -614,7 +558,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
 name = "mdurl"
 version = "0.1.2"
 description = "Markdown URL utilities"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -626,7 +569,6 @@ files = [
 name = "more-click"
 version = "0.1.2"
 description = "More click."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -644,7 +586,6 @@ tests = ["coverage", "pytest"]
 name = "myst-parser"
 version = "2.0.0"
 description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser,"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -671,7 +612,6 @@ testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,
 name = "packaging"
 version = "23.2"
 description = "Core utilities for Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -683,7 +623,6 @@ files = [
 name = "platformdirs"
 version = "4.1.0"
 description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -699,7 +638,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co
 name = "pluggy"
 version = "1.3.0"
 description = "plugin and hook calling mechanisms for python"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -715,7 +653,6 @@ testing = ["pytest", "pytest-benchmark"]
 name = "pydantic"
 version = "2.5.2"
 description = "Data validation using Python type hints"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -735,7 +672,6 @@ email = ["email-validator (>=2.0.0)"]
 name = "pydantic-core"
 version = "2.14.5"
 description = ""
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -853,7 +789,6 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
 name = "pygments"
 version = "2.17.2"
 description = "Pygments is a syntax highlighting package written in Python."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -869,7 +804,6 @@ windows-terminal = ["colorama (>=0.4.6)"]
 name = "pyparsing"
 version = "3.1.1"
 description = "pyparsing module - Classes and methods to define and execute parsing grammars"
-category = "main"
 optional = false
 python-versions = ">=3.6.8"
 files = [
@@ -884,7 +818,6 @@ diagrams = ["jinja2", "railroad-diagrams"]
 name = "pyproject-api"
 version = "1.6.1"
 description = "API to interact with the python pyproject.toml based projects"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -904,7 +837,6 @@ testing = ["covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytes
 name = "pystow"
 version = "0.5.2"
 description = "Easily pick a place to store data for your python package."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -929,7 +861,6 @@ xml = ["lxml"]
 name = "pytest"
 version = "7.4.3"
 description = "pytest: simple powerful testing with Python"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -952,7 +883,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no
 name = "pytrie"
 version = "0.4.0"
 description = "A pure Python implementation of the trie data structure."
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -962,11 +892,21 @@ files = [
 [package.dependencies]
 sortedcontainers = "*"
 
+[[package]]
+name = "pytz"
+version = "2024.1"
+description = "World timezone definitions, modern and historical"
+optional = false
+python-versions = "*"
+files = [
+    {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"},
+    {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"},
+]
+
 [[package]]
 name = "pyyaml"
 version = "6.0.1"
 description = "YAML parser and emitter for Python"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1016,7 +956,6 @@ files = [
 name = "rdflib"
 version = "6.3.2"
 description = "RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information."
-category = "main"
 optional = false
 python-versions = ">=3.7,<4.0"
 files = [
@@ -1038,7 +977,6 @@ networkx = ["networkx (>=2.0.0,<3.0.0)"]
 name = "requests"
 version = "2.31.0"
 description = "Python HTTP for Humans."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1060,7 +998,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
 name = "six"
 version = "1.16.0"
 description = "Python 2 and 3 compatibility utilities"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 files = [
@@ -1072,7 +1009,6 @@ files = [
 name = "snowballstemmer"
 version = "2.2.0"
 description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -1084,7 +1020,6 @@ files = [
 name = "sortedcontainers"
 version = "2.4.0"
 description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -1092,28 +1027,15 @@ files = [
     {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"},
 ]
 
-[[package]]
-name = "soupsieve"
-version = "2.5"
-description = "A modern CSS selector implementation for Beautiful Soup."
-category = "main"
-optional = false
-python-versions = ">=3.8"
-files = [
-    {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"},
-    {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"},
-]
-
 [[package]]
 name = "sphinx"
-version = "7.2.6"
+version = "7.1.2"
 description = "Python documentation generator"
-category = "main"
 optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.8"
 files = [
-    {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"},
-    {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"},
+    {file = "sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe"},
+    {file = "sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f"},
 ]
 
 [package.dependencies]
@@ -1125,7 +1047,7 @@ imagesize = ">=1.3"
 importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""}
 Jinja2 = ">=3.0"
 packaging = ">=21.0"
-Pygments = ">=2.14"
+Pygments = ">=2.13"
 requests = ">=2.25.0"
 snowballstemmer = ">=2.0"
 sphinxcontrib-applehelp = "*"
@@ -1133,19 +1055,17 @@ sphinxcontrib-devhelp = "*"
 sphinxcontrib-htmlhelp = ">=2.0.0"
 sphinxcontrib-jsmath = "*"
 sphinxcontrib-qthelp = "*"
-sphinxcontrib-serializinghtml = ">=1.1.9"
-sphinxcontrib-websupport = {version = "*", optional = true, markers = "extra == \"docs\""}
+sphinxcontrib-serializinghtml = ">=1.1.5"
 
 [package.extras]
 docs = ["sphinxcontrib-websupport"]
 lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"]
-test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools (>=67.0)"]
+test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"]
 
 [[package]]
 name = "sphinx-autodoc-typehints"
 version = "1.25.2"
 description = "Type hints (PEP 484) support for the Sphinx autodoc extension"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1154,7 +1074,6 @@ files = [
 ]
 
 [package.dependencies]
-furo = {version = ">=2023.7.26", optional = true, markers = "extra == \"docs\""}
 sphinx = ">=7.1.2"
 
 [package.extras]
@@ -1162,29 +1081,10 @@ docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)"]
 numpy = ["nptyping (>=2.5)"]
 testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "sphobjinv (>=2.3.1)", "typing-extensions (>=4.7.1)"]
 
-[[package]]
-name = "sphinx-basic-ng"
-version = "1.0.0b2"
-description = "A modern skeleton for Sphinx themes."
-category = "main"
-optional = false
-python-versions = ">=3.7"
-files = [
-    {file = "sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b"},
-    {file = "sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9"},
-]
-
-[package.dependencies]
-sphinx = ">=4.0"
-
-[package.extras]
-docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"]
-
 [[package]]
 name = "sphinx-click"
 version = "4.4.0"
 description = "Sphinx extension that automatically documents click applications"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1201,7 +1101,6 @@ sphinx = ">=2.0"
 name = "sphinx-rtd-theme"
 version = "1.3.0"
 description = "Read the Docs theme for Sphinx"
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
 files = [
@@ -1219,57 +1118,45 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"]
 
 [[package]]
 name = "sphinxcontrib-applehelp"
-version = "1.0.7"
+version = "1.0.4"
 description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
-category = "main"
 optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.8"
 files = [
-    {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"},
-    {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"},
+    {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"},
+    {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"},
 ]
 
-[package.dependencies]
-Sphinx = ">=5"
-
 [package.extras]
 lint = ["docutils-stubs", "flake8", "mypy"]
 test = ["pytest"]
 
 [[package]]
 name = "sphinxcontrib-devhelp"
-version = "1.0.5"
-description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents"
-category = "main"
+version = "1.0.2"
+description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
 optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.5"
 files = [
-    {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"},
-    {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"},
+    {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"},
+    {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"},
 ]
 
-[package.dependencies]
-Sphinx = ">=5"
-
 [package.extras]
 lint = ["docutils-stubs", "flake8", "mypy"]
 test = ["pytest"]
 
 [[package]]
 name = "sphinxcontrib-htmlhelp"
-version = "2.0.4"
+version = "2.0.1"
 description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
-category = "main"
 optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.8"
 files = [
-    {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"},
-    {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"},
+    {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"},
+    {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"},
 ]
 
-[package.dependencies]
-Sphinx = ">=5"
-
 [package.extras]
 lint = ["docutils-stubs", "flake8", "mypy"]
 test = ["html5lib", "pytest"]
@@ -1278,7 +1165,6 @@ test = ["html5lib", "pytest"]
 name = "sphinxcontrib-jquery"
 version = "4.1"
 description = "Extension to include jQuery on newer Sphinx releases"
-category = "main"
 optional = false
 python-versions = ">=2.7"
 files = [
@@ -1293,7 +1179,6 @@ Sphinx = ">=1.8"
 name = "sphinxcontrib-jsmath"
 version = "1.0.1"
 description = "A sphinx extension which renders display math in HTML via JavaScript"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1306,68 +1191,38 @@ test = ["flake8", "mypy", "pytest"]
 
 [[package]]
 name = "sphinxcontrib-qthelp"
-version = "1.0.6"
-description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents"
-category = "main"
+version = "1.0.3"
+description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
 optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.5"
 files = [
-    {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"},
-    {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"},
+    {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"},
+    {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"},
 ]
 
-[package.dependencies]
-Sphinx = ">=5"
-
 [package.extras]
 lint = ["docutils-stubs", "flake8", "mypy"]
 test = ["pytest"]
 
 [[package]]
 name = "sphinxcontrib-serializinghtml"
-version = "1.1.9"
-description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)"
-category = "main"
+version = "1.1.5"
+description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
 optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.5"
 files = [
-    {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"},
-    {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"},
+    {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"},
+    {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
 ]
 
-[package.dependencies]
-Sphinx = ">=5"
-
 [package.extras]
 lint = ["docutils-stubs", "flake8", "mypy"]
 test = ["pytest"]
 
-[[package]]
-name = "sphinxcontrib-websupport"
-version = "1.2.6"
-description = "sphinxcontrib-websupport provides a Python API to easily integrate Sphinx documentation into your Web application"
-category = "main"
-optional = false
-python-versions = ">=3.9"
-files = [
-    {file = "sphinxcontrib_websupport-1.2.6-py3-none-any.whl", hash = "sha256:c43c2031b93799ad688c2af233e330740768adc57c02746d5ec197e815b9469e"},
-    {file = "sphinxcontrib_websupport-1.2.6.tar.gz", hash = "sha256:d592be8e11261bbbc64668f258efc4fd42c93ab617411143b5245fe30c633d8c"},
-]
-
-[package.dependencies]
-jinja2 = "*"
-Sphinx = ">=5"
-sphinxcontrib-serializinghtml = "*"
-
-[package.extras]
-lint = ["docutils-stubs", "flake8", "mypy"]
-test = ["greenlet (>=3.0.0a1)", "pytest", "sqlalchemy", "whoosh"]
-
 [[package]]
 name = "tomli"
 version = "2.0.1"
 description = "A lil' TOML parser"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1379,7 +1234,6 @@ files = [
 name = "tox"
 version = "4.11.4"
 description = "tox is a generic virtualenv management and test command line tool"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1407,7 +1261,6 @@ testing = ["build[virtualenv] (>=0.10)", "covdefaults (>=2.3)", "detect-test-pol
 name = "tqdm"
 version = "4.66.1"
 description = "Fast, Extensible Progress Meter"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1428,7 +1281,6 @@ telegram = ["requests"]
 name = "typing-extensions"
 version = "4.9.0"
 description = "Backported and Experimental Type Hints for Python 3.8+"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1440,7 +1292,6 @@ files = [
 name = "urllib3"
 version = "2.1.0"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1457,7 +1308,6 @@ zstd = ["zstandard (>=0.18.0)"]
 name = "virtualenv"
 version = "20.25.0"
 description = "Virtual Python Environment builder"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1478,7 +1328,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess
 name = "zipp"
 version = "3.17.0"
 description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1490,11 +1339,7 @@ files = [
 docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"]
 testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"]
 
-[extras]
-docs = ["Sphinx", "myst-parser", "sphinx-autodoc-typehints", "sphinx-click", "sphinx-rtd-theme"]
-refresh = ["bioregistry", "rdflib", "requests"]
-
 [metadata]
 lock-version = "2.0"
-python-versions = "^3.9"
-content-hash = "c7d0c46e8686f81212b0477bbcfd9f359343f6b05527d42ba3d5cdf223d19592"
+python-versions = "^3.8"
+content-hash = "8412cb4a8c0642692ca736a4a58eda975f389efb25f9ee7b1e572e262737c08d"
diff --git a/pyproject.toml b/pyproject.toml
index a10d17e..931b1b4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -14,7 +14,6 @@ classifiers = [
     "Programming Language :: Python :: 3.10",
     "Programming Language :: Python :: 3.9",
     "Programming Language :: Python :: 3.8",
-    "Programming Language :: Python :: 3.7",
 ]
 
 [tool.poetry.urls]
@@ -24,46 +23,33 @@ homepage = "https://github.com/linkml/prefixmaps"
 
 
 [tool.poetry.dependencies]
-python = "^3.9"
+python = "^3.8"
 pyyaml = ">=5.3.1"
-sphinx-rtd-theme = {version = "^1.0.0", extras = ["docs"]}
-Sphinx = {version = "^7.2.6", extras = ["docs"]}
-sphinx-autodoc-typehints = {version = "^1.23.4", extras = ["docs"]}
-sphinx-click = {version = "^4.3.0", extras = ["docs"]}
-myst-parser = {version = "^2.0.0", extras = ["docs"]}
-click = ">=8.1.3"
-requests = {version = "^2.28.1", extras = ["refresh"]}
-bioregistry = {version = "^0.10.65", extras = ["refresh"]}
-rdflib = {version = "^6.2.0", extras = ["refresh"]}
 curies = ">=0.5.3"
+
+[tool.poetry.group.test.dependencies]
+pytest = ">=6.2"
+coverage = ">=6.4.4"
 tox = "^4.11.3"
-pydantic = "^2.5"
+
+[tool.poetry.group.docs.dependencies]
+myst-parser = "*"
+sphinx = ">=7.0.0"
+sphinx-autodoc-typehints = "*"
+sphinx-click = "*"
+sphinx-rtd-theme = "*"
+
+[tool.poetry.group.refresh.dependencies]
+click = ">=8.1.3"
+requests = "^2.28.1"
+bioregistry = "^0.10.65"
+rdflib = "^6.2.0"
 
 [tool.poetry-dynamic-versioning]
 enable = true
 vcs = "git"
 style = "pep440"
 
-
-[tool.poetry.dev-dependencies]
-pytest = ">=6.2"
-coverage = ">=6.4.4"
-typing-extensions = ">=4.4.0"
-
-[tool.poetry.extras]
-docs = [
-    "sphinx",
-    "sphinx-rtd-theme",
-    "sphinx-autodoc-typehints",
-    "sphinx-click",
-    "myst-parser"
-]
-refresh = [
-    "requests",
-    "bioregistry",
-    "rdflib"
-]
-
 [tool.black]
 line-length = 100
 target-version = ["py39", "py310"]
diff --git a/src/prefixmaps/ingest/etl_runner.py b/src/prefixmaps/ingest/etl_runner.py
index 778d02a..b8311d9 100644
--- a/src/prefixmaps/ingest/etl_runner.py
+++ b/src/prefixmaps/ingest/etl_runner.py
@@ -1,4 +1,5 @@
 """ETL logic for retrieving and normalizing upstream contexts."""
+
 from pathlib import Path
 from typing import Callable, Dict, Mapping, Union
 
diff --git a/src/prefixmaps/ingest/ingest_bioportal.py b/src/prefixmaps/ingest/ingest_bioportal.py
index dd6f95d..8abbd11 100644
--- a/src/prefixmaps/ingest/ingest_bioportal.py
+++ b/src/prefixmaps/ingest/ingest_bioportal.py
@@ -1,4 +1,5 @@
 """Simple ETL from bioportal to prefixmaps."""
+
 from typing import Any, Dict, TextIO, Union
 
 from prefixmaps.data import data_path
diff --git a/src/prefixmaps/ingest/ingest_go.py b/src/prefixmaps/ingest/ingest_go.py
index bd9134f..a70fecb 100755
--- a/src/prefixmaps/ingest/ingest_go.py
+++ b/src/prefixmaps/ingest/ingest_go.py
@@ -1,4 +1,5 @@
 """Ingests the GO prefix registry."""
+
 from typing import TextIO, Union
 
 import requests
diff --git a/src/prefixmaps/ingest/ingest_jsonld.py b/src/prefixmaps/ingest/ingest_jsonld.py
index 2bf4c5c..bb424b6 100644
--- a/src/prefixmaps/ingest/ingest_jsonld.py
+++ b/src/prefixmaps/ingest/ingest_jsonld.py
@@ -1,4 +1,5 @@
 """Generic JSON-LD ingests."""
+
 import json
 from typing import Any, Dict, List, Optional, TextIO, Union
 
diff --git a/src/prefixmaps/ingest/ingest_shacl.py b/src/prefixmaps/ingest/ingest_shacl.py
index cfe4452..c564d8a 100644
--- a/src/prefixmaps/ingest/ingest_shacl.py
+++ b/src/prefixmaps/ingest/ingest_shacl.py
@@ -1,4 +1,5 @@
 """Ingests from triples using the SHACL PrefixDeclarations data model."""
+
 from typing import Any, TextIO, Union
 
 import rdflib
diff --git a/tests/test_core/test_prefixmaps.py b/tests/test_core/test_prefixmaps.py
index 0b931c9..909f97d 100644
--- a/tests/test_core/test_prefixmaps.py
+++ b/tests/test_core/test_prefixmaps.py
@@ -1,6 +1,7 @@
 """Tests core expansion logic and data.
 This serves as "checksums" on the underlying ingested data.
 """
+
 import unittest
 
 import prefixmaps
diff --git a/tox.ini b/tox.ini
index d5e1dd7..8470180 100644
--- a/tox.ini
+++ b/tox.ini
@@ -45,11 +45,12 @@ description = Run the flake8 tool with several plugins (bandit, docstrings, impo
 
 [testenv:refresh]
 description = Refresh the data in the prefixmaps package
+skip_install = true
+allowlist_externals = poetry
+commands_pre =
+    poetry install --only main,refresh
 commands =
     python -m prefixmaps.ingest.etl_runner
-usedevelop = true
-extras =
-    refresh
 
 #########################
 # Flake8 Configuration  #