From 56a41fdff57336344f9fe55d8f5ab95cb230e414 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 15:50:57 -0500 Subject: [PATCH 01/29] Update docs structure. --- .gitignore | 2 +- docs/.docker/Dockerfile | 15 +++ docs/.docker/apk_requirements.txt | 1 + docs/.docker/pip_requirements.txt | 9 ++ docs/docker-compose.yaml | 39 ++++++++ docs/mkdocs.yaml | 86 ++++++++++++++++++ .../.icons/datajoint/company-logo.svg | 20 ++++ .../assets/images/project-logo-black.png | Bin 0 -> 48706 bytes .../assets/images/project-logo-color.png | Bin 0 -> 82925 bytes .../.overrides/assets/stylesheets/extra.css | 36 ++++++++ docs/src/.overrides/partials/nav.html | 33 +++++++ docs/src/about/changelog.md | 1 + docs/src/api/gen_api.py | 18 ++++ docs/src/concepts.md | 0 docs/src/getting_started.md | 1 + docs/src/tutorials.md | 0 16 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 docs/.docker/Dockerfile create mode 100644 docs/.docker/apk_requirements.txt create mode 100644 docs/.docker/pip_requirements.txt create mode 100644 docs/docker-compose.yaml create mode 100644 docs/mkdocs.yaml create mode 100644 docs/src/.overrides/.icons/datajoint/company-logo.svg create mode 100644 docs/src/.overrides/assets/images/project-logo-black.png create mode 100644 docs/src/.overrides/assets/images/project-logo-color.png create mode 100644 docs/src/.overrides/assets/stylesheets/extra.css create mode 100644 docs/src/.overrides/partials/nav.html create mode 120000 docs/src/about/changelog.md create mode 100644 docs/src/api/gen_api.py create mode 100644 docs/src/concepts.md create mode 100644 docs/src/getting_started.md create mode 100644 docs/src/tutorials.md diff --git a/.gitignore b/.gitignore index af0a838bf..15a6c5653 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,6 @@ notebook .vscode __main__.py jupyter_custom.js -apk_requirements.txt .eggs *.code-workspace +docs/site \ No newline at end of file diff --git a/docs/.docker/Dockerfile b/docs/.docker/Dockerfile new file mode 100644 index 000000000..e3acb0f42 --- /dev/null +++ b/docs/.docker/Dockerfile @@ -0,0 +1,15 @@ +FROM datajoint/miniconda3:4.10.3-py3.9-alpine +ARG PACKAGE +WORKDIR /main +COPY --chown=anaconda:anaconda ./docs/.docker/apk_requirements.txt ${APK_REQUIREMENTS} +COPY --chown=anaconda:anaconda ./docs/.docker/pip_requirements.txt ${PIP_REQUIREMENTS} +RUN \ + /entrypoint.sh echo "Dependencies installed" && \ + git config --global user.name "GitHub Action" && \ + git config --global user.email "action@github.com"&& \ + git config --global pull.rebase false && \ + git init +COPY --chown=anaconda:anaconda ./${PACKAGE} /main/${PACKAGE} +COPY --chown=anaconda:anaconda ./docs/mkdocs.yaml /main/docs/mkdocs.yaml +COPY --chown=anaconda:anaconda ./docs/src /main/docs/src +COPY --chown=anaconda:anaconda ./CHANGELOG.md /main/docs/src/about/changelog.md \ No newline at end of file diff --git a/docs/.docker/apk_requirements.txt b/docs/.docker/apk_requirements.txt new file mode 100644 index 000000000..5664e303b --- /dev/null +++ b/docs/.docker/apk_requirements.txt @@ -0,0 +1 @@ +git diff --git a/docs/.docker/pip_requirements.txt b/docs/.docker/pip_requirements.txt new file mode 100644 index 000000000..0ed6d8057 --- /dev/null +++ b/docs/.docker/pip_requirements.txt @@ -0,0 +1,9 @@ +mkdocs-material +mkdocs-redirects +mkdocstrings +mkdocstrings-python +mike +mdx-truly-sane-lists +mkdocs-gen-files +mkdocs-literate-nav +mkdocs-exclude-search diff --git a/docs/docker-compose.yaml b/docs/docker-compose.yaml new file mode 100644 index 000000000..ff4ab022a --- /dev/null +++ b/docs/docker-compose.yaml @@ -0,0 +1,39 @@ +# MODE="LIVE|QA|BUILD" PACKAGE=datajoint UPSTREAM_REPO=https://github.com/datajoint/datajoint-python.git HOST_UID=$(id -u) docker compose -f docs/docker-compose.yaml up --build +# navigate to http://localhost/ +version: "2.4" +services: + docs: + build: + dockerfile: docs/.docker/Dockerfile + context: ../ + args: + - PACKAGE + image: ${PACKAGE}-docs + environment: + - PACKAGE + - UPSTREAM_REPO + - MODE + volumes: + - ..:/main + user: ${HOST_UID}:anaconda + ports: + - 80:80 + command: + - sh + - -c + - | + set -e + if echo "$${MODE}" | grep -i live &>/dev/null; then + mkdocs serve --config-file ./docs/mkdocs.yaml -a 0.0.0.0:80 + elif echo "$${MODE}" | grep -iE "qa|build" &>/dev/null; then + git branch -D gh-pages || true + git fetch $${UPSTREAM_REPO} gh-pages && git merge FETCH_HEAD + mike deploy --config-file ./docs/mkdocs.yaml -u $$(grep -oE '\d+\.\d+' /main/$${PACKAGE}/version.py) latest + mike set-default --config-file ./docs/mkdocs.yaml latest + if echo "$${MODE}" | grep -i qa &>/dev/null; then + mike serve --config-file ./docs/mkdocs.yaml -a 0.0.0.0:80 + fi + else + echo "Unexpected mode..." + exit 1 + fi diff --git a/docs/mkdocs.yaml b/docs/mkdocs.yaml new file mode 100644 index 000000000..b675d9272 --- /dev/null +++ b/docs/mkdocs.yaml @@ -0,0 +1,86 @@ +# ---------------------- PROJECT SPECIFIC --------------------------- + +site_name: DataJoint Python +repo_url: https://github.com/datajoint/datajoint-python +repo_name: datajoint/datajoint-python +nav: + - DataJoint Python: getting_started.md + - Getting Started: getting_started.md + - Concepts: concepts.md + - Tutorials: tutorials.md + - About: + - Changelog: about/changelog.md + - API: api/ # defer to gen-files + literate-nav + +# ---------------------------- STANDARD ----------------------------- + +edit_uri: ./edit/master/docs/src +docs_dir: ./src +theme: + name: material + custom_dir: src/.overrides + logo: assets/images/project-logo-black.png + favicon: assets/images/project-logo-color.png + features: + - toc.integrate + palette: + - media: "(prefers-color-scheme: light)" + scheme: datajoint + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/brightness-4 + name: Switch to light mode +plugins: + - search + - redirects: + redirect_maps: + "index.md": "getting_started.md" + - mkdocstrings: + default_handler: python + - gen-files: + scripts: + - ./src/api/gen_api.py + - literate-nav: + nav_file: navigation.md + - exclude-search: + exclude: + - "*/navigation.md" +markdown_extensions: + - attr_list + - toc: + permalink: true + - pymdownx.emoji: + options: + custom_icons: + - .overrides/.icons + - mdx_truly_sane_lists + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format +extra: + generator: false # Disable watermark + version: + provider: mike + social: + - icon: datajoint/company-logo + link: https://www.datajoint.com/ + - icon: fontawesome/brands/slack + link: https://datajoint.slack.com + - icon: fontawesome/brands/linkedin + link: https://www.linkedin.com/company/datajoint + - icon: fontawesome/brands/twitter + link: https://twitter.com/DataJointIO + - icon: fontawesome/brands/github + link: https://github.com/datajoint + - icon: fontawesome/brands/stack-overflow + link: https://stackoverflow.com/questions/tagged/datajoint + - icon: fontawesome/brands/youtube + link: https://www.youtube.com/channel/UCdeCuFOTCXlVMRzh6Wk-lGg +extra_css: + - assets/stylesheets/extra.css \ No newline at end of file diff --git a/docs/src/.overrides/.icons/datajoint/company-logo.svg b/docs/src/.overrides/.icons/datajoint/company-logo.svg new file mode 100644 index 000000000..b99eecb28 --- /dev/null +++ b/docs/src/.overrides/.icons/datajoint/company-logo.svg @@ -0,0 +1,20 @@ + + www.datajoint.com + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/src/.overrides/assets/images/project-logo-black.png b/docs/src/.overrides/assets/images/project-logo-black.png new file mode 100644 index 0000000000000000000000000000000000000000..804d2c393a004f43f146bd99d7f5d6dfc3d8b9b2 GIT binary patch literal 48706 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 NUcP!+`nSx3{~M7Y_09kQ literal 0 HcmV?d00001 diff --git a/docs/src/.overrides/assets/images/project-logo-color.png b/docs/src/.overrides/assets/images/project-logo-color.png new file mode 100644 index 0000000000000000000000000000000000000000..d8117bbcbc777b3839813f9c2b252af3bb38ca70 GIT binary patch literal 82925 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

xXF?)GmMZeq6CK^^@TV{ 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 + + {% if config.repo_url %} +

+ {% include "partials/source.html" %} +
+ {% endif %} +
    + {% for nav_item in nav %} + {% set path = "__nav_" ~ loop.index %} + {% set level = 1 %} + {% include "partials/nav-item.html" %} + {% endfor %} +
+ \ No newline at end of file diff --git a/docs/src/about/changelog.md b/docs/src/about/changelog.md new file mode 120000 index 000000000..79b747aee --- /dev/null +++ b/docs/src/about/changelog.md @@ -0,0 +1 @@ +../../../CHANGELOG.md \ No newline at end of file diff --git a/docs/src/api/gen_api.py b/docs/src/api/gen_api.py new file mode 100644 index 000000000..87673d14e --- /dev/null +++ b/docs/src/api/gen_api.py @@ -0,0 +1,18 @@ +"""Generate the api pages and navigation.""" + +import mkdocs_gen_files +from pathlib import Path +import os + +package = os.getenv("PACKAGE") +nav = mkdocs_gen_files.Nav() +for path in sorted(Path(package).glob("**/*.py")): + with mkdocs_gen_files.open(f"api/{path.with_suffix('')}.md", "w") as f: + module_path = ".".join( + [p for p in path.with_suffix("").parts if p != "__init__"] + ) + print(f"::: {module_path}", file=f) + nav[path.parts] = f"{path.with_suffix('')}.md" + +with mkdocs_gen_files.open("api/navigation.md", "w") as nav_file: + nav_file.writelines(nav.build_literate_nav()) diff --git a/docs/src/concepts.md b/docs/src/concepts.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/src/getting_started.md b/docs/src/getting_started.md new file mode 100644 index 000000000..f34d65bd7 --- /dev/null +++ b/docs/src/getting_started.md @@ -0,0 +1 @@ +# Installation \ No newline at end of file diff --git a/docs/src/tutorials.md b/docs/src/tutorials.md new file mode 100644 index 000000000..e69de29bb From a64f9fa7fa9027e2f8cf2e2055ca6e6fb86a97d8 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 15:57:03 -0500 Subject: [PATCH 02/29] Update gh-pages checkout. --- docs/docker-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docker-compose.yaml b/docs/docker-compose.yaml index ff4ab022a..c608930a3 100644 --- a/docs/docker-compose.yaml +++ b/docs/docker-compose.yaml @@ -27,7 +27,7 @@ services: mkdocs serve --config-file ./docs/mkdocs.yaml -a 0.0.0.0:80 elif echo "$${MODE}" | grep -iE "qa|build" &>/dev/null; then git branch -D gh-pages || true - git fetch $${UPSTREAM_REPO} gh-pages && git merge FETCH_HEAD + git fetch $${UPSTREAM_REPO} gh-pages:gh-pages && git checkout gh-pages mike deploy --config-file ./docs/mkdocs.yaml -u $$(grep -oE '\d+\.\d+' /main/$${PACKAGE}/version.py) latest mike set-default --config-file ./docs/mkdocs.yaml latest if echo "$${MODE}" | grep -i qa &>/dev/null; then From 8efeb2804b0a50fa6e7c8e3fb2beafae1a3f7d22 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 16:17:08 -0500 Subject: [PATCH 03/29] Remove gh-pages checkout since mike will perform it. --- docs/docker-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docker-compose.yaml b/docs/docker-compose.yaml index c608930a3..3b6a8df2f 100644 --- a/docs/docker-compose.yaml +++ b/docs/docker-compose.yaml @@ -27,7 +27,7 @@ services: mkdocs serve --config-file ./docs/mkdocs.yaml -a 0.0.0.0:80 elif echo "$${MODE}" | grep -iE "qa|build" &>/dev/null; then git branch -D gh-pages || true - git fetch $${UPSTREAM_REPO} gh-pages:gh-pages && git checkout gh-pages + git fetch $${UPSTREAM_REPO} gh-pages:gh-pages mike deploy --config-file ./docs/mkdocs.yaml -u $$(grep -oE '\d+\.\d+' /main/$${PACKAGE}/version.py) latest mike set-default --config-file ./docs/mkdocs.yaml latest if echo "$${MODE}" | grep -i qa &>/dev/null; then From 686cfea4fe52b87120971a035b1184a8efc21f32 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 16:52:33 -0500 Subject: [PATCH 04/29] Removed old API docs. --- docs-api/Makefile | 20 ---- docs-api/apt_requirements.txt | 1 - docs-api/docker-compose.yaml | 27 ----- docs-api/make.bat | 35 ------ docs-api/pip_requirements.txt | 2 - docs-api/source/conf.py | 51 -------- docs-api/source/index.rst | 28 ----- docs-api/source/submodules.rst | 207 --------------------------------- 8 files changed, 371 deletions(-) delete mode 100644 docs-api/Makefile delete mode 100644 docs-api/apt_requirements.txt delete mode 100644 docs-api/docker-compose.yaml delete mode 100644 docs-api/make.bat delete mode 100644 docs-api/pip_requirements.txt delete mode 100644 docs-api/source/conf.py delete mode 100644 docs-api/source/index.rst delete mode 100644 docs-api/source/submodules.rst diff --git a/docs-api/Makefile b/docs-api/Makefile deleted file mode 100644 index d0c3cbf10..000000000 --- a/docs-api/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-api/apt_requirements.txt b/docs-api/apt_requirements.txt deleted file mode 100644 index ac08cdcf9..000000000 --- a/docs-api/apt_requirements.txt +++ /dev/null @@ -1 +0,0 @@ -make \ No newline at end of file diff --git a/docs-api/docker-compose.yaml b/docs-api/docker-compose.yaml deleted file mode 100644 index 4124b9139..000000000 --- a/docs-api/docker-compose.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# HOST_UID=1000 docker-compose -f ./docs-api/docker-compose.yaml up --build -# docker exec -it docs-api_docs-builder_1 bash -c "pip install -U /main/datajoint-python && rm -R build && make html" -version: '2.4' -services: - # example how to build - docs-builder: - # build: . - image: datajoint/djbase:py3.9-debian - user: ${HOST_UID}:anaconda - working_dir: /main/docs-api - volumes: - - .:/main/docs-api - - ./pip_requirements.txt:/tmp/pip_requirements.txt - - ./apt_requirements.txt:/tmp/apt_requirements.txt - - ../datajoint:/main/datajoint-python/datajoint:ro - - ../setup.py:/main/datajoint-python/setup.py:ro - - ../requirements.txt:/main/datajoint-python/requirements.txt - command: - - bash - - -c - - | - pip install /main/datajoint-python - make html - chmod -R o=rwx /main/docs-api/build/html - # tail -f /dev/null - # sphinx-quickstart - # sphinx-apidoc -o ./source ../datajoint-python/datajoint diff --git a/docs-api/make.bat b/docs-api/make.bat deleted file mode 100644 index 747ffb7b3..000000000 --- a/docs-api/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs-api/pip_requirements.txt b/docs-api/pip_requirements.txt deleted file mode 100644 index 856b3f4cb..000000000 --- a/docs-api/pip_requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -sphinx -sphinx_rtd_theme \ No newline at end of file diff --git a/docs-api/source/conf.py b/docs-api/source/conf.py deleted file mode 100644 index 2b114821e..000000000 --- a/docs-api/source/conf.py +++ /dev/null @@ -1,51 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- 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 -sys.path.insert(0, os.path.abspath('../datajoint')) - - -# -- Project information ----------------------------------------------------- - -project = 'DataJoint API Docs' -copyright = '2022, DataJoint contributors' -author = 'DataJoint contributors' - - -# -- 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'] - -# 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 = [] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# 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'] \ No newline at end of file diff --git a/docs-api/source/index.rst b/docs-api/source/index.rst deleted file mode 100644 index b733b02f8..000000000 --- a/docs-api/source/index.rst +++ /dev/null @@ -1,28 +0,0 @@ -.. DataJoint API Docs documentation master file, created by - sphinx-quickstart on Tue Apr 26 22:08:07 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to DataJoint's API Documentation! -========================================= - -datajoint module ----------------- - -.. automodule:: datajoint - :members: - :undoc-members: - :show-inheritance: - -.. toctree:: - :maxdepth: 2 - :caption: Submodules: - - submodules - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs-api/source/submodules.rst b/docs-api/source/submodules.rst deleted file mode 100644 index 45105d3dd..000000000 --- a/docs-api/source/submodules.rst +++ /dev/null @@ -1,207 +0,0 @@ -datajoint.admin module ----------------------- - -.. automodule:: datajoint.admin - :members: - :undoc-members: - :show-inheritance: - -datajoint.attribute\_adapter module ------------------------------------ - -.. automodule:: datajoint.attribute_adapter - :members: - :undoc-members: - :show-inheritance: - -datajoint.autopopulate module ------------------------------ - -.. automodule:: datajoint.autopopulate - :members: - :undoc-members: - :show-inheritance: - -datajoint.blob module ---------------------- - -.. automodule:: datajoint.blob - :members: - :undoc-members: - :show-inheritance: - -datajoint.condition module --------------------------- - -.. automodule:: datajoint.condition - :members: - :undoc-members: - :show-inheritance: - -datajoint.connection module ---------------------------- - -.. automodule:: datajoint.connection - :members: - :undoc-members: - :show-inheritance: - -datajoint.declare module ------------------------- - -.. automodule:: datajoint.declare - :members: - :undoc-members: - :show-inheritance: - -datajoint.dependencies module ------------------------------ - -.. automodule:: datajoint.dependencies - :members: - :undoc-members: - :show-inheritance: - -datajoint.diagram module ------------------------- - -.. automodule:: datajoint.diagram - :members: - :undoc-members: - :show-inheritance: - -datajoint.errors module ------------------------ - -.. automodule:: datajoint.errors - :members: - :undoc-members: - :show-inheritance: - -datajoint.expression module ---------------------------- - -.. automodule:: datajoint.expression - :members: - :undoc-members: - :show-inheritance: - -datajoint.external module -------------------------- - -.. automodule:: datajoint.external - :members: - :undoc-members: - :show-inheritance: - -datajoint.fetch module ----------------------- - -.. automodule:: datajoint.fetch - :members: - :undoc-members: - :show-inheritance: - -datajoint.hash module ---------------------- - -.. automodule:: datajoint.hash - :members: - :undoc-members: - :show-inheritance: - -datajoint.heading module ------------------------- - -.. automodule:: datajoint.heading - :members: - :undoc-members: - :show-inheritance: - -datajoint.jobs module ---------------------- - -.. automodule:: datajoint.jobs - :members: - :undoc-members: - :show-inheritance: - -datajoint.migrate module ------------------------- - -.. automodule:: datajoint.migrate - :members: - :undoc-members: - :show-inheritance: - -datajoint.plugin module ------------------------ - -.. automodule:: datajoint.plugin - :members: - :undoc-members: - :show-inheritance: - -datajoint.preview module ------------------------- - -.. automodule:: datajoint.preview - :members: - :undoc-members: - :show-inheritance: - -datajoint.s3 module -------------------- - -.. automodule:: datajoint.s3 - :members: - :undoc-members: - :show-inheritance: - -datajoint.schemas module ------------------------- - -.. automodule:: datajoint.schemas - :members: - :undoc-members: - :show-inheritance: - -datajoint.settings module -------------------------- - -.. automodule:: datajoint.settings - :members: - :undoc-members: - :show-inheritance: - -datajoint.table module ----------------------- - -.. automodule:: datajoint.table - :members: - :undoc-members: - :show-inheritance: - -datajoint.user\_tables module ------------------------------ - -.. automodule:: datajoint.user_tables - :members: - :undoc-members: - :show-inheritance: - -datajoint.utils module ----------------------- - -.. automodule:: datajoint.utils - :members: - :undoc-members: - :show-inheritance: - -datajoint.version module ------------------------- - -.. automodule:: datajoint.version - :members: - :undoc-members: - :show-inheritance: From 2684fd1e1d67ce5046ef7c64f2fe6807ad9886a8 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 16:55:28 -0500 Subject: [PATCH 05/29] Remove previous API docs. --- .github/workflows/development.yaml | 57 ------------------------------ 1 file changed, 57 deletions(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 8d81bc84c..909d05a20 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -9,25 +9,7 @@ on: - '**' # every branch - '!stage*' # exclude branches beginning with stage jobs: - build-docs: - runs-on: ubuntu-latest - env: - DOCKER_CLIENT_TIMEOUT: "120" - COMPOSE_HTTP_TIMEOUT: "120" - steps: - - uses: actions/checkout@v2 - - name: Compile docs static artifacts - run: | - export HOST_UID=$(id -u) - docker-compose -f ./docs-api/docker-compose.yaml up --exit-code-from docs-builder --build - - name: Add docs static artifacts - uses: actions/upload-artifact@v2 - with: - name: docs-api-static - path: docs-api/build/html - retention-days: 1 test: - if: github.event_name == 'push' || github.event_name == 'pull_request' runs-on: ubuntu-latest strategy: matrix: @@ -66,42 +48,3 @@ jobs: --count --max-complexity=62 --max-line-length=127 --statistics black datajoint --check -v black tests --check -v - publish-docs: - if: | - github.event_name == 'push' && - ( - github.repository_owner == 'datajoint' || - github.repository_owner == 'datajoint-company' || - github.repository_owner == 'dj-sciops' - ) - needs: build-docs - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Fetch docs static artifacts - uses: actions/download-artifact@v2 - with: - name: docs-api-static - path: docs-api/build/html - - name: Commit documentation changes - run: | - git clone https://github.com/${GITHUB_REPOSITORY}.git \ - --branch gh-pages --single-branch gh-pages - rm -R gh-pages/* - cp -r docs-api/build/html/* gh-pages/ - cp .gitignore gh-pages/ - touch gh-pages/.nojekyll - echo "docs-api.datajoint.org" > gh-pages/CNAME - cd gh-pages - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git add . --all - git commit -m "Update documentation" -a || true - # The above command will fail if no changes were present, so we ignore - # the return code. - - name: Push changes - uses: ad-m/github-push-action@master - with: - branch: gh-pages - directory: gh-pages - github_token: ${{secrets.GITHUB_TOKEN}} From db66165b0899c0123b4112e51bfb739fda36ff28 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 17:01:15 -0500 Subject: [PATCH 06/29] Update nginx certs. --- LNX-docker-compose.yml | 2 +- local-docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LNX-docker-compose.yml b/LNX-docker-compose.yml index b2b8c7cb9..1b0525ee3 100644 --- a/LNX-docker-compose.yml +++ b/LNX-docker-compose.yml @@ -32,7 +32,7 @@ services: interval: 1s fakeservices.datajoint.io: <<: *net - image: datajoint/nginx:v0.2.1 + image: datajoint/nginx:v0.2.3 environment: - ADD_db_TYPE=DATABASE - ADD_db_ENDPOINT=db:3306 diff --git a/local-docker-compose.yml b/local-docker-compose.yml index 6fdcfec9b..2ef858db2 100644 --- a/local-docker-compose.yml +++ b/local-docker-compose.yml @@ -34,7 +34,7 @@ services: interval: 1s fakeservices.datajoint.io: <<: *net - image: datajoint/nginx:v0.2.1 + image: datajoint/nginx:v0.2.3 environment: - ADD_db_TYPE=DATABASE - ADD_db_ENDPOINT=db:3306 From a5726b33ae95311e7ce1975590885699e81c4bf2 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 18:47:28 -0500 Subject: [PATCH 07/29] Update GHA automation. --- .github/workflows/development.yaml | 93 +++++++++++++++++++++++++++++- Dockerfile | 18 ++++-- docker-compose-build.yaml | 24 ++++++++ 3 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 docker-compose-build.yaml diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 909d05a20..937adbc62 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -1,14 +1,42 @@ name: Development on: push: - branches: - - '**' # every branch - - '!stage*' # exclude branches beginning with stage + tags: + - '*.*.*' pull_request: branches: - '**' # every branch - '!stage*' # exclude branches beginning with stage jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + include: + - py_ver: 3.8 + distro: alpine + image: djbase + env: + PY_VER: ${{matrix.py_ver}} + DISTRO: ${{matrix.distro}} + IMAGE: ${{matrix.image}} + DOCKER_CLIENT_TIMEOUT: "120" + COMPOSE_HTTP_TIMEOUT: "120" + steps: + - uses: actions/checkout@v2 + - name: Compile image + run: | + export DJ_VERSION=$(grep -oP '\d+\.\d+\.\d+' datajoint/version.py) + export HOST_UID=$(id -u) + docker-compose -f docker-compose-build.yaml up --exit-code-from app --build + echo "DJ_VERSION=${DJ_VERSION}" >> $GITHUB_ENV + - if: matrix.py_ver == '3.8' && matrix.distro == 'alpine' + name: Add pip artifacts + uses: actions/upload-artifact@v2 + with: + name: pip-datajoint-${{env.DJ_VERSION}} + path: dist + retention-days: 1 test: runs-on: ubuntu-latest strategy: @@ -48,3 +76,62 @@ jobs: --count --max-complexity=62 --max-line-length=127 --statistics black datajoint --check -v black tests --check -v + publish-release: + if: github.event_name == 'push' + needs: test + runs-on: ubuntu-latest + env: + TWINE_USERNAME: ${{secrets.twine_username}} + TWINE_PASSWORD: ${{secrets.twine_password}} + outputs: + release_upload_url: ${{steps.create_gh_release.outputs.upload_url}} + steps: + - uses: actions/checkout@v2 + - name: Determine package version + run: | + DJ_VERSION=$(grep -oP '\d+\.\d+\.\d+' datajoint/version.py) + echo "DJ_VERSION=${DJ_VERSION}" >> $GITHUB_ENV + - name: Create GH release + id: create_gh_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + with: + tag_name: ${{env.DJ_VERSION}} + release_name: Release ${{env.DJ_VERSION}} + body: "" + prerelease: false + draft: false + - name: Fetch pip artifacts + uses: actions/download-artifact@v2 + with: + name: pip-datajoint-${{env.DJ_VERSION}} + path: dist + - name: Determine pip artifact paths + run: | + echo "DJ_WHEEL_PATH=$(ls dist/datajoint-*.whl)" >> $GITHUB_ENV + echo "DJ_SDIST_PATH=$(ls dist/datajoint-*.tar.gz)" >> $GITHUB_ENV + - name: Upload pip wheel asset to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + with: + upload_url: ${{steps.create_gh_release.outputs.upload_url}} + asset_path: ${{env.DJ_WHEEL_PATH}} + asset_name: pip-datajoint-${{env.DJ_VERSION}}.whl + asset_content_type: application/zip + - name: Upload pip sdist asset to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + with: + upload_url: ${{steps.create_gh_release.outputs.upload_url}} + asset_path: ${{env.DJ_SDIST_PATH}} + asset_name: pip-datajoint-${{env.DJ_VERSION}}.tar.gz + asset_content_type: application/gzip + - name: Publish pip release + run: | + export HOST_UID=$(id -u) + docker-compose -f docker-compose-build.yaml run \ + -e TWINE_USERNAME=${TWINE_USERNAME} -e TWINE_PASSWORD=${TWINE_PASSWORD} datajoint \ + sh -lc "pip install twine && python -m twine upload dist/*" diff --git a/Dockerfile b/Dockerfile index 920f3c75c..fef39e810 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,13 @@ -FROM datajoint/pydev - -COPY --chown=dja . /tmp/src -RUN pip install --user /tmp/src && \ - rm -rf /tmp/src +ARG PY_VER +ARG DISTRO +ARG IMAGE +FROM datajoint/${IMAGE}:py${PY_VER}-${DISTRO} +WORKDIR /main +COPY --chown=anaconda:anaconda ./requirements.txt ./setup.py \ + /main/ +COPY --chown=anaconda:anaconda ./datajoint/*.py /main/datajoint/ +RUN \ + umask u+rwx,g+rwx,o-rwx && \ + pip install --no-cache-dir . && \ + rm -R ./* +CMD ["python"] \ No newline at end of file diff --git a/docker-compose-build.yaml b/docker-compose-build.yaml new file mode 100644 index 000000000..557bb6c01 --- /dev/null +++ b/docker-compose-build.yaml @@ -0,0 +1,24 @@ +# PY_VER=3.8 IMAGE=djbase DISTRO=alpine DJ_VERSION=$(grep -oP '\d+\.\d+\.\d+' datajoint/version.py) HOST_UID=$(id -u) docker compose -f docker-compose-build.yaml up --exit-code-from app --build +# +# Intended for updating dependencies and docker image. +# Used to build release artifacts. +version: "2.4" +services: + app: + build: + context: . + args: + - PY_VER + - DISTRO + - IMAGE + image: datajoint/datajoint:${DJ_VERSION} + user: ${HOST_UID}:anaconda + volumes: + - .:/main + command: + - sh + - -lc + - | + set -e + rm -R build dist *.egg-info || echo "No prev build" + python setup.py bdist_wheel sdist \ No newline at end of file From e2ae133b0c91dbd6ac63a919e367aadcf1a11c6d Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 18:51:42 -0500 Subject: [PATCH 08/29] Adjust trigger so that GHA will run on forks. --- .github/workflows/development.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 937adbc62..efc832842 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -1,8 +1,6 @@ name: Development on: push: - tags: - - '*.*.*' pull_request: branches: - '**' # every branch @@ -77,7 +75,9 @@ jobs: black datajoint --check -v black tests --check -v publish-release: - if: github.event_name == 'push' + if: | + github.event_name == 'push' && + startsWith(github.ref, 'refs/tags') needs: test runs-on: ubuntu-latest env: From ea6a59f966870e1f45c3c2563d884ec74e79d91d Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 19:12:05 -0500 Subject: [PATCH 09/29] Rename utility to generate api docs + add gh-pages automation. --- .github/workflows/development.yaml | 23 ++++++++++++++++++++-- docs/docker-compose.yaml | 1 + docs/mkdocs.yaml | 2 +- docs/src/api/{gen_api.py => make_pages.py} | 0 4 files changed, 23 insertions(+), 3 deletions(-) rename docs/src/api/{gen_api.py => make_pages.py} (100%) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index efc832842..e9a160abb 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -22,7 +22,7 @@ jobs: COMPOSE_HTTP_TIMEOUT: "120" steps: - uses: actions/checkout@v2 - - name: Compile image + - name: Build pip artifacts run: | export DJ_VERSION=$(grep -oP '\d+\.\d+\.\d+' datajoint/version.py) export HOST_UID=$(id -u) @@ -73,7 +73,26 @@ jobs: flake8 --ignore=E203,E722,F401,W503 datajoint \ --count --max-complexity=62 --max-line-length=127 --statistics black datajoint --check -v - black tests --check -v + black tests --check -v + publish-docs: + if: | + github.event_name == 'push' && + startsWith(github.ref, 'refs/tags') + needs: test + runs-on: ubuntu-latest + env: + DOCKER_CLIENT_TIMEOUT: "120" + COMPOSE_HTTP_TIMEOUT: "120" + steps: + - uses: actions/checkout@v2 + - name: Deploy docs + run: | + export MODE=BUILD + export PACKAGE=datajoint + export UPSTREAM_REPO=https://github.com/datajoint/datajoint-python.git + export HOST_UID=$(id -u) + docker compose -f docs/docker-compose.yaml up --exit-code-from docs --build + git push origin gh-pages publish-release: if: | github.event_name == 'push' && diff --git a/docs/docker-compose.yaml b/docs/docker-compose.yaml index 3b6a8df2f..d4acf3b8b 100644 --- a/docs/docker-compose.yaml +++ b/docs/docker-compose.yaml @@ -1,4 +1,5 @@ # MODE="LIVE|QA|BUILD" PACKAGE=datajoint UPSTREAM_REPO=https://github.com/datajoint/datajoint-python.git HOST_UID=$(id -u) docker compose -f docs/docker-compose.yaml up --build +# # navigate to http://localhost/ version: "2.4" services: diff --git a/docs/mkdocs.yaml b/docs/mkdocs.yaml index b675d9272..be50d7fe9 100644 --- a/docs/mkdocs.yaml +++ b/docs/mkdocs.yaml @@ -43,7 +43,7 @@ plugins: default_handler: python - gen-files: scripts: - - ./src/api/gen_api.py + - ./src/api/make_pages.py - literate-nav: nav_file: navigation.md - exclude-search: diff --git a/docs/src/api/gen_api.py b/docs/src/api/make_pages.py similarity index 100% rename from docs/src/api/gen_api.py rename to docs/src/api/make_pages.py From 3b4c28e44fb8b7eb1710424ec675b070f520fdfb Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 19:20:41 -0500 Subject: [PATCH 10/29] Exclude branches that need to be ignored from GHA. --- .github/workflows/development.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index e9a160abb..9fdeb2400 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -1,6 +1,10 @@ name: Development on: push: + branches: + - '**' # every branch + - '!gh-pages' # exclude gh-pages branch + - '!stage*' # exclude branches beginning with stage pull_request: branches: - '**' # every branch From 74ca7bf2deb1624c0f26f61d0e310973db784a1c Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 19:29:49 -0500 Subject: [PATCH 11/29] Add listener for tags that are semver. --- .github/workflows/development.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 9fdeb2400..83bcb6900 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -5,6 +5,8 @@ on: - '**' # every branch - '!gh-pages' # exclude gh-pages branch - '!stage*' # exclude branches beginning with stage + tags: + - '*.*.*' pull_request: branches: - '**' # every branch From d2580bf89a97cfa0ff78aa7de274b407114e90c8 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 19:45:03 -0500 Subject: [PATCH 12/29] Add check for proper semver in tag. --- .github/workflows/development.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 83bcb6900..c1ceec9fa 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -6,7 +6,6 @@ on: - '!gh-pages' # exclude gh-pages branch - '!stage*' # exclude branches beginning with stage tags: - - '*.*.*' pull_request: branches: - '**' # every branch @@ -90,6 +89,9 @@ jobs: DOCKER_CLIENT_TIMEOUT: "120" COMPOSE_HTTP_TIMEOUT: "120" steps: + - name: Verify if release tag + run: | + echo "${GITHUB_REF#refs/*/}" | grep -oP '\d+\.\d+\.\d+' - uses: actions/checkout@v2 - name: Deploy docs run: | @@ -111,6 +113,9 @@ jobs: outputs: release_upload_url: ${{steps.create_gh_release.outputs.upload_url}} steps: + - name: Verify if release tag + run: | + echo "${GITHUB_REF#refs/*/}" | grep -oP '\d+\.\d+\.\d+' - uses: actions/checkout@v2 - name: Determine package version run: | From 0f6b34c306955b37fb36f3427413eb651fed41a8 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 19:48:51 -0500 Subject: [PATCH 13/29] Run GHA on any tag but only publish on semver. --- .github/workflows/development.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index c1ceec9fa..b009650df 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -6,6 +6,7 @@ on: - '!gh-pages' # exclude gh-pages branch - '!stage*' # exclude branches beginning with stage tags: + - '*' pull_request: branches: - '**' # every branch From 896cf561b5dd453237338ed9ae042a1a67709349 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 20:01:16 -0500 Subject: [PATCH 14/29] Fix tag filter and publish step. --- .github/workflows/development.yaml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index b009650df..86ac45822 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -6,7 +6,7 @@ on: - '!gh-pages' # exclude gh-pages branch - '!stage*' # exclude branches beginning with stage tags: - - '*' + - '[0-9]+\.[0-9]+\.[0-9]+' pull_request: branches: - '**' # every branch @@ -90,9 +90,6 @@ jobs: DOCKER_CLIENT_TIMEOUT: "120" COMPOSE_HTTP_TIMEOUT: "120" steps: - - name: Verify if release tag - run: | - echo "${GITHUB_REF#refs/*/}" | grep -oP '\d+\.\d+\.\d+' - uses: actions/checkout@v2 - name: Deploy docs run: | @@ -114,9 +111,6 @@ jobs: outputs: release_upload_url: ${{steps.create_gh_release.outputs.upload_url}} steps: - - name: Verify if release tag - run: | - echo "${GITHUB_REF#refs/*/}" | grep -oP '\d+\.\d+\.\d+' - uses: actions/checkout@v2 - name: Determine package version run: | @@ -164,5 +158,5 @@ jobs: run: | export HOST_UID=$(id -u) docker-compose -f docker-compose-build.yaml run \ - -e TWINE_USERNAME=${TWINE_USERNAME} -e TWINE_PASSWORD=${TWINE_PASSWORD} datajoint \ + -e TWINE_USERNAME=${TWINE_USERNAME} -e TWINE_PASSWORD=${TWINE_PASSWORD} app \ sh -lc "pip install twine && python -m twine upload dist/*" From 224a2289ffc6904f2e2911f7c5744d105f92e252 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 20:19:25 -0500 Subject: [PATCH 15/29] Use better defaults. --- .github/workflows/development.yaml | 8 ++++---- Dockerfile | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 86ac45822..dca91ecd0 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -6,7 +6,7 @@ on: - '!gh-pages' # exclude gh-pages branch - '!stage*' # exclude branches beginning with stage tags: - - '[0-9]+\.[0-9]+\.[0-9]+' + - '\d+\.\d+\.\d+' pull_request: branches: - '**' # every branch @@ -18,7 +18,7 @@ jobs: matrix: include: - py_ver: 3.8 - distro: alpine + distro: debian image: djbase env: PY_VER: ${{matrix.py_ver}} @@ -34,7 +34,7 @@ jobs: export HOST_UID=$(id -u) docker-compose -f docker-compose-build.yaml up --exit-code-from app --build echo "DJ_VERSION=${DJ_VERSION}" >> $GITHUB_ENV - - if: matrix.py_ver == '3.8' && matrix.distro == 'alpine' + - if: matrix.py_ver == '3.8' && matrix.distro == 'debian' name: Add pip artifacts uses: actions/upload-artifact@v2 with: @@ -95,7 +95,7 @@ jobs: run: | export MODE=BUILD export PACKAGE=datajoint - export UPSTREAM_REPO=https://github.com/datajoint/datajoint-python.git + export UPSTREAM_REPO=https://github.com/${GITHUB_REPOSITORY}.git export HOST_UID=$(id -u) docker compose -f docs/docker-compose.yaml up --exit-code-from docs --build git push origin gh-pages diff --git a/Dockerfile b/Dockerfile index fef39e810..f2d0f938e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -ARG PY_VER -ARG DISTRO -ARG IMAGE +ARG PY_VER=3.8 +ARG DISTRO=debian +ARG IMAGE=djbase FROM datajoint/${IMAGE}:py${PY_VER}-${DISTRO} WORKDIR /main COPY --chown=anaconda:anaconda ./requirements.txt ./setup.py \ From da1fb64dcc825c7b4f41f427e2960e22ecb8d3c3 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 20:23:57 -0500 Subject: [PATCH 16/29] Change image due to errors, address this later. --- .github/workflows/development.yaml | 4 ++-- Dockerfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index dca91ecd0..8970f2372 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -18,7 +18,7 @@ jobs: matrix: include: - py_ver: 3.8 - distro: debian + distro: alpine image: djbase env: PY_VER: ${{matrix.py_ver}} @@ -34,7 +34,7 @@ jobs: export HOST_UID=$(id -u) docker-compose -f docker-compose-build.yaml up --exit-code-from app --build echo "DJ_VERSION=${DJ_VERSION}" >> $GITHUB_ENV - - if: matrix.py_ver == '3.8' && matrix.distro == 'debian' + - if: matrix.py_ver == '3.8' && matrix.distro == 'alpine' name: Add pip artifacts uses: actions/upload-artifact@v2 with: diff --git a/Dockerfile b/Dockerfile index f2d0f938e..8657b9e61 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ARG PY_VER=3.8 -ARG DISTRO=debian +ARG DISTRO=alpine ARG IMAGE=djbase FROM datajoint/${IMAGE}:py${PY_VER}-${DISTRO} WORKDIR /main From 98e64a1181a2b8e1b7ebd9666bd551c5897c86f6 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 22:35:52 -0500 Subject: [PATCH 17/29] Remove whitespace. --- .github/workflows/development.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 8970f2372..35baeff7f 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -79,7 +79,7 @@ jobs: flake8 --ignore=E203,E722,F401,W503 datajoint \ --count --max-complexity=62 --max-line-length=127 --statistics black datajoint --check -v - black tests --check -v + black tests --check -v publish-docs: if: | github.event_name == 'push' && From d7fda2c978708373dc700ea204a93a46cedb6804 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 22:50:15 -0500 Subject: [PATCH 18/29] Enforce build before publishing. --- .github/workflows/development.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 35baeff7f..c4d13266f 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -157,6 +157,7 @@ jobs: - name: Publish pip release run: | export HOST_UID=$(id -u) + docker-compose -f docker-compose-build.yaml build docker-compose -f docker-compose-build.yaml run \ -e TWINE_USERNAME=${TWINE_USERNAME} -e TWINE_PASSWORD=${TWINE_PASSWORD} app \ sh -lc "pip install twine && python -m twine upload dist/*" From e6b1ca6fa66b517a30bee6b748befce4d5a04b29 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 23:11:44 -0500 Subject: [PATCH 19/29] Add debug logs for GHA. --- .github/workflows/development.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index c4d13266f..40bbbe278 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -157,7 +157,11 @@ jobs: - name: Publish pip release run: | export HOST_UID=$(id -u) + echo one docker-compose -f docker-compose-build.yaml build + echo two + docker images docker-compose -f docker-compose-build.yaml run \ -e TWINE_USERNAME=${TWINE_USERNAME} -e TWINE_PASSWORD=${TWINE_PASSWORD} app \ sh -lc "pip install twine && python -m twine upload dist/*" + echo three From 7a65d985c3606f20c0e3f7f0a589b8b5da562018 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 23:27:21 -0500 Subject: [PATCH 20/29] Add more debug logs. --- .github/workflows/development.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 40bbbe278..2cf4212b5 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -158,6 +158,9 @@ jobs: run: | export HOST_UID=$(id -u) echo one + docker-compose -f docker-compose-build.yaml up --exit-code-from app --build + echo one_point_five + docker images docker-compose -f docker-compose-build.yaml build echo two docker images From cbd17fb9fb652b0e87e06e11f77634ad5036cb12 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 23:37:22 -0500 Subject: [PATCH 21/29] Add more debug logs for GHA. --- .github/workflows/development.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 2cf4212b5..7e3b0afcc 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -105,9 +105,20 @@ jobs: startsWith(github.ref, 'refs/tags') needs: test runs-on: ubuntu-latest + strategy: + matrix: + include: + - py_ver: 3.8 + distro: alpine + image: djbase env: + PY_VER: ${{matrix.py_ver}} + DISTRO: ${{matrix.distro}} + IMAGE: ${{matrix.image}} TWINE_USERNAME: ${{secrets.twine_username}} TWINE_PASSWORD: ${{secrets.twine_password}} + DOCKER_CLIENT_TIMEOUT: "120" + COMPOSE_HTTP_TIMEOUT: "120" outputs: release_upload_url: ${{steps.create_gh_release.outputs.upload_url}} steps: From 63a3e2686cf80ae52eb00d9fbb156f06b585f106 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Tue, 20 Sep 2022 23:48:25 -0500 Subject: [PATCH 22/29] Verify fix. --- .github/workflows/development.yaml | 33 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 7e3b0afcc..fbc38c0d1 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -105,16 +105,16 @@ jobs: startsWith(github.ref, 'refs/tags') needs: test runs-on: ubuntu-latest - strategy: - matrix: - include: - - py_ver: 3.8 - distro: alpine - image: djbase + # strategy: + # matrix: + # include: + # - py_ver: 3.8 + # distro: alpine + # image: djbase env: - PY_VER: ${{matrix.py_ver}} - DISTRO: ${{matrix.distro}} - IMAGE: ${{matrix.image}} + # PY_VER: ${{matrix.py_ver}} + # DISTRO: ${{matrix.distro}} + # IMAGE: ${{matrix.image}} TWINE_USERNAME: ${{secrets.twine_username}} TWINE_PASSWORD: ${{secrets.twine_password}} DOCKER_CLIENT_TIMEOUT: "120" @@ -168,14 +168,13 @@ jobs: - name: Publish pip release run: | export HOST_UID=$(id -u) - echo one - docker-compose -f docker-compose-build.yaml up --exit-code-from app --build - echo one_point_five - docker images - docker-compose -f docker-compose-build.yaml build - echo two - docker images + # echo one + # docker-compose -f docker-compose-build.yaml up --exit-code-from app --build + # echo one_point_five + # docker images + # docker-compose -f docker-compose-build.yaml build + # echo two + # docker images docker-compose -f docker-compose-build.yaml run \ -e TWINE_USERNAME=${TWINE_USERNAME} -e TWINE_PASSWORD=${TWINE_PASSWORD} app \ sh -lc "pip install twine && python -m twine upload dist/*" - echo three From 83dfccd83f447ea8180abea2ce31014368283bfa Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Wed, 21 Sep 2022 00:09:22 -0500 Subject: [PATCH 23/29] Add env variables. --- .github/workflows/development.yaml | 25 +++++++++---------------- LNX-docker-compose.yml | 2 +- local-docker-compose.yml | 2 +- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index fbc38c0d1..9798e64b5 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -105,16 +105,16 @@ jobs: startsWith(github.ref, 'refs/tags') needs: test runs-on: ubuntu-latest - # strategy: - # matrix: - # include: - # - py_ver: 3.8 - # distro: alpine - # image: djbase + strategy: + matrix: + include: + - py_ver: 3.8 + distro: alpine + image: djbase env: - # PY_VER: ${{matrix.py_ver}} - # DISTRO: ${{matrix.distro}} - # IMAGE: ${{matrix.image}} + PY_VER: ${{matrix.py_ver}} + DISTRO: ${{matrix.distro}} + IMAGE: ${{matrix.image}} TWINE_USERNAME: ${{secrets.twine_username}} TWINE_PASSWORD: ${{secrets.twine_password}} DOCKER_CLIENT_TIMEOUT: "120" @@ -168,13 +168,6 @@ jobs: - name: Publish pip release run: | export HOST_UID=$(id -u) - # echo one - # docker-compose -f docker-compose-build.yaml up --exit-code-from app --build - # echo one_point_five - # docker images - # docker-compose -f docker-compose-build.yaml build - # echo two - # docker images docker-compose -f docker-compose-build.yaml run \ -e TWINE_USERNAME=${TWINE_USERNAME} -e TWINE_PASSWORD=${TWINE_PASSWORD} app \ sh -lc "pip install twine && python -m twine upload dist/*" diff --git a/LNX-docker-compose.yml b/LNX-docker-compose.yml index 1b0525ee3..7dfdfd5f7 100644 --- a/LNX-docker-compose.yml +++ b/LNX-docker-compose.yml @@ -1,4 +1,4 @@ -# docker-compose -f LNX-docker-compose.yml --env-file LNX.env up --exit-code-from app --build +# docker compose -f LNX-docker-compose.yml --env-file LNX.env up --exit-code-from app --build version: '2.2' x-net: &net networks: diff --git a/local-docker-compose.yml b/local-docker-compose.yml index 2ef858db2..0d34c8a8e 100644 --- a/local-docker-compose.yml +++ b/local-docker-compose.yml @@ -1,4 +1,4 @@ -# docker-compose -f local-docker-compose.yml --env-file LNX.env up --build +# docker compose -f local-docker-compose.yml --env-file LNX.env up --build version: '2.2' x-net: &net networks: From 6e53b724d7c54e39976cbd320e19c4f7c929f028 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Wed, 21 Sep 2022 00:26:33 -0500 Subject: [PATCH 24/29] Fix regression with backslashes in queries. --- datajoint/condition.py | 2 +- local-docker-compose.yml | 2 +- tests/test_fetch.py | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/datajoint/condition.py b/datajoint/condition.py index 397f68b53..034698925 100644 --- a/datajoint/condition.py +++ b/datajoint/condition.py @@ -109,7 +109,7 @@ def prep_value(k, v): ): return '"%s"' % v if isinstance(v, str): - return '"%s"' % v.replace("%", "%%") + return '"%s"' % v.replace("%", "%%").replace("\\", "\\\\") return "%r" % v negate = False diff --git a/local-docker-compose.yml b/local-docker-compose.yml index 0d34c8a8e..22a234c4c 100644 --- a/local-docker-compose.yml +++ b/local-docker-compose.yml @@ -82,7 +82,7 @@ services: - -c - | set -e - pip install --user nose nose-cov coveralls flake8 ptvsd black + pip install --user nose nose-cov coveralls flake8 ptvsd black faker pip install -e . pip freeze | grep datajoint ## You may run the below tests once sh'ed into container i.e. docker exec -it datajoint-python_app_1 sh diff --git a/tests/test_fetch.py b/tests/test_fetch.py index 309cac77b..684cd4846 100644 --- a/tests/test_fetch.py +++ b/tests/test_fetch.py @@ -380,3 +380,11 @@ def test_dj_u_distinct(self): fetched_result = result.fetch(as_dict=True, order_by=("contrast", "brightness")) Stimulus.delete_quick() assert fetched_result == expected_result + + def test_backslash(self): + # https://github.com/datajoint/datajoint-python/issues/999 + expected = "She\Hulk" + Parent.insert([(2, expected)]) + q = Parent & dict(name=expected) + assert q.fetch1("name") == expected + q.delete() From 3b3f44739cfb7669a68b13c2bdbc2fabb56f87d6 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Wed, 21 Sep 2022 00:35:46 -0500 Subject: [PATCH 25/29] Update version + changelog. --- CHANGELOG.md | 7 +++++-- datajoint/version.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 616fa5eb1..a7ebcc92d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,11 @@ ## Release notes +### 0.13.8 -- Sep 28, 2022 +* Bugfix - Fix queries with backslashes ([#999](https://github.com/datajoint/datajoint-python/issues/999)) PR [#1052](https://github.com/datajoint/datajoint-python/pull/1052) + ### 0.13.7 -- Jul 13, 2022 -* Bugfix - Fix networkx incompatable change by version pinning to 2.6.3 PR #1036 (#1035) -* Add - Support for serializing numpy datetime64 types PR #1036 (#1022) +* Bugfix - Fix networkx incompatable change by version pinning to 2.6.3 (#1035) PR #1036 +* Add - Support for serializing numpy datetime64 types (#1022) PR #1036 * Update - Add traceback to default logging PR #1036 ### 0.13.6 -- Jun 13, 2022 diff --git a/datajoint/version.py b/datajoint/version.py index 50c8b9c68..2c25e981a 100644 --- a/datajoint/version.py +++ b/datajoint/version.py @@ -1,3 +1,3 @@ -__version__ = "0.13.7" +__version__ = "0.13.8" assert len(__version__) <= 10 # The log table limits version to the 10 characters From 0d4646a4cd6327ab362b39873a4d99065e4081ec Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Wed, 21 Sep 2022 00:51:27 -0500 Subject: [PATCH 26/29] Remove unused makefile. --- Makefile | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index 85e421b32..000000000 --- a/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -all: - @echo 'MakeFile for DataJoint packaging ' - @echo ' ' - @echo 'make sdist Creates source distribution ' - @echo 'make wheel Creates Wheel distribution ' - @echo 'make pypi Package and upload to PyPI ' - @echo 'make pypitest Package and upload to PyPI test server' - @echo 'make clean Remove all build related directories ' - - -sdist: - python3 setup.py sdist >/dev/null 2>&1 - -wheel: - python3 setup.py bdist_wheel >/dev/null 2>&1 - -pypi:clean sdist wheel - twine upload dist/* - -pypitest: clean sdist wheel - twine upload -r pypitest dist/* - -clean: - rm -rf dist && rm -rf build && rm -rf *.egg-info - - - - From 3f195980fefe8caf35eb6ea41c50034286380e2b Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Wed, 21 Sep 2022 07:36:00 -0500 Subject: [PATCH 27/29] Update release date, enable unused imports check, dynamically check GHA's uid/gid setting. --- .github/workflows/development.yaml | 11 ++++++----- CHANGELOG.md | 2 +- LNX-docker-compose.yml | 2 +- README.md | 4 ++-- docs/docker-compose.yaml | 2 +- local-docker-compose.yml | 4 ++-- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 9798e64b5..96f7d1bb4 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -6,7 +6,7 @@ on: - '!gh-pages' # exclude gh-pages branch - '!stage*' # exclude branches beginning with stage tags: - - '\d+\.\d+\.\d+' + - '\d+\.\d+\.\d+' # only semver tags pull_request: branches: - '**' # every branch @@ -64,8 +64,6 @@ jobs: run: flake8 datajoint --count --select=E9,F63,F7,F82 --show-source --statistics - name: Run primary tests env: - UID: "1001" - GID: "121" PY_VER: ${{matrix.py_ver}} MYSQL_VER: ${{matrix.mysql_ver}} ALPINE_VER: "3.10" @@ -73,10 +71,13 @@ jobs: COMPOSE_HTTP_TIMEOUT: "120" COVERALLS_SERVICE_NAME: travis-ci COVERALLS_REPO_TOKEN: fd0BoXG46TPReEem0uMy7BJO5j0w1MQiY - run: docker-compose -f LNX-docker-compose.yml up --build --exit-code-from app + run: | + export HOST_UID=$(id -u) + export HOST_GID=$(id -g) + docker-compose -f LNX-docker-compose.yml up --build --exit-code-from app - name: Run style tests run: | - flake8 --ignore=E203,E722,F401,W503 datajoint \ + flake8 --ignore=E203,E722,W503 datajoint \ --count --max-complexity=62 --max-line-length=127 --statistics black datajoint --check -v black tests --check -v diff --git a/CHANGELOG.md b/CHANGELOG.md index a7ebcc92d..fa6ae2a21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## Release notes -### 0.13.8 -- Sep 28, 2022 +### 0.13.8 -- Sep 21, 2022 * Bugfix - Fix queries with backslashes ([#999](https://github.com/datajoint/datajoint-python/issues/999)) PR [#1052](https://github.com/datajoint/datajoint-python/pull/1052) ### 0.13.7 -- Jul 13, 2022 diff --git a/LNX-docker-compose.yml b/LNX-docker-compose.yml index 7dfdfd5f7..c55d6f4f1 100644 --- a/LNX-docker-compose.yml +++ b/LNX-docker-compose.yml @@ -85,7 +85,7 @@ services: # jupyter notebook # ports: # - "8888:8888" - user: ${UID}:${GID} + user: ${HOST_UID}:${HOST_GID} volumes: - .:/src - /tmp/.X11-unix:/tmp/.X11-unix:rw diff --git a/README.md b/README.md index 8d25fac4d..6c818865d 100644 --- a/README.md +++ b/README.md @@ -132,8 +132,8 @@ PY_VER=3.7 ALPINE_VER=3.10 MYSQL_VER=5.7 MINIO_VER=RELEASE.2021-09-03T03-56-13Z -UID=1000 -GID=1000 +HOST_UID=1000 +HOST_GID=1000 ``` * `cp local-docker-compose.yml docker-compose.yml` * `docker-compose up -d` (Note configured `JUPYTER_PASSWORD`) diff --git a/docs/docker-compose.yaml b/docs/docker-compose.yaml index d4acf3b8b..1d0e395b6 100644 --- a/docs/docker-compose.yaml +++ b/docs/docker-compose.yaml @@ -28,7 +28,7 @@ services: mkdocs serve --config-file ./docs/mkdocs.yaml -a 0.0.0.0:80 elif echo "$${MODE}" | grep -iE "qa|build" &>/dev/null; then git branch -D gh-pages || true - git fetch $${UPSTREAM_REPO} gh-pages:gh-pages + git fetch $${UPSTREAM_REPO} gh-pages:gh-pages || true mike deploy --config-file ./docs/mkdocs.yaml -u $$(grep -oE '\d+\.\d+' /main/$${PACKAGE}/version.py) latest mike set-default --config-file ./docs/mkdocs.yaml latest if echo "$${MODE}" | grep -i qa &>/dev/null; then diff --git a/local-docker-compose.yml b/local-docker-compose.yml index 22a234c4c..8bafa7cc5 100644 --- a/local-docker-compose.yml +++ b/local-docker-compose.yml @@ -90,7 +90,7 @@ services: # nosetests -vs --tests=tests.test_external_class:test_insert_and_fetch; #run specific basic test # nosetests -vs --tests=tests.test_fetch:TestFetch.test_getattribute_for_fetch1; #run specific Class test # flake8 datajoint --count --select=E9,F63,F7,F82 --show-source --statistics - # flake8 --ignore=E203,E722,F401,W503 datajoint --count --max-complexity=62 --max-line-length=127 --statistics + # flake8 --ignore=E203,E722,W503 datajoint --count --max-complexity=62 --max-line-length=127 --statistics # black datajoint --check -v ## Interactive Jupyter Notebook environment jupyter notebook & @@ -103,7 +103,7 @@ services: ports: - "8888:8888" - "5678:5678" - user: ${UID}:${GID} + user: ${HOST_UID}:${HOST_GID} volumes: - .:/src - /tmp/.X11-unix:/tmp/.X11-unix:rw From 653d5dc1fd56765ca145fb43eacb69c57b70d8b1 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Wed, 21 Sep 2022 07:43:39 -0500 Subject: [PATCH 28/29] Fix unused imports. --- datajoint/__init__.py | 2 ++ datajoint/declare.py | 1 - datajoint/logging.py | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datajoint/__init__.py b/datajoint/__init__.py index e512d85d6..9817d5c30 100644 --- a/datajoint/__init__.py +++ b/datajoint/__init__.py @@ -50,6 +50,8 @@ "DataJointError", "key", "key_hash", + "logger", + "migrate_dj011_external_blob_storage_to_dj012", ] from .logging import logger diff --git a/datajoint/declare.py b/datajoint/declare.py index 4ad1285f2..74673a928 100644 --- a/datajoint/declare.py +++ b/datajoint/declare.py @@ -5,7 +5,6 @@ import re import pyparsing as pp import logging -import warnings from .errors import DataJointError, _support_filepath_types, FILEPATH_FEATURE_SWITCH from .attribute_adapter import get_adapter diff --git a/datajoint/logging.py b/datajoint/logging.py index 5f0f3eb06..b432e1a4b 100644 --- a/datajoint/logging.py +++ b/datajoint/logging.py @@ -1,7 +1,6 @@ import logging import os import sys -import io logger = logging.getLogger(__name__.split(".")[0]) From 251030390ec7fb513ac09dfa40d170081be88d50 Mon Sep 17 00:00:00 2001 From: guzman-raphael Date: Wed, 21 Sep 2022 08:10:49 -0500 Subject: [PATCH 29/29] Parse for changelog info to add to release. --- .github/workflows/development.yaml | 12 ++++++++++-- CHANGELOG.md | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/development.yaml b/.github/workflows/development.yaml index 96f7d1bb4..d7ea2cc8b 100644 --- a/.github/workflows/development.yaml +++ b/.github/workflows/development.yaml @@ -53,7 +53,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Set up Python ${{matrix.py_ver}} - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: ${{matrix.py_ver}} - name: Install dependencies @@ -124,10 +124,18 @@ jobs: release_upload_url: ${{steps.create_gh_release.outputs.upload_url}} steps: - uses: actions/checkout@v2 + - name: Set up Python ${{matrix.py_ver}} + uses: actions/setup-python@v4 + with: + python-version: ${{matrix.py_ver}} - name: Determine package version run: | DJ_VERSION=$(grep -oP '\d+\.\d+\.\d+' datajoint/version.py) + RELEASE_BODY=$(python -c \ + 'print(open("./CHANGELOG.md").read().split("\n\n")[1].split("\n", 1)[1])' \ + ) echo "DJ_VERSION=${DJ_VERSION}" >> $GITHUB_ENV + echo "RELEASE_BODY=${RELEASE_BODY}" >> $GITHUB_ENV - name: Create GH release id: create_gh_release uses: actions/create-release@v1 @@ -136,7 +144,7 @@ jobs: with: tag_name: ${{env.DJ_VERSION}} release_name: Release ${{env.DJ_VERSION}} - body: "" + body: ${{env.RELEASE_BODY}} prerelease: false draft: false - name: Fetch pip artifacts diff --git a/CHANGELOG.md b/CHANGELOG.md index fa6ae2a21..15e4e9446 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## Release notes ### 0.13.8 -- Sep 21, 2022 +* Add - New documentation structure based on markdown PR [#1052](https://github.com/datajoint/datajoint-python/pull/1052) * Bugfix - Fix queries with backslashes ([#999](https://github.com/datajoint/datajoint-python/issues/999)) PR [#1052](https://github.com/datajoint/datajoint-python/pull/1052) ### 0.13.7 -- Jul 13, 2022