diff --git a/.bumpversion.cfg b/.bumpversion.cfg deleted file mode 100644 index fdba9e4..0000000 --- a/.bumpversion.cfg +++ /dev/null @@ -1,8 +0,0 @@ -[bumpversion] -current_version = 0.0.1 -tag = True -commit = True - -[bumpversion:file:./pyproject.toml] -search = version = "{current_version}" -replace = version = "{new_version}" diff --git a/.codecov.yaml b/.codecov.yaml index 829e56c..d0c0e29 100644 --- a/.codecov.yaml +++ b/.codecov.yaml @@ -1,17 +1,17 @@ # Based on pydata/xarray codecov: - require_ci_to_pass: no + require_ci_to_pass: no coverage: - status: - project: - default: - # Require 1% coverage, i.e., always succeed - target: 1 - patch: false - changes: false + status: + project: + default: + # Require 1% coverage, i.e., always succeed + target: 1 + patch: false + changes: false comment: - layout: diff, flags, files - behavior: once - require_base: no + layout: diff, flags, files + behavior: once + require_base: no diff --git a/.cruft.json b/.cruft.json index c151555..ac8342c 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,7 +1,7 @@ { "template": "https://github.com/scverse/cookiecutter-scverse", - "commit": "57f6267716826dad73baba46dc3c00fe7262c459", - "checkout": "v0.2.0", + "commit": "586b1652162ff7994b0070a034023d64289ae416", + "checkout": "v0.3.1", "context": { "cookiecutter": { "project_name": "geome", @@ -13,9 +13,15 @@ "project_repo": "https://github.com/theislab/geome", "license": "MIT License", "_copy_without_render": [ - ".github/workflows/**.yaml", + ".github/workflows/build.yaml", + ".github/workflows/test.yaml", "docs/_templates/autosummary/**.rst" ], + "_render_devdocs": false, + "_jinja2_env_vars": { + "lstrip_blocks": true, + "trim_blocks": true + }, "_template": "https://github.com/scverse/cookiecutter-scverse" } }, diff --git a/.editorconfig b/.editorconfig index 2fe0ce0..050f911 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,5 +8,11 @@ charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true +[*.{yml,yaml}] +indent_size = 2 + +[.cruft.json] +indent_size = 2 + [Makefile] indent_style = tab diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 8d3ddaa..a5a20e6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -2,88 +2,88 @@ name: Bug report description: Report something that is broken or incorrect labels: bug body: - - type: markdown - attributes: - value: | - **Note**: Please read [this guide](https://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports) - detailing how to provide the necessary information for us to reproduce your bug. In brief: - * Please provide exact steps how to reproduce the bug in a clean Python environment. - * In case it's not clear what's causing this bug, please provide the data or the data generation procedure. - * Sometimes it is not possible to share the data, but usually it is possible to replicate problems on publicly - available datasets or to share a subset of your data. + - type: markdown + attributes: + value: | + **Note**: Please read [this guide](https://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports) + detailing how to provide the necessary information for us to reproduce your bug. In brief: + * Please provide exact steps how to reproduce the bug in a clean Python environment. + * In case it's not clear what's causing this bug, please provide the data or the data generation procedure. + * Sometimes it is not possible to share the data, but usually it is possible to replicate problems on publicly + available datasets or to share a subset of your data. - - type: textarea - id: report - attributes: - label: Report - description: A clear and concise description of what the bug is. - validations: - required: true + - type: textarea + id: report + attributes: + label: Report + description: A clear and concise description of what the bug is. + validations: + required: true - - type: textarea - id: versions - attributes: - label: Version information - description: | - Please paste below the output of + - type: textarea + id: versions + attributes: + label: Version information + description: | + Please paste below the output of - ```python - import session_info - session_info.show(html=False, dependencies=True) - ``` - placeholder: | - ----- - anndata 0.8.0rc2.dev27+ge524389 - session_info 1.0.0 - ----- - asttokens NA - awkward 1.8.0 - backcall 0.2.0 - cython_runtime NA - dateutil 2.8.2 - debugpy 1.6.0 - decorator 5.1.1 - entrypoints 0.4 - executing 0.8.3 - h5py 3.7.0 - ipykernel 6.15.0 - jedi 0.18.1 - mpl_toolkits NA - natsort 8.1.0 - numpy 1.22.4 - packaging 21.3 - pandas 1.4.2 - parso 0.8.3 - pexpect 4.8.0 - pickleshare 0.7.5 - pkg_resources NA - prompt_toolkit 3.0.29 - psutil 5.9.1 - ptyprocess 0.7.0 - pure_eval 0.2.2 - pydev_ipython NA - pydevconsole NA - pydevd 2.8.0 - pydevd_file_utils NA - pydevd_plugins NA - pydevd_tracing NA - pygments 2.12.0 - pytz 2022.1 - scipy 1.8.1 - setuptools 62.5.0 - setuptools_scm NA - six 1.16.0 - stack_data 0.3.0 - tornado 6.1 - traitlets 5.3.0 - wcwidth 0.2.5 - zmq 23.1.0 - ----- - IPython 8.4.0 - jupyter_client 7.3.4 - jupyter_core 4.10.0 - ----- - Python 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:58:50) [GCC 10.3.0] - Linux-5.18.6-arch1-1-x86_64-with-glibc2.35 - ----- - Session information updated at 2022-07-07 17:55 + ```python + import session_info + session_info.show(html=False, dependencies=True) + ``` + placeholder: | + ----- + anndata 0.8.0rc2.dev27+ge524389 + session_info 1.0.0 + ----- + asttokens NA + awkward 1.8.0 + backcall 0.2.0 + cython_runtime NA + dateutil 2.8.2 + debugpy 1.6.0 + decorator 5.1.1 + entrypoints 0.4 + executing 0.8.3 + h5py 3.7.0 + ipykernel 6.15.0 + jedi 0.18.1 + mpl_toolkits NA + natsort 8.1.0 + numpy 1.22.4 + packaging 21.3 + pandas 1.4.2 + parso 0.8.3 + pexpect 4.8.0 + pickleshare 0.7.5 + pkg_resources NA + prompt_toolkit 3.0.29 + psutil 5.9.1 + ptyprocess 0.7.0 + pure_eval 0.2.2 + pydev_ipython NA + pydevconsole NA + pydevd 2.8.0 + pydevd_file_utils NA + pydevd_plugins NA + pydevd_tracing NA + pygments 2.12.0 + pytz 2022.1 + scipy 1.8.1 + setuptools 62.5.0 + setuptools_scm NA + six 1.16.0 + stack_data 0.3.0 + tornado 6.1 + traitlets 5.3.0 + wcwidth 0.2.5 + zmq 23.1.0 + ----- + IPython 8.4.0 + jupyter_client 7.3.4 + jupyter_core 4.10.0 + ----- + Python 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:58:50) [GCC 10.3.0] + Linux-5.18.6-arch1-1-x86_64-with-glibc2.35 + ----- + Session information updated at 2022-07-07 17:55 diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 5cad625..5b62547 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: Scverse Community Forum - url: https://discourse.scverse.org/ - about: If you have questions about “How to do X”, please ask them here. + - name: Scverse Community Forum + url: https://discourse.scverse.org/ + about: If you have questions about “How to do X”, please ask them here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 27a13ea..90ce14b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -2,10 +2,10 @@ name: Feature request description: Propose a new feature for geome labels: enhancement body: - - type: textarea - id: description - attributes: - label: Description of feature - description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. - validations: - required: true + - type: textarea + id: description + attributes: + label: Description of feature + description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. + validations: + required: true diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0242943..265a95e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,23 +1,29 @@ name: Check Build on: - push: - branches: [main] - pull_request: - branches: [main] + push: + branches: [main] + pull_request: + branches: [main] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: - package: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Python 3.10 - uses: actions/setup-python@v2 - with: - python-version: "3.10" - - name: Install build dependencies - run: python -m pip install --upgrade pip wheel twine build - - name: Build package - run: python -m build - - name: Check package - run: twine check --strict dist/*.whl + package: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up Python 3.10 + uses: actions/setup-python@v4 + with: + python-version: "3.10" + cache: "pip" + cache-dependency-path: "**/pyproject.toml" + - name: Install build dependencies + run: python -m pip install --upgrade pip wheel twine build + - name: Build package + run: python -m build + - name: Check package + run: twine check --strict dist/*.whl diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..b9599b0 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,29 @@ +name: Release + +on: + release: + types: [published] + +# Use "trusted publishing", see https://docs.pypi.org/trusted-publishers/ +jobs: + release: + name: Upload release to PyPI + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/geome + permissions: + id-token: write # IMPORTANT: this permission is mandatory for trusted publishing + steps: + - uses: actions/checkout@v4 + with: + filter: blob:none + fetch-depth: 0 + - uses: actions/setup-python@v4 + with: + python-version: "3.x" + cache: "pip" + - run: pip install build + - run: python -m build + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2f0ffd7..c5b152b 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,62 +1,67 @@ name: Test on: - push: - branches: [main] - pull_request: - branches: [main] + push: + branches: [main] + pull_request: + branches: [main] + schedule: + - cron: "0 5 1,15 * *" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: - test: - runs-on: ${{ matrix.os }} - defaults: - run: - shell: bash -e {0} # -e to fail on error - - strategy: - fail-fast: false - matrix: - python: ["3.8", "3.10"] - os: [ubuntu-latest] + test: + runs-on: ${{ matrix.os }} + defaults: + run: + shell: bash -e {0} # -e to fail on error + + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + python: "3.9" + - os: ubuntu-latest + python: "3.11" + - os: ubuntu-latest + python: "3.11" + pip-flags: "--pre" + name: PRE-RELEASE DEPENDENCIES + + name: ${{ matrix.name }} Python ${{ matrix.python }} + + env: + OS: ${{ matrix.os }} + PYTHON: ${{ matrix.python }} + + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python }} + cache: "pip" + cache-dependency-path: "**/pyproject.toml" + - name: Install test dependencies + run: | + python -m pip install --upgrade pip wheel + - name: Install dependencies + run: | + pip install ${{ matrix.pip-flags }} ".[dev,test]" + - name: Test env: - OS: ${{ matrix.os }} - PYTHON: ${{ matrix.python }} - - steps: - - uses: actions/checkout@v2 - - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python }} - - - name: Get pip cache dir - id: pip-cache-dir - run: | - echo "::set-output name=dir::$(pip cache dir)" - - name: Restore pip cache - uses: actions/cache@v2 - with: - path: ${{ steps.pip-cache-dir.outputs.dir }} - key: pip-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('**/pyproject.toml') }} - restore-keys: | - pip-${{ runner.os }}-${{ env.pythonLocation }}- - - name: Install test dependencies - run: | - python -m pip install --upgrade pip wheel - pip install codecov - - name: Install dependencies - run: | - pip install ".[dev,test]" - - name: Test - env: - MPLBACKEND: agg - PLATFORM: ${{ matrix.os }} - DISPLAY: :42 - run: | - pytest -v --cov --color=yes - - name: Upload coverage - env: - CODECOV_NAME: ${{ matrix.python }}-${{ matrix.os }} - run: | - codecov --required --flags=unittests + MPLBACKEND: agg + PLATFORM: ${{ matrix.os }} + DISPLAY: :42 + run: | + coverage run -m pytest -v --color=yes + - name: Report coverage + run: | + coverage report + - name: Upload coverage + uses: codecov/codecov-action@v3 diff --git a/.pre-commit-config.yaml.rej b/.pre-commit-config.yaml.rej index 18c10b3..463a752 100644 --- a/.pre-commit-config.yaml.rej +++ b/.pre-commit-config.yaml.rej @@ -1,81 +1,89 @@ diff a/.pre-commit-config.yaml b/.pre-commit-config.yaml (rejected hunks) -@@ -7,32 +7,28 @@ default_stages: +@@ -1,50 +1,42 @@ + fail_fast: false + default_language_version: +- python: python3 ++ python: python3 + default_stages: +- - commit +- - push ++ - commit ++ - push minimum_pre_commit_version: 2.16.0 repos: - - repo: https://github.com/psf/black -- rev: 23.1.0 -+ rev: "23.1.0" - hooks: - - id: black +- - repo: https://github.com/psf/black +- rev: "24.2.0" +- hooks: +- - id: black +- - repo: https://github.com/asottile/blacken-docs +- rev: 1.16.0 +- hooks: +- - id: blacken-docs - - repo: https://github.com/pre-commit/mirrors-prettier -- rev: v3.0.0-alpha.6 +- rev: v4.0.0-alpha.8 - hooks: - - id: prettier - - repo: https://github.com/asottile/blacken-docs - rev: 1.13.0 - hooks: - - id: blacken-docs -- - repo: https://github.com/PyCQA/isort -- rev: 5.12.0 -- hooks: -- - id: isort -- - repo: https://github.com/asottile/yesqa -- rev: v1.4.0 -+ - repo: https://github.com/pre-commit/mirrors-prettier -+ rev: v3.0.0-alpha.6 - hooks: -- - id: yesqa -- additional_dependencies: -- - flake8-tidy-imports -- - flake8-docstrings -- - flake8-rst-docstrings -- - flake8-comprehensions -- - flake8-bugbear -- - flake8-blind-except -+ - id: prettier -+ # Newer versions of node don't work on systems that have an older version of GLIBC -+ # (in particular Ubuntu 18.04 and Centos 7) -+ # EOL of Centos 7 is in 2024-06, we can probably get rid of this then. -+ # See https://github.com/scverse/cookiecutter-scverse/issues/143 and -+ # https://github.com/jupyterlab/jupyterlab/issues/12675 -+ language_version: "17.9.1" -+ - repo: https://github.com/charliermarsh/ruff-pre-commit -+ rev: v0.0.255 -+ hooks: -+ - id: ruff -+ args: [--fix, --exit-non-zero-on-fix] - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 - hooks: -@@ -43,31 +39,6 @@ repos: - args: [--fix=lf] - - id: trailing-whitespace - - id: check-case-conflict -- - repo: https://github.com/myint/autoflake -- rev: v2.0.2 +- # Newer versions of node don't work on systems that have an older version of GLIBC +- # (in particular Ubuntu 18.04 and Centos 7) +- # EOL of Centos 7 is in 2024-06, we can probably get rid of this then. +- # See https://github.com/scverse/cookiecutter-scverse/issues/143 and +- # https://github.com/jupyterlab/jupyterlab/issues/12675 +- language_version: "17.9.1" +- - repo: https://github.com/charliermarsh/ruff-pre-commit +- rev: v0.2.2 - hooks: -- - id: autoflake -- args: -- - --in-place -- - --remove-all-unused-imports -- - --remove-unused-variable -- - --ignore-init-module-imports -- - repo: https://github.com/PyCQA/flake8 -- rev: 6.0.0 +- - id: ruff +- args: [--fix, --exit-non-zero-on-fix] +- - repo: https://github.com/pre-commit/pre-commit-hooks +- rev: v4.5.0 - hooks: -- - id: flake8 -- additional_dependencies: -- - flake8-tidy-imports -- - flake8-docstrings -- - flake8-rst-docstrings -- - flake8-comprehensions -- - flake8-bugbear -- - flake8-blind-except -- - repo: https://github.com/asottile/pyupgrade -- rev: v3.3.1 +- - id: detect-private-key +- - id: check-ast +- - id: end-of-file-fixer +- - id: mixed-line-ending +- args: [--fix=lf] +- - id: trailing-whitespace +- - id: check-case-conflict +- - repo: local - hooks: -- - id: pyupgrade -- args: [--py3-plus, --py38-plus, --keep-runtime-typing] - - repo: local - hooks: - - id: forbid-to-commit +- - id: forbid-to-commit +- name: Don't commit rej files +- entry: | +- Cannot commit .rej files. These indicate merge conflicts that arise during automated template updates. +- Fix the merge conflicts manually and remove the .rej files. +- language: fail +- files: '.*\.rej$' ++ - repo: https://github.com/pre-commit/mirrors-prettier ++ rev: v4.0.0-alpha.8 ++ hooks: ++ - id: prettier ++ - repo: https://github.com/astral-sh/ruff-pre-commit ++ rev: v0.2.2 ++ hooks: ++ - id: ruff ++ types_or: [python, pyi, jupyter] ++ args: [--fix, --exit-non-zero-on-fix] ++ - id: ruff-format ++ types_or: [python, pyi, jupyter] ++ - repo: https://github.com/pre-commit/pre-commit-hooks ++ rev: v4.5.0 ++ hooks: ++ - id: detect-private-key ++ - id: check-ast ++ - id: end-of-file-fixer ++ - id: mixed-line-ending ++ args: [--fix=lf] ++ - id: trailing-whitespace ++ - id: check-case-conflict ++ # Check that there are no merge conflicts (could be generated by template sync) ++ - id: check-merge-conflict ++ args: [--assume-in-merge] ++ - repo: local ++ hooks: ++ - id: forbid-to-commit ++ name: Don't commit rej files ++ entry: | ++ Cannot commit .rej files. These indicate merge conflicts that arise during automated template updates. ++ Fix the merge conflicts manually and remove the .rej files. ++ language: fail ++ files: '.*\.rej$' diff --git a/.readthedocs.yaml.rej b/.readthedocs.yaml.rej new file mode 100644 index 0000000..6e4581a --- /dev/null +++ b/.readthedocs.yaml.rej @@ -0,0 +1,29 @@ +diff a/.readthedocs.yaml b/.readthedocs.yaml (rejected hunks) +@@ -1,16 +1,16 @@ + # https://docs.readthedocs.io/en/stable/config-file/v2.html + version: 2 + build: +- os: ubuntu-20.04 +- tools: +- python: "3.10" ++ os: ubuntu-20.04 ++ tools: ++ python: "3.10" + sphinx: +- configuration: docs/conf.py +- # disable this for more lenient docs builds +- fail_on_warning: true ++ configuration: docs/conf.py ++ # disable this for more lenient docs builds ++ fail_on_warning: true + python: +- install: +- - method: pip +- path: . +- extra_requirements: +- - doc ++ install: ++ - method: pip ++ path: . ++ extra_requirements: ++ - doc diff --git a/README.md b/README.md index fd3ec6d..e1a6af9 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Please refer to the [documentation][link-docs]. In particular, the ## Installation -You need to have Python 3.8 or newer installed on your system. If you don't have +You need to have Python 3.9 or newer installed on your system. If you don't have Python installed, we recommend installing [Mambaforge](https://github.com/conda-forge/miniforge#mambaforge). There are several alternative options to install geome: diff --git a/README.md.rej b/README.md.rej new file mode 100644 index 0000000..34cf2af --- /dev/null +++ b/README.md.rej @@ -0,0 +1,10 @@ +diff a/README.md b/README.md (rejected hunks) +@@ -33,7 +33,7 @@ pip install geome + 1. Install the latest development version: + + ```bash +-pip install git+https://github.com/tothmarcella/geome.git@main ++pip install git+https://github.com/theislab/geome.git@main + ``` + + ## Release notes diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css new file mode 100644 index 0000000..b8c8d47 --- /dev/null +++ b/docs/_static/css/custom.css @@ -0,0 +1,4 @@ +/* Reduce the font size in data frames - See https://github.com/scverse/cookiecutter-scverse/issues/193 */ +div.cell_output table.dataframe { + font-size: 0.8em; +} diff --git a/docs/conf.py b/docs/conf.py index 8b13aa2..dea2278 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -61,6 +61,7 @@ "sphinx_autodoc_typehints", "sphinx.ext.mathjax", "IPython.sphinxext.ipython_console_highlighting", + "sphinxext.opengraph", *[p.stem for p in (HERE / "extensions").glob("*.py")], ] @@ -128,18 +129,3 @@ # you can add an exception to this list. # ("py:class", "igraph.Graph"), ] - - -def setup(app): - """App setup hook.""" - app.add_config_value( - "recommonmark_config", - { - "auto_toc_tree_section": "Contents", - "enable_auto_toc_tree": True, - "enable_math": True, - "enable_inline_math": False, - "enable_eval_rst": True, - }, - True, - ) diff --git a/docs/conf.py.rej b/docs/conf.py.rej index 727d2a1..52fcb14 100644 --- a/docs/conf.py.rej +++ b/docs/conf.py.rej @@ -1,18 +1,34 @@ diff a/docs/conf.py b/docs/conf.py (rejected hunks) -@@ -16,15 +16,12 @@ sys.path.insert(0, str(HERE / "extensions")) +@@ -16,12 +16,15 @@ sys.path.insert(0, str(HERE / "extensions")) # -- Project information ----------------------------------------------------- --# NOTE: If you installed your project in editable mode, this might be stale. --# If this is the case, reinstall it to refresh the metadata ++# NOTE: If you installed your project in editable mode, this might be stale. ++# If this is the case, reinstall it to refresh the metadata info = metadata("geome") project_name = info["Name"] author = info["Author"] copyright = f"{datetime.now():%Y}, {author}." version = info["Version"] --urls = dict(pu.split(", ") for pu in info.get_all("Project-URL")) --repository_url = urls["Source"] -+repository_url = f"https://github.com/tothmarcella/{project_name}" +-repository_url = f"https://github.com/tothmarcella/{project_name}" ++urls = dict(pu.split(", ") for pu in info.get_all("Project-URL")) ++repository_url = urls["Source"] # The full version, including alpha/beta/rc tags release = info["Version"] +@@ -105,12 +109,15 @@ exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints"] + # + html_theme = "sphinx_book_theme" + html_static_path = ["_static"] ++html_css_files = ["css/custom.css"] ++ + html_title = project_name + + html_theme_options = { + "repository_url": repository_url, + "use_repository_button": True, + "path_to_docs": "docs/", ++ "navigation_with_keys": False, + } + + pygments_style = "default" diff --git a/docs/contributing.md b/docs/contributing.md index f4796c2..cf23234 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -1,6 +1,6 @@ # Contributing guide -Scanpy provides extensive [developer documentation][scanpy developer guide], most of which applies to this repo, too. +Scanpy provides extensive [developer documentation][scanpy developer guide], most of which applies to this project, too. This document will not reproduce the entire content from there. Instead, it aims at summarizing the most important information to get you started on contributing. @@ -19,9 +19,8 @@ pip install -e ".[dev,test,doc]" ## Code-style -This template uses [pre-commit][] to enforce consistent code-styles. On every commit, pre-commit checks will either -automatically fix issues with the code, or raise an error message. See [pre-commit checks](template_usage.md#pre-commit-checks) for -a full list of checks enabled for this repository. +This package uses [pre-commit][] to enforce consistent code-styles. +On every commit, pre-commit checks will either automatically fix issues with the code, or raise an error message. To enable pre-commit locally, simply run @@ -43,10 +42,10 @@ git pull --rebase to integrate the changes into yours. While the [pre-commit.ci][] is useful, we strongly encourage installing and running pre-commit locally first to understand its usage. -Finally, most editors have an _autoformat on save_ feature. Consider enabling this option for [black][black-editors] +Finally, most editors have an _autoformat on save_ feature. Consider enabling this option for [ruff][ruff-editors] and [prettier][prettier-editors]. -[black-editors]: https://black.readthedocs.io/en/stable/integrations/editors.html +[ruff-editors]: https://docs.astral.sh/ruff/integrations/ [prettier-editors]: https://prettier.io/docs/en/editors.html ## Writing tests @@ -65,7 +64,17 @@ command line by executing pytest ``` -in the root of the repository. Continuous integration will automatically run the tests on all pull requests. +in the root of the repository. + +### Continuous integration + +Continuous integration will automatically run the tests on all pull requests and test +against the minimum and maximum supported Python version. + +Additionally, there's a CI job that tests against pre-releases of all dependencies +(if there are any). The purpose of this check is to detect incompatibilities +of new package versions early on and gives you time to fix the issue or reach +out to the developers of the dependency before the package is released to a wider audience. [scanpy-test-docs]: https://scanpy.readthedocs.io/en/latest/dev/testing.html#writing-tests @@ -73,7 +82,7 @@ in the root of the repository. Continuous integration will automatically run the ### Updating the version number -Before making a release, you need to update the version number. Please adhere to [Semantic Versioning][semver], in brief +Before making a release, you need to update the version number in the `pyproject.toml` file. Please adhere to [Semantic Versioning][semver], in brief > Given a version number MAJOR.MINOR.PATCH, increment the: > @@ -83,56 +92,8 @@ Before making a release, you need to update the version number. Please adhere to > > Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. -We use [bump2version][] to automatically update the version number in all places and automatically create a git tag. -Run one of the following commands in the root of the repository - -```bash -bump2version patch -bump2version minor -bump2version major -``` - -Once you are done, run - -``` -git push --tags -``` - -to publish the created tag on GitHub. - -[bump2version]: https://github.com/c4urself/bump2version - -### Building and publishing the package on PyPI - -Python packages are not distributed as source code, but as _distributions_. The most common distribution format is the so-called _wheel_. To build a _wheel_, run - -```bash -python -m build -``` - -This command creates a _source archive_ and a _wheel_, which are required for publishing your package to [PyPI][]. These files are created directly in the root of the repository. - -Before uploading them to [PyPI][] you can check that your _distribution_ is valid by running: - -```bash -twine check dist/* -``` - -and finally publishing it with: - -```bash -twine upload dist/* -``` - -Provide your username and password when requested and then go check out your package on [PyPI][]! - -For more information, follow the [Python packaging tutorial][]. - -It is possible to automate this with GitHub actions, see also [this feature request][pypi-feature-request] -in the cookiecutter-scverse template. - -[python packaging tutorial]: https://packaging.python.org/en/latest/tutorials/packaging-projects/#generating-distribution-archives -[pypi-feature-request]: https://github.com/scverse/cookiecutter-scverse/issues/88 +Once you are done, commit and push your changes and navigate to the "Releases" page of this project on GitHub. +Specify `vX.X.X` as a tag name and create a release. For more information, see [managing GitHub releases][]. This will automatically create a git tag and trigger a Github workflow that creates a release on PyPI. ## Writing documentation @@ -142,6 +103,7 @@ Please write documentation for new or changed features and use-cases. This proje - [Numpy-style docstrings][numpydoc] (through the [napoloen][numpydoc-napoleon] extension). - Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks)) - [Sphinx autodoc typehints][], to automatically reference annotated input and output types +- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/) See the [scanpy developer docs](https://scanpy.readthedocs.io/en/latest/dev/documentation.html) for more information on how to write documentation. @@ -150,7 +112,7 @@ on how to write documentation. The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][]. Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells. -It is your reponsibility to update and re-run the notebook whenever necessary. +It is your responsibility to update and re-run the notebook whenever necessary. If you are interested in automatically running notebooks as part of the continuous integration, please check out [this feature request](https://github.com/scverse/cookiecutter-scverse/issues/40) in the `cookiecutter-scverse` @@ -195,3 +157,4 @@ open _build/html/index.html [numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html [sphinx autodoc typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints [pypi]: https://pypi.org/ +[managing GitHub releases]: https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository diff --git a/docs/index.md.rej b/docs/index.md.rej new file mode 100644 index 0000000..14a8d31 --- /dev/null +++ b/docs/index.md.rej @@ -0,0 +1,9 @@ +diff a/docs/index.md b/docs/index.md (rejected hunks) +@@ -8,7 +8,6 @@ + + api.md + changelog.md +-template_usage.md + contributing.md + references.md + diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 954237b..0000000 --- a/docs/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=. -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/pyproject.toml b/pyproject.toml index cffa850..346a1f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,14 +73,15 @@ addopts = [ "--import-mode=importlib", # allow using test files with same name ] -[tool.black] -line-length = 120 -target-version = ["py38"] - [tool.ruff] -src = ["src"] line-length = 120 -target-version = "py38" +src = ["src"] +extend-include = ["*.ipynb"] + +[tool.ruff.format] +docstring-code-format = true + +[tool.ruff.lint] select = [ "F", # Errors detected by Pyflakes "E", # Error detected by Pycodestyle @@ -95,7 +96,7 @@ select = [ "RUF100", # Report unused noqa directives ] ignore = [ - # line too long -> we accept long comment lines; black gets rid of long code lines + # line too long -> we accept long comment lines; formatter gets rid of long code lines "E501", # Do not assign a lambda expression, use a def -> lambda expression assignments are convenient "E731", @@ -121,14 +122,14 @@ ignore = [ "D213", ] -[tool.ruff.per-file-ignores] +[tool.ruff.lint.pydocstyle] +convention = "numpy" + +[tool.ruff.lint.per-file-ignores] "docs/*" = ["I"] "tests/*" = ["D"] "*/__init__.py" = ["F401"] -[tool.jupytext] -formats = "ipynb,md" - [tool.cruft] skip = [ "tests", @@ -138,5 +139,5 @@ skip = [ "docs/changelog.md", "docs/references.bib", "docs/references.md", - "docs/notebooks/example.ipynb" + "docs/notebooks/example.ipynb", ] diff --git a/pyproject.toml.rej b/pyproject.toml.rej new file mode 100644 index 0000000..20f01e8 --- /dev/null +++ b/pyproject.toml.rej @@ -0,0 +1,47 @@ +diff a/pyproject.toml b/pyproject.toml (rejected hunks) +@@ -7,7 +7,7 @@ name = "geome" + version = "0.0.1" + description = "The repo provides a set of tools for creating PyTorch Geometric (PyG) data objects from AnnData objects, which are commonly used for storing and manipulating single-cell genomics data. In addition, the repo includes functionality for creating PyTorch Lightning (PyTorch-Lightning) DataModule objects from the PyG data objects, which can be used to create graph neural network (GNN) data pipelines. The PyG data objects represent graphs, where the nodes represent cells and the edges represent relationships between the cells, and can be used to perform GNN tasks such as node classification, graph classification, and link prediction. The repo is written in Python and utilizes the PyTorch, PyTorch Geometric, and PyTorch-Lightning libraries." + readme = "README.md" +-requires-python = ">=3.8" ++requires-python = ">=3.9" + license = {file = "LICENSE"} + authors = [ + {name = "Marcella Toth"}, +@@ -21,30 +21,31 @@ urls.Home-page = "https://github.com/theislab/geome" + dependencies = [ + "anndata", + # for debug logging (referenced from the issue template) +- "session-info" ++ "session-info", + ] + + [project.optional-dependencies] + dev = [ +- # CLI for bumping the version number +- "bump2version", + "pre-commit", +- "twine>=4.0.2" ++ "twine>=4.0.2", + ] + doc = [ ++ "docutils>=0.8,!=0.18.*,!=0.19.*", + "sphinx>=4", + "sphinx-book-theme>=1.0.0", + "myst-nb", + "sphinxcontrib-bibtex>=1.0.0", + "sphinx-autodoc-typehints", ++ "sphinxext-opengraph", + # For notebooks + "ipykernel", + "ipython", + "sphinx-copybutton", ++ "pandas", + ] + test = [ + "pytest", +- "pytest-cov", ++ "coverage", + ] + + [tool.coverage.run]