From 26b1a28f2b861009cc7c0d0bf589cd6a09e3d227 Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Fri, 29 May 2026 08:47:29 +0200 Subject: [PATCH 01/11] Clean up banners --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4bcfabd..6bdce69 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ # Bike Net Kit / Fix Bike Net -[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) -[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) -[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) -[![Docs](https://github.com/BikeNetKit/FixBikeNet/actions/workflows/docs.yml/badge.svg)](https://github.com/BikeNetKit/FixBikeNet/actions/workflows/docs.yml) + [![Test](https://github.com/BikeNetKit/FixBikeNet/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/BikeNetKit/FixBikeNet/actions/workflows/test.yml) +[![PyPI - Version](https://img.shields.io/pypi/v/fixbikenet)](https://pypi.org/project/FixBikeNet/) +[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) The Python package `fixbikenet` identifies the most important gaps to fill in a city's bicycle network. From 05c9fca6ac8ff3a23c1b62dce310352dfbae1086 Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Fri, 29 May 2026 08:53:04 +0200 Subject: [PATCH 02/11] Update docs and funders --- README.md | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 6bdce69..4b83f42 100644 --- a/README.md +++ b/README.md @@ -138,21 +138,12 @@ We provide a minimum working example in two formats: - Python script ([examples/mwe.py](examples/mwe.py)) - Jupyter notebook ([examples/mwe.ipynb](examples/mwe.ipynb)) -## Repository structure +## Docs +Our documentation is in development. Stay tuned. -``` -├── fixbikenet <- Packaged functions and visualizations -├── tests <- Tests to execute to ensure functionality -├── .gitignore <- Files and folders ignored by git -├── .pre-commit-config.yaml <- Pre-commit hooks used -├── README.md -├── environment.yml <- Environment file to set up the environment using conda/mamba/pixi -``` -## Credits +## Supported by +Development of BikeNetKit/FixBikeNet was supported by the [Innovation Fund Denmark](https://innovationsfonden.dk/en) and the EU HORIZON project [JUST STREETS](https://www.just-streets.eu). - -Development of FixBikeNet was supported by the Danish Innovation Fund (Innovationsfonden). +[![Innovation Fund Denmark](https://raw.githubusercontent.com/BikeNetKit/.github/refs/heads/main/profile/_static/logo_innovationfund.png)](https://innovationsfonden.dk/en)    [![European Union](https://raw.githubusercontent.com/BikeNetKit/.github/refs/heads/main/profile/_static/logo_eu.png)](https://commission.europa.eu/index_en)   [![JUST STREETS](https://raw.githubusercontent.com/BikeNetKit/.github/refs/heads/main/profile/_static/logo_juststreets.png)](https://www.just-streets.eu/) From 8334ac693427efcbea8a11242ece465f96323013 Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Fri, 29 May 2026 08:54:31 +0200 Subject: [PATCH 03/11] Fill out full gitignore --- .gitignore | 263 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) diff --git a/.gitignore b/.gitignore index ae849e6..edd770c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,266 @@ +# Folders +data/ +results/ +cache/ +examples/*.gpkg +/*.gpkg + +# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,macos,windows +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,python,macos,windows + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + # pixi environments .pixi/* !.pixi/config.toml +pixi* + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,macos,windows From 35465d812e449e24d1aac3c6866f2ffcfebec692 Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Tue, 2 Jun 2026 12:55:41 +0200 Subject: [PATCH 04/11] Copy-paste gbn docs to fbn --- .github/workflows/docs.yml | 75 +++++++++++ FixBIkeViz.ipynb | 30 ++--- FixBikeMVP.ipynb | 2 +- docs/Makefile | 20 +++ docs/make.bat | 35 ++++++ docs/requirements.txt | 1 + docs/source/_static/logo_eu.png | Bin 0 -> 4456 bytes docs/source/_static/logo_innovationfund.png | Bin 0 -> 14556 bytes docs/source/_static/logo_juststreets.png | Bin 0 -> 5628 bytes docs/source/_static/references.bib | 20 +++ docs/{ => source}/conf.py | 64 +++++++--- docs/source/getting_started.rst | 38 ++++++ docs/source/index.rst | 68 ++++++++++ docs/source/installation.rst | 131 ++++++++++++++++++++ docs/source/mwe.ipynb | 80 ++++++++++++ docs/source/reference_developer.rst | 19 +++ docs/source/reference_user.rst | 9 ++ docs/source/references.rst | 5 + 18 files changed, 565 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/requirements.txt create mode 100644 docs/source/_static/logo_eu.png create mode 100644 docs/source/_static/logo_innovationfund.png create mode 100644 docs/source/_static/logo_juststreets.png create mode 100644 docs/source/_static/references.bib rename docs/{ => source}/conf.py (52%) create mode 100644 docs/source/getting_started.rst create mode 100644 docs/source/index.rst create mode 100644 docs/source/installation.rst create mode 100644 docs/source/mwe.ipynb create mode 100644 docs/source/reference_developer.rst create mode 100644 docs/source/reference_user.rst create mode 100644 docs/source/references.rst diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..9b61aab --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,75 @@ +name: Docs + +on: + push: + branches: + - main + - dow_workflow + paths: + - "fixbikenet/**" + - "docs/**" + - "logging.cfg" + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + generate-deploy-docs: + strategy: + matrix: + python-version: ["3.12"] + os: [ubuntu-latest] + name: Generate documentation + runs-on: ${{ matrix.os }} + env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + environment: + name: Deploy to github pages + url: ${{ steps.deployment.outputs.page_url }} + defaults: + run: + shell: bash -el {0} + steps: + - name: Check out Git repository + uses: actions/checkout@v6 + + - name: Get week number + run: echo "WEEK=$(date +'%V')" >> $GITHUB_ENV + + - name: Set up Python ${{ matrix.python-version }} + uses: mamba-org/setup-micromamba@v2 + with: + create-args: python=${{ matrix.python-version }} + environment-file: environment-dev.yml + cache-environment: true + cache-environment-key: W${{ env.WEEK }} + + - name: Add Notebook Kernel + run: python -m ipykernel install --user --name fixbikenet --display-name "Python (fixbikenet)" + + # - name: Generating .rst files + # run: sphinx-apidoc -o docs/api/ fixbikenet/ + - name: Generating html + run: sphinx-build docs/source/ public -b dirhtml + + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload artifact + uses: actions/upload-pages-artifact@v4 + with: + # Upload generated html + path: "public/" + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/FixBIkeViz.ipynb b/FixBIkeViz.ipynb index e797507..134fcd3 100644 --- a/FixBIkeViz.ipynb +++ b/FixBIkeViz.ipynb @@ -121,7 +121,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 38 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 38 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -141,7 +141,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -181,7 +181,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -219,7 +219,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 21 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 21 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -257,7 +257,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 21 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 21 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -307,7 +307,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 38 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 38 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -327,7 +327,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 38 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 38 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -377,7 +377,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -445,7 +445,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 21 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 21 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -475,7 +475,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 40 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 40 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -515,7 +515,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -535,7 +535,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 39 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -555,7 +555,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 40 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 40 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -605,7 +605,7 @@ "text": [ "/var/folders/q4/95x26cls17s1z694v56lw3hh0000gn/T/ipykernel_62426/2585542112.py:17: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed.\n", " edges_gdf[edges_gdf.intersects(gap_gdf.union_all())].plot(ax=ax, color = \"black\", zorder = 1, lw = 0)\n", - "/Users/jqz304/miniconda3/envs/growbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 37 is not valid for the current tile provider (valid zooms: 0 - 20).\n", + "/Users/jqz304/miniconda3/envs/fixbikenet/lib/python3.12/site-packages/contextily/tile.py:662: UserWarning: The inferred zoom level of 37 is not valid for the current tile provider (valid zooms: 0 - 20).\n", " warnings.warn(msg)\n" ] }, @@ -777,7 +777,7 @@ ], "metadata": { "kernelspec": { - "display_name": "growbikenet", + "display_name": "fixbikenet", "language": "python", "name": "python3" }, diff --git a/FixBikeMVP.ipynb b/FixBikeMVP.ipynb index ce246c0..a076788 100644 --- a/FixBikeMVP.ipynb +++ b/FixBikeMVP.ipynb @@ -749,7 +749,7 @@ ], "metadata": { "kernelspec": { - "display_name": "growbikenet", + "display_name": "fixbikenet", "language": "python", "name": "python3" }, diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..92dd33a --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# 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/make.bat b/docs/make.bat new file mode 100644 index 0000000..83cf06c --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@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/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..6944a6b --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1 @@ +furo==2025.12.19 diff --git a/docs/source/_static/logo_eu.png b/docs/source/_static/logo_eu.png new file mode 100644 index 0000000000000000000000000000000000000000..2467c6771ea476aa77836a33fb0840fc2feb12b0 GIT binary patch literal 4456 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 WnnlO-u!|u80000 + + + """, + "class": "", + }, + { + "name": "GitHub", + "url": "https://github.com/BikeNetKit/FixBikeNet", + "html": """ + + + + """, + "class": "", + }, + ], } # Generate the API documentation when building autosummary_generate = True autosummary_imported_members = True -numpydoc_show_class_members = True -class_members_toctree = True -numpydoc_show_inherited_class_members = True +numpydoc_show_class_members = False +class_members_toctree = False +numpydoc_show_inherited_class_members = False numpydoc_class_members_toctree = False numpydoc_use_plots = True autodoc_typehints = "none" @@ -90,9 +123,8 @@ .. note:: | This page was generated from `{{ docname }}`__. - | Interactive online version: :raw-html:`Binder badge` - __ https://github.com/BikeNetKit/FixBikeNet/blob/master/docs/{{ docname }} + __ https://github.com/BikeNetKit/FixBikeNet/blob/main/docs/source/{{ docname }} """ # noqa: E501 @@ -114,8 +146,8 @@ def find_source(): if domain != "py" or not info["module"]: return None try: - filename = "FixBikeNet/%s#L%d-L%d" % find_source() # noqa: UP031 + filename = "fixbikenet/%s#L%d-L%d" % find_source() # noqa: UP031 except Exception: filename = info["module"].replace(".", "/") + ".py" tag = "main" if "+" in release else ("v" + release) - return f"https://github.com/BikeNetKit/FixBikeNet/blob/{tag}/{filename}" \ No newline at end of file + return f"https://github.com/BikeNetKit/FixBikeNet/blob/{tag}/{filename}" diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst new file mode 100644 index 0000000..42790b8 --- /dev/null +++ b/docs/source/getting_started.rst @@ -0,0 +1,38 @@ +Getting started +=============== + +Get Started in 4 Steps +---------------------- + +1. Install FixBikeNet by following the :doc:`installation` guide. + +2. Read the :ref:`introducing-fixbikenet` section below. + +3. To check that the installation worked, run ``python examples/mwe.py`` or the Jupyter :doc:`mwe`. + +4. Consult the :doc:`reference_user` for complete details on using the package. + +Finally, if you're not already familiar with `NetworkX`_ and `GeoPandas`_, make sure you read their user guides as FixBikeNet uses their data structures. + +.. _introducing-fixbikenet: + +Introducing FixBikeNet +----------------------- + +FixBikeNet is built on top of `OSMnx`_/`NetworkX`_ and `GeoPandas`_. It takes one mandatory parameter, the city name, which it passes via `Nominatim`_ to `OSMnx`_, to download a city's street network. FixBikeNet then runs the following operations: + +* TBA + + +To try it out, run the: + +.. toctree:: + :maxdepth: 1 + + Minimum working example + + +.. _GeoPandas: https://geopandas.org +.. _NetworkX: https://networkx.org +.. _OSMnx: https://osmnx.readthedocs.io +.. _Nominatim: https://nominatim.openstreetmap.org \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..2b000cd --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,68 @@ +.. FixBikeNet documentation master file, created by + sphinx-quickstart on Thu Feb 12 15:01:19 2026. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +FixBikeNet |version| documentation +=================================== + +The Python package ``fixbikenet`` identifies the most important gaps to fill in a city's bicycle network. It is hosted on `Github `__, part of `BikeNetKit `__. + +The software downloads and pre-processes data from OpenStreetMap, identifies the gaps, saves the results, creates plots and videos. The source code builds on `the code from the +research paper `__ *Automated Detection of Missing Links in Bicycle Networks*. + + +Setup and use +------------- + +To set up FixBikeNet, see the :doc:`installation` page. +To use FixBikeNet, the :doc:`getting_started` page +is a good place to start, which also explains how the package works in detail. For technical documentation, consult the :doc:`reference_user`. + +.. Statement of need +.. ================= + +.. TBA + +How to cite +----------- + +If you use FixBikeNet in your research, please cite `the paper `__: + + A. Vybornova, T. Cunha, A. Gühnemann, M. Szell. Automated Detection of Missing Links in Bicycle Networks. Geographical Analysis 55(2), 239-267 (2023) + +Contributing +------------ + +If you want to contribute to the development of FixBikeNet, please read the +`CONTRIBUTING.md `__ +file. + +Supported by +------------ + +Development of BikeNetKit/FixBikeNet was supported by the Innovation Fund Denmark +and the EU HORIZON grant JUST STREETS. + +|Innovation Fund Denmark|    |European Union|   |JUST STREETS| + +.. |Innovation Fund Denmark| image:: _static/logo_innovationfund.png + :target: https://innovationsfonden.dk/en +.. |European Union| image:: _static/logo_eu.png + :target: https://commission.europa.eu/index_en +.. |JUST STREETS| image:: _static/logo_juststreets.png + :target: https://www.just-streets.eu/ + + +Documentation contents +---------------------- + +.. toctree:: + :maxdepth: 1 + + Home + installation + getting_started + reference_user + reference_developer + references diff --git a/docs/source/installation.rst b/docs/source/installation.rst new file mode 100644 index 0000000..e6fe9d5 --- /dev/null +++ b/docs/source/installation.rst @@ -0,0 +1,131 @@ +============= +Installation +============= + +The easy way +~~~~~~~~~~~~ + +The currently default way to install FixBikeNet is using pip: + +:: + + pip install fixbikenet + +If this does not work, follow the instructions below. + +Advanced installations +~~~~~~~~~~~~~~~~~~~~~~ + +The main step is to set up a virtual environment ``fbnenv`` in which to +install the package, and then to use or run the environment. Use either of the methods below. + +With conda/pip +^^^^^^^^^^^^^^ + +Installation with `conda `__ (or the faster `mamba `__). + +The conda-forge installation is not yet working. Therefore, you need to `clone the +repository `__ +and create the environment via the +``environment.yml`` file: + +:: + + conda env create --file environment.yml + conda activate fbnenv + pip install fixbikenet + + +With Pixi +^^^^^^^^^ + +Installation with `Pixi `__. + +First, `clone this +repository `__ +and create the environment via the +``environment.yml`` file: + +:: + + pixi init --import environment.yml + +At this point you can run fixbikenet in the environment, for example as +such: + +:: + + pixi run python examples/mwe.py + +.. + + | The first time you run code with Pixi, it might take a minute + longer, as Pixi resolves the environment’s dependencies only at + this point. + + +Run fixbikenet in Jupyter lab +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +After having set up the environment above, if you wish to run +fixbikenet via `JupyterLab `__, +follow the corresponding instructions below. + +With conda +^^^^^^^^^^ + +Using `conda `__ (or the faster `mamba `__), run: + +:: + + conda activate fbnenv + ipython kernel install --user --name=fbnenv + conda deactivate + jupyter lab + +Once Jupyter lab opens, switch the kernel (Kernel > Change Kernel > +fbnenv) + +With pip +^^^^^^^^ + +Using pip, run: + +:: + + pip install --user ipykernel + python -m ipykernel install --user --name=fbnenv + jupyter lab + +Once Jupyter lab opens, switch the kernel (Kernel > Change Kernel > +fbnenv) + + +With Pixi +^^^^^^^^^ + +Running fixbikenet in Jupter lab with +`Pixi `__ is straightforward: + +:: + + pixi run jupyter lab + +An instance of Jupyter lab is automatically going to open in your +browser after the environment is built. + +Development installation +~~~~~~~~~~~~~~~~~~~~~~~~ + +If you want to develop the project, `clone this +repository `__ +and create the environment via the +``environment-dev.yml`` file: + +:: + + pixi init --import environment-dev.yml + +The development environment is called ``fbnenvdev``. Make sure to also +read `our contribution +guidelines `__. diff --git a/docs/source/mwe.ipynb b/docs/source/mwe.ipynb new file mode 100644 index 0000000..cf8edb9 --- /dev/null +++ b/docs/source/mwe.ipynb @@ -0,0 +1,80 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "## Minimum working example\n", + "This notebook runs a minimum working example with fixbikenet" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "### Import fixbikenet" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import fixbikenet as fbn" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "### Run fixbikenet with example city Frederiksberg" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "gaps = fbn.fixbikenet(\n", + " city_name=\"Frederiksberg municipality\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "data is saved in `.examples/` as `gaps.gpk`" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/reference_developer.rst b/docs/source/reference_developer.rst new file mode 100644 index 0000000..9035245 --- /dev/null +++ b/docs/source/reference_developer.rst @@ -0,0 +1,19 @@ +Developer reference +=================== + +This is the complete developer reference for the FixBikeNet package. If you are looking for an introduction to FixBikeNet, read the :doc:`getting_started` guide. + +fixbikenet.fixbikenet +----------------------- + +.. automodule:: fixbikenet.fixbikenet + :members: + +fixbikenet.functions +--------------------- + +.. automodule:: fixbikenet.functions + :members: + :private-members: + + \ No newline at end of file diff --git a/docs/source/reference_user.rst b/docs/source/reference_user.rst new file mode 100644 index 0000000..1fadca0 --- /dev/null +++ b/docs/source/reference_user.rst @@ -0,0 +1,9 @@ +User reference +============== + +This is the user reference for the FixBikeNet package. If you are looking for an introduction to FixBikeNet, read the :doc:`getting_started` guide. + +The standard way to import the FixBikeNet package is via ``import fixbikenet as fbn``. The main ``fixbikenet()`` function below is then called via ``fbn.fixbikenet()``, see the :doc:`mwe`. + +.. automodule:: fixbikenet.fixbikenet + :members: \ No newline at end of file diff --git a/docs/source/references.rst b/docs/source/references.rst new file mode 100644 index 0000000..6cd4a15 --- /dev/null +++ b/docs/source/references.rst @@ -0,0 +1,5 @@ +References +========== + +.. bibliography:: _static/references.bib + :cited: \ No newline at end of file From c5657370a85445fa69ae0e486b66fe30650daa95 Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Tue, 2 Jun 2026 13:16:53 +0200 Subject: [PATCH 05/11] Add missing dependencies to dev env --- environment-dev.yml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/environment-dev.yml b/environment-dev.yml index 7db88c4..60ea5d8 100644 --- a/environment-dev.yml +++ b/environment-dev.yml @@ -4,9 +4,29 @@ channels: dependencies: - python=3.12 - jupyter + - jupyterlab + - ipywidgets + - ipykernel - geopandas>=0.14 - osmnx>=1.9.4 - pip - pytest - pixi-pycharm - - pre-commit \ No newline at end of file + - pre-commit + - sphinx + - numpydoc + - myst-nb + - sphinx-book-theme + - nbsphinx + - myst-parser + - ipython + - pip: + # not available via conda-forge: + - opencv-python + - pre-commit + - sphinxcontrib-bibtex + - sphinx-copybutton + - sphinx-gallery + - python-slugify + - growbikenet + - furo \ No newline at end of file From 99ae0950f68db5990537d57f913742fa27e3c311 Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Tue, 2 Jun 2026 13:19:10 +0200 Subject: [PATCH 06/11] Fix fixbikenet dev env dependency --- environment-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment-dev.yml b/environment-dev.yml index 60ea5d8..3282d6b 100644 --- a/environment-dev.yml +++ b/environment-dev.yml @@ -28,5 +28,5 @@ dependencies: - sphinx-copybutton - sphinx-gallery - python-slugify - - growbikenet + - fixbikenet - furo \ No newline at end of file From 78aa70791c309d66dbd0349d01aa4696fde00f22 Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Tue, 2 Jun 2026 13:34:02 +0200 Subject: [PATCH 07/11] Update pyproject --- pyproject.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ab0ed9d..38c25d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,9 +13,10 @@ authors = [ maintainers = [{ name = "Manuel Knepper", email = "manuel.knepper@gmx.net" }] license = "AGPL-3.0-or-later" readme = "README.md" -description = "Python package to detect gaps in developed bicycle networks" +description = "BikeNetKit Python package to detect gaps in developed bicycle networks" keywords = ["Bicycle network planning", "Networks", "OpenStreetMap", "Urban Planning", "Urban Mobility"] classifiers = [ + "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Operating System :: OS Independent", @@ -45,6 +46,9 @@ Issues = "https://github.com/BikeNetKit/FixBikeNet/issues" test = ["pytest"] doc = ["sphinx", "momepy"] +[tool.ruff.lint.extend-per-file-ignores] +"__init__.py" = ["F401"] # "Imported but unused: happens with packages + [tool.setuptools.packages.find] exclude = [ "examples*", From 6be1eb63b828aa56bac7fdc44b5a872c74080f8b Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Tue, 2 Jun 2026 13:39:11 +0200 Subject: [PATCH 08/11] Add matplotlib dependency --- environment-dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/environment-dev.yml b/environment-dev.yml index 3282d6b..983925e 100644 --- a/environment-dev.yml +++ b/environment-dev.yml @@ -7,6 +7,7 @@ dependencies: - jupyterlab - ipywidgets - ipykernel + - matplotlib - geopandas>=0.14 - osmnx>=1.9.4 - pip From 1c2f134b8e324ead31c2f99554599a4e32b96ee9 Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Tue, 2 Jun 2026 13:42:45 +0200 Subject: [PATCH 09/11] Update docs links and install info in readme --- README.md | 114 +++++------------------------------------------------- 1 file changed, 10 insertions(+), 104 deletions(-) diff --git a/README.md b/README.md index 4b83f42..b8ca783 100644 --- a/README.md +++ b/README.md @@ -17,119 +17,25 @@ The software downloads and pre-processes data from OpenStreetMap, identifies the ### The easy way -> [!IMPORTANT] -> As of 2026-05-27, the conda-forge installation is not yet working. We will remove this note once it works. +The currently default way to install FixBikeNet is using pip: -The best way to install FixBikeNet is using [`conda`](https://docs.conda.io/projects/conda/en/latest/index.html) and the `conda-forge` channel: - -``` -conda install -c conda-forge fixbikenet -``` - -### Advanced installations -#### Set up environment - -The main step is to set up a virtual environment `fbnenv` in which to install the package, and then to use or run the environment. - -##### With Pixi - -Installation with [`Pixi`](https://pixi.prefix.dev/latest/) is fastest and most stable: - -``` -pixi init fbnenv -pixi add --pypi fixbikenet -``` - -At this point you can run fixbikenet in the environment, for example as such: - -``` -pixi run python examples/mwe.py -``` - -> [!NOTE] -> The first time you run code with Pixi, it might take a minute longer, as Pixi resolves the environment's dependencies only at this point. - -_Alternatively_, or if you run into issues, [clone this repository](https://github.com/BikeNetKit/fixbikenet/archive/refs/heads/main.zip) and create the environment via the [`environment.yml`](environment.yml) file: - -``` -pixi init --import environment.yml -``` - -##### With mamba/conda/pip - -Alternatively to Pixi, use [`mamba`](https://mamba.readthedocs.io/en/latest/index.html) or [`conda`](https://docs.conda.io/projects/conda/en/latest/index.html). - -
Instructions - -> [!IMPORTANT] -> As of 2026-05-06, the conda-forge installation is not yet working. We will remove this note once it works. - -``` -mamba create -n fbnenv -c conda-forge fixbikenet -mamba activate fbnenv ``` - -_Alternatively_, or if you run into issues, [clone this repository](https://github.com/BikeNetKit/fixbikenet/archive/refs/heads/main.zip) and create the environment via the [`environment.yml`](environment.yml) file: - -``` -mamba env create --file environment.yml -mamba activate fbnenv pip install fixbikenet ``` -
- -### Run fixbikenet in Jupyter lab - -After having set up the environment above, if you wish to run fixbikenet via [JupyterLab](https://pypi.org/project/jupyterlab/), follow the - -
Instructions - -#### With Pixi -Running fixbikenet in Jupter lab with [`Pixi`](https://pixi.prefix.dev/latest/) is straightforward: - -``` -pixi run jupyter lab -``` - -An instance of Jupyter lab is automatically going to open in your browser after the environment is built. + -``` -pixi init --import environment-dev.yml -``` +If this does not work, consult our [installation docs](https://bikenetkit.github.io/FixBikeNet/installation/). -The developemt environment is called `fbnenvdev`. Make sure to also read [our contribution guidelines](https://github.com/BikeNetKit/FixBikeNet?tab=contributing-ov-file). +### Advanced and development installations + See our [installation docs](https://bikenetkit.github.io/FixBikeNet/installation/) for details. ## Usage @@ -139,7 +45,7 @@ We provide a minimum working example in two formats: - Jupyter notebook ([examples/mwe.ipynb](examples/mwe.ipynb)) ## Docs -Our documentation is in development. Stay tuned. +Find more information in our docs: [https://bikenetkit.github.io/FixBikeNet/](https://bikenetkit.github.io/FixBikeNet/) ## Supported by From e212247d23f8f02986cdfa9df96f4f849f2ba01f Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Tue, 2 Jun 2026 13:43:30 +0200 Subject: [PATCH 10/11] Add docs and human created badges --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b8ca783..0bceb76 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # Bike Net Kit / Fix Bike Net - +[![Docs](https://github.com/BikeNetKit/FixBikeNet/actions/workflows/docs.yml/badge.svg)](https://bikenetkit.github.io/FixBikeNet/) [![Test](https://github.com/BikeNetKit/FixBikeNet/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/BikeNetKit/FixBikeNet/actions/workflows/test.yml) [![PyPI - Version](https://img.shields.io/pypi/v/fixbikenet)](https://pypi.org/project/FixBikeNet/) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) +![Human created](https://raw.githubusercontent.com/BikeNetKit/.github/refs/heads/main/profile/_static/badge_humancreated.svg) The Python package `fixbikenet` identifies the most important gaps to fill in a city's bicycle network. From b1cbf2f44a2615bd060f22ff60b837074119c245 Mon Sep 17 00:00:00 2001 From: Michael Szell Date: Tue, 2 Jun 2026 13:47:30 +0200 Subject: [PATCH 11/11] Polish mwe.ipynb --- docs/source/mwe.ipynb | 14 ++++++++++---- examples/mwe.ipynb | 14 ++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/docs/source/mwe.ipynb b/docs/source/mwe.ipynb index cf8edb9..1f0faa2 100644 --- a/docs/source/mwe.ipynb +++ b/docs/source/mwe.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "## Minimum working example\n", - "This notebook runs a minimum working example with fixbikenet" + "This notebook runs a minimum working example with fixbikenet." ] }, { @@ -17,6 +17,14 @@ "### Import fixbikenet" ] }, + { + "cell_type": "markdown", + "id": "21330ccc-40a3-433a-8ce6-f547c47310ae", + "metadata": {}, + "source": [ + "The standard way of importing fixbikenet:" + ] + }, { "cell_type": "code", "execution_count": null, @@ -42,9 +50,7 @@ "metadata": {}, "outputs": [], "source": [ - "gaps = fbn.fixbikenet(\n", - " city_name=\"Frederiksberg municipality\",\n", - ")" + "gaps = fbn.fixbikenet(\"Frederiksberg municipality\")" ] }, { diff --git a/examples/mwe.ipynb b/examples/mwe.ipynb index cf8edb9..1f0faa2 100644 --- a/examples/mwe.ipynb +++ b/examples/mwe.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "## Minimum working example\n", - "This notebook runs a minimum working example with fixbikenet" + "This notebook runs a minimum working example with fixbikenet." ] }, { @@ -17,6 +17,14 @@ "### Import fixbikenet" ] }, + { + "cell_type": "markdown", + "id": "21330ccc-40a3-433a-8ce6-f547c47310ae", + "metadata": {}, + "source": [ + "The standard way of importing fixbikenet:" + ] + }, { "cell_type": "code", "execution_count": null, @@ -42,9 +50,7 @@ "metadata": {}, "outputs": [], "source": [ - "gaps = fbn.fixbikenet(\n", - " city_name=\"Frederiksberg municipality\",\n", - ")" + "gaps = fbn.fixbikenet(\"Frederiksberg municipality\")" ] }, {