From bb76a9204138dcc9de417c6d469505b310fd7f1a Mon Sep 17 00:00:00 2001 From: Andy Shapiro Date: Wed, 31 Jul 2024 13:44:15 -0400 Subject: [PATCH] update documentation (#54) * switch to furo? * remove sphinx docx --- .gitignore | 1 - HISTORY.md | 5 ++ HISTORY.rst | 7 --- Makefile | 25 +--------- README.md | 33 +------------ bmds_ui/analysis/fixtures/initial_data.json | 2 +- docs/Makefile | 20 -------- docs/{source => }/development.md | 43 ++--------------- docs/index.md | 18 +++++++ docs/source/_static/css/style.css | 7 --- docs/source/_static/img/epa_logo.png | Bin 29874 -> 0 bytes docs/source/conf.py | 50 -------------------- docs/source/index.md | 14 ------ make.bat | 25 ---------- pyproject.toml | 5 -- tests/data/db.yaml | 4 +- 16 files changed, 34 insertions(+), 225 deletions(-) create mode 100644 HISTORY.md delete mode 100644 HISTORY.rst delete mode 100644 docs/Makefile rename docs/{source => }/development.md (82%) create mode 100644 docs/index.md delete mode 100644 docs/source/_static/css/style.css delete mode 100644 docs/source/_static/img/epa_logo.png delete mode 100644 docs/source/conf.py delete mode 100644 docs/source/index.md diff --git a/.gitignore b/.gitignore index 31589bcc..fc314e18 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ build/ /data/ coverage_report/ dist/ -docs/site/ node_modules/ scripts/private /public/ diff --git a/HISTORY.md b/HISTORY.md new file mode 100644 index 00000000..527a58d4 --- /dev/null +++ b/HISTORY.md @@ -0,0 +1,5 @@ +# History + +## v24.1 (TBD) + +* ... diff --git a/HISTORY.rst b/HISTORY.rst deleted file mode 100644 index 4d0b1077..00000000 --- a/HISTORY.rst +++ /dev/null @@ -1,7 +0,0 @@ -======= -History -======= - -v24.1 (TBD) -------------------- -* ... diff --git a/Makefile b/Makefile index 9c0cf109..277f3b38 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: build docs docs-clean docs-serve docs-all clean clean-test clean-pyc clean-build loc help lint lint-py lint-js format format-py format-js sync-dev +.PHONY: build clean clean-test clean-pyc clean-build loc help lint lint-py lint-js format format-py format-js sync-dev .DEFAULT_GOAL := help define BROWSER_PYSCRIPT @@ -60,29 +60,6 @@ coverage: ## Generate test coverage report coverage html -d coverage_report $(BROWSER) coverage_report/index.html -docs: ## Build documentation {html} - @$(MAKE) -C docs clean - @$(MAKE) -C docs html - @echo "HTML: \"docs/build/html/index.html\"" - -docs-clean: ## Clean documentation - @$(MAKE) -C docs clean - -docs-serve: ## Realtime documentation preview - sphinx-autobuild -b html docs/source docs/build/html --port 5555 - -docs-all: ## Build documentation {html, pdf, docx} - @$(MAKE) -C docs clean - @$(MAKE) -C docs html - @$(MAKE) -C docs singlehtml - @$(MAKE) -C docs latexpdf - @mkdir -p docs/build/docx - @cd docs/build/singlehtml; pandoc -s index.html -o ../docx/pybmds.docx - @echo "HTML: \"docs/build/html/index.html\"" - @echo "Single Page HTML: \"docs/build/singlehtml/index.html\"" - @echo "Microsoft Word: \"docs/build/docx/pybmds.docx\"" - @echo "PDF: \"docs/build/latex/pybmds.pdf\"" - loc: ## Generate lines of code report @cloc \ --exclude-dir=build,dist,migrations,node_modules,logs,private,public,scripts,vendor,venv \ diff --git a/README.md b/README.md index 6924f3b0..21a1c0f4 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,4 @@ -# BMDS webserver +# BMDS UI -Run a webserver that will batch process dose-response data using the US EPA's -benchmark dose modeling software [BMDS](https://www.epa.gov/bmds). Under the hood, this web application -uses the [BMDS Python interface](https://pypi.python.org/pypi/bmds). +A user interface foe execution of dose-response data using the US EPA's Benchmark Dose Modeling Software [BMDS](https://www.epa.gov/bmds). Under the hood, this web application uses the [BMDS Python interface](https://pypi.python.org/pypi/bmds). -To use the webserver, specify a new BMDS Job using a input file formatted like this. - -```json -{ - "dataset_type": "D", - "bmds_version": "BMDS2601", - "datasets": [ - { - "doses": [0, 1.96, 5.69, 29.75], - "ns": [75, 49, 50, 49], - "incidences": [5, 1, 3, 14] - }, - { - "doses": [0, 1.96, 5.69, 29.75], - "ns": [75, 49, 50, 49], - "incidences": [0, 0, 11, 27] - } - ] -} -``` - -You'll receive a Job ID back, and you can check the website to see when the job is complete. Then, results can be downloaded. Results include: - -* The dfile created for each model -* The outfile created for each model -* The parsed output file for each model -* A recommended best-fitting model, using guidance from [Wignall et al. 2014](https://dx.doi.org/10.1289/ehp.1307539) (optional) diff --git a/bmds_ui/analysis/fixtures/initial_data.json b/bmds_ui/analysis/fixtures/initial_data.json index 887fbbbb..7e92bac0 100644 --- a/bmds_ui/analysis/fixtures/initial_data.json +++ b/bmds_ui/analysis/fixtures/initial_data.json @@ -6,7 +6,7 @@ "content_type": 1, "subject": "Homepage", "content": { - "template": "
\n
\n

Welcome to BMDS online.

\n
\n
\n
\n
\n
\n

\n This web-application executes the US EPA's benchmark dose modeling software (BMDS).\n

\n
    \n
  • Load example datasets below to view example input files; for more information, see the documentation\n
  • \n
  • Software is designed for automated BMDS execution using a\n programming language such as Python, R, or Java. To take\n advantage of automation, use the API,\n and see the quickstart section.\n
  • \n
\n
\n
\n
\n
\n {% csrf_token %}\n \n \n

Analyses are deleted after {{days_to_keep_analyses}}.

\n
\n
\n
\n" + "template": "
\n
\n

Welcome to BMDS online.

\n
\n
\n
\n
\n
\n

\n This web-application executes the US EPA's benchmark dose modeling software (BMDS).\n

\n
    \n
  • Load example datasets below to view example input files; for more information, see the documentation\n
  • \n
  • Software is designed for automated BMDS execution using a\n programming language such as Python, R, or Java. To take\n advantage of automation, use the API,\n and see the quickstart section.\n
  • \n
\n
\n
\n
\n
\n {% csrf_token %}\n \n \n

Analyses are deleted after {{days_to_keep_analyses}}.

\n
\n
\n
\n" }, "created": "2021-01-31 08:00:00.123456+00:00", "last_updated": "2021-01-31 08:00:00.123456+00:00" diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d0c3cbf1..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = source -BUILDDIR = build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/source/development.md b/docs/development.md similarity index 82% rename from docs/source/development.md rename to docs/development.md index fc239e92..3c3be36b 100644 --- a/docs/source/development.md +++ b/docs/development.md @@ -8,7 +8,7 @@ Make sure you have the following applications installed locally: - [Yarn](https://yarnpkg.com/) - [PostgreSQL](https://www.postgresql.org/) >= 16 -If installing on Windows, all requirements are available using [miniconda](https://docs.conda.io/en/latest/miniconda.html), and do not require administrative access. +If installing on Windows, these packages are available using [miniconda](https://docs.conda.io/en/latest/miniconda.html). ## Initial setup @@ -79,7 +79,7 @@ npm start If you navigate to [localhost](http://127.0.0.1:8000/) and see a website, you're ready to begin coding! -## Visual Studio Code settings +## Visual Studio Code [Visual Studio Code](https://code.visualstudio.com/) is the recommended editor for this project. @@ -89,35 +89,6 @@ Recommended extensions: - [Eslint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) - [Ruff](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff) -Recommended workspace settings: - -```json -{ - "restructuredtext.linter.disabled": true, - "[html]": { - "editor.formatOnSave": false - }, - "[python]": { - "editor.formatOnSave": true, - "editor.formatOnPaste": false, - "editor.codeActionsOnSave": { - "source.fixAll": true - } - }, - "[javascript]": { - "editor.formatOnSave": false, - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true - } - }, - "editor.formatOnSave": true, - "python.linting.flake8Enabled": false, - "python.pythonPath": "./venv/bin/python", - "eslint.workingDirectories": [ - "./frontend" - ] -} -``` ## Additional settings ### Feature flags (frontend) @@ -134,14 +105,10 @@ Future mode can also be enabled via the local setting `ALWAYS_SHOW_FUTURE`. This ```python # bmds_ui\main\settings\local.py - ... - # Shows future-flagged items without login/url parameter - ALWAYS_SHOW_FUTURE = True - ... -``` - -That's it! Now you should be able to view content that's coming soon! +# Shows future-flagged items without login/url parameter +ALWAYS_SHOW_FUTURE = True +``` ### Building a test database diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..cecc7e0b --- /dev/null +++ b/docs/index.md @@ -0,0 +1,18 @@ +# BMDS UI + +BMDS UI is a user interface for running `pybmds`, a python package for dose-response modeling using the US EPA's Benchmark Dose Modeling Software ([BMDS](https://www.epa.gov/bmds)). The user interface is a web application, and it is desgined for running as a web application (such as [BMDS Online](https://bmdsonline.epa.gov)) or a desktop model, which we call BMDS Desktop. + +## BMDS Desktop Capabilities + +BMDS Desktop is designed to run locally on your desktop computer in fully offline mode; it does not interact with any resources on the internet after initial installation. + + +*Screenshot of TUI* + +*Create database* + +*BMDS Desktop User Interface w/ Runs* + +*Dose Response Setup* + +*Dose Response Plot* diff --git a/docs/source/_static/css/style.css b/docs/source/_static/css/style.css deleted file mode 100644 index 4abf7877..00000000 --- a/docs/source/_static/css/style.css +++ /dev/null @@ -1,7 +0,0 @@ -code { - font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif; -} - -.bd-page-width { - max-width: 100%; -} diff --git a/docs/source/_static/img/epa_logo.png b/docs/source/_static/img/epa_logo.png deleted file mode 100644 index fcc6403f3abd45c23d4856b15fc05146047e876a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29874 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 diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index f85b901c..00000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,50 +0,0 @@ -project = "BMDS webserver" -copyright = "Public Domain" -author = "U.S. EPA" - -extensions = ["myst_parser"] -souce_suffix = { - ".md": "markdown", - ".rst": "restructuredtext", -} -templates_path = ["_templates"] - -exclude_patterns = [] - - -# HTML settings -html_theme = "pydata_sphinx_theme" -html_static_path = ["_static"] -html_css_files = ["css/style.css"] -html_sidebars = {"**": ["globaltoc.html"]} -html_theme_options = { - "icon_links": [ - { - "name": "GitHub", - "url": "https://github.com/USEPA/bmds-online-private", - "icon": "fa-brands fa-github", - "type": "fontawesome", - }, - { - "name": "U.S. Environmental Protection Agency", - "url": "https://epa.gov/bmds", - "icon": "_static/img/epa_logo.png", - "type": "local", - }, - ], - "use_edit_page_button": False, - "show_toc_level": 2, - "navbar_end": [ - "theme-switcher.html", - "navbar-icon-links.html", - ], -} - -# Latex / PDF settings -latex_elements = { - "printindex": "", - "sphinxsetup": "hmargin={0.9in,0.9in}, vmargin={0.9in,0.9in}, marginpar=1.0in", - "papersize": "letterpaper", - "pointsize": "10pt", - "figure_align": "htbp", -} diff --git a/docs/source/index.md b/docs/source/index.md deleted file mode 100644 index 68e4053f..00000000 --- a/docs/source/index.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -html_theme.sidebar_secondary.remove: true ---- - -# BMDS webserver - -BMDS Server is a web application for conducting dose-response modeling using the US EPA's Benchmark Dose Modeling Software ([BMDS](https://www.epa.gov/bmds)). It utilizes the BMDS package [pybmds](https://pypi.org/project/pybmds/) under the hood, which can be helpful for batch-executing analysis that do not require a user-interface. - -## User's Guide - -```{toctree} -:maxdepth: 2 -development -``` diff --git a/make.bat b/make.bat index 64bdf730..526faaa4 100644 --- a/make.bat +++ b/make.bat @@ -4,9 +4,6 @@ if "%~1" == "" goto :help if /I %1 == help goto :help if /I %1 == sync-dev goto :sync-dev if /I %1 == build goto :build -if /I %1 == docs goto :docs -if /I %1 == docs-serve goto :docs-serve -if /I %1 == docs-all goto :docs-all if /I %1 == test goto :test if /I %1 == lint goto :lint if /I %1 == format goto :format @@ -23,9 +20,6 @@ goto :help echo.Please use `make ^` where ^ is one of echo. sync-dev sync dev environment after code checkout echo. build build application (python wheel) -echo. docs Build documentation {html} -echo. docs-serve Realtime documentation preview -echo. docs-all Build documentation {html, docx} echo. test perform both test-py and test-js echo. coverage generate test coverage report echo. test-py run python tests @@ -52,25 +46,6 @@ python manage.py set_git_commit flit build --no-use-vcs --format=wheel goto :eof -:docs -rmdir /s /q docs\build -sphinx-build -b html docs/source docs/build/html -goto :eof - -:docs-serve -rmdir /s /q docs\build -sphinx-autobuild -b html docs/source docs/build/html --port 5555 -goto :eof - -:docs-all -rmdir /s /q docs\build -sphinx-build -b html docs/source docs/build/html -sphinx-build -b singlehtml docs/source docs/build/singlehtml -cd docs\build\singlehtml -pandoc -s index.html -o pybmds.docx -cd ../../.. -goto :eof - :lint ruff format . --check && ruff check . npm --prefix .\frontend run lint diff --git a/pyproject.toml b/pyproject.toml index 0a3b0355..6f601f5a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,11 +54,6 @@ dev = [ "django_extensions==3.2.3", "django-browser-reload==1.12.1", - # docs - "Sphinx~=7.3.7", - "myst-parser~=2.0.0", - "pydata-sphinx-theme~=0.15.2", - # tests "pytest~=8.2.1", "pytest-django~=4.8.0", diff --git a/tests/data/db.yaml b/tests/data/db.yaml index e05e1c6c..b1e34227 100644 --- a/tests/data/db.yaml +++ b/tests/data/db.yaml @@ -5161,11 +5161,11 @@ \
\n

\n This web-application executes the US EPA's benchmark dose modeling software (BMDS).\n \

\n
    \n
  • Load example datasets - below to view example input files; for more information, see the documentation\n + below to view example input files; for more information, see the documentation\n \
  • \n
  • Software is designed for automated BMDS execution using a\n programming language such as Python, R, or Java. To take\n advantage of automation, use the - API,\n and see the quickstart + API,\n and see the quickstart section.\n
  • \n
\n
\n \n \
\n
\n {% csrf_token %}\n \n