From b5586b1d571e1e4a4ddf6a9c65eea7f8f54d370c Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Wed, 25 Mar 2026 16:39:41 -0700 Subject: [PATCH 01/13] docs/update_theme --- docs/_static/custom.css | 14 + docs/conf.py | 126 ++------ docs/index.rst | 2 +- poetry.lock | 640 +++++++++++++++++++++++++++++++++++----- pyproject.toml | 6 +- 5 files changed, 606 insertions(+), 182 deletions(-) diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 995f5e7ff..550090ce5 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,3 +1,17 @@ +/* TOM Toolkit Branding Colors */ +/* --primary: #017792; /* TOM Toolkit logo colors */ +/* --color-primary: #017792; */ +/* --primary-light: #00a3c8; */ + +[data-theme="light"] { + --color-primary: #017792; + --color-header-background: #00a3c8; +} +[data-theme="dark"] { + --color-primary: #017792; + --color-background: #00a3c8; +} + div.partners { text-align: center; } diff --git a/docs/conf.py b/docs/conf.py index 2fa68b4e0..569c0d791 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -4,116 +4,46 @@ # list see the documentation: # http://www.sphinx-doc.org/en/master/config -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# import os import sys import django -import sphinx_rtd_theme - -from recommonmark.parser import CommonMarkParser - -from tom_base import __version__ - -sys.path.insert(0, os.path.abspath('..')) - - -# -- Project information ----------------------------------------------------- -project = 'TOM Toolkit' -copyright = '2021-6, Las Cumbres Observatory' -author = 'Joey Chatelain, David Collom, Lindy Lindstrom, Austin Riba' - -# The full version, including alpha/beta/rc tags -# This has to mirror the setup.py version for PDF generation -release = __version__ - -# -- Django Configuration ------------------------------------------------- - -# import os -# import sys -# import django -# sys.path.insert(0, os.path.abspath('..')) os.environ['DJANGO_SETTINGS_MODULE'] = 'tom_base.settings' django.setup() +sys.path.insert(0, os.path.abspath("..")) -# -- 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.autosectionlabel', - 'sphinx.ext.autosummary', - 'sphinx.ext.intersphinx', - 'sphinx_design', - 'sphinx_copybutton', + "sphinx.ext.autodoc", + "sphinx.ext.viewcode", + "sphinx_breeze_theme", + 'myst_parser', ] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# 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 = ['_build', 'Thumbs.db', '.DS_Store'] - -# source_parsers = { -# '.md': 'recommonmark.parser.CommonMarkParser', -# } - -# source_suffix = ['.rst', '.md'] - -# autodoc_mock_imports = ['rise-set'] -autodoc_inherit_docstrings = False -autodoc_default_options = { - # 'members': True, - 'member-order': 'bysource', - # 'special-members': '__init__', -} -autoclass_content = 'both' - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. - -html_sidebars = { - '**': [ - 'about.html', - 'navigation.html', - 'relations.html', - 'searchbox.html', - 'donate.html', - ] +templates_path = ["_templates"] +source_suffix = { + ".rst": "restructuredtext", + ".txt": "markdown", + ".md": "markdown", } - +master_doc = "index" +project = "TOM Toolkit" +copyright = "2026, Las Cumbres Observatory" +author = "Joey Chatelain, David Collom, Lindy Lindstrom, Austin Riba, Rachel Street" + +language = "en" +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "requirements.txt"] +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False +today_fmt = "%Y-%m-%d %H:%M" + +# -- Options for HTML output ------------------------------------------- +html_theme = "breeze" +html_show_sphinx = True html_static_path = ['_static'] -html_theme = 'alabaster' -# html_theme = 'sphinx_rtd_theme' - -html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] -html_theme_options = { - 'logo': 'logo-color.png', - 'logo_name': 'false', - 'github_repo': 'tom_base', - 'github_button': 'false', -} - -pygments_style = 'sphinx' - -# 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_css_files = ["custom.css"] +html_favicon = "_static/logo-color.png" +github_doc_root = "https://github.com/TOMToolkit/tom_base/tree/dev/docs" def setup(app): - app.add_source_suffix('.md', 'markdown') - app.add_source_parser(CommonMarkParser) + pass diff --git a/docs/index.rst b/docs/index.rst index 829408a3b..909954f5f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,7 +8,7 @@ Welcome to the TOM Toolkit's documentation! .. toctree:: :maxdepth: 3 - :hidden: + :titlesonly: introduction/credits introduction/index diff --git a/poetry.lock b/poetry.lock index 0937ef00f..7ba9b163d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,23 @@ -# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. + +[[package]] +name = "accessible-pygments" +version = "0.0.5" +description = "A collection of accessible pygments styles" +optional = false +python-versions = ">=3.9" +groups = ["docs"] +files = [ + {file = "accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7"}, + {file = "accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872"}, +] + +[package.dependencies] +pygments = ">=1.5" + +[package.extras] +dev = ["pillow", "pkginfo (>=1.10)", "playwright", "pre-commit", "setuptools", "twine (>=5.0)"] +tests = ["hypothesis", "pytest"] [[package]] name = "alabaster" @@ -332,7 +351,7 @@ version = "4.14.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" -groups = ["main"] +groups = ["main", "docs"] files = [ {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, @@ -596,19 +615,81 @@ files = [ ] [[package]] -name = "commonmark" -version = "0.9.1" -description = "Python parser for the CommonMark Markdown spec" +name = "contourpy" +version = "1.3.2" +description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = "*" +python-versions = ">=3.10" groups = ["docs"] files = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, + {file = "contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934"}, + {file = "contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631"}, + {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f"}, + {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2"}, + {file = "contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0"}, + {file = "contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a"}, + {file = "contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445"}, + {file = "contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7"}, + {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83"}, + {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd"}, + {file = "contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f"}, + {file = "contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878"}, + {file = "contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2"}, + {file = "contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe"}, + {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441"}, + {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e"}, + {file = "contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912"}, + {file = "contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73"}, + {file = "contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb"}, + {file = "contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841"}, + {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422"}, + {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef"}, + {file = "contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f"}, + {file = "contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9"}, + {file = "contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f"}, + {file = "contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b"}, + {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52"}, + {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd"}, + {file = "contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1"}, + {file = "contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69"}, + {file = "contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c"}, + {file = "contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16"}, + {file = "contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad"}, + {file = "contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0"}, + {file = "contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5"}, + {file = "contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5"}, + {file = "contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54"}, ] +[package.dependencies] +numpy = ">=1.23" + [package.extras] -test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.15.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" @@ -841,6 +922,22 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi (>=2024)", "cryptography-vectors (==46.0.5)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +groups = ["docs"] +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "django" version = "5.2.11" @@ -1075,6 +1172,21 @@ files = [ {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] +[[package]] +name = "emoji" +version = "2.15.0" +description = "Emoji for Python" +optional = false +python-versions = ">=3.8" +groups = ["docs"] +files = [ + {file = "emoji-2.15.0-py3-none-any.whl", hash = "sha256:205296793d66a89d88af4688fa57fd6496732eb48917a87175a023c8138995eb"}, + {file = "emoji-2.15.0.tar.gz", hash = "sha256:eae4ab7d86456a70a00a985125a03263a5eac54cd55e51d7e184b1ed3b6757e4"}, +] + +[package.extras] +dev = ["coverage", "pytest (>=7.4.4)"] + [[package]] name = "factory-boy" version = "3.3.3" @@ -1146,6 +1258,79 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.12.0,<2.13.0" pyflakes = ">=3.2.0,<3.3.0" +[[package]] +name = "fonttools" +version = "4.62.1" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.10" +groups = ["docs"] +files = [ + {file = "fonttools-4.62.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad5cca75776cd453b1b035b530e943334957ae152a36a88a320e779d61fc980c"}, + {file = "fonttools-4.62.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3ae47e8636156a9accff64c02c0924cbebad62854c4a6dbdc110cd5b4b341a"}, + {file = "fonttools-4.62.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b9e288b4da2f64fd6180644221749de651703e8d0c16bd4b719533a3a7d6e3"}, + {file = "fonttools-4.62.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7bca7a1c1faf235ffe25d4f2e555246b4750220b38de8261d94ebc5ce8a23c23"}, + {file = "fonttools-4.62.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4e0fcf265ad26e487c56cb12a42dffe7162de708762db951e1b3f755319507d"}, + {file = "fonttools-4.62.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2d850f66830a27b0d498ee05adb13a3781637b1826982cd7e2b3789ef0cc71ae"}, + {file = "fonttools-4.62.1-cp310-cp310-win32.whl", hash = "sha256:486f32c8047ccd05652aba17e4a8819a3a9d78570eb8a0e3b4503142947880ed"}, + {file = "fonttools-4.62.1-cp310-cp310-win_amd64.whl", hash = "sha256:5a648bde915fba9da05ae98856987ca91ba832949a9e2888b48c47ef8b96c5a9"}, + {file = "fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:40975849bac44fb0b9253d77420c6d8b523ac4dcdcefeff6e4d706838a5b80f7"}, + {file = "fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9dde91633f77fa576879a0c76b1d89de373cae751a98ddf0109d54e173b40f14"}, + {file = "fonttools-4.62.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6acb4109f8bee00fec985c8c7afb02299e35e9c94b57287f3ea542f28bd0b0a7"}, + {file = "fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1c5c25671ce8805e0d080e2ffdeca7f1e86778c5cbfbeae86d7f866d8830517b"}, + {file = "fonttools-4.62.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5d8825e1140f04e6c99bb7d37a9e31c172f3bc208afbe02175339e699c710e1"}, + {file = "fonttools-4.62.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:268abb1cb221e66c014acc234e872b7870d8b5d4657a83a8f4205094c32d2416"}, + {file = "fonttools-4.62.1-cp311-cp311-win32.whl", hash = "sha256:942b03094d7edbb99bdf1ae7e9090898cad7bf9030b3d21f33d7072dbcb51a53"}, + {file = "fonttools-4.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:e8514f4924375f77084e81467e63238b095abda5107620f49421c368a6017ed2"}, + {file = "fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974"}, + {file = "fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9"}, + {file = "fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936"}, + {file = "fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392"}, + {file = "fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04"}, + {file = "fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d"}, + {file = "fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c"}, + {file = "fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42"}, + {file = "fonttools-4.62.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79"}, + {file = "fonttools-4.62.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe"}, + {file = "fonttools-4.62.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68"}, + {file = "fonttools-4.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1"}, + {file = "fonttools-4.62.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069"}, + {file = "fonttools-4.62.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9"}, + {file = "fonttools-4.62.1-cp313-cp313-win32.whl", hash = "sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24"}, + {file = "fonttools-4.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056"}, + {file = "fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca"}, + {file = "fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca"}, + {file = "fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782"}, + {file = "fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae"}, + {file = "fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7"}, + {file = "fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a"}, + {file = "fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800"}, + {file = "fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e"}, + {file = "fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82"}, + {file = "fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260"}, + {file = "fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4"}, + {file = "fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b"}, + {file = "fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87"}, + {file = "fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c"}, + {file = "fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a"}, + {file = "fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e"}, + {file = "fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd"}, + {file = "fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d"}, +] + +[package.extras] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.45.0)"] +symfont = ["sympy"] +type1 = ["xattr ; sys_platform == \"darwin\""] +unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] + [[package]] name = "gwcs" version = "0.24.0" @@ -1406,6 +1591,133 @@ enabler = ["pytest-enabler (>=3.4)"] test = ["pyfakefs", "pytest (>=6,!=8.1.*)"] type = ["pygobject-stubs", "pytest-mypy (>=1.0.1)", "shtab", "types-pywin32"] +[[package]] +name = "kiwisolver" +version = "1.5.0" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.10" +groups = ["docs"] +files = [ + {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32cc0a5365239a6ea0c6ed461e8838d053b57e397443c0ca894dcc8e388d4374"}, + {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc0b66c1eec9021353a4b4483afb12dfd50e3669ffbb9152d6842eb34c7e29fd"}, + {file = "kiwisolver-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86e0287879f75621ae85197b0877ed2f8b7aa57b511c7331dce2eb6f4de7d476"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:62f59da443c4f4849f73a51a193b1d9d258dcad0c41bc4d1b8fb2bcc04bfeb22"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9190426b7aa26c5229501fa297b8d0653cfd3f5a36f7990c264e157cbf886b3b"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8277104ded0a51e699c8c3aff63ce2c56d4ed5519a5f73e0fd7057f959a2b9e"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8f9baf6f0a6e7571c45c8863010b45e837c3ee1c2c77fcd6ef423be91b21fedb"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cff8e5383db4989311f99e814feeb90c4723eb4edca425b9d5d9c3fefcdd9537"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ebae99ed6764f2b5771c522477b311be313e8841d2e0376db2b10922daebbba4"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d5cd5189fc2b6a538b75ae45433140c4823463918f7b1617c31e68b085c0022c"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f42c23db5d1521218a3276bb08666dcb662896a0be7347cba864eca45ff64ede"}, + {file = "kiwisolver-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:94eff26096eb5395136634622515b234ecb6c9979824c1f5004c6e3c3c85ccd2"}, + {file = "kiwisolver-1.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:dd952e03bfbb096cfe2dd35cd9e00f269969b67536cb4370994afc20ff2d0875"}, + {file = "kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c"}, + {file = "kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb"}, + {file = "kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4"}, + {file = "kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b"}, + {file = "kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac"}, + {file = "kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9"}, + {file = "kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588"}, + {file = "kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9"}, + {file = "kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384"}, + {file = "kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7"}, + {file = "kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09"}, + {file = "kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3"}, + {file = "kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0"}, + {file = "kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276"}, + {file = "kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53"}, + {file = "kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615"}, + {file = "kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02"}, + {file = "kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796"}, + {file = "kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e"}, + {file = "kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:295d9ffe712caa9f8a3081de8d32fc60191b4b51c76f02f951fd8407253528f4"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:51e8c4084897de9f05898c2c2a39af6318044ae969d46ff7a34ed3f96274adca"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b83af57bdddef03c01a9138034c6ff03181a3028d9a1003b301eb1a55e161a3f"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf4679a3d71012a7c2bf360e5cd878fbd5e4fcac0896b56393dec239d81529ed"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:41024ed50e44ab1a60d3fe0a9d15a4ccc9f5f2b1d814ff283c8d01134d5b81bc"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1"}, + {file = "kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a"}, +] + [[package]] name = "markdown" version = "3.10.2" @@ -1422,6 +1734,31 @@ files = [ docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python] (>=0.28.3)"] testing = ["coverage", "pyyaml"] +[[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" +groups = ["docs"] +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 = "3.0.3" @@ -1521,6 +1858,85 @@ files = [ {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] +[[package]] +name = "matplotlib" +version = "3.10.8" +description = "Python plotting package" +optional = false +python-versions = ">=3.10" +groups = ["docs"] +files = [ + {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, + {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, + {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, + {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, + {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, + {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, + {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, + {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, + {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, + {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=3" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] + [[package]] name = "mccabe" version = "0.7.0" @@ -1533,6 +1949,38 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mdit-py-plugins" +version = "0.5.0" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.10" +groups = ["docs"] +files = [ + {file = "mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f"}, + {file = "mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6"}, +] + +[package.dependencies] +markdown-it-py = ">=2.0.0,<5.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" +groups = ["docs"] +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 = "more-itertools" version = "10.8.0" @@ -1545,6 +1993,33 @@ files = [ {file = "more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd"}, ] +[[package]] +name = "myst-parser" +version = "4.0.1" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +optional = false +python-versions = ">=3.10" +groups = ["docs"] +files = [ + {file = "myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d"}, + {file = "myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4"}, +] + +[package.dependencies] +docutils = ">=0.19,<0.22" +jinja2 = "*" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4.1,<1.0" +pyyaml = "*" +sphinx = ">=7,<9" + +[package.extras] +code-style = ["pre-commit (>=4.0,<5.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pygments (<2.19)", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"] + [[package]] name = "ndcube" version = "2.3.5" @@ -1577,7 +2052,7 @@ version = "2.1.3" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "docs"] files = [ {file = "numpy-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff"}, {file = "numpy-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5"}, @@ -1654,7 +2129,7 @@ version = "12.1.1" description = "Python Imaging Library (fork)" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "docs"] files = [ {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, @@ -1930,13 +2405,28 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyparsing" +version = "3.3.2" +description = "pyparsing - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +groups = ["docs"] +files = [ + {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, + {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] +groups = ["main", "docs"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1997,7 +2487,7 @@ version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "test"] +groups = ["main", "docs", "test"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -2074,23 +2564,6 @@ files = [ {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] -[[package]] -name = "recommonmark" -version = "0.7.1" -description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." -optional = false -python-versions = "*" -groups = ["docs"] -files = [ - {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, - {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, -] - -[package.dependencies] -commonmark = ">=0.8.1" -docutils = ">=0.11" -sphinx = ">=1.3.1" - [[package]] name = "requests" version = "2.32.5" @@ -2236,7 +2709,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] +groups = ["main", "docs"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -2260,7 +2733,7 @@ version = "2.8.3" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "docs"] files = [ {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, @@ -2294,18 +2767,18 @@ test = ["matplotlib", "pytest-astropy", "spectral-cube", "tox"] [[package]] name = "sphinx" -version = "7.4.7" +version = "8.1.3" description = "Python documentation generator" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["docs"] files = [ - {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, - {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, + {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"}, + {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"}, ] [package.dependencies] -alabaster = ">=0.7.14,<0.8.0" +alabaster = ">=0.7.14" babel = ">=2.13" colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} docutils = ">=0.20,<0.22" @@ -2315,19 +2788,41 @@ packaging = ">=23.0" Pygments = ">=2.17" requests = ">=2.30.0" snowballstemmer = ">=2.2" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" +sphinxcontrib-applehelp = ">=1.0.7" +sphinxcontrib-devhelp = ">=1.0.6" +sphinxcontrib-htmlhelp = ">=2.0.6" +sphinxcontrib-jsmath = ">=1.0.1" +sphinxcontrib-qthelp = ">=1.0.6" sphinxcontrib-serializinghtml = ">=1.1.9" tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +lint = ["flake8 (>=6.0)", "mypy (==1.11.1)", "pyright (==1.1.384)", "pytest (>=6.0)", "ruff (==0.6.9)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-Pillow (==10.2.0.20240822)", "types-Pygments (==2.18.0.20240506)", "types-colorama (==0.4.15.20240311)", "types-defusedxml (==0.7.0.20240218)", "types-docutils (==0.21.0.20241005)", "types-requests (==2.32.0.20240914)", "types-urllib3 (==1.26.25.14)"] test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] +[[package]] +name = "sphinx-breeze-theme" +version = "0.13.2" +description = "A clean and modern Sphinx theme with polished API docs." +optional = false +python-versions = ">=3.10" +groups = ["docs"] +files = [ + {file = "sphinx_breeze_theme-0.13.2-py3-none-any.whl", hash = "sha256:ea008094e5fddaf9fad109475e8bc8742cb183b13dc529b233a090e07bc43fb5"}, + {file = "sphinx_breeze_theme-0.13.2.tar.gz", hash = "sha256:6cb2b6c26524970d04080b86f603cf723887f2ac8d02ec0a4d5266b49f816e3f"}, +] + +[package.dependencies] +accessible-pygments = "*" +beautifulsoup4 = "*" +docutils = "*" +emoji = "*" +pygments = "*" +sphinx = ">=8.0" +sphinxext-opengraph = {version = "*", extras = ["social-cards"]} +typing-extensions = "*" + [[package]] name = "sphinx-copybutton" version = "0.5.2" @@ -2373,26 +2868,6 @@ theme-pydata = ["pydata-sphinx-theme (>=0.15.2,<0.16.0)"] theme-rtd = ["sphinx-rtd-theme (>=2.0,<3.0)"] theme-sbt = ["sphinx-book-theme (>=1.1,<2.0)"] -[[package]] -name = "sphinx-rtd-theme" -version = "3.0.2" -description = "Read the Docs theme for Sphinx" -optional = false -python-versions = ">=3.8" -groups = ["docs"] -files = [ - {file = "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", hash = "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13"}, - {file = "sphinx_rtd_theme-3.0.2.tar.gz", hash = "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85"}, -] - -[package.dependencies] -docutils = ">0.18,<0.22" -sphinx = ">=6,<9" -sphinxcontrib-jquery = ">=4,<5" - -[package.extras] -dev = ["bump2version", "transifex-client", "twine", "wheel"] - [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" @@ -2444,21 +2919,6 @@ lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] -[[package]] -name = "sphinxcontrib-jquery" -version = "4.1" -description = "Extension to include jQuery on newer Sphinx releases" -optional = false -python-versions = ">=2.7" -groups = ["docs"] -files = [ - {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, - {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, -] - -[package.dependencies] -Sphinx = ">=1.8" - [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" @@ -2508,6 +2968,26 @@ lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] +[[package]] +name = "sphinxext-opengraph" +version = "0.13.0" +description = "Sphinx Extension to enable OGP support" +optional = false +python-versions = ">=3.9" +groups = ["docs"] +files = [ + {file = "sphinxext_opengraph-0.13.0-py3-none-any.whl", hash = "sha256:936c07828edc9ad9a7b07908b29596dc84ed0b3ceaa77acdf51282d232d4d80e"}, + {file = "sphinxext_opengraph-0.13.0.tar.gz", hash = "sha256:103335d08567ad8468faf1425f575e3b698e9621f9323949a6c8b96d9793e80b"}, +] + +[package.dependencies] +matplotlib = {version = ">=3", optional = true, markers = "extra == \"social-cards\""} +Sphinx = ">=6.0" + +[package.extras] +rtd = ["furo (>=2024)", "sphinx (>=8.1.0,<8.2.0)", "sphinx-design"] +social-cards = ["matplotlib (>=3)"] + [[package]] name = "sqlparse" version = "0.5.5" @@ -2604,7 +3084,7 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "docs"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -2677,4 +3157,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10.0,<3.14" -content-hash = "42e84dedd351bd8a9baa634188ea539502c13cb3ac9f831a53cd59a301ef81cd" +content-hash = "1d6114c680d1e0530b7d9fc64f463f737c7fae9574658f345cd28f25aa04ffda" diff --git a/pyproject.toml b/pyproject.toml index 6877dc042..acd2bf9b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -94,11 +94,11 @@ psycopg2-binary = "*" # for testing postgres [tool.poetry.group.docs.dependencies] docutils = "!=0.21.post1" -recommonmark = "~0.7" -sphinx = ">=5,<8" +sphinx = ">=8" sphinx-design = ">=0.6,<0.7" -sphinx-rtd-theme = ">=1.0,<3.1" +sphinx-breeze-theme = "0.13.2" sphinx-copybutton = "~0.5" +myst-parser = "==4.0.1" [tool.poetry.group.coverage.dependencies] coverage = ">=6,<8" # coveralls needs ~6 even though 7.3.2 is latest From c5b5c68d02e7908467895bd7e4dabf6207183154 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Wed, 25 Mar 2026 16:41:13 -0700 Subject: [PATCH 02/13] Updated the theme for the Toolkit's documentation and resolved dependencies --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index acd2bf9b3..0b9217246 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -107,7 +107,6 @@ coveralls = ">=3,<5" [tool.poetry.group.lint.dependencies] flake8 = ">=6.0,<7.2" - [tool.poetry.requires-plugins] poetry-dynamic-versioning = { version = ">=1.0.0,<2.0.0", extras = ["plugin"] } From c1371ca1e6cda5d95a2d022292e3f1b38f8cc3cf Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Wed, 6 May 2026 16:44:26 -0700 Subject: [PATCH 03/13] Revamp landing page and navbar --- docs/_static/custom.css | 5 + docs/{api/plugins.md => code/plugins.rst} | 2 +- docs/index.rst | 159 ++++++++-------------- 3 files changed, 61 insertions(+), 105 deletions(-) rename docs/{api/plugins.md => code/plugins.rst} (99%) diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 550090ce5..9b0b17650 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -18,4 +18,9 @@ div.partners { a.hs { padding-right: 10%; +} + +.toctree-l1 > a[href*="getting_started"] { + color: #017792 !important; + font-weight: bold; } \ No newline at end of file diff --git a/docs/api/plugins.md b/docs/code/plugins.rst similarity index 99% rename from docs/api/plugins.md rename to docs/code/plugins.rst index 65aa18a40..459c298fc 100644 --- a/docs/api/plugins.md +++ b/docs/code/plugins.rst @@ -1,5 +1,5 @@ Plugins ---- +======= ### TOM Toolkit Plugins diff --git a/docs/index.rst b/docs/index.rst index 909954f5f..d06a397e2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,89 +1,82 @@ -Welcome to the TOM Toolkit's documentation! -=========================================== - -.. button-link:: introduction/getting_started.html - :color: info - - Quickstart Guide +TOM Toolkit +=========== .. toctree:: - :maxdepth: 3 - :titlesonly: + :maxdepth: 2 + :hidden: - introduction/credits - introduction/index - introduction/about - introduction/support - introduction/troubleshooting + Getting started + Configuration + Targets + Dataservices + Observing + Data + Customization + APIs + Deploy + Plugins Introduction ------------ -The TOM (Target and Observation Manager) Toolkit project was started in early 2018 with the goal of simplifying the development of next generation software for the rapidly evolving field of astronomy. Read more :doc:`about TOMs` and the motivation for them. - -:doc:`TOM Toolkit Architecture ` - This document describes the architecture of the TOM Toolkit at a -high level. Read this first if you're interested in how the TOM Toolkit works. - -:doc:`Getting Started with the TOM Toolkit` - First steps for getting a TOM up and running. +Target and Observation Manager systems (TOMs, aka marshals) are designed to help researchers +to manage all aspects of astronomical programs. With data rates and volumes increasing, keeping track of +all targets, data products and observations can be a challenge. A TOM system provides a flexible database +of all project information, with a built-in observation and data analysis control system, +together with communication and data visualization tools. +Hundreds of users can then use them to collaborate scientifically, share results and to coordinate +the acquisition of new data. -:doc:`TOM Workflow ` - The general workflow used with TOMs. +The TOM (Target and Observation Manager) Toolkit is designed to make it easy for astronomers to build +and customize a TOM system for their science goals. The package includes a full-featured TOM system +out of the box, and this documentation describes how you can extend this system for your own needs. -:doc:`Programming Resources ` - Resources for learning the core components of the TOM Toolkit: -HTML, CSS, Python, and Django +More information about the project can be found in :doc:`here`. -:doc:`Frequently Asked Questions ` - Look here for a potential quick answer to a common question. +Installation & Configuration +---------------------------- -:doc:`Troubleshooting ` - Find solutions to common problems or information on how to debug an issue. +Full instructions for installing the package and creating your own TOM system can be found in :doc:`getting started`. -Interested in seeing what a TOM can do? Take a look at our `demonstration TOM `_, where we show off the features of the TOM Toolkit. +A range of common configuration options are covered in :doc:`custom settings`, including options +to control user permissions. -If you'd like to know what we're working on, check out the `TOM Toolkit project board `_. - - -Topics ------- - -.. toctree:: - :maxdepth: 2 - :hidden: +Examples +-------- - targets/index - brokers/index - observing/index - managing_data/index - customization/index - common/permissions - common/latex_generation - code/index - deployment/index - common/customsettings +It's always helpful to have template projects as a reference, so we run a `TOM demo system `__ +where you can explore the TOM's features. If you want to see how this was done, you can explore the code on +`Github `__. +Customizing your system +----------------------- -:doc:`Targets ` - Learn all about how to manage Targets in a TOM. +The TOM is designed to be flexible, and there are a number of ways to customize it, from the look and feel of its +user interface, to adding science-specific parameters to each target to adding custom functions and applications. +All of these options are described :doc:`here`. -:doc:`Brokers ` - Find out about querying brokers in the TOM, which are available, and writing your own. - -:doc:`Observing ` - Tutorials on submitting observations, customizing submission, and the available facilities. - -:doc:`Managing Data ` - Customize plots, upload data, and even integrate a data reduction pipeline. - -:doc:`Customization ` - Customize and create new views in your TOM. - -:doc:`The Permissions System ` - Use the permissions system to limit access to targets in your TOM. +Plugins +------- -:doc:`LaTeX Generation ` - Generate data tables for your targets and observations +In addition to the features of the base TOM, we also support a range of optional plugin modules. +These extend the functions of the TOM in various ways that are useful for many users. Examples include data visualization +tools for specific science goals, and interfaces for observations with additional telescope facilities. +Click :doc:`here` to browse the list of options. -:doc:`Interacting with your TOM through code ` - Learn how to programmatically interact with your TOM. +Support +------- -:doc:`Deploying your TOM Online ` - Resources for deploying your TOM to a cloud provider +Looking for help? Want to request a feature? Have questions about Github Issues? Take a look at the :doc:`support guide +`. -:doc:`TOM Settings ` - Reference and description for the available settings values to be added to/edited in your project's ``settings.py``. +If you just need an idea, checkout out the :doc:`examples` of existing TOMs built with the TOM Toolkit. Contributing ------------ +The TOM Toolkit is a community-driven project and we welcome feedback and contributions from our users! If you find an issue, you need help with your TOM, you have a useful idea, or you wrote a module you'd like to be -included in the TOM Toolkit, start with the :doc:`Contribution Guide `. +included in the TOM Toolkit, start with our :doc:`contribution guide `. Acknowledging the TOM Toolkit ----------------------------- @@ -95,49 +88,8 @@ We would also very much appreciate you including a citation to our paper describ the Toolkit `Street, R.A. et al., 2018, SPIE, 10707, 11 `_ (to export the BibTeX please click `here `_). -.. toctree:: - :maxdepth: 1 - - introduction/acknowledging_tom_toolkit - -Support -------- - -Looking for help? Want to request a feature? Have questions about Github Issues? Take a look at the :doc:`support guide -`. - -If you just need an idea, checkout out the :doc:`examples` of existing TOMs built with the TOM Toolkit. - -.. toctree:: - :maxdepth: 1 - :hidden: - - examples - introduction/contributing - Releases - Release Notes - Github - -API Documentation ------------------ - -.. toctree:: - :maxdepth: 2 - - api/modules - api/plugins - api/affiliated - -****************** -Indices and tables -****************** - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - -About the TOM Toolkit ---------------------- +Acknowledgements +---------------- The TOM Toolkit is managed by Las Cumbres Observatory, with generous financial support from the `National Science Foundation `_ grant 2209852. @@ -145,5 +97,4 @@ We are also grateful for support from the `Heising-Simons Foundation `_ and the `Zegar Family Foundation `_ at the start of the project. - Read about the project and the motivations behind it on the :doc:`About page `. From 95ff72c65e5b2bce16753ec6e16633b4da15bf68 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Wed, 6 May 2026 17:30:53 -0700 Subject: [PATCH 04/13] Revamp configurations pages --- docs/common/customsettings.rst | 2 +- docs/common/index.rst | 27 +++++++++++++++++++++++++++ docs/index.rst | 2 +- docs/introduction/getting_started.rst | 20 ++++++++++++-------- 4 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 docs/common/index.rst diff --git a/docs/common/customsettings.rst b/docs/common/customsettings.rst index 454988919..2d1c485e1 100644 --- a/docs/common/customsettings.rst +++ b/docs/common/customsettings.rst @@ -1,5 +1,5 @@ TOM Specific Settings ---------------------- +===================== The following is a list of TOM Specific settings to be added/edited in your project’s ``settings.py``. For explanations of Django specific diff --git a/docs/common/index.rst b/docs/common/index.rst new file mode 100644 index 000000000..ea6d52e35 --- /dev/null +++ b/docs/common/index.rst @@ -0,0 +1,27 @@ +Configuring a TOM +================= + +TOM Settings +------------ + +TOMs have a number of configurable settings that are needed for various functions. +Since the Toolkit is based on the `Django framework `__ +most of these options are controlled via the settings.py file. You'll find this +is created for you when you initialize a new TOM: + +.. code:: + + mytom/ + | mytom/ + |- settings.py + ... + +The admin of the TOM can edit this file to set the parameters as desired. A full list of the +configurable options is given :doc:`here` + +Permissions +----------- + +TOM systems can have hundreds or thousands of users and we recognize that sometimes it is desirable to control +who can access what data or functions. The Toolkit provides fine-grained control over user permissions, as documented +:doc:`here`. diff --git a/docs/index.rst b/docs/index.rst index d06a397e2..ee6b001f1 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,7 +6,7 @@ TOM Toolkit :hidden: Getting started - Configuration + Configuration Targets Dataservices Observing diff --git a/docs/introduction/getting_started.rst b/docs/introduction/getting_started.rst index 704ba167f..f95afa831 100644 --- a/docs/introduction/getting_started.rst +++ b/docs/introduction/getting_started.rst @@ -1,8 +1,5 @@ -Getting Started with the TOM Toolkit ------------------------------------- - -So you’ve decided to run a Target and Observation Manager system. This article will -help you get started. +Getting Started +=============== The TOM Toolkit is a `Django `__ project. This means you’ll be running an application based on the Django @@ -16,7 +13,7 @@ likely won’t need to utilize any advanced features. Ready to go? Let’s get started. Quickstart -~~~~~~~~~~ +---------- The easiest way to getting a TOM system up and running on a Linux or Mac is to use our make-tom script. If you would rather install the TOM manually, you can follow the instructions in the :doc:`Manual Installation @@ -50,7 +47,7 @@ Your TOM should now be initialized, and you are ready to spin up a server. .. _runserver: Running the dev server -~~~~~~~~~~~~~~~~~~~~~~ +---------------------- Now that your TOM has been built you can run it immediately, directly on your local machine, using the command ``runserver``: @@ -61,4 +58,11 @@ your local machine, using the command ``runserver``: Now, if you open a web browser, you can navigate to the URL `http://127.0.0.1:8000 `_ and you should see your -new TOM up and running! Go ahead and login to explore what it can do. \ No newline at end of file +new TOM up and running! Go ahead and login to explore what it can do. + +Manual Installation +------------------- + +If you would prefer to install the TOM yourself, full instructions can be +found in our :doc:`Manual Installation +Guide `. \ No newline at end of file From 7f2877363ee18bf46448904a379c8afb0cdeaa49 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Wed, 6 May 2026 22:01:48 -0700 Subject: [PATCH 05/13] Refactor docs for targets --- docs/brokers/index.rst | 29 --------- docs/common/customsettings.rst | 4 +- .../create_broker.rst | 0 .../create_dash_broker.rst | 0 .../create_dataservice.rst | 0 docs/dataservices/index.rst | 33 ++++++++++ docs/index.rst | 4 +- docs/introduction/tomarchitecture.rst | 2 +- docs/targets/index.rst | 63 ++++++++++++------- tom_alerts/alerts.py | 16 ++--- tom_alerts/brokers/alerce.py | 2 +- tom_alerts/brokers/gaia.py | 2 +- tom_alerts/brokers/lasair.py | 2 +- tom_alerts/brokers/tns.py | 2 +- tom_alerts/tests/brokers/test_alerce.py | 30 ++++----- tom_alerts/tests/brokers/test_gaia.py | 14 ++--- tom_alerts/tests/brokers/test_lasair.py | 4 +- tom_alerts/tests/tests.py | 8 +-- tom_alerts/views.py | 4 +- 19 files changed, 122 insertions(+), 97 deletions(-) delete mode 100644 docs/brokers/index.rst rename docs/{brokers => dataservices}/create_broker.rst (100%) rename docs/{brokers => dataservices}/create_dash_broker.rst (100%) rename docs/{brokers => dataservices}/create_dataservice.rst (100%) create mode 100644 docs/dataservices/index.rst diff --git a/docs/brokers/index.rst b/docs/brokers/index.rst deleted file mode 100644 index 4da6fa5df..000000000 --- a/docs/brokers/index.rst +++ /dev/null @@ -1,29 +0,0 @@ -Brokers -======= - -.. toctree:: - :maxdepth: 2 - :hidden: - - create_broker - create_dash_broker - ../api/tom_alerts/brokers - ../api/tom_alerts/views - create_dataservice - - -What is an Alert Broker Module? -------------------------------- - -A TOM Toolkit Alert Broker Module is an object which contains the logic for querying a remote broker -(e.g `ANTARES `_), and transforming the returned data into TOM Toolkit Targets. - -:doc:`Creating an Alert Broker ` - Learn how to add a custom broker module to query for targets from your favorite broker. - -:doc:`Creating a Dash Alert Broker ` - Add a responsive broker module to browse alerts using Plotly Dash. - -:doc:`Broker Modules <../api/tom_alerts/brokers>` - Take a look at the supported brokers. - -:doc:`Broker Views <../api/tom_alerts/views>` - Familiarize yourself with the available Broker Views. - -:doc:`Create Data Service ` - Walk through the creation of your own Data Service. diff --git a/docs/common/customsettings.rst b/docs/common/customsettings.rst index 2d1c485e1..d5b572bae 100644 --- a/docs/common/customsettings.rst +++ b/docs/common/customsettings.rst @@ -222,7 +222,7 @@ A list of tom alert classes to make available to your TOM. If you have written or downloaded additional alert classes you would make them available here. If you’d like to write your own alert module please see the documentation on :doc:`Creating an Alert Module for the TOM -Toolkit <../brokers/create_broker>`. +Toolkit `. `TOM_ALERT_DASH_CLASSES <#tom-alert-dash-classes>`__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -239,7 +239,7 @@ Default: A list of tom alert dash classes to make available to your TOM. If you have written or downloaded additional alert classes you would make them available here. If you’d like to write your own dash alert module, please see -the documentation on :doc:`Plotly Dash Broker Modules in the TOM Toolkit <../brokers/create_dash_broker>`. +the documentation on :doc:`Plotly Dash Broker Modules in the TOM Toolkit `. `TOM_FACILITY_CLASSES <#tom-facility-classes>`__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/brokers/create_broker.rst b/docs/dataservices/create_broker.rst similarity index 100% rename from docs/brokers/create_broker.rst rename to docs/dataservices/create_broker.rst diff --git a/docs/brokers/create_dash_broker.rst b/docs/dataservices/create_dash_broker.rst similarity index 100% rename from docs/brokers/create_dash_broker.rst rename to docs/dataservices/create_dash_broker.rst diff --git a/docs/brokers/create_dataservice.rst b/docs/dataservices/create_dataservice.rst similarity index 100% rename from docs/brokers/create_dataservice.rst rename to docs/dataservices/create_dataservice.rst diff --git a/docs/dataservices/index.rst b/docs/dataservices/index.rst new file mode 100644 index 000000000..65c88370c --- /dev/null +++ b/docs/dataservices/index.rst @@ -0,0 +1,33 @@ +Dataservices +============ + +There are many sources of data in astrophysics, including alert brokers, data archives, data sharing facilities and +forced photometry services. Many services offer a number of functions. TOM's dataservices module provides interfaces to +enable users to query these services and retrieve data from them for further analysis in the TOM. + +Built-in Dataservices +--------------------- +The Toolkit includes built-in modules to query widely-used public services, including: + +* `Simbad `__ +* `The Transient Name Server `__ +* `ANTARES alert broker `__ +* `Fink alert broker `__ +* `ALeRCE alert broker `__ +* `Hermes `__ +* `JPL SCOUT `__ + +More information on these interfaces is summarized in :doc:`Broker Modules `, and +:doc:`Broker Views ` describes the views available. + +Adding Dataservices +------------------- + +The Toolkit is designed to be extensible and we welcome contributed modules. If you're interested +in developing a dataservice for your own science, here are some resources to get you started. + +:doc:`Creating an Alert Broker ` - Learn how to add a custom broker module to query for targets from your favorite broker. + +:doc:`Creating a Dash Alert Broker ` - Add a responsive broker module to browse alerts using Plotly Dash. + +:doc:`Create Data Service ` - Walk through the creation of your own Data Service. diff --git a/docs/index.rst b/docs/index.rst index ee6b001f1..1a1b77cd8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,7 +8,7 @@ TOM Toolkit Getting started Configuration Targets - Dataservices + Dataservices Observing Data Customization @@ -85,7 +85,7 @@ We hope you find our software useful for your research. If so, we would be grat if you can include a brief acknowledgement in your papers and presentations, for example "This research made use of `The TOM Toolkit `_". We would also very much appreciate you including a citation to our paper describing -the Toolkit `Street, R.A. et al., 2018, SPIE, 10707, 11 `_ +the Toolkit `Street, R.A. et al., 2018, SPIE, 10707, 11 `_ (to export the BibTeX please click `here `_). Acknowledgements diff --git a/docs/introduction/tomarchitecture.rst b/docs/introduction/tomarchitecture.rst index b9fe01c5f..6e90640f7 100644 --- a/docs/introduction/tomarchitecture.rst +++ b/docs/introduction/tomarchitecture.rst @@ -53,7 +53,7 @@ to implement the specific features that their science case requires. The toolkit tries to facilitate this as efficiently as possible and provides :doc:`documentation ` in areas of customization from :doc:`changing the HTML layout of a page ` to :doc:`customizing an OCS facility and forms ` and even -:doc:`creating a new alert broker `. +:doc:`creating a new alert broker `. Django, and by extension the toolkit, rely heavily on object oriented programming, especially inheritance. Most customization in the TOM toolkit comes diff --git a/docs/targets/index.rst b/docs/targets/index.rst index 905a8bc99..eb09b3cc6 100644 --- a/docs/targets/index.rst +++ b/docs/targets/index.rst @@ -1,33 +1,54 @@ Targets ======= -.. toctree:: - :maxdepth: 2 - :hidden: +The ``Target``, along with the associated ``TargetList``, ``TargetExtra``, and ``TargetName``, are the core models of the +TOM Toolkit. The ``Target`` defines the concept of an astronomical target through a number of parameters. The ``Target`` +object is then used throughout the TOM to reference all the +information a user or app needs to know about a target. As astrophysical objects are often identified in multiple catalogs, +each ``Target`` is associated with one or more ``TargetName``s. - target_fields - target_matcher - target_table - ../api/tom_targets/models - ../api/tom_targets/views - ../api/tom_targets/groups +More information on Targets can be found using the following pages: +:doc:`Target Models ` - Take a look at the available properties for a ``Target`` and its associated models. -The ``Target``, along with the associated ``TargetList``, ``TargetExtra``, and ``TargetName``, are the core models of the -TOM Toolkit. The ``Target`` defines the concept of an astronomical target through a number of parameters. This -object is then used throughout the TOM to reference all the information a user or app needs to know about a target. -More information on Targets can be found using the following pages: +:doc:`Target Views ` - Familiarize yourself with the available Target Views. + +:doc:`Target Lists ` - Check out the functions for operating on Target Lists/Target Groups. + + +Customizing the BaseTarget +-------------------------- + +Although almost all astrophysical targets share some descriptive parameters - such as RA, Dec or orbital parameters - +the Toolkit recognises that each science case has a specific set of relevant parameters. For example, for some science +goals, a ``Target`` may have a measured period, while this may not be appropriate for an aperiodic object. + +For this reason, the Toolkit provides a ``BaseTarget`` class which supports both sidereal and non-sidereal celestial objects. +By default, this is used to create the ``Target`` model when a TOM is created. +However, this class is designed to be extended by users to add fields relevant to their science. See +:doc:`Adding Custom Target Fields ` to learn how to add custom fields to your TOM Targets. + +Crossmatching Targets +--------------------- -:doc:`Adding Custom Target Fields ` - Learn how to add custom fields to your TOM Targets if the -defaults do not suffice. +It is often useful to compare a target with those already in the TOM, especially to avoid duplicating targets. +By default, matching is performed on ``TargetName``, but the TOM includes functions to match on position as well. +If you need to compare targets using different parameters, :doc:`Customizing a Target Matcher ` +describes how to add a custom match function. -:doc:`Customizing a Target Matcher ` - Learn how to replace or modify the TargetMatchManager if more -options are needed. +TargetLists +----------- -:doc:`Customizing the Target List Table ` - Learn how to modify which columns are displayed in the target list table. +By default, all targets in the TOM are treated as a single collection, which can be viewed as a table and on an +interactive skymap by navigating to the Targets view. +The columns presented in the target list table can be customized - see :doc:`Customizing the Target List Table ` +for more information. -:doc:`Target Models <../api/tom_targets/models>` - Take a look at the available properties for a ``Target`` and its associated models. +Targets can be collected into user-created lists for convenience. -:doc:`Target Views <../api/tom_targets/views>` - Familiarize yourself with the available Target Views. +Target and TargetList Sharing +----------------------------- -:doc:`Target Lists <../api/tom_targets/groups>` - Check out the functions for operating on Target Lists/Target Groups. +Individual targets and their associated data can be shared directly with another TOM, with the TOM administrator's +permission. Sets of targets can also be shared. See :doc:`TOM Direct Sharing ` +to learn how to configure the TOMs to allow this. \ No newline at end of file diff --git a/tom_alerts/alerts.py b/tom_alerts/alerts.py index 9bf6ceb1f..7f45b427e 100644 --- a/tom_alerts/alerts.py +++ b/tom_alerts/alerts.py @@ -16,13 +16,13 @@ DEFAULT_ALERT_CLASSES = [ - 'tom_alerts.brokers.lasair.LasairBroker', - 'tom_alerts.brokers.scout.ScoutBroker', - 'tom_alerts.brokers.alerce.ALeRCEBroker', - # 'tom_alerts.brokers.antares.ANTARESBroker', - 'tom_alerts.brokers.gaia.GaiaBroker', - 'tom_alerts.brokers.fink.FinkBroker', # the stub for the plugin - 'tom_alerts.brokers.hermes.HermesBroker', # the stub for the plugin + 'tom_alerts.dataservices.lasair.LasairBroker', + 'tom_alerts.dataservices.scout.ScoutBroker', + 'tom_alerts.dataservices.alerce.ALeRCEBroker', + # 'tom_alerts.dataservices.antares.ANTARESBroker', + 'tom_alerts.dataservices.gaia.GaiaBroker', + 'tom_alerts.dataservices.fink.FinkBroker', # the stub for the plugin + 'tom_alerts.dataservices.hermes.HermesBroker', # the stub for the plugin ] @@ -178,7 +178,7 @@ class GenericBroker(ABC): https://github.com/TOMToolkit/tom_base/blob/main/tom_alerts/brokers/mars.py """ alert_submission_form = GenericUpstreamSubmissionForm - score_description = "The meaning of this field changes between brokers, please consult this broker's documentation." + score_description = "The meaning of this field changes between dataservices, please consult this broker's documentation." @abstractmethod def fetch_alerts(self, parameters: dict): diff --git a/tom_alerts/brokers/alerce.py b/tom_alerts/brokers/alerce.py index 41a49e923..bf0bf7383 100644 --- a/tom_alerts/brokers/alerce.py +++ b/tom_alerts/brokers/alerce.py @@ -430,7 +430,7 @@ class ALeRCEBroker(GenericBroker): .. code-block:: python TOM_ALERT_CLASSES = [ - 'tom_alerts.brokers.alerce.ALeRCEBroker', + 'tom_alerts.dataservices.alerce.ALeRCEBroker', ... ] diff --git a/tom_alerts/brokers/gaia.py b/tom_alerts/brokers/gaia.py index e1385fabc..3a64894ee 100644 --- a/tom_alerts/brokers/gaia.py +++ b/tom_alerts/brokers/gaia.py @@ -67,7 +67,7 @@ class GaiaBroker(GenericBroker): .. code-block:: python TOM_ALERT_CLASSES = [ - 'tom_alerts.brokers.gaia.GaiaBroker', + 'tom_alerts.dataservices.gaia.GaiaBroker', ... ] diff --git a/tom_alerts/brokers/lasair.py b/tom_alerts/brokers/lasair.py index 98f9881a2..ee8a95d42 100644 --- a/tom_alerts/brokers/lasair.py +++ b/tom_alerts/brokers/lasair.py @@ -87,7 +87,7 @@ class LasairBroker(GenericBroker): .. code-block:: python TOM_ALERT_CLASSES = [ - 'tom_alerts.brokers.lasair.LasairBroker', + 'tom_alerts.dataservices.lasair.LasairBroker', ... ] diff --git a/tom_alerts/brokers/tns.py b/tom_alerts/brokers/tns.py index 3f51b3641..ee4a05578 100644 --- a/tom_alerts/brokers/tns.py +++ b/tom_alerts/brokers/tns.py @@ -90,7 +90,7 @@ class TNSBroker(GenericBroker): .. code-block:: python TOM_ALERT_CLASSES = [ - 'tom_alerts.brokers.tns.TNSBroker', + 'tom_alerts.dataservices.tns.TNSBroker', ... ] diff --git a/tom_alerts/tests/brokers/test_alerce.py b/tom_alerts/tests/brokers/test_alerce.py index 8e3187050..c524f3283 100644 --- a/tom_alerts/tests/brokers/test_alerce.py +++ b/tom_alerts/tests/brokers/test_alerce.py @@ -77,7 +77,7 @@ def setUp(self): 'broker': 'ALeRCE' } - @patch('tom_alerts.brokers.alerce.cache') + @patch('tom_alerts.dataservices.alerce.cache') def test_cone_search_validation(self, mock_cache): """Test cross-field validation for cone search filters.""" @@ -98,7 +98,7 @@ def test_cone_search_validation(self, mock_cache): form = ALeRCEQueryForm(self.base_form_data) self.assertTrue(form.is_valid()) - @patch('tom_alerts.brokers.alerce.cache') + @patch('tom_alerts.dataservices.alerce.cache') def test_time_filters_validation(self, mock_cache): """Test validation for time filters.""" @@ -112,7 +112,7 @@ def test_time_filters_validation(self, mock_cache): form = ALeRCEQueryForm(parameters) self.assertTrue(form.is_valid()) - @patch('tom_alerts.brokers.alerce.cache.get') + @patch('tom_alerts.dataservices.alerce.cache.get') def test_classifier_filters_validation(self, mock_cache_get): mock_cache_get.return_value = alerce_classifiers_response @@ -139,8 +139,8 @@ def test_classifier_filters_validation(self, mock_cache_get): self.assertIn('Only one of either light curve or stamp classification may be used as a filter.', form.errors['__all__']) - @patch('tom_alerts.brokers.alerce.cache.get') - @patch('tom_alerts.brokers.alerce.requests.get') + @patch('tom_alerts.dataservices.alerce.cache.get') + @patch('tom_alerts.dataservices.alerce.requests.get') def test_get_classifiers(self, mock_requests_get, mock_cache_get): mock_response = Response() mock_response._content = str.encode(json.dumps(alerce_classifiers_response)) @@ -161,7 +161,7 @@ def test_get_classifiers(self, mock_requests_get, mock_cache_get): classifiers = ALeRCEQueryForm._get_classifiers() mock_requests_get.assert_called_once() - @patch('tom_alerts.brokers.alerce.cache.get') + @patch('tom_alerts.dataservices.alerce.cache.get') def test_get_light_curve_classifier_choices(self, mock_cache_get): mock_cache_get.return_value = alerce_classifiers_response lc_classifiers = ALeRCEQueryForm._get_light_curve_classifier_choices() @@ -174,7 +174,7 @@ def test_get_light_curve_classifier_choices(self, mock_cache_get): for classifier in expected_classifiers: self.assertIn(classifier, lc_classifiers) - @patch('tom_alerts.brokers.alerce.cache.get') + @patch('tom_alerts.dataservices.alerce.cache.get') def test_get_stamp_classifier_choices(self, mock_cache_get): mock_cache_get.return_value = alerce_classifiers_response stamp_classifiers = ALeRCEQueryForm._get_stamp_classifier_choices() @@ -269,9 +269,9 @@ def test_clean_classifier_parameters(self): cleaned_classifier_parameters = self.broker._clean_classifier_parameters(parameters) self.assertIn(expected, cleaned_classifier_parameters) - @patch('tom_alerts.brokers.alerce.ALeRCEBroker._clean_classifier_parameters') - @patch('tom_alerts.brokers.alerce.ALeRCEBroker._clean_date_parameters') - @patch('tom_alerts.brokers.alerce.ALeRCEBroker._clean_coordinate_parameters') + @patch('tom_alerts.dataservices.alerce.ALeRCEBroker._clean_classifier_parameters') + @patch('tom_alerts.dataservices.alerce.ALeRCEBroker._clean_date_parameters') + @patch('tom_alerts.dataservices.alerce.ALeRCEBroker._clean_coordinate_parameters') def test_clean_parameters(self, mock_coordinate, mock_date, mock_classifier): mock_coordinate.return_value = [('ra', 10), ('dec', 10), ('radius', 10)] mock_date.return_value = [('firstmjd', 57000), ('firstmjd', 58000), ('lastmjd', 58000), ('lastmjd', 59000)] @@ -297,8 +297,8 @@ def test_clean_parameters(self, mock_coordinate, mock_date, mock_classifier): with self.subTest(): self.assertIn(('page', 1), payload) - @patch('tom_alerts.brokers.alerce.requests.get') - @patch('tom_alerts.brokers.alerce.ALeRCEBroker._clean_parameters') + @patch('tom_alerts.dataservices.alerce.requests.get') + @patch('tom_alerts.dataservices.alerce.ALeRCEBroker._clean_parameters') def test_fetch_alerts(self, mock_clean_parameters, mock_requests_get): """Test fetch_alerts broker method.""" first_mock_response_content = create_alerce_query_response(20, page=1) @@ -331,7 +331,7 @@ def test_fetch_alerts(self, mock_clean_parameters, mock_requests_get): alerts.append(alert) self.assertEqual(20, len(alerts)) - @patch('tom_alerts.brokers.alerce.requests.get') + @patch('tom_alerts.dataservices.alerce.requests.get') def test_fetch_alert(self, mock_requests_post): """Test fetch_alert broker method.""" alert = create_alerce_alert(1) @@ -354,7 +354,7 @@ def test_to_target(self): self.assertEqual(mock_alert['meanra'], t.ra) self.assertEqual(mock_alert['meandec'], t.dec) - @patch('tom_alerts.brokers.alerce.ALeRCEBroker.fetch_lightcurve') + @patch('tom_alerts.dataservices.alerce.ALeRCEBroker.fetch_lightcurve') def test_process_reduced_datum(self, mock_fetch_lightcurve): test_data = { "detections": [{ @@ -438,7 +438,7 @@ def setUp(self): 'broker': 'ALeRCE', } - @patch('tom_alerts.brokers.alerce.cache.get') + @patch('tom_alerts.dataservices.alerce.cache.get') def test_get_classifiers(self, mock_cache_get): mock_cache_get.return_value = None # Ensure cache is not used diff --git a/tom_alerts/tests/brokers/test_gaia.py b/tom_alerts/tests/brokers/test_gaia.py index 803032306..2ccbfa54e 100644 --- a/tom_alerts/tests/brokers/test_gaia.py +++ b/tom_alerts/tests/brokers/test_gaia.py @@ -12,7 +12,7 @@ from tom_dataproducts.models import ReducedDatum -@override_settings(TOM_ALERT_CLASSES=['tom_alerts.brokers.gaia.GaiaBroker']) +@override_settings(TOM_ALERT_CLASSES=['tom_alerts.dataservices.gaia.GaiaBroker']) class TestGaiaQueryForm(TestCase): def setUp(self): self.base_form_params = {'query_name': 'Test Query', 'broker': 'Gaia'} @@ -59,7 +59,7 @@ def test_cone_invalid_format(self): self.assertIn('Cone search parameters must be in the format \'RA,Dec,Radius\'.', form.errors.get('cone')) -@override_settings(TOM_ALERT_CLASSES=['tom_alerts.brokers.gaia.GaiaBroker']) +@override_settings(TOM_ALERT_CLASSES=['tom_alerts.dataservices.gaia.GaiaBroker']) class TestGaiaBroker(TestCase): def setUp(self): self.test_html = """ @@ -111,7 +111,7 @@ def setUp(self): value=12345.6789 ) - @mock.patch('tom_alerts.brokers.gaia.requests.get') + @mock.patch('tom_alerts.dataservices.gaia.requests.get') def test_fetch_alerts(self, mock_requests_get): mock_response = Response() mock_response._content = self.test_html @@ -130,7 +130,7 @@ def test_to_generic_alert(self): alert = GaiaBroker().to_generic_alert(self.alert_list[0]) self.assertEqual(alert.name, self.alert_list[0]['name']) - @mock.patch('tom_alerts.brokers.gaia.requests.get') + @mock.patch('tom_alerts.dataservices.gaia.requests.get') def test_process_reduced_data_with_alert(self, mock_requests_get): mock_photometry_response = Response() @@ -145,8 +145,8 @@ def test_process_reduced_data_with_alert(self, mock_requests_get): self.assertGreater(reduced_data.count(), 1) self.assertEqual(reduced_data.count(), 3) # one from setUp and two from this test - @mock.patch('tom_alerts.brokers.gaia.requests.get') - @mock.patch('tom_alerts.brokers.gaia.GaiaBroker.fetch_alerts') + @mock.patch('tom_alerts.dataservices.gaia.requests.get') + @mock.patch('tom_alerts.dataservices.gaia.GaiaBroker.fetch_alerts') def test_process_reduced_data_without_alert(self, mock_fetch_alerts, mock_requests_get): mock_fetch_alerts.return_value = iter([self.alert_list[1]]) @@ -171,7 +171,7 @@ def test_rewrite_process_reduced_data_with_alert(self): There are TWO ReducedDatums in the _content mocked below. """ - with mock.patch('tom_alerts.brokers.gaia.requests.get') as mock_requests_get: + with mock.patch('tom_alerts.dataservices.gaia.requests.get') as mock_requests_get: mock_photometry_response = Response() mock_photometry_response._content = str.encode('''Gaia20bph\n#Date,JD,averagemag.\n 2014-08-01 00:05:24,2456870.504,19.48\n2014-08-01 06:05:38,2456870.754,19.48\n\n''') diff --git a/tom_alerts/tests/brokers/test_lasair.py b/tom_alerts/tests/brokers/test_lasair.py index d0c82c2f1..5d5d02237 100644 --- a/tom_alerts/tests/brokers/test_lasair.py +++ b/tom_alerts/tests/brokers/test_lasair.py @@ -54,7 +54,7 @@ def test_clean(self): self.assertTrue(form.is_valid()) -@override_settings(TOM_ALERT_CLASSES=['tom_alerts.brokers.lasair.LasairBroker']) +@override_settings(TOM_ALERT_CLASSES=['tom_alerts.dataservices.lasair.LasairBroker']) class TestLasairBrokerClass(TestCase): """ Test the functionality of the LasairBroker, we modify the django settings to make sure @@ -67,7 +67,7 @@ def setUp(self): def test_get_broker_class(self): self.assertEqual(LasairBroker, get_service_class('Lasair')) - @mock.patch('tom_alerts.brokers.lasair.requests.get') + @mock.patch('tom_alerts.dataservices.lasair.requests.get') def test_fetch_alerts(self, mock_requests_get): pass diff --git a/tom_alerts/tests/tests.py b/tom_alerts/tests/tests.py index fbf9984a6..08bbdba89 100644 --- a/tom_alerts/tests/tests.py +++ b/tom_alerts/tests/tests.py @@ -24,7 +24,7 @@ class TestBrokerForm(GenericQueryForm): - """ All brokers must have a form which will be used to construct and save queries + """ All dataservices must have a form which will be used to construct and save queries to the broker. They should subclass `GenericQueryForm` which includes some required fields and contains logic for serializing and persisting the query parameters to the database. This test form will only have one field. @@ -42,7 +42,7 @@ class TestUpstreamSubmissionForm(GenericUpstreamSubmissionForm): class TestBroker(GenericBroker): - """ The broker class encapsulates the logic for querying remote brokers and transforming + """ The broker class encapsulates the logic for querying remote dataservices and transforming the returned data into TOM Toolkit Targets so they can be used elsewhere in the system. The following methods and attributes are all required, but a broker can be as complex as needed. """ @@ -51,13 +51,13 @@ class TestBroker(GenericBroker): alert_submission_form = TestUpstreamSubmissionForm def fetch_alerts(self, parameters): - """ All brokers must implement this method. It must return a list of alerts and may include broker feedback. + """ All dataservices must implement this method. It must return a list of alerts and may include broker feedback. """ # Here we simply return a list of `GenericAlert`s that match the name passed in via `parameters`. return iter([alert for alert in test_alerts if alert['name'] == parameters['name']]), "test message" def no_message_fetch_alerts(self, parameters): - """ Older brokers might implement this version of the fetch_alerts method. It returns a list of alerts. + """ Older dataservices might implement this version of the fetch_alerts method. It returns a list of alerts. """ # Here we simply return a list of `GenericAlert`s that match the name passed in via `parameters`. return iter([alert for alert in test_alerts if alert['name'] == parameters['name']]) diff --git a/tom_alerts/views.py b/tom_alerts/views.py index ca8f75218..b81a2c57f 100644 --- a/tom_alerts/views.py +++ b/tom_alerts/views.py @@ -164,7 +164,7 @@ class BrokerQueryListView(LoginRequiredMixin, FilterView): def get_context_data(self, *args, **kwargs): """ - Adds the brokers available to the TOM to the context dictionary. + Adds the dataservices available to the TOM to the context dictionary. :returns: context :rtype: dict @@ -227,7 +227,7 @@ def get_context_data(self, *args, **kwargs): broker_class = get_service_class(query.broker)() # Do query and get query results (fetch_alerts) - # TODO: Should the deepcopy be in the brokers? + # TODO: Should the deepcopy be in the dataservices? try: alert_query_results = broker_class.fetch_alerts(deepcopy(query.parameters)) From 3ed1cfdf68a6539b2a21a0bbf55c0a5a1673f844 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Wed, 6 May 2026 22:41:42 -0700 Subject: [PATCH 06/13] Start revamp of observations section --- docs/observing/index.rst | 83 +++++++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 19 deletions(-) diff --git a/docs/observing/index.rst b/docs/observing/index.rst index 3ac917ba8..370fe1d49 100644 --- a/docs/observing/index.rst +++ b/docs/observing/index.rst @@ -1,36 +1,81 @@ Observing Facilities and Observations ===================================== -.. toctree:: - :maxdepth: 2 - :hidden: +One of a TOM's most powerful features is to enable astronomers to directly request observations from telescope facilities. +With this capability becoming more and more common among observatories, TOMs can be used to easily coordinate observations +across a number of telescopes. Observing programs can also scripted, so that the TOM can automatically observe +targets selected according to pre-defined criteria and with observations determined by a pre-defined strategy. - customize_ocs_facility - ../common/scripts - strategies - observation_module - selecting_targets_for_facility - ../api/tom_observations/models - ../api/tom_observations/facilities - ../api/tom_observations/views +Built-in Observing Facilities +----------------------------- +The TOM includes built-in modules that provide interfaces to a number of telescopes including: -:doc:`Customizing an OCS Facility and its Forms ` - Learn how to customize an -`Observatory Control System `_ facility and its observation forms -to add new fields and behaviour. +* `Las Cumbres Observatory 0.4m, 1m and 2m telescope networks `_ +* `4.1m Southern Astrophysical Research (SOAR) Telescope `_ +* `8m Gemini Telescopes North and South `_ +* `4m Víctor M. Blanco Telescope `_ + +These modules enable users to compose and submit requests for observations, and to calculate target visibility from +these observing sites. Data products resulting from submitted observations can also be retrieved. + +Detailed information on these modules can be found here: +:doc:`Facility Modules <../api/tom_observations/facilities>` - Take a look at the supported facilities. + +:doc:`Observation Views <../api/tom_observations/views>` - Familiarize yourself with the available Observation Views. + + +Additional Telescope Facilities +------------------------------- + +The Toolkit also has a number of optional plugin modules providing interfaces to other telescopes, including: + +* `2m Liverpool Telescope `_ +* `Telescopes at the European Southern Observatory `_ +* `Neil Gehrels Swift Observatory `_ + +For more information about the plugin modules, see :doc:`Plugins `. + +Facilities +---------- + +The TOM's ``tom_observations`` module also has a database table (model) for telescope facilities where users can store +general information about telescopes, including the location of the telescope site(s) or orbits, wavelength range, etc. +This information is used by the TOM when calculating target visibility, even if the telescope doesn't accept programmatic +submission of observations. + +A TOM administrator can add facilities to this table using the TOM's admin interface. + +Adding Telescope Modules to the TOM +----------------------------------- + +Modules can be added to enable the submission of observations to additional telescope facilities. +For telescopes using LCO's `Observatory Control System `_ software, +:doc:`Customizing an OCS Facility and its Forms ` describes how to customize the facility and +its observation forms to add new fields and behaviour. + +:doc:`Building a TOM Observation Facility Module ` describes how to build a module for any telescope +that allows the programmatic submission of observations. + +We encourage users with custom telescope module to submit a pull request through Github to the TOM Toolkit, to share +the capability with other users. + +Observing Programs +------------------ `Programmatically Submitting Observations <../common/scripts.html#creating-observations-programmatically>`__ :doc:`Cadence and Observing Strategies ` - Learn how to build cadence strategies that submit observations based on the result of prior observations, as well as how to leverage observing templates to submit observations with fewer clicks. -:doc:`Building a TOM Observation Facility Module ` - Learn to build a module which will -allow your TOM to submit observation requests to observatories. + +Finding visible targets +----------------------- :doc:`Selecting Targets ` - Display a selection of targets for a specific observing facility. -:doc:`Observation Models <../api/tom_observations/models>` - Learn about the models used to store observation data. -:doc:`Facility Modules <../api/tom_observations/facilities>` - Take a look at the supported facilities. +Observation Records +------------------- -:doc:`Observation Views <../api/tom_observations/views>` - Familiarize yourself with the available Observation Views. +:doc:`Observation Models <../api/tom_observations/models>` - Learn about the models used to store observation data. From 4ad6a3df33f45f0c8c462411ab0ac78ae8859cd1 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Thu, 7 May 2026 11:30:08 -0700 Subject: [PATCH 07/13] Revamp observations page --- .../target_detail_observe_buttons.png | Bin 0 -> 73636 bytes .../target_moon_separation_plot.png | Bin 0 -> 37172 bytes .../target_visibility_tool.png | Bin 0 -> 71957 bytes docs/conf.py | 3 +- docs/observing/index.rst | 73 +++++++++++++++--- 5 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 docs/_static/observation_module/target_detail_observe_buttons.png create mode 100644 docs/_static/observation_module/target_moon_separation_plot.png create mode 100644 docs/_static/observation_module/target_visibility_tool.png diff --git a/docs/_static/observation_module/target_detail_observe_buttons.png b/docs/_static/observation_module/target_detail_observe_buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c94f96d29e1f16ff0d1794d622e8f7eb1cade5 GIT binary patch literal 73636 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%0DIA4L?^aG&AV$6buan>&5rHCj42oklv|@ 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 u%EU?i&p>jv0_H*^ZwP8){6NC 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�g@>k@^;g-E;#*8W6dG-} zZULW{R1nL49VnqANKDXQp$|jtCB-vj1@ZLE@%c)>=ZXxt>88weFc+W}v>{*4D zVu=<8;&MorfM|Mu`N=HoULB7GphnK-B0WuU!V%VhwK|>I?*Rqjhtip7&^@R&rbnBM zY+S%IC!Kc61GIaSiBfN9$g87yx$q`i;jayNe|j*@i%?ya1q=@_1%I6}JVT)_fP{gN z(YG@Kc3;h1wyuECuI2(#031Mp_yPQeXAJfyzd1Jw)QEe} z3t;<;xpA~epP&JT$o9CDTc9+uxVGCCF)&^k{uT$KXYUs<>=wX&K+KOW%0Od@ApFG# z%&4e@Bm7f!0BZv3%f>Ju4x#GEb&kvOKE6Q7@>9tQH0D!%z@w_mZ*Ol8Oo30yWi)!0 zS<~3;#F>F2Y)8$J3``E0vW(8nccu*Br@sMLh+NL2a6CF=aGmF8nYl|$5HMp|1#oi?UG>_lmU*x{IlTt90#Y4vX2>R!rkwD&)yU43#nLC>?V~FzrvBT$(EeVu zmm)hySR}x5OE@4rl(oz5Rm{BwEbb@BvcpOAcjYX&auXdr0manOq6`@*B?)>IXmvU1!& zQcF<&5(AgzCGb-1#6`eB>8S0w6U)Wsc+jWAKpnCdN&?2lBVUK-+*>`Fm)}EUZQ0Dlz#jWeY38aQe>h z*@J;nUsbUI&9;)P`#&5Dy#I78;II6vW8ouN{)1Xp>f~oa+8VCzY;59@fAcIX+PvFd zpbD6upuaqfJTs`xm8_ac&>wN@@oWb*tD_Io1lr6S@rHGFxC4~Y^DU9-JfZF$H zL=l_WOnf@V|G`rC7) z(6@_+Lh0g9N#DKn2GaH7BK)C|qWZO%i(#Qv*zaoH|DCn~x%PLMPm{*`e`)u0jXyi+ z++$GW0QU$81H=}{0H(&y0OSowu&WuLh34l$=wo@!xX`@Ca_Z!lWN9w^emoNfVmSbD z02~B7r7(F=Ls5~qe$MCdEkTN(7^=YXkW7 z{%$TqUuBKJ*yiW%OPGp$wnU-s=(s}LaEq=u47!0=SuEg zx;EL%eiWE;TcyVR>;DfoX@mcAJ|y(%i>-W{Voxl(tnhWfQyRe00n30r`<=4yMnwhL z5aQaetY^SdFc^)qCFxmI#E>$7>>(~8VKCe_7BC

5CJNqf5Q>svXcG8+g@%8~asC&St`?As!bkA3;^u103vdn*ub8 zisyYx0c5k6r{`dLPnq$UHPA0QI;ALpFLoJNjQ8*&T$|l_lQ;^(64f?jI1?*dAPfvj zwRMWQbL_?2PY2)#||%!j)Uk{^O1q!kEpi1JezMD1>piv3F{pu=>j5%}8=y`#6%EQZC7!rvBGv+aN9({oUj z2Jbw24v`Rkr%3R<`e>u(;MR`xEGC31|1!ZOeXF|aW2Nh@c30$fSQyYij(Z3IS||A1 z8X&p>Fni1*Nqe4i^J+Y!_t~k>VPGo2KwcZ>rrbc&=mi%dfveeYD#m7}847u#JLmHC zP~&(_*h)tiy^V|!XqEmPoudL@bnIs}=&}43^i|161_9h*0d`~txV4LF4hRANGzy5$ z`Ij#00{!{;!fvbbQf%`nnsUBk<8&^{0&f-5NnLmNcK>|fo?4|I{!tSvfsf;NX9J5& zV{rWen4erIdzRD8VFdyTQe3RH-dqENXHlYc9veIWKxF`BVUg@!zobHr<3exjbVpTv zv8CD@BYAyG=V5u^S{Fo|ewvR4J9jl3vK&G^qCkU4xa!gsDiJGt>>&g}YH2Tbf=4p$ z&ght}YcM&)a<&=&(Wl?g*qF_EmKOqzt@z=7f8$EiW4rI%jn;mxJ?;Lftkk@_@V(nf zFBtOBZ0Fxi%-8ilp;-gPOLbFj6lKdzkaGMQqmZwWO9N&}Z3b#z_Gf41R9tNp-<=F& zl>`Nyfyo|M$0=AGMJl&miQhPYP8Q;gp8NuM9zl53rCbjG=Fhh7OR&YDv1sp$G{d8| zv8=3|(P||efn*kvh|DHbA!u5IMMNLFA}{;cB3#;@@zP#1?tCbU!50||-i+$F$~p6$ zQjHy?qv9QXIB5{mbq1nJMz(dbYk7B8_t*V>&Z+U}>AyfC(z()uHf1{kQ zg}Hr@tBE~5O(bZ=?5w7^rwyz;m)y1bI}$-q`{bmekp`Szf7lD)JfLnX1L|9Eg4}Csv`q8hV6kHH}3<_z)ofS zmFM{s2)BLWeVq#22khXK|HUtCd&goQ(qR4VNf-lpa?lxpc`g(y*4Pk$p!7f-{!h1; z6$HR$wQ_4jkj|_$Sm5I3QDl6$Z>o`?JuVMBTg3pp?@U({o_jVzqa)I34PTW6y`F3b zu8B6WN1(i$+TNS;_4TYT1HR6*K}{i`u>-yYf#uH>m}~&1K&&P@$=QKn4&Dd+vMK7; zjjX2#*A!ULvX-3C?q&jsck3g0`bNnIruXa)>9|bsz#D~EMn_87V4h zYMI#Za zi>sB3Gb7bM9r4>Px1xoj7(ImzN__iuiQM5lUYP+wLU_vwp@sdBKO7b^UVNauxh9)ZRW@=UwKe$Cw&*1DzI?CM z%yQ8SUO6sl_yL>_{iSGok!G*YuVo+*=OZyZVm?8atX_h9521?oU$iguPAVd{r*n|K zbXXJ`nvBMt05h>U2}*rpXis0mchFucH9+xroZ-z=7qKrX;UpO_+y&Kjj1toZ;m}0zMoinmz)Wo#$?;rN#6p>3+J}zI_K?vOfE}noX?+b!QR9 zMGTJBmjrCMiFSb(M?9$|S0>k7^=)UruxuSaF&rnMJxxT^Dvjg?=r@G(J9uv|tmyf~ zlN6EsLtR7&Qp+O}Ae|U4HX%Re8Z^J{r6*~de>ShavN6%_I;KUIfcSila)`H1I_(+} zf-`|6JRB0F>@Oh8#bDv$L`{jEk3AWJjMUdL&ugaG?ntWU?^+yeHgVgn!mh63U||uW zK(6lAxIXl2vC}aqqyo3$@bXQudvK)GTm1~w9l}Hx?6fTYsNfz|4l`91Vs48=8067h zG2RpdPK)(ov}71CtC0udGs258n*H8hv(5_VGgVbX91s zyqY{><>t(|Q@xq=>ySJ8euzvLCRdG*OI(UZkhZmvzw^n9gfMr^p4UUy+0ewIqRIwr z(foWugw(kzgD`n&)c$j@Gq}kd2q7T2yo7y;|1{9HtVYDp!K3`v)pe5L5C1co%POXT zfYr$ZLE&Ndw$@BOBQff-5)pY2+B$lLDZ)Z2Vu0*noYDyez#rux@6F*VW<6}Fn8LdoF9ktK^vo~v{EZNHiDk3 zePu_x-h;9j;Z;o*YP8)Cdh1OnzFQyf&5$gU(=Pk^05X?<$}KQroGAe z;uy*M(>g#@z|nTwg$4GKWa_qV;9mc!fXmi|{J|~92_d9)uJDQ@g>;s~H@5)=)|tFJ zzf$EXUusfZWMGTc+x9WT@zO$9Ft{}muQ9S$@wtG>)kT=Cqf zgDS)QDQMw&NO!TcG5ASexsreKRYFXnN+3&KS5 zIlhgacHc(Djxhp5@3gHRSFF9vks%7Cc+k?> z_7I`O0)Gi1_g4G7Q|aBgonHE!lMznvv78WcJX!mWS&JsZvk}wbfv7q8mKKZwiU`OZ zE_1wO74H1iF{#0xtNQZU>e{Q!ll#?{lM69>ES3WD7y9(@DJ?;ayiu!tCso-3i_2bG zCtFFRs#kMQf;*M-4pu^OOoT8=>`>s`oay4-X!MVz4PVr$`FL7st?aS;Ajm%n(iWm^ zxoIq8uIl?bu}HEpY-$s{vCPfscWN=4N9IJ1+D=Ojzx|>TmVNekoVxAhZrnAk$ABwbvy> zNFhmF7ffR$hwb4+^Eip840nwlII_veFhA7l_l7&uOh3ottKrR_(z&I9;)wOgLFn5M zWufD}{)3F$_2OwjMk6gc@dzm>P+?w6!E(*_S`D72va6-@Jg;_D>!PHn^^4R`-w32t zlGx)t7N7C3FOh5LyMA*Zp|q#@Q21t{r6M}pjLm9x_FM8>D%Wne7gjomki5zppN~Ua z&s_pHKmVS@O^Y=+X2AIP&P&an!hFpJCc4n<@#%}c^|ENyx0XsbKmG{sQ(7G}U}1DT zHwn=m{xs!<;B*iJ2YI*)w9ol!XeUmM2N-k{jKzJpw_|7fJQluf!}c2EM)0C$n}S}O zyg%keT@-)5j=Q}#HKPbn)U0>!$I3T3VNtSw=grbfZtvlVHrZv|Xrr}bBOkkQIY1H^ zD5m>oPDg*W*4O2+IJ)yORZ!}k&?>v4a~VA=RdsW6iv!M)blPW7`dN%sOWF8UvgN6m z1h5hl?G&AVGJn~pi&ro18vA9^)AOyPw_H8H!ZBXisTw)@BIPTCjmN_zaj2~$;Vyt;g={}mNEq!(C4gA^&BVBtpb4-3Bytj#M$ zIt(zW#MJg1&m~0hm5j*b?dhJwSrfZ8*tpT!9&7R}=P$Z&Qi{OifJ@q_^tv)b^Jua# z7+)qc@@oF@(xx>)*skBbW9$A$cQQ zT1Hve(toLXKNo~TyxM=RFy;(c#(a~(8ov@QQG;DPI3JFIfN!Z1g26w<(m#TMMZ+Ko0 z`FA&Ku_ z@Q-ME$Aw}ijSYG9*F}7CK*YkrVs*)p>`0Cu>5UwHk+elLY)JP4EvW*N?&bSo=gn~> zN=nKn!@^mJL8{)bTW%KjH<*eC=5p-)LnW^JhDJK7-*EZ`2M4#Ye|*KXpV(W?kot<`B4LiG?HlgDzanh-yi0N* zm$}XrA@A;!IXw7a{w8b`H02LPixm)+k}x-SdJL~0`5%IMOl?ZS%SlN7`sg$nPno6$^{lLB0`qYZb zSZ=2qHqa-pevZrYTdid-z)V1>-JhlxHL@|e*>NpFbwxl;8BKjT#jZv~BmEsNo(NsF zXYAbBTpWNo#g*hB=;-8)>nvgsbBj5_N@ zgfX3*CayW;`{j(H3VsJNFBj%pcyh#R4X-&WUZx(|KZ1~Ufe%}jmfX?~EB-cDxPP{8R2ESZ)M{v4+j{tV+4hbUe zk`z92{Mqz(8IxtnfEvjGhf?42}#0Sopf z%^F+wxyepv=POOLiU&)t^EZ|ae}D(64&hJisCKWRo?B-=7QAVYh0UxJ!BIGQXcE(e zBbmnOls6K3UEn)l_^!n0eotBcTi^mbi0S%U?&<@9kIS4b$pSFvdvVFM9qM%NmJiol zOztqbdEY=F83s7ex&of5_;AnojLr*ey)O4sz17cxx@Q+1pkB-6FJ^-7Brm~*gx`~} z>27u%evwm;5%!EE{<=b%8k0Q zTwEuAsj$;-|C!!=Qjz)OQaJ7KK<8>YrVFEOxSwk!jS=zqq`?5Zh#L;0U7fD&YV<+1 zny0MQUY+yu-C5V-mDPrFIN>C*kX|oU%aiki@Jf8^x=R#kbA$!hqIz`k4!oigiE-sIEsc1n7_2q*cROO?q7DWGJG- zh76F_-cd5}?$ZupgPV>nb@}yMh5T{Vn<>2c`ZG*}&zGX{=z}m2Ff8R4*dMkVqTD3= zR-+}3R32ADg|o!C;A1Rz>rAe$WD-DI7VucYa?YW6&~#xwKEfYdF-ot4`e2j4WcXFm zyMNN2OgXm16GF%;4Znz$N%q@N8SSaif3A{~@aGMW#4i5r)daEg=us>>LXetHgDXDd z_+rl=1%BvygM2e(PeKU0Ksg$3`cT&frJTF;vOZ1&4RwEv(Bg67GqM5V+vk}23oW;- z04fHe-wtv9Y$0z>y2Q`WUt9TDDH>w*96N;N)BM|khffGYT8+NwR!Pf85$+=yW^g~P zHx+arL4)UV!GPfD_R~MppHzP}Re!I0rUPr0iOHf1nE8mvT{kD?!Fb5?N$n`>j~V}&+!=U5g%_i zxm?^`!I%n~TF=XmzMcRoSTDE+$CwD&3Q|5jkxQfCp&^5ONx0LeLIX#>%9kAi(&?}e z>wtx+C&RG5n9vL2y1xdK@E%?+CUs@e|D~0uVtM%xN-_+?ofX{cCuHr2F`_GjQ>T9S zd+C=D2>OKO$ z6k*b{M;j6%7pA6yBZk9r*+X;}CwbE@R$tEf znB`=m&enRkQ?j#yF!m$&EeD@{2fGL4H#1x98=NdZ76j&rWvHBpC zj){Iz9ULCXtl)}za@k=+UqcBF6#Jq(8tl83v+PIJO45F1L~yIVn~Osm{nd>k8|lRD z!caTED@r*z|LwyoPOepUcHD&PbL?auXIy{@O@UxO>teo1s?*|F+Isf5SSzOBd{Irn zn)i9gpl-vC;>EKXYeAP1Z405V><$lqt}SLi!X9XF1*se)nXW4!UQ%Vu)P?|h>7!bi zSh(c-wEi}5lMR{5F%QqSV@={k;$GZY)N`9PAH^v6Y)z_P^bwXcowb@B@To&wY*uX# zpi>hRnYKoY%DHZue#0=yqTA-Ld^nYXiG2#L^V%r~y0K57cXV-HwM`aq#s#nap>s$B z*9n6LY4B!56R7SERyIda;Ek4AS=qmpbChkN$L)AX*A=lJ7DdxiK-zqNM*bZIEfq$0 zzNcBW#Yk}R(GV++@s2zTdk~XV3~_Mq%im-}M(zNkMiVZi%%Vf+;MiGBl1O zKu?~W8SWB&+7iiF#(IpIOj6j^B^nxI@*Xe(ojJePhkPGguW7&mMHn|H;lTiH75g)7CPW12p_#88-iu%G;IO)s@RcmohuvaimRmYL2fSo-b`RayS*d1= ze-wBIV7LC+oy1F-<9x3u&Bwr?eU~wzxM^UAoDz>yXuI-7o~^d;+qdBnuutqbtrRgD zFrKW$V8A-Ksl&(&|5+RiJLz7UD>GPnm0V}5b(;XXFg>_>J=-NFR~Ri>;Tq4QUZJRo z3<iebM;jjhAoH`d610aLt@SqM}8*!BiDlLqfBv17|x8EDEgZ2q=SS-|mM=hny?w%>R zzitKs86!HS11Qwh5sA1a2jYYysO41%?}6RPFRn6)7iE9|)pCMp(5_M;Q_ zC76w*1ZGd0YNvqD2g3bN6-+8P5EvK(zJy9OuQ*UTVL=AVtU_D}p1hIz<7OQem$i1G zMNKr0qjz&VX{l>;#m}yyw}M4*e-RI@YKz_$hUK?3{~PPT+(fqbPM8DOI+hQ26%AQl z#nT_Zqyu-q(z0UHtQ5IIzT)a)$4h9lTc3F^)sp%j8402nU;Wa~0CdaBHfmiMRBO;A zz}mskNDNWEy|px?kA>o#$@_*D>EQ+Mbq2uGU0uY~NTDX{1iUE~wD>rjLN36D+@&p* zLU^E)oF3wiSG==zN3WO2Xi9H&_S(x0A7NH?)NUeeAR8 z68XaDB<(+qyG6&1bsy~lE2cfqWm1)fy5qO*71BRY(l>1{k|=!V%IZ;mmrwWRYFK^~ zf#K6rl`NB8E~%rzvc{>)B7`RLBN4)So(V`rh0;rNC+Xcm`dM$29-ZcaJ|1MT`~i0% z*C{opAq$mKdXB5DcPV!S!F5kn#UUuH@Q(H0ZtCb_i9#806$@5}-%#_)*I3ahiubb& z+zu$`qd67f-;xj=KFO9WW?~_)swgjy(_IU-iT;)h8=`9Ybt_N4kk#t<%K?|8DtS2x zDkvm#s}m0i4i5x0$)?8xdeZCDpzJ`TE#{^6^_?>oqfOZ4*(MUD!e`0kw9oKj_NkT( zVD(OJcRNyks;2nl@{Oj;t? zigUladCj!(xGEQJ-yvkL@*JgrW$+KaUd)P-wZ721-mUvG>MZ1cdI9d%VAEF?3!Swn zq~BsD;hR#%K0XVE}Ex@ePld7R|(?tbv(;MrH9Dw_$Um?eVH z4M3wFG+^;W!6XetPkzlP)G@3FI>wa@_Arm3{-z^6U06!K#cil|AxBASX?sj58? zoQN__C@I-UhFo96Iquc23^n=fMQk!DP)kX;=TC8U-Bh|YO@|Kdt=i`gKQC>Z*ka=` zvM~^lQA64gFYdV=!U?t-Smj^Pt6=$y8d7{sI~1Thoc+c}6VcFRpTHn`YeQagCT-lOI4M6x8(p~KZ9E>@cqHZ<`w;ICs#JU2 zAuTMdh-^C_9|BdA>|F6crwoB`yB^ZDABkl|n#iPN)8aigV_`*?Bi*?(6-=8lJ*AB# z4YqQZU0!4MY8%Km&;vys6kJijb)ar9AXm-1>Zzy!f@1VX=)?DGC@ghCP+lZFh#16d zJ7X7lA;>K(ER34kOVF%U2JP4mmIRrXvXH~O(HI;Sy6%wGND5~3XZ#Wq?$@4rRO)6s z-PT5XvO2CJ;aRg{%PZPCakl7n^@esAX|fSzG9%^=^x^Xn8&6kLSj(G50s7;wpH5$y zITs&i-a@*!gY67O?(ObZ<3#lezKnXG%|4Qhp0(I2`F50lKQ%5j%LL1AT|9{Hp0Fa;K7 zI4rD>My&yQig|xgb^IUt&x~MRx7z-$W$4fxuT%*S{ra5!Zm?k9a&GhYp0uzbl*IUS zBKeX`q^p7j3bwKv^5j?-Mff3uBUY4Dqb8#624FejEU<%+3wibq2)YL7TQ`>T-nyel zwU&>?V-enG9luUjeqYSw$>g_hX_R=u%*@qsxHi4hAME+{O1?Bx{?q-@R{>@KAmR_) zm5RHk?Q$v((!3|h z$|YwD3Q)B3RJuulAnfN|8d+8`aJ%0p|NFQ*>44jPh38OA7)pQ`kTauR9Qgs^2-o#) za1Pzzb}{CQc;}V}Xz5Gnjb zFI~AB`r(C7gkmU7#IC;TqqVKQBi)pN)uI!@+(qi!o^sA?rZszfo97&N6vncoC?M$h zny=vJ^qF+0&N%TaHPyTU=@`QNZ`Xb%7knzlpiV9{`fnxc&Ee@+y2@#yM}}5do-1dW z80rIJfCpwZ!-$ymXv)zg=?eAzU4#C9umDg1e}%A9T)92yxFjVMEnI?1j*6TR=>5P8 z;cX}Y)D;Vu5E|ToL3whWEO^{v6Nfj8Q>g3|NJR|)4ChW0`+1vW{wOb=ORs`Tak8Mj~XuHkD#ihGI$!D=^->S7AzM?lx z7Vt&`!!^4sI@~KqKW2B$Z75y^^2ZSFY-I>AQs^988sHu6pl|W2xZDhw+H7wukEu?Rp0Av&OPPgYH?pMyYSXXXSU4q^onPUyaz!88T z_2~N{VamG#Fc&}~{)gp3r{TUSq~qivH|*1~D$C9JzRzKb#tzBjEKn>%L%NTB7s?%{ zSoe8ch=82Q{6|v|kbDh)i~+pS_S};KFVn(QSR@H5P&&1yx!nFuRQ&%M`|7wVzje=z zgh~h^DJdvO7_@W>f|P*325DqVBM8!6k|NSA9RiZlExk9=-JQ}6cfEM#H}}kE=FH_E z6gF?Hc%El{W39MT-HU>?-{~$k!|J5Mp7WsOBDp9-1C@$8pCw;)%}(TDSC@+JO2_5r z#4z~1)jj}Mo)u)6TuzoPVbsD43G2=($m_b}^!jb$cx_oJC?R0_Jn$seu_mkF?ea7{ zag3e;&HLo$LqHsqUWR}OEiNJX7Bq{spBZ|OX~xD`AN@14Do>@9#?U&=Qaw_b?)r_1 z$@;OG+c5Wr3#|{=5F#8OPM3ITRxw6JmkLtM1AX}bz%e}by5(b%eB)<#xO$QPOOI)X zsjy<0`zM3zv#t`H0J8i=N|V`8X0pxWmyn|-K9#ufLvKw~z?ssEq1M)xI%)5OK=$NF zYF)_cZow^=^x+|mN^9Vt4Gf*?xfzcpLiYpWWyDQ1CJ)7mSc&V-_i2!Ceue;47$7mU zx+*#VO@#A%A4BMAOFJ6yw>7%)hu&j7y9YM52?V?m)4>n01_g(h5=+Tzfo;VE?jH9y zWHkt~{nQyE&6!F$KQAu^xoPf5kJ1J=2}Gm`h~DzB|U<5 z4V!jD_3ZHQe<8A-19smj&|!A#fUv(k-8HfdJ8{ zk+X6$lBKB7=F*tcay=M;`)tV{89}QA1EwT`Sv|-thn!oxAjHX|RfFdc;^HhOT@`27 z;%ls^z*9dzutygmrjSFG0d%rS`w|0Mfo=`l76+|+_=g!=#s_+_2K>9`FA08obM@a^TYHpa)C$h^8KHs6Ka}u}57ZRr$Q3aEdZ>kyEHKPu? zp-u;6I95_O{1yNKbPebiNN)jduS0aTuj>Zs{z=?cUeGIwQh`z%HgnVHg(V--14FZ8 zr^N2JCKyoGqy=COSh4@E&}xXYq~rAnKB%CBpvQSAh3e>*k{}T(E}{HimZ#qy_{lE@&lYj#`N;*q17p zp_wk&=PzyGfPt&ecCJ|Ji)_h{CYStdJ)jZv1A4CyzO{8iIZpr&8#<+ish?Fx6Q85T za=ss+1nIEu0RT|^jBA0{^@Ff18NUdk4irR3#>WifPGmmda9Y{}X*!Z8V>c8&lA68Q zrfOD=z5R?vo;tWwt?5HzmGf^_^W-zxNUS70`ZUlfsen7a1YM*eR+`nKhN$D_ARo3LKuCVpCOd9sd4LI_e}b(R}jMp0y?5c_DH z%pY9z`wM{(jvSq|gnbNezm`{xsYt;@8kd~L^0afdn0CsI3=?K$o3Fh*XHysL$=2kk z2S|$dD>7tIIBPIyI64mPwl}x8?6S9H^%g@@>SKq&l%#*tb6KMo207dKeWbzd#p-r9 z@-NqEC3*Iq0pk_hHYU47XzWo1atbZ=WVYreeSknl+)G=tPyW7d!qNpVc9r_LmbBBq z3dVuh3P6;GgsM=hrA_(`JE`lySm%aY@g@b&cdXnZXa>EC^n}kx&~Bm9=-obnn{YxL ztO?6b+^X%7w~y3UGJ#CccM~xJC2ag{(YUGPy544A3ZjOgt2((jJq?cE=WcfU2zTo4{1d_cJZW)TzY;mr2mu z2P^-cIyEV?5eK58uhsWXs4bAA_2ll{^oJk{f@W{vh~ZI|Az3uABR$|1L}6)&`2imN zA>fmf0HyRjY?Mq_TM(sk0iu;2ynI&PF(hCBL+;iR;RgI}JH_L1*f0VLoyyYOM~@yUrdFbBaGSfI z*b4Rlu6ToTUU<-~wP?VjFjA(c?5#NG_O@quDis(l$kR9T7=4f8j=vrYf~u%ZmAQ0* z_%?YUIB$&z&akl<)T zM+YH|%QgqdmL5jIHQ>aQ#R^80Z?YWD)HT#gR9o|>WCDm#ha{8FtarX~PdfwQ;zW6@ z%WF`y>bKU0V|p$LO^l_wYT@s#ji6apUkXO%4SRyr@VfxvCx+r-lg5H&y^^*3{^Gu8 zdDL~WCYsszDsRFXgkd)@t^tlWxiXdN0)8P^G357;@{M;KXSZA>Rk+r6y`D__VLvOcPZm5p&S$U)pjg`&uZ%%&Qzjoq}4J4ibxrcw)b(v1(Wg)CBc_Z3e-Hc)2Fn zWrxTuZzQB{a6{to@pnZat^M)^yv{y21WC&mkeZGQUE-xhCG}Ap47xje4)z-f1y2FZ z2+A4J$k-6^Rxhv$zyk%@bm?uE613q6iW#!msnQ<3As45z*0LH#Pz1m^cea`L#8_lS+ne{ARbQ^?=jj{}S6f?P&0}padW!Yr6A5OXYp=L_fh!6uv-<{LVx;=+d4mmH z0aZ;ue_{?%MNL>A&|%e=gEuJosDq?wF8yy7;E8xSmJ(1TLGzq$e$$3o~x&W!IGkD5xPQ)$E0js2<>;y7ihN=QMy zoik3lUoMA07F)jFjVaFMC+&lM3c}@_I+nNRrofAl=MT@kTas{_Tp9F#;i)cx&@rt@ zCQlLAM-Ip^g3hIoGh6WwBCPRfhN+Y%$#ROF6;D-z362imIF}z;0+v#(YT~a*!TzvY zZ{pc2yY+tHf zWEM}gH3)vtR#TVNRUbA0^-*r5a|mjQwKcxQ&9oeU|FEg+ur=~XNJ32X6VJ=Yu5+@w z{9(^@H)G@k5HZkS->;8Mkg`2EH(AuodNqLtR)0fS-C)*4v+JqU$t>nZ^06kZp}XAT^JLZB0ao9R=aCsb&bP;i5{dp1`dKBE z)=%58yWJT3E@xDdzcIFOGP*-RJRikXhg){%5#C8{5#3|j-7cB#P_w0vx--AO$)Xg# zw(HUVa39V&O8L#GPipM7 zL=I-L>u=+@2y1BExJOLtV#y2NCR4j}Ie3+_7Oulib5 zvp4Byf*c?J52U^!PTGVkF&%h2jM>fd(yi=rGB`e#_Do4XCjrpSw}4=-Hzv=>s=-Dc zss@eMg=uGB;o6z2-=J743htLdwMm$bE5AtB2a%cR*cGUoKoP3aD2LNdV0oaAJsDT*QByl=omJcfauNYL!sNuVU|+%?K@F0A3B`U z@r2TwUH;7U2Lj6J--6im2c;_XoD$KRkPeGL;YL`*u|N3>EI8pvLqZ@MW&<$;>_DC_ z*A|f^LhD{*PHY}(VeJ2%b!KBhujH`AWlI`bawOGWCU<#oB(FS23S(5a9Ws^m!Zor5 zcvXrYapRnH=FGt>SGeiIZftUyR_|?li-~%qxB4@)FyN-@$Jj9FiuZM2GZT8bY?ZK7 z#F4%*-4VzB>!(+Y3X?)te(*wToXXz6=?Q;&W1njywJJYZlH_@VdJSyNL(CH8FMA8f z3Fqf;jT~^5b0tOuR0}s_MeoKhU@Nc*E2t=5EKGMDwGJu>!5>Fjt(1A8YB!?pP9umM~v?y@M?Z>z_K`$tu+!bF-T5UsM_j& z6{idwF4p`c)kAhRJZQs>GpHw1rpK*`OhLXu7E;L>Tu3I>O%RHsLra z8-kC&ZC&hk;NFvCo|uNa38Exxq+57VSMcU1ST`ZxqKvsaYrU_XpAB34*U{+4Kja&q zuEdA0^%vuBK8tD__(S6o!TNaV+vHP0)DLV@*XV4;6sF%scLm}QlBfJLBWFE?km8Yn zozmb*O86KH1A)ysyu$!`(ljy~WHB21D9an(rI@R$-lp9*HtL^?>m%e_HRDb0Kvrb& zOvfVxb%vL8#QfG!ssbn4w~!+}pN?@k&Bmf_68}ETZP>&#MX zcu;y{74}{MR~L@?-0^gZ{OK7X-_yqDf&hm9<{i5x$81|`XD-Q;ZNb4tb0vTLHXA)e z$an0R*s?gX+x6f>2Qq$%pCV2q?=nv1J-k}C-Rz-q;DGJ*4@TN?&F;u zD>HLmq7nG#-ktvp4UA;)gpee|q4&TaJ^~{s6lr5+GU%7I1gg8R^vRH2+1th?hr{lj z4Sz>%Ul_2o+((Khy<8?+Xw=S^HoTwnYKpdX?xa{{gpApqo0DOVo(^JcRNQ$HXp$DF zV(KTWyi*nWZArf;$vPVrmNW;PEsEwRlds{H|D#^rsVzilEx}u~@6(-w+4kf*!g8U( zlkw_85mezm5%dv+tLyRUIjj#@@!4~FzP|IKWE9O{*ZP}Y(VaHT=?dFZvNz?&OvvS|4_ABZJ@(apDd_emuQll4S3LEr zq?=7(Lk5ddzo>ivCkHI5n{LDf3gBU@_JT%R#gDQUD7yiZgPbpV% z(0WInb3^fQUb-uzKpc%Kc#=B}?-NuWW-D;aX%EM}BGC=2xt{0boVMaYVik;F&sU7m zD;i}?%bH#{sn`3(*HC=nlsHF}|Jnc80sJv&Hi?Ddjyzgxi{!(mVR(gjNZHSX$lzx_ zxuT9O{sFUQ%e<%~j<@3C3ilCxu=8D` zcw9%BJe7U)^cA9=>+)%z>=<4&YmmQx+w!xen6{vC`GvC=Ir07Q*f`0>GTDKRsy7sg z;I}G;OEI#)5JKn#v4l;Yw7qw1EOeORX7Yc`qGiY4!}FIn>XQ_&hNsGk^j$IpIhBnJ zk)#UzL0Xos>9oP(HP=zc z;XZiQk@bD<8+o-nW1JA*^d89(Mm`gdV3t>}eVgOl^)3OC0G3jmW^tg8m}w?E80fxX zQwwA+;Usn=h7S^|WQ;}_uI`i}Kil`!M?~VS^(LGIRzEUwtsB>2`mCXN*x7UGWM3ls zLTJef^d*RV;RawttX~i1IB`Vn?SRIR`4&3wTqDdapNt678?#g0JR<;|{+b=kH%x%; z`7?hxYbr}=)f+<*g|V7ly}N|UZ#Fnt#C^^Oqw8LX$FD&k0{j-3QP?<%#T>hssID@( ze}1H7w1AU{*SBj1Mz;0ekxdK-W&rC7Ps~^CT!ng#Pnly2$iHvn!b}{PX-ilRo81Mn05U?(j zmmk=G6zI>0)ZD$>ntF#Gw5-}?x5;Cyt2tb6;6(d(CDw~|iT#zbFK#xWTqX63)_oEw zelB6armGYf8-Ni3)&rD#AE=&T0vid3Jp&z8?Q7E_0?>aT+NjBzx+Mjhr4wp?q-p}I zx~P>3V`Fj{tktA!)V%Dq`Si-BCy;HCSUg~BgL{f12}v-*5>j)M^8R;I? zZ+=csn~4&>Y&puFY5?#F7;t19d8CsGPxIQAvIkhJ0wlW~4H9Z-lbG{C*(kHSm6Lx) zS!0;+wE;>z~~S!;DqT?SuVcIu#Y1km99$vDzd#X zSGSkF=yPOPi)WTdFGta53p(3Hwe%EjKEu-|8meX3cQ=zHb>5nNJm)3K+QIqTPp(W)cGby%1=+#tk?p0h0F#3n!Tg(AM%AZ)2l{eYREA z8ztjU_~hUAdFUpqXTU;p48b}tk#|3*9ErJUHba$l&#@^cyQ$wqaL56xdQ+pA_iu5X zh75B*w%xUKd)qb^tHOeSCU6iCuy#VW+|@xl12iZ|Lob(q^xp|)3>Z+-B+LJafBD%m zZ&XV8mk4WFW2~GLv?Sg*2=j8(9Zh@1`UcE2Fi4{AE9O>A`&IzM4n6P+j*Q6I_vfKe zP#CA2w)YajV44&xBpR4s9)>qb>ZAQ2zC-?+NSd8DjS%OBI)d1jRSxYX&b>7KNzMF+ z`z=!(fc+=Zri#7|3=Kfb3MT-u0DLV3T_qc+Q9$OsdS)mfT|K~62DthZRMGtXYT)?$ znO7|>={d|l^2~^FQs}r;!(cKIvHPkX{@~6bpjr>Gl>~q2qs0i^yj+1P)?w*P_IfWQ zB#at*#cn{)eKoB9bsKhWq{ILJj!??``-O#4q5dlKwqjFFyC6K_yWv80T3()6mWs(B z9Mc40Qd;?DRKs}9)7FS@BM5p96<&DZ4cRFOQE|4V%^$zv2SjR+JiHJ8n&QOo3!eiP zd83SLfsy7A+6khMH$bSs;d?%M=T*eRhe?;Wbb(SFprCjlwC!z9lJredW4?UpnrHp} z1i=%6snu9HRmc2ixK#7w52HRIXjKB_0c|sBuK-qACELnku2qPXO-=ZL1kLco*v5`U4V5>5~h+S@L(yc^27jnw`b0_?{i*mf#S zWiem9Qs&=Rx?#d@%u%QP&0>)>x%QA&smdJKq*skx(NXcfV+uw`Lm8b97a@4{0J<~5i3l}DwSIzlX#^|^^o=)BwH6OB^ zQ0CdiQFN<&XPX`JdbCnE0YEPX31EK5PC_uVN2aw1!kidD0Y3Sipk0#72%LwPXljeqxj`3liHZ6ltQ$--p^xil@-%rL*Fn16YY|Bm|33}rF z`zZj)ZEi6=$kiDVM+k3Kmcn2^-Yc+tOf4cvDf3&@2jCJ@pG|?^Bs#3$`lDV#j5COEk|*he((W z0~Ad`8t7&6+P?$SzrhAGy{)5H<;x3|X|}Kz-m(?nWKS1N=I4AQg|sn4GuvFK^gM=O z?(6Yy9p-rp5PJ8RKh))|o2hD(zeTWYw~PzlzI#DHBS#%vdF+c1?w*>k@c6yqTVuGD zaLUun>epAJ;ZNOREAidxh>XYT2wzJ?9*D+t%(s>V;tEadUZcUtV|K2ErUPmf*vrA3 z{sjCfFk0or^kTt7Tbs~1#qP46xrK`j_3n@eH7ww>7CLt&2bA5f=J)6TCUMJ7>g3~i z!+!@G6SCiHNJ@H~TPK-XYNj{OMU;U%X7nM|5g;BnPmlCJS>50w-49Kj!+wJy+0vZq z8xGx3dOu!-_2ARy)2%GB?s(L=gZnLBQg6=%rWDo8+$KVzW_Ctu~ITgeRT2-5`&EuFW=YTEurjP?G z-TU)Ft&K8(w!~N2qic=wcqv97M#P3OwI+&-VirwAL2dL;uY@eG71UkCw&+&gS5+N$ z+oQDbp7aY2#!$1IY~jICrDNfzm~y)a;qEjuK16p1FEhK#>n4(|k|GtQI=aE7m1A(& zKugK@9t{|&4VjFOOwZ*ZKlgk3(_~=q0@G+18z{i6{@6cFWN4>_K_>kRASkGvEZyGp z)&o(wx0mDndjErQCjy^4h{tn)e_HL&`2^TGT}#d9apP+fF}t^2g$W@uL$Hb`Fej~@ zsdaY43TKtFg%y;AryS75q*U+5;s6a|h#X!UwG*u8>HZxsJ0 z8DS2G#Lp6_o1Fi~Jh1P=)2`-YpyB}u43d;I+$)E@^9{*ATDg;OY?D5L55o}iSiHRE zfwW6e^nYFF8iFr;N)Fsi{T4J_X^a`QTw;hR;6P4RGz7wQdSI5n0Ti-*Sn7M-rxCTt zLe>x|+JlS==sg zLE;D)5zgj5ea-(hnL)Ci87p#bp5+4rm<>{vZEx@BX0 z$RZ6gmBMT|DCBW}4Cl0+vvUyJ6A@nr*3rW6CQSkCbb~Q7qvSB4$`#3P6MMviNSGOY z`|2tc+`0-<{}dj~*Y5cKEr0$;HPXLTEYc4nWDF53FKaBNfmd}tAdfu>T}_={IV>jo z;Q&HQXCsgE^aqr8Zr2FlkTe8p4Tr>?;lXsz$lUfeerqqiuXy9p&Ou7cAs+I(NxK1T z3V>&=or%(EvUEFFo1g2xJJiHTQ?0!?6s+)~G0F7fbeGQ>$UoO%KP&k3&fd8Nkqx7Z zrHC+oRxdH52OBbq0=WdV$$^pm6Wp~axy&F9FvnJ0~_2D)iBM!`|3C{QE;e=(X!JwE+dOv4yCjP=rqAF}&dBxuYwwHMF< zv>kG>87DpdMH6V00yf5QG)LrKj08jUH1Pef?SH@h)Ake%2-#_XGY?ohRQ_p$79jou znxl}!+91#f){l=~L&4*(>6LT&xWsrSko%D{j#(XGyOo#nzky@qpX^mW=AtY#Ymoi$ zu1})M95{u@xVCM~M&3&}y>dGgy$|W10D(1gikd`&1>NnvBYw?DZ~vDdnNT4=C_`9T zC4d810&-cBki_aPdr7BG^DJvo;#UUEBbW-yb8}p}!RvcnmVYdm0cT88wz|c?ktgJp z6C)rLqm1IT_x+-w^#Ilj^ThqN3HS zS{gejcwda5e4OKnJS8uk?TU0P=@hDJJ+HXv(BWXqVNlrVdud$EIq^2qbSHnNJy;5P z(GyQhOl;f|+ih*jW^xkOw6H$^P}+o2Q9=BdtlC-G#Nlg!DRU$?HZ~FQoq|fCNexb$ z>L5u*=#ToFc~6{Ase@e~D3_W#hH=1PFn)u_lUqIX>!_S9P0c|1Aq(^NbQmQ}kd=$Nzp$`idUO;M%V%nwjiTmrRuOMS z_Cz)d9)1Y%@p&G*KPgjDNw%+KUw&FC?3FROA1J>Zj^Vn$`F2!ZKe> z9Gu`dm%(u#nSa_Q@9gXlQzWGUiJtjXg-(UT@wof^I(~ahc&b;U*x1TZHfL}QrJhz& z^+BJ6bgvFSW|So|U`U}41Z!&KiPnzd0uyd1gk ziwXw^nHQs(-f1rEJbTKZabvk1qWLh&9}dN9{j{%mruMju*XGCk`WuFS^`dt?B^75O zD*R;YjQB3kTaPZh^S!pD*tI`T7-dSi$Z+}gcG)(LR^3A=6<+^3e#xhG*3VpQFG4w- z<`H`x>)rl|`CYccDA`R5jq(*7>7tRR%NBVPKed2tKbF(Z{Y?FmmIUJwj5kex;p3oY2150uhFIqad~fJ^3*HQW#`rLiM?s}uZ=Hh`|tVt znX`Uq1#}l#M}~)+w!=TI3_q}mj7m~Kg2~!})>pQXj3^HQQ=eIoUinGg-q#$Jiu28q zEvft=oF@u{MX!^XczATW#|Ny-zQMSUObLN-nf3lK{$z6b>J zFftqK>?oX^=2~`kHl^V&%74ym?dC=zBZH$oW4TpQv1-}LaINjERg$!|`kCAE(5I-% zNC;^W#1X~o>u+jKezBHfvzzutU#wn=eQc5J?rCeNDRtTs?S>O+<@4_DaE{Ec4#vMe zban@Rf7n;_M1e7nxZGDwSVFl8RduBnzie{B9-_uGt!vQLkNaBHr+&niu)vcn%O~O= za;61W3&?8J@@a1lys_PIEIZlTv{qOms$iBM%14-X2w#tK6tfk^#tG#7xXt`rvUO!! z%4>g%$5;I$d2Nd1`|WtUgX(K%YZ{?b>UUNb^ooq@9=s2QdiO0y*2rZ^enWKwIPOQf zH@gqHDEzuxH-{tmSNd`TNxCW37Tu4RZ+2Q#Jo4%qM60>~R=caR z+kHTE2K7O8H3nBM{={|LNo~vZ&bN}{n3Ja_sj)HV`|2;^*vB5+-x$bvq{BRSi^4$* zh5S9tLr+9bm04TU#A)7JsD$n)Z8FC2;!DX~F8YH24>9oZh}^(ea(Cg}w^*2&d;M6r zSNF>oSwQTGeBxZ(@2>p?41N>!x{$K1@q*n4gD-VDDsu#{-)iq{GIYVdZms%?*XCn! z9+&)h1#0mqJueqT?|W*bsW~dy8Wy~!x5*U83pS=MzdifdfRFj*>OJejm#}BImguDe zMn2OXn&jueo0O+0k6uymY*m||W>(quJJEa(zrT;OWj7}J0Z#I$)OnLe{L+YHqBt$D zQ;o|}$@{+XQpWSTk*P0lDZYL#Q7EmhG0a)az)$6#RN@rQBJl_&8n2951ygBrb^r`R z6GfC%T)EqK8dtuY3zV>)%XegyQ|(ao1GX<|s@>fh`|YZ67pupEs!=^o zp~Z6MycZM5ciEM876qn5HbljGarcd_ zrl<$UBczZZkT_;IF@8Vge5H(#T79yiu?iy5-gbwaiP3?YVzKW$F6i;u3Tr0Q?uCuf z=V&DsGsnDdslb=*3 zLkurAWMo-t25K$wUw%0eAT`?c-n7HU#(4nO4lABcElqdbS~XD#te4CIC)o-GL}$Ia zv-obXF=BA)aPv4C)Oc^tD++%KOKVh{iDzH%+1j`9Wmz8n@rq@4{hT2su~O>R{o_oK zG?gKkN_SVt_;YbU2b6ghdgE2i*vB9Q~1`acZhuRI8^qJVP5Ln#4=3v|vbouv?S)$ir9 zKb$9#TZme{)_g;s5>xnNFfn$Xz7F@xj-5E+Aj2JGst|eGK9aDxyMv7Ry`1(7%@yjh zJL6Fta5>nk?o-CPHi^Yvw4otZc}n~^*A}$?1;j%mW1N76=`&t*3GwwrPbkf zj+{;7FCXy~Y6-4lnfolr$e{Z>f{n+Zf4~$4zypFL4d^83s|6~?U@#)o)wlon%YR)8 z7J#_=?88J5Dxs`. -Facilities ----------- +Facilities Table +---------------- The TOM's ``tom_observations`` module also has a database table (model) for telescope facilities where users can store -general information about telescopes, including the location of the telescope site(s) or orbits, wavelength range, etc. -This information is used by the TOM when calculating target visibility, even if the telescope doesn't accept programmatic -submission of observations. +general information about telescopes, including the location of the telescope site(s) or orbits, wavelength range, etc, +regardless of whether they can accept the programmatic submission of observations. +This enables the TOM to include these facilties, for example when calculating target visibility. A TOM administrator can add facilities to this table using the TOM's admin interface. @@ -60,22 +60,71 @@ that allows the programmatic submission of observations. We encourage users with custom telescope module to submit a pull request through Github to the TOM Toolkit, to share the capability with other users. -Observing Programs ------------------- +Making Observations Interactively +--------------------------------- -`Programmatically Submitting Observations <../common/scripts.html#creating-observations-programmatically>`__ +Requests for observations on multiple telescopes for can be submitted interactively from the detail page of an individual ``Target``. +This can be done by clicking on the button for the desired observatory under the ``observe`` tab: -:doc:`Cadence and Observing Strategies ` - Learn how to build cadence strategies that submit observations based on -the result of prior observations, as well as how to leverage observing templates to submit observations with fewer clicks. +.. figure:: /_static/observation_module/target_detail_observe_buttons.png + :alt: Section of a target detail page showing the buttons to submit observations + :width: 100% + :align: center + + Observatory buttons under the `observe` tab of a target detail page. + +Each button takes the user to the observation request form for the corresponding telescope's instrumentation. + +Automating your observations +---------------------------- + +It's also possible to request observations programmatically, through a script. This can be a very powerful +way to orchestrate an observing program, and allows users to automate their observations. An example of +this approach can be found under +:doc:`Programmatically Submitting Observations `. + +Observing Strategies and Templates +---------------------------------- + +A further step in automating your observing program is to tell the TOM what your strategy is for future observations +of a given target. For example, this allows it to automatically re-submit a previously-defined observation request in +the event that those observations were not executed for whatever reason. + +:doc:`Cadence and Observing Strategies ` describes how to build cadence strategies that submit observations +based on the result of prior observations, as well as how to leverage observing templates to submit observations +with fewer clicks. Finding visible targets ----------------------- -:doc:`Selecting Targets ` - Display a selection of targets for a specific observing facility. +Identifying which targets are visible from a given observatory is a routine task in any observing program. The TOM's +target detail page includes a tool that computes the target's visibility from a range of different sites. +.. grid:: 2 + :gutter: 3 + + .. grid-item:: + .. figure:: /_static/observation_module/target_visibility_tool.png + :width: 100% + + Target visibility calculator + + .. grid-item:: + .. figure:: /_static/observation_module/target_moon_separation_plot.png + :width: 100% + + Plot of target separation from the Moon + +Conversely, the TOM also has a tool to figure out which of your targets will be visible from a given telescopes. +This is described under :doc:`Selecting Targets `. Observation Records ------------------- -:doc:`Observation Models <../api/tom_observations/models>` - Learn about the models used to store observation data. +The TOM keeps an ``Observation_Record`` of all observations submitted through it, either interactively or programmatically. +These records include the parameters of the observation request and its status of execution. +For observatories that offer APIs to allow users to query observation status, the TOM includes tools to update +this parameter programmatically. + +For more details about observation-related models in the TOM see :doc:`Observation Models `. From 4f5bcd8033ec45503fd89ca0e99f28f8ce7c2cd1 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Thu, 7 May 2026 12:05:30 -0700 Subject: [PATCH 08/13] Revamp data section --- .../managing_data/data_upload_form.png | Bin 0 -> 71819 bytes docs/managing_data/index.rst | 75 +++++++++++++----- 2 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 docs/_static/managing_data/data_upload_form.png diff --git a/docs/_static/managing_data/data_upload_form.png b/docs/_static/managing_data/data_upload_form.png new file mode 100644 index 0000000000000000000000000000000000000000..ac19de04280197cc4acdae79e58cb53a56419044 GIT binary patch literal 71819 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

g*JpF~L%F4r+FDHh$ql6`!FW*Tc)YGBF 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 Z{qx5+9sehMZ4J;C22WQ%mvv4FO#ph&p%(xE literal 0 HcmV?d00001 diff --git a/docs/managing_data/index.rst b/docs/managing_data/index.rst index ad3b4ebdf..c85eaa0f9 100644 --- a/docs/managing_data/index.rst +++ b/docs/managing_data/index.rst @@ -1,31 +1,68 @@ Managing Data ============= -.. toctree:: - :maxdepth: 2 - :hidden: +The TOM's Data Models +--------------------- +The TOM Toolkit includes two distinct models for data in the ``tom_dataproducts`` module: - ../api/tom_dataproducts/views - plotting_data - customizing_data_processing - tom_direct_sharing - stream_pub_sub - continuous_sharing - single_target_data_service +* ``DataProduct``: Corresponds to any file containing data, from a FITS, to a PNG, to a CSV. It can optionally be + associated with a specific observation, and is required to be associated with a target. A ``DataProduct`` can have a + specified type which can be used to trigger post-save hooks to perform automated process upon ingest. +* ``ReducedDatum``: Refers to a single piece of data - e.g., a spectrum, a single measurement or a set of timeseries + photometry measurements. It is associated with a target, and optionally with the data product it came from. +The TOM also allows a ``DataProductGroup`` to be defined. This allows TOM administrators control over which user +groups can access which data products. -:doc:`Creating Plots from TOM Data ` - Learn how to create plots using plot.ly and your TOM -data to display anywhere in your TOM. +Ingesting data into the TOM +--------------------------- +Data products for a given target can be uploaded through the ``Manage Data`` tab on the target's detail page, or +programmatically. -:doc:`Adding Custom Data Processing ` - Learn how you can process data into your -TOM from uploaded data products. +.. figure:: /_static/managing_data/data_upload_form.png + :alt: TOM's data upload form + :width: 100% + :align: center -:doc:`TOM-TOM Direct Sharing ` - Learn how you can send and receive data between your TOM and another TOM-Toolkit TOM via an API. + DataProduct upload form in the TOM's target detail page -:doc:`Publish and Subscribe to a Kafka Stream ` - Learn how to publish and subscribe to a Kafka stream topic. +If a data product type is specified, then the TOM calls uses post-save hooks to call the corresponding built-in +processing functions found in ``tom_dataproducts/processors``. The TOM's ``photometry_processor.py`` for example, +reads a photometry data file and ingests the timeseries measurements as ``ReducedDatum``. -:doc:`Setting up Continuous Sharing of a target's data to a TOM or Kafka stream ` - Learn how to set up continuous sharing of a Target's data products. +It's also possible for users to add their own custom data formats and corresponding specialized processors - see +:doc:`Adding Custom Data Processing ` for more details. -:doc:`Integrating Single-Target Data Service Queries ` - Learn how to integrate the existing Atlas, panSTARRS, and ZTF -single-target data services into your TOM, and learn how to add new services. +Data Visualization +------------------ + +The Toolkit includes built-in interactive tools for plotting data types common in astronomy, such as +light curves and spectra. But it is often useful to customize these for particular science goals. +:doc:`Creating Plots from TOM Data ` describes how to create interactive plots of your data +to display anywhere in your TOM. + +Data Sharing +------------ + +Many users find it valuable to be able to share data from their TOM system with other people, services or directly with +other TOM systems. The Toolkit includes a number of different data sharing options: + +* :doc:`TOM-TOM Direct Sharing ` - Send and receive data between your TOM and another TOM-Toolkit TOM via an API. + +* :doc:`Publish and Subscribe to a Kafka Stream ` - Publish and subscribe to a Kafka stream topic. + +* :doc:`Setting up Continuous Sharing of a target's data to a TOM or Kafka stream ` - Set up continuous sharing of a Target's data products. + +Survey data on a Target +----------------------- + +Archival data can be a valuable resource for understanding its nature and behaviour. These include data archives, which +hold source catalogs, photometry, spectroscopy and imaging data in many wavelengths, as well as forced photometry +services. These are offered by a number of surveys, to enable users to search for precursor observations. + +The TOM include a number of built-in single-target data service query functions to allow the user to harvest data +for a given object from surveys including ATLAS and Pan-STARRS. + +To learn about these functions, and how to add a new service to your TOM, see +:doc:`Integrating Single-Target Data Service Queries `. From 11e310133aff74374eba574991437af213709b6f Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Thu, 7 May 2026 13:45:35 -0700 Subject: [PATCH 09/13] Revamp code section --- docs/code/index.rst | 63 ++++++++++---- docs/customization/index.rst | 86 ++++++++++++++----- .../single_target_data_service.rst | 3 +- 3 files changed, 110 insertions(+), 42 deletions(-) diff --git a/docs/code/index.rst b/docs/code/index.rst index 4ada5532e..f3a77da67 100644 --- a/docs/code/index.rst +++ b/docs/code/index.rst @@ -1,26 +1,55 @@ Interacting with your TOM through code ====================================== -.. toctree:: - :maxdepth: 2 - :hidden: +TOM systems provide a platform for automating some, if not all, of the day-to-day workflow of an +astronomical program. To that end, the Toolkit offers Application Programmable Interfaces (API) for +a number of key functions, and there are a number of options for automating workflows. - querying - automation - backgroundtasks - custom_code - ../common/scripts +Automated Tasks +--------------- -:doc:`Advanced Querying ` - Get a couple of tips on programmatic querying with Django's QuerySet API +There are many tasks which often have to be executed on a regular schedule, such as looking for new potential +targets for instance. Rather than have to do this yourself, you can write a simple script called a ``management command`` +which can be configured to run regularly as a cronjob. -:doc:`Automating Tasks ` - Run commands automatically to keep your TOM working even when you -aren’t +This mechanism is also really helpful if you want to implementing code to analyse the data in the TOM without having to +build it into the user interface. -:doc:`Background Tasks ` - Learn how to set up an asynchronous task library to handle long -running and/or concurrent functions. +:doc:`Automating Tasks ` describes how to implement a ``management command``, and a full list of the +TOM's built-in management commands can be found :doc:`here `. -:doc:`Running Custom Code Hooks ` - Learn how to run your own scripts when certain actions happen -within your TOM (for example, an observation completes). +Asynchronous Tasks +------------------ -:doc:`Scripting your TOM with Jupyter Notebooks <../common/scripts>` - Use a Jupyter notebook (or just a python -console/scripts) to interact directly with your TOM. +Sometimes functions can take a long time to complete, such as data reduction pipelines or queries to external services. +This can be an issue for browser-based systems like TOMs, because the browser has a timeout which may raise an error +before the task completes. Nevertheless, it is often desirable for a TOM system to be able to orchestrate these +tasks. + +An asynchronous task is designed to mitigate this problem; it can be triggered to run in the background by the TOM, and +to return the expected output whenever it is ready. :doc:`Background Tasks ` describes how to set up +an asynchronous task library to handle long running and/or concurrent functions. + +Advanced Queries +---------------- + +Django's QuerySet API provides a range of sophisticated and efficient tools for querying your TOM's database. +:doc:`Advanced Querying ` explores some of the options in more depth. + +Custom Code Hooks +----------------- + +A code hook allows us to tell the TOM to perform a given function whenever a certain action is taken, such as clicking +a button or uploading a file. You can add your own customized functions to the TOM and define when they should +be called following the guidelines in :doc:`Running Custom Code Hooks `. + +Python Scripts and Jupyter Notebooks +------------------------------------ + +You can also interact directly with your TOM from a Python script or Jupyter notebook, which provides a flexible way to +analysis the data. :doc:`Scripting your TOM with Jupyter Notebooks ` shows how. + +TOM Toolkit APIs +---------------- + +Full details of all TOM Toolkit functions can be found in the :doc:`API Documentation `. \ No newline at end of file diff --git a/docs/customization/index.rst b/docs/customization/index.rst index 561d13ef0..456608863 100644 --- a/docs/customization/index.rst +++ b/docs/customization/index.rst @@ -1,36 +1,76 @@ Customization ============= -.. toctree:: - :maxdepth: 2 - :hidden: +The TOM Toolkit is deliberately designed as an adaptable framework to enable users to customize +all aspects of it. This includes both "look and feel" aspects of the appearance of the user interface, +to adding new functionality and automating aspects of your workflow. - customize_templates - adding_pages - customize_template_tags - testing_toms - widgets - encrypted_model_fields - htmx_tables +User Interface Appearance and Layout +------------------------------------ +The TOM's user interface is built on top of `Django's template engine `_. +This template system allows us to design pages which can be populated with variables and even functions called ``templatetags``, +to adapt the content and provide functionality - without duplication of content. -Start here to learn how to customize the look and feel of your TOM or add new functionality. +The Toolkit provides a number of built-in templates which you can see in the out-of-the-box TOM system. +Any or all of these templates can be overridden if you want to change the color palette or even the entire layout. +:doc:`Customizing TOM Templates ` describes how to do this. -:doc:`Customizing TOM Templates ` - Learn how to override built in TOM templates to -change the look and feel of your TOM. +We provide a library of widgets to perform common functions, such as buttons. +:doc:`TOM Widgets ` describes how to make use of these in your page. -:doc:`Adding new Pages to your TOM ` - Learn how to add entirely new pages to your TOM, -displaying static html pages or dynamic database-driven content. -:doc:`Customizing Template Tags ` - Learn how to write your own template tags to display -the data you need. +Adding Pages and Functionality +------------------------------ -:doc:`Testing TOMs ` - Learn how to test your TOM's functionality. +You can also add entirely new pages to the TOM user interface, to display either static content or display and interact +with data in the database. The process for doing this is described in +:doc:`Adding new Pages to your TOM `. -:doc:`TOM Widgets ` - Include these widgets in your custom templates. +Alternatively, you may not need to add a whole new page, but would like to "embed" a function to display data in +a customized way within an existing page. In that case, you probably want to develop a new `templatetag +`_. +:doc:`This page ` describes how to do this. -:doc:`Encrypting Data in a Model Field ` - Learn how to encrypt sensitive data like -passwords and API keys in your TOMToolkit app. -:doc:`Building Interactive HTMX Tables ` - Learn how to build interactive tables with -filtering, sorting, and pagination using django-tables2 and HTMX. \ No newline at end of file +Data Visualization Tools +------------------------ + +The data visualization tools in the Toolkit include a number of interactive plots and skymaps. You can add +your own custom plots following the guidelines in :doc:`Creating Plots from TOM Data `. + +We are increasingly using `HTMX `_ within the Toolkit to provide more responsive interactive elements +such as search functions, while minimizing the Toolkit's dependency on Javascript. This choice helps us minimize the +user learning curve (though you're welcome to use Javascript if you like!). One area where HTMX has proven useful is in +in the interactive table search functions. :doc:`Click here ` to learn how to build interactive tables with +filtering, sorting, and pagination using django-tables2 and HTMX. + +Custom Code Hooks +----------------- + +Code hooks provide a mechanism for triggering a pre-defined action whenever a certain condition happens. +One example of this is the TOM's data processors which are triggered whenever a data product is uploaded, but you +can easily imagine many other use cases within your workflow. + +:doc:`Running Custom Code Hooks ` demonstrates how to implement you own custom code hook. + +Encrypting Sensitive Data +------------------------- + +Some data held in a TOM can be sensitive, such as user passwords. For security's sake, it is best that these fields +are encrypted, and the TOM provides support for this. :doc:`Click here ` to learn how to +make use of encrypted fields your TOMToolkit app. + +Testing +------- + +If you implement new features, it is a very good idea to include unit tests to verify that the functionality works, +both right now and after future upgrades. To test your TOM's functionality, see :doc:`Testing TOMs `. + +Asynchronous Tasks +------------------ + +If a function is expected to take more than a few minutes - for example a data reduction pipeline - it is advisable +to consider implementing it as an asynchronous task. This will avoid the browser timing out while the task is executing. + +More information on implementing asynchronous tasks within a TOM can be found in :doc:`Background Tasks `. diff --git a/docs/managing_data/single_target_data_service.rst b/docs/managing_data/single_target_data_service.rst index dbf86f71c..fb806683e 100644 --- a/docs/managing_data/single_target_data_service.rst +++ b/docs/managing_data/single_target_data_service.rst @@ -6,8 +6,7 @@ The base TOM Toolkit comes with `ATLAS `). +Additional services can be added by extending the ``BaseSingleTargetDataService`` implementation. Integrating existing Single-Target Data Services From a04121c6ef31cdacb3e9997403ad6e0f486293b1 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Fri, 8 May 2026 09:34:00 -0700 Subject: [PATCH 10/13] Revamp deployment section --- docs/deployment/index.rst | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/docs/deployment/index.rst b/docs/deployment/index.rst index 8b7e6f5fb..1c200e643 100644 --- a/docs/deployment/index.rst +++ b/docs/deployment/index.rst @@ -1,19 +1,35 @@ Deploying your TOM Online ========================= -.. toctree:: - :maxdepth: 2 - :hidden: +Once you’ve got a TOM up and running on your machine (aka ``localhost``), it's advantageous to deploy to a +webhosting service so that it is accessible by you and your colleagues worldwide. - deployment_tips - deployment_heroku - amazons3 +There are a number of different ways of doing this, either by hosting the TOM on a local webserver, or by +deploying it to a Cloud-based service. -Once you’ve got a TOM up and running on your machine, you’ll probably want to deploy it somewhere so it is permanently -accessible by you and your colleagues. +Whichever option you choose, there are some essential decisions to make, including some security settings that it's +important to get right. :doc:`General Deployment Tips covers these fundamentals. -:doc:`General Deployment Tips ` - Read this first before deploying your TOM for others to use. +Local Server +------------ -:doc:`Deploy to Heroku ` - Heroku is a PaaS that allows you to publicly deploy your web applications without the need for managing the infrastructure yourself. +Many institutions have their own in-house servers on which they host their own websites. If that is the case at +your institution, then talk to your IT department about hosting your TOM from a local server - every institution +has a distinct configuration. -:doc:`Using Amazon S3 to Store Data for a TOM ` - Enable storing data on the cloud storage service Amazon S3 instead of your local disk. \ No newline at end of file +Cloud Server +------------ + +There are a number of Cloud service providers that can host a TOM system, including Heroku, Google Cloud, Azure and +Amazon Web Service (AWS). It's worth noting that while Github offers the github.io service, this is designed for +relatively static content in Markdown format rather than database-driven services like a TOM system. + +Heroku offers one of the most straight-forward deployment workflows, without the need for managing the infrastructure yourself, +so we use this as a guide to the process in :doc:`Deploy to Heroku `. + +Data storage +------------ + +Cloud providers also offer general-purpose data storage, which is often value for TOM-related data products. +:doc:`Using Amazon S3 to Store Data for a TOM ` demonstrates how to enable storing data on the cloud storage +service Amazon S3 instead of your local disk. \ No newline at end of file From 67e2e9bb11a73fd91ec3b0fa9da219b35487dcc7 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Fri, 8 May 2026 09:38:30 -0700 Subject: [PATCH 11/13] Revamp deployment section --- docs/deployment/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/deployment/index.rst b/docs/deployment/index.rst index 1c200e643..7fc21449e 100644 --- a/docs/deployment/index.rst +++ b/docs/deployment/index.rst @@ -8,7 +8,7 @@ There are a number of different ways of doing this, either by hosting the TOM on deploying it to a Cloud-based service. Whichever option you choose, there are some essential decisions to make, including some security settings that it's -important to get right. :doc:`General Deployment Tips covers these fundamentals. +important to get right. :doc:`General Deployment Tips ` covers these fundamentals. Local Server ------------ @@ -25,11 +25,11 @@ Amazon Web Service (AWS). It's worth noting that while Github offers the github relatively static content in Markdown format rather than database-driven services like a TOM system. Heroku offers one of the most straight-forward deployment workflows, without the need for managing the infrastructure yourself, -so we use this as a guide to the process in :doc:`Deploy to Heroku `. +so we use this as a guide to the process in :doc:`Deploy to Heroku `. Data storage ------------ Cloud providers also offer general-purpose data storage, which is often value for TOM-related data products. -:doc:`Using Amazon S3 to Store Data for a TOM ` demonstrates how to enable storing data on the cloud storage +:doc:`Using Amazon S3 to Store Data for a TOM ` demonstrates how to enable storing data on the cloud storage service Amazon S3 instead of your local disk. \ No newline at end of file From 7bd130dcb803e20c2fc598e2b209b63e4b5519c4 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Fri, 8 May 2026 10:36:30 -0700 Subject: [PATCH 12/13] Revise support and plugins sections --- docs/code/plugins.rst | 165 ++++++++++++++++++++++++---------- docs/deployment/index.rst | 8 ++ docs/index.rst | 1 + docs/introduction/support.rst | 3 +- 4 files changed, 131 insertions(+), 46 deletions(-) diff --git a/docs/code/plugins.rst b/docs/code/plugins.rst index 9d2130758..a26bcc3d5 100644 --- a/docs/code/plugins.rst +++ b/docs/code/plugins.rst @@ -1,5 +1,5 @@ TOM Toolkit Plugins -------------------- +=================== We aim to keep the TOM as lightweight and flexible as possible, and we recognize that every team has their own science goals and often need @@ -10,150 +10,225 @@ functions, we support a range of optional plugin modules for the Toolkit. These range from adding the ability to interface with additional observatories and catalogs, to providing additional plotting or data analytics functionality. -### [tom_hermes](https://github.com/TOMToolkit/tom_hermes) +tom_hermes +---------- + +`Github link `_ -The [Hermes](https://hermes.lco.global) service provides a archive of +The `Hermes `_ service provides a archive of astronomical alerts. This plugin allows TOM users to query Hermes and share data with the service. -### [tom_fink](https://github.com/TOMToolkit/tom_fink) +tom_fink +-------- -[Fink](https://fink-broker.org/) is an alert broker service. This plugin +`Github link `_ + +`Fink `_ is an alert broker service. This plugin enables users to query this service and harvest alert information. -### [tom_antares](https://github.com/TOMToolkit/tom_antares) +tom_antares +----------- + +`Github link `_ -This plugin adds support for querying the [ANTARES](https://antares.noirlab.edu/) broker for targets of interest. +This plugin adds support for querying the `ANTARES `_ broker for targets of interest. -### [tom_app_template](https://github.com/TOMToolkit/tom_app_template) +tom_app_template +---------------- + +`Github link `_ This repository is designed to provide a starting template for TOM users wishing to develop their own TOM app. This app contains all of the basic workflows, directory structure, testing infrastructure, and instructions you will need to get started. -### [tom_jpl](https://github.com/TOMToolkit/tom_jpl) +tom_jpl +------- + +`Github link `_ The Jet Propulsion Laboratory provides a number of services supporting Solar System science. This plugin provides a TOM interface to JPL's -[SCOUT](https://cneos.jpl.nasa.gov/scout/intro.html) service. +`SCOUT `_ service. + +tom_eso +------- -### [tom_eso](https://github.com/TOMToolkit/tom_eso) +`Github link `_ This plugin enables users to compose and submit observation requests to -telescopes at the [European Southern Observatory](https://www.eso.org/public/). +telescopes at the `European Southern Observatory `_. -### [tom_regions](https://github.com/TOMToolkit/tom_regions) +tom_regions +----------- + +`Github link `_ This plugin allows a TOM to store sky regions defined from Multi-Order Coverage maps. -### [tom_registration](https://github.com/TOMToolkit/tom_registration) +tom_registration +---------------- + +`Github link `_ This plugin introduces support for two TOM registration -workflows--an open registration, and a registration that requires administrator approval. +workflows including an open registration, and a registration that requires administrator approval. -### [tom_tns](https://github.com/TOMToolkit/tom_tns) +tom_tns +------- + +`Github link `_ This plugin enables TOMs to report transient classifications to -the [Transient Name Server](https://www.wis-tns.org/). +the `Transient Name Server `_. + +tom_alertstreams +---------------- -### [tom_alertstreams](https://github.com/TOMToolkit/tom_alertstreams) +`Github link `_ Apache Kafka is widely used in astrophysics for the dissemination of alert packages. This plugin enables a TOM system to listen to user-configured alerts streams. -### [tom_demoapp](https://github.com/TOMToolkit/tom_demoapp) +tom_demoapp +----------- + +`Github link `_ This TOM application is not designed to be installed by users, but instead act as a development and demonstration app for users wishing to integrate their own TOM applications with the base TOM toolkit. The code itself serves as example, -while the [wiki](https://github.com/TOMToolkit/tom_demoapp/wiki) gives a menu of existing integration points. +while the `wiki `_ gives a menu of existing integration points. + +tom_nonlocalizedevents +---------------------- -### [tom_nonlocalizedevents](https://github.com/TOMToolkit/tom_nonlocalizedevents) +`Github link `_ Various events in astrophysics are hard to localize, for example gravitational wave or neutrino detections. This app allows the TOM to recognize that a given event may be associated with a number of candidates, and provides custom views designed to support this workflow. -### [tom_swift](https://github.com/TOMToolkit/tom_swift) +tom_swift +--------- + +`Github link `_ -The [Neil Gehrels Swift Observatory](https://swift.gsfc.nasa.gov/) is a space telescope offering +The `Neil Gehrels Swift Observatory `_ is a space telescope offering UV/Visible and X-ray instrumentation and rapid response capabilities. This plugin enables TOM users to submit requests for Target of Opportunity observations with this spacecraft. -### [tom_classifications](https://github.com/TOMToolkit/tom_classifications) +tom_classifications +------------------- + +`Github link `_ This app provides a number of data visualization tools for inspecting alert data from multiple brokers. -### [tom_keck](https://github.com/TOMToolkit/tom_keck) +tom_keck +-------- + +`Github link `_ Application to enable requests for Target of Opportunity observations -to be submitted to the [Keck Observatories](https://keckobservatory.org/). -Note: to be integrated with [AEONlib](https://github.com/AEONplus/AEONlib). +to be submitted to the `Keck Observatories `_. +Note: to be integrated with `AEONlib `_. + +tom-lt +------ -### [tom-lt](https://github.com/TOMToolkit/tom_lt) +`Github link `_ This module provides the ability to submit observations to the -[Liverpool Telescope](https://telescope.livjm.ac.uk/) Phase 2 system. It is in a very alpha +`Liverpool Telescope `_ Phase 2 system. It is in a very alpha state, with little error handling and minimal instrument options, but can successfully submit well-formed observation requests. -### [tom-toolkit_component_lib](https://github.com/TOMToolkit/tom-toolkit-component-lib) +tom-toolkit_component_lib +------------------------- + +`Github link `_ Demonstration of how Javascript front-end components can be integrated with a TOM. -### [tom_dash](https://github.com/TOMToolkit/tom_dash) +tom_dash +-------- + +`Github link `_ -This module demonstrates how [Plotly-Dash](https://dash.plotly.com/) components can be added to a +This module demonstrates how `Plotly-Dash `_ components can be added to a TOM for data exploration and visualization. -### [tom_gemini_community](https://github.com/TOMToolkit/tom_gemini_community) +tom_gemini_community +-------------------- + +`Github link `_ TOM module to enable observations to be submitted to the -[Gemini Telescope's](http://www.gemini.edu/) Phase 2 system. +`Gemini Telescope's `_ Phase 2 system. -### [tom_nonsidereal_airmass](https://github.com/TOMToolkit/tom_nonsidereal_airmass) +tom_nonsidereal_airmass +----------------------- -This plugin provides a templatetag -that supports plotting for non-sidereal objects. The plugin is fully supported by the TOM Toolkit team; however, +`Github link `_ + +This plugin provides a templatetag that supports plotting for non-sidereal objects. The plugin is fully supported by the TOM Toolkit team; however, non-sidereal visibility calculations require the PyEphem library, which is minimally supported while its successor is in development. The library used for the TOM Toolkit sidereal visibility, astroplan, does not yet support non-sidereal visibility calculations. -### [tom_publications](https://github.com/TOMToolkit/tom_publications) +tom_publications +---------------- + +`Github link `_ This application prototyped tools to enable users to output latex-formatted data from their TOM system. -### [herokutom](https://github.com/TOMToolkit/herokutom) +herokutom +--------- + +`Github link `_ This repository demonstrates how a TOM system can be deployed to a public -server using the [Heroku platform](https://www.heroku.com/). +server using the `Heroku platform `_. -## Archived plugins +Archived plugins +---------------- The following plugins are available but not currently supported. In some cases this is because the functionality has been integrated with the base Toolkit. -### [tom_alerts_dash](https://github.com/TOMToolkit/tom_alerts_dash) +tom_alerts_dash +--------------- + +`Github link `_ This plugin adds responsive ReactJS views to the `tom_alerts` module for supported brokers. The `tom_alerts` module has been superseded by tom_dataservices in v3.0.0. -### [dockertom](https://github.com/TOMToolkit/dockertom) +dockertom +--------- + +`Github link `_ This repository demonstrates how to package a TOM system in a docker container, which is often required for deployment. -### [tom_scimma](https://github.com/TOMToolkit/tom_scimma) +tom_scimma +---------- + +`Github link `_ This app enables a TOM to subscribe to the Hopskotch alert stream developed by the Scalable Cyberinfrastructure to support Multi‑Messenger Astrophysics -([SCiMMA](https://scimma.org/)) project. +(`SCiMMA `_) project. diff --git a/docs/deployment/index.rst b/docs/deployment/index.rst index 7fc21449e..603f78627 100644 --- a/docs/deployment/index.rst +++ b/docs/deployment/index.rst @@ -10,6 +10,14 @@ deploying it to a Cloud-based service. Whichever option you choose, there are some essential decisions to make, including some security settings that it's important to get right. :doc:`General Deployment Tips ` covers these fundamentals. +Dockerizing your TOM +-------------------- + +Docker is a software packaging system which creates a container that ensures the software has a well-defined +environment in which to run -- including all necessary dependencies. This has become widely used and is often +a necessary first step to deploying your TOM. An example repository of a dockerized TOM system can be found +`here `_ for reference. + Local Server ------------ diff --git a/docs/index.rst b/docs/index.rst index 1a1b77cd8..8629fc894 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,6 +15,7 @@ TOM Toolkit APIs Deploy Plugins + Support Introduction ------------ diff --git a/docs/introduction/support.rst b/docs/introduction/support.rst index 5a8b98d23..d62d54865 100644 --- a/docs/introduction/support.rst +++ b/docs/introduction/support.rst @@ -26,4 +26,5 @@ Like issues, feature and enhancement requests should be done via the same `Githu Support ------- -If you're looking for help with some aspect of your TOM, the `Github issues page `_ is once again the place to go. The "question" or "help wanted" tags should be very useful when looking for support, and the TOM Toolkit developers are more than happy to provide the help necessary to get your TOM running. You may also want to peruse the `Closed Issues `_, where someone may have already had (and solved!) your problem. \ No newline at end of file +If you're looking for help with some aspect of your TOM, the `Github issues page `_ is once again the place to go. The "question" or "help wanted" tags should be very useful when looking for support, and the TOM Toolkit developers are more than happy to provide the help necessary to get your TOM running. You may also want to peruse the `Closed Issues `_, where someone may have already had (and solved!) your problem. + From 4b05a6439c151732b8a881129a7fd60601a6afc6 Mon Sep 17 00:00:00 2001 From: rachel3834 Date: Fri, 8 May 2026 11:27:13 -0700 Subject: [PATCH 13/13] Review and finish docs overhaul --- docs/code/index.rst | 4 +-- docs/customization/index.rst | 4 ++- docs/index.rst | 8 +++--- docs/introduction/about.rst | 22 ++++++++++----- docs/introduction/index.rst | 27 ------------------- ...esources.rst => programming_resources.rst} | 0 docs/introduction/tomarchitecture.rst | 6 ++--- docs/introduction/workflow.rst | 18 ++++++------- 8 files changed, 37 insertions(+), 52 deletions(-) delete mode 100644 docs/introduction/index.rst rename docs/introduction/{resources.rst => programming_resources.rst} (100%) diff --git a/docs/code/index.rst b/docs/code/index.rst index f3a77da67..f432e70b9 100644 --- a/docs/code/index.rst +++ b/docs/code/index.rst @@ -49,7 +49,7 @@ Python Scripts and Jupyter Notebooks You can also interact directly with your TOM from a Python script or Jupyter notebook, which provides a flexible way to analysis the data. :doc:`Scripting your TOM with Jupyter Notebooks ` shows how. -TOM Toolkit APIs ----------------- +API Reference +------------- Full details of all TOM Toolkit functions can be found in the :doc:`API Documentation `. \ No newline at end of file diff --git a/docs/customization/index.rst b/docs/customization/index.rst index 456608863..5f8751e00 100644 --- a/docs/customization/index.rst +++ b/docs/customization/index.rst @@ -5,6 +5,9 @@ The TOM Toolkit is deliberately designed as an adaptable framework to enable use all aspects of it. This includes both "look and feel" aspects of the appearance of the user interface, to adding new functionality and automating aspects of your workflow. +The :doc:`Programming Resources ` page provides some quick links to a number of useful reference sources +relating to software used in the TOM Toolkit: HTML, CSS, Python, and Django + User Interface Appearance and Layout ------------------------------------ @@ -19,7 +22,6 @@ Any or all of these templates can be overridden if you want to change the color We provide a library of widgets to perform common functions, such as buttons. :doc:`TOM Widgets ` describes how to make use of these in your page. - Adding Pages and Functionality ------------------------------ diff --git a/docs/index.rst b/docs/index.rst index 8629fc894..f6dfa7772 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,7 +12,7 @@ TOM Toolkit Observing Data Customization - APIs + API Deploy Plugins Support @@ -32,7 +32,7 @@ The TOM (Target and Observation Manager) Toolkit is designed to make it easy for and customize a TOM system for their science goals. The package includes a full-featured TOM system out of the box, and this documentation describes how you can extend this system for your own needs. -More information about the project can be found in :doc:`here`. +More information about TOM systems and the TOM Toolkit project can be found in :doc:`here`. Installation & Configuration ---------------------------- @@ -42,8 +42,8 @@ Full instructions for installing the package and creating your own TOM system ca A range of common configuration options are covered in :doc:`custom settings`, including options to control user permissions. -Examples --------- +TOM Demo Example System +----------------------- It's always helpful to have template projects as a reference, so we run a `TOM demo system `__ where you can explore the TOM's features. If you want to see how this was done, you can explore the code on diff --git a/docs/introduction/about.rst b/docs/introduction/about.rst index d8ed67ce5..3ac40e98c 100644 --- a/docs/introduction/about.rst +++ b/docs/introduction/about.rst @@ -1,10 +1,10 @@ -About the TOM Toolkit ---------------------- +TOM systems and the TOM Toolkit Project +======================================= What’s a TOM? -~~~~~~~~~~~~~ +------------- -It stands for Target and Observation Manager, and its a software package +It stands for Target and Observation Manager (aka marshal), and its a software package designed to facilitate astronomical observing projects and collaborations. @@ -31,7 +31,7 @@ TOM systems perform some or all of these functions: - Facilitate the sharing of information and data. Motivation for a TOM Toolkit -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------- Many projects, from several branches of astronomy, have found it necessary to develop TOM systems. Current examples include the PTF @@ -60,8 +60,18 @@ What’s needed is a software package that lets astronomers easily build a TOM, customized to suit the needs of their project, without becoming an IT expert or software engineer. +TOM Architecture and Workflow +----------------------------- + +For a high-level overview of the architecture of the TOM Toolkit, see :doc:`Architecture . + +The architecture was designed around a general workflow common to many different areas of astronomy, +particularly time domain and multi-messenger astrophysics. An overview of the workflow is described +:doc:`here `. + + Financial Support -~~~~~~~~~~~~~~~~~ +----------------- The TOM Toolkit is managed by Las Cumbres Observatory, with generous financial support from the `National Science Foundation `_ grant 2209852. diff --git a/docs/introduction/index.rst b/docs/introduction/index.rst deleted file mode 100644 index f891498f1..000000000 --- a/docs/introduction/index.rst +++ /dev/null @@ -1,27 +0,0 @@ -Introduction -============ - -.. toctree:: - :maxdepth: 2 - :hidden: - - tomarchitecture - getting_started - workflow - resources - faqs - troubleshooting - -:doc:`Architecture ` - This document describes the architecture of the TOM Toolkit at a -high level. Read this first if you're interested in how the TOM Toolkit works. - -:doc:`Getting Started ` - First steps for getting a TOM up and running. - -:doc:`Workflow ` - The general workflow used with TOMs. - -:doc:`Programming Resources ` - Resources for learning the elements of programming used in the TOM Toolkit: -HTML, CSS, Python, and Django - -:doc:`Frequently Asked Questions ` - Look here for a potential quick answer to a common question. - -:doc:`Troubleshooting ` - Find solutions to common problems or information on how to debug an issue. \ No newline at end of file diff --git a/docs/introduction/resources.rst b/docs/introduction/programming_resources.rst similarity index 100% rename from docs/introduction/resources.rst rename to docs/introduction/programming_resources.rst diff --git a/docs/introduction/tomarchitecture.rst b/docs/introduction/tomarchitecture.rst index 6e90640f7..aa8bc9405 100644 --- a/docs/introduction/tomarchitecture.rst +++ b/docs/introduction/tomarchitecture.rst @@ -38,7 +38,7 @@ Django framework. This provides several advantages: We **highly recommend** that developers interested in utilizing the TOM Toolkit familiarize themselves with the basics of Django, especially if they want to -customize the toolkit in any significant fashion. The majority of the :doc:`guides found in the TOM toolkit documentation ` are simply Django concepts rewritten in a TOM context. +customize the toolkit in any significant fashion. Extending and Customizing the TOM Toolkit ========================================= @@ -47,11 +47,11 @@ As mentioned before, Django is well known for its extensibility and modularity. The toolkit takes advantage of these strengths heavily. In many ways, the TOM Toolkit is a framework within a framework. -After a TOM developer follows the :doc:`getting started guide ` +After a TOM developer follows the :doc:`getting started guide ` they are left with a functioning but generic TOM. It is then up to the developer to implement the specific features that their science case requires. The toolkit tries to facilitate this as efficiently as possible and provides -:doc:`documentation ` in areas of customization from :doc:`changing the HTML layout of a page ` +:doc:`documentation ` in areas of customization from :doc:`changing the HTML layout of a page ` to :doc:`customizing an OCS facility and forms ` and even :doc:`creating a new alert broker `. diff --git a/docs/introduction/workflow.rst b/docs/introduction/workflow.rst index 64fd9b74a..bf56584af 100644 --- a/docs/introduction/workflow.rst +++ b/docs/introduction/workflow.rst @@ -1,8 +1,8 @@ TOM Workflow ------------- +============ Targets -~~~~~~~ +------- Targets are the central entity of the TOM Toolkit. Most functionality in the toolkit requires a target as they are the object of study. A target @@ -11,7 +11,7 @@ usually represented using coordinates on the sky along with other meta data. Creating Targets -^^^^^^^^^^^^^^^^ +---------------- The TOM Toolkit provides a variety of methods for importing astronomical targets into the TOM: @@ -36,14 +36,14 @@ targets into the TOM: information that they know of. Observations -~~~~~~~~~~~~ +------------ After creating targets, the scientist needs to collect data on these targets. The TOM Observing module provides an interface to several observatories for which observations can be requested. Requesting Observations -^^^^^^^^^^^^^^^^^^^^^^^ +----------------------- Using the TOM Observation module, scientists can request observations of their targets to one or many different observatories. Since the @@ -61,7 +61,7 @@ programs. .. image:: /_static/common_interface.png Observation Status -^^^^^^^^^^^^^^^^^^ +------------------ Once an observation for a target is created it’s status is kept up to date within the TOM. When the status of an observation request at an @@ -69,7 +69,7 @@ observatory changes (failed, completed, postponed, etc) the scientist may be notified by the TOM. Data -~~~~ +---- The ultimate goal of the TOM toolkit is to collect and organize data. The TOM data module provides several methods for obtaining data, the @@ -77,7 +77,7 @@ most obvious being from completed observations. Scientists can also upload any data they’d like to associate with their targets as well. Data Processing -^^^^^^^^^^^^^^^ +--------------- The TOM toolkit provides a framework to write custom code to interact with the data the TOM obtains (among other things). These are called @@ -88,7 +88,7 @@ images of microlensed stars for exoplanets, they may hook the code into the TOM toolkit directly to run whenever new data is acquired. Downloading Data -^^^^^^^^^^^^^^^^ +---------------- Data is stored in the TOM toolkit by default, but many scientists may want to download the data somewhere else to do offline processing.