From f50ba230ce2099622754e77d1f27db4479a2a5f1 Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Sun, 14 Sep 2025 15:14:53 +0200 Subject: [PATCH 01/11] Improve deps --- pyproject.toml | 70 +++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2384dcdc3..28f453fca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,28 +37,28 @@ dependencies = [ "numpy >= 1.21.5, < 3", "pandas >= 2.0.0, < 3", # Optimization and data handling - "linopy >=0.5.7, <0.5.8", # Update and test regularly + "linopy >=0.5.7, <0.5.8", "netcdf4 >= 1.6.1, < 2", # Utilities "PyYAML >= 6.0.0, < 7", - "rich >= 13.0.0", - "tomli >= 2.0.1; python_version < '3.11'", # Only needed with python 3.10 or earlier + "rich >= 13.0.0, < 15", + "tomli >= 2.0.1, < 3; python_version < '3.11'", # Only needed with python 3.10 or earlier # Default solver - "highspy >= 1.5.3", + "highspy >= 1.5.3, < 2", # Visualization - "matplotlib >= 3.5.2, < 4.0.0", + "matplotlib >= 3.5.2, < 4", "plotly >=5.15.0, <6.4.0", ] [project.optional-dependencies] # Interactive network visualization with enhanced color picker network-viz = [ - "dash >= 3.0.0", - "dash-cytoscape >= 1.0.0", - "dash-daq >= 0.6.0", - "networkx >= 3.0.0", - "werkzeug >= 3.0.0", + "dash >= 3.0.0, < 4", + "dash-cytoscape >= 1.0.0, < 2", + "dash-daq >= 0.6.0, < 1", + "networkx >= 3.0.0, < 4", + "werkzeug >= 3.0.0, < 4", ] # Full feature set (everything except dev tools) @@ -66,43 +66,43 @@ full = [ "pyvis ==0.3.2", # Visualizing FlowSystem Network "tsam >= 2.3.1, < 3.0.0", # Time series aggregation "scipy >= 1.15.1, < 2.0.0", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257 - "gurobipy >= 10.0.0", - "dash >= 3.0.0", # Visualizing FlowSystem Network as app - "dash-cytoscape >= 1.0.0", # Visualizing FlowSystem Network as app - "dash-daq >= 0.6.0", # Visualizing FlowSystem Network as app - "networkx >= 3.0.0", # Visualizing FlowSystem Network as app - "werkzeug >= 3.0.0", # Visualizing FlowSystem Network as app + "gurobipy >= 10.0.0, < 13", + "dash >= 3.0.0, < 4.0.0", # Visualizing FlowSystem Network as app + "dash-cytoscape >= 1.0.0, < 2.0.0", # Visualizing FlowSystem Network as app + "dash-daq >= 0.6.0, < 1.0.0", # Visualizing FlowSystem Network as app + "networkx >= 3.0.0, < 4.0.0", # Visualizing FlowSystem Network as app + "werkzeug >= 3.0.0, < 4.0.0", # Visualizing FlowSystem Network as app ] # Development tools and testing dev = [ - "pytest >= 7.0.0", - "nbformat>=4.2.0", # Related to failing CI with Plotly>6 - "ruff >= 0.9.0", - "pre-commit >= 4.0.0", + "pytest >= 7.0.0, < 9", + "nbformat>=4.2.0, < 6", # Related to failing CI with Plotly>6 + "ruff >= 0.9.0, < 1", + "pre-commit >= 4.0.0, < 5", "pyvis ==0.3.2", # Visualizing FlowSystem "tsam >= 2.3.1, < 3.0.0", # Time series aggregation "scipy >= 1.15.1, < 2.0.0", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257 - "gurobipy >= 10.0.0", - "dash >= 3.0.0", - "dash-cytoscape >= 1.0.0", - "dash-daq >= 0.6.0", - "networkx >= 3.0.0", - "werkzeug >= 3.0.0", + "gurobipy >= 10.0.0, < 13", + "dash >= 3.0.0, < 4", + "dash-cytoscape >= 1.0.0, < 2", + "dash-daq >= 0.6.0, < 1", + "networkx >= 3.0.0, < 4", + "werkzeug >= 3.0.0, < 4", ] # Documentation building docs = [ "mkdocs-material >= 9.0.0, < 10", - "mkdocstrings-python >= 1.0.0", - "mkdocs-table-reader-plugin >= 2.0.0", - "mkdocs-gen-files >= 0.4.0", - "mkdocs-include-markdown-plugin >= 6.0.0", - "mkdocs-literate-nav >= 0.6.0", - "markdown-include >= 0.8.0", - "pymdown-extensions >= 10.0.0", - "pygments >= 2.14.0", - "mike >= 2.0.0", + "mkdocstrings-python >= 1.0.0, < 2.0.0", + "mkdocs-table-reader-plugin >= 2.0.0, < 4.0.0", + "mkdocs-gen-files >= 0.4.0, < 1.0.0", + "mkdocs-include-markdown-plugin >= 6.0.0, < 8.0.0", + "mkdocs-literate-nav >= 0.6.0, < 1.0.0", + "markdown-include >= 0.8.0, < 1.0.0", + "pymdown-extensions >= 10.0.0, < 11.0.0", + "pygments >= 2.14.0, < 3.0.0", + "mike >= 2.0.0, < 3.0.0", ] [project.urls] From f4eef9f0fc57caf4d9ccbeedc72b37047d2ad6ff Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Sun, 14 Sep 2025 15:24:20 +0200 Subject: [PATCH 02/11] Improve deps --- pyproject.toml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 28f453fca..07fa300a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ dependencies = [ # Visualization "matplotlib >= 3.5.2, < 4", - "plotly >=5.15.0, <6.4.0", + "plotly >=5.15.0, <7", ] [project.optional-dependencies] @@ -64,14 +64,14 @@ network-viz = [ # Full feature set (everything except dev tools) full = [ "pyvis ==0.3.2", # Visualizing FlowSystem Network - "tsam >= 2.3.1, < 3.0.0", # Time series aggregation - "scipy >= 1.15.1, < 2.0.0", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257 + "tsam >= 2.3.1, < 3", # Time series aggregation + "scipy >= 1.15.1, < 2", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257 "gurobipy >= 10.0.0, < 13", - "dash >= 3.0.0, < 4.0.0", # Visualizing FlowSystem Network as app - "dash-cytoscape >= 1.0.0, < 2.0.0", # Visualizing FlowSystem Network as app - "dash-daq >= 0.6.0, < 1.0.0", # Visualizing FlowSystem Network as app - "networkx >= 3.0.0, < 4.0.0", # Visualizing FlowSystem Network as app - "werkzeug >= 3.0.0, < 4.0.0", # Visualizing FlowSystem Network as app + "dash >= 3.0.0, < 4", # Visualizing FlowSystem Network as app + "dash-cytoscape >= 1.0.0, < 2", # Visualizing FlowSystem Network as app + "dash-daq >= 0.6.0, < 1", # Visualizing FlowSystem Network as app + "networkx >= 3.0.0, < 4", # Visualizing FlowSystem Network as app + "werkzeug >= 3.0.0, < 4", # Visualizing FlowSystem Network as app ] # Development tools and testing @@ -81,8 +81,8 @@ dev = [ "ruff >= 0.9.0, < 1", "pre-commit >= 4.0.0, < 5", "pyvis ==0.3.2", # Visualizing FlowSystem - "tsam >= 2.3.1, < 3.0.0", # Time series aggregation - "scipy >= 1.15.1, < 2.0.0", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257 + "tsam >= 2.3.1, < 3", # Time series aggregation + "scipy >= 1.15.1, < 2", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257 "gurobipy >= 10.0.0, < 13", "dash >= 3.0.0, < 4", "dash-cytoscape >= 1.0.0, < 2", @@ -94,15 +94,15 @@ dev = [ # Documentation building docs = [ "mkdocs-material >= 9.0.0, < 10", - "mkdocstrings-python >= 1.0.0, < 2.0.0", - "mkdocs-table-reader-plugin >= 2.0.0, < 4.0.0", - "mkdocs-gen-files >= 0.4.0, < 1.0.0", - "mkdocs-include-markdown-plugin >= 6.0.0, < 8.0.0", - "mkdocs-literate-nav >= 0.6.0, < 1.0.0", - "markdown-include >= 0.8.0, < 1.0.0", - "pymdown-extensions >= 10.0.0, < 11.0.0", - "pygments >= 2.14.0, < 3.0.0", - "mike >= 2.0.0, < 3.0.0", + "mkdocstrings-python >= 1.0.0, < 2", + "mkdocs-table-reader-plugin >= 2.0.0, < 4", + "mkdocs-gen-files >= 0.4.0, < 1", + "mkdocs-include-markdown-plugin >= 6.0.0, < 8", + "mkdocs-literate-nav >= 0.6.0, < 1", + "markdown-include >= 0.8.0, < 1", + "pymdown-extensions >= 10.0.0, < 11", + "pygments >= 2.14.0, < 3", + "mike >= 2.0.0, < 3", ] [project.urls] From a80a15f5bc4ad6ef00d0fe176ba8853d2639f427 Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Sun, 14 Sep 2025 15:31:41 +0200 Subject: [PATCH 03/11] Added xarray dependency explicitly --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 07fa300a1..0f739f8e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,7 @@ dependencies = [ # Core scientific computing "numpy >= 1.21.5, < 3", "pandas >= 2.0.0, < 3", + "xarray >= 2024.2.0, < 2025.9.0", # Optimization and data handling "linopy >=0.5.7, <0.5.8", "netcdf4 >= 1.6.1, < 2", From 8526eda70d148c0acdd02d929d30e554d496d2a9 Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Mon, 15 Sep 2025 19:01:10 +0200 Subject: [PATCH 04/11] After testing linopy versions, widen dependency to >0.5.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0f739f8e0..0b345dcb9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ dependencies = [ "pandas >= 2.0.0, < 3", "xarray >= 2024.2.0, < 2025.9.0", # Optimization and data handling - "linopy >=0.5.7, <0.5.8", + "linopy >=0.5.1, <0.5.8", "netcdf4 >= 1.6.1, < 2", # Utilities "PyYAML >= 6.0.0, < 7", From 0f162850dd254e0e6e2f296fb6370073ae4d6284 Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Mon, 15 Sep 2025 19:09:16 +0200 Subject: [PATCH 05/11] Add dep bounds to flask, allow ruff 1.x,widen linopy dep --- pyproject.toml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0b345dcb9..920c74ed3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,9 +36,9 @@ dependencies = [ # Core scientific computing "numpy >= 1.21.5, < 3", "pandas >= 2.0.0, < 3", - "xarray >= 2024.2.0, < 2025.9.0", + "xarray >= 2024.2.0, < 2026.0", # CalVer: allow through next calendar year # Optimization and data handling - "linopy >=0.5.1, <0.5.8", + "linopy >= 0.5.1, < 0.6", # Widened from patch pin to minor range "netcdf4 >= 1.6.1, < 2", # Utilities "PyYAML >= 6.0.0, < 7", @@ -49,7 +49,7 @@ dependencies = [ # Visualization "matplotlib >= 3.5.2, < 4", - "plotly >=5.15.0, <7", + "plotly >= 5.15.0, < 7", ] [project.optional-dependencies] @@ -60,6 +60,7 @@ network-viz = [ "dash-daq >= 0.6.0, < 1", "networkx >= 3.0.0, < 4", "werkzeug >= 3.0.0, < 4", + "Flask >= 3.0.0, < 4", # Explicit Flask cap to prevent transitive major bumps ] # Full feature set (everything except dev tools) @@ -78,8 +79,8 @@ full = [ # Development tools and testing dev = [ "pytest >= 7.0.0, < 9", - "nbformat>=4.2.0, < 6", # Related to failing CI with Plotly>6 - "ruff >= 0.9.0, < 1", + "nbformat >= 4.2.0, < 6", # Pinned due to CI compatibility issues; revisit quarterly + "ruff >= 0.9.0, < 2", # Allow 1.x versions "pre-commit >= 4.0.0, < 5", "pyvis ==0.3.2", # Visualizing FlowSystem "tsam >= 2.3.1, < 3", # Time series aggregation From b16048b0f86954eadd1c964023ef9d5ae3bd315a Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Tue, 16 Sep 2025 20:20:13 +0200 Subject: [PATCH 06/11] pin --- pyproject.toml | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 920c74ed3..69256fcfc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,33 +78,33 @@ full = [ # Development tools and testing dev = [ - "pytest >= 7.0.0, < 9", - "nbformat >= 4.2.0, < 6", # Pinned due to CI compatibility issues; revisit quarterly - "ruff >= 0.9.0, < 2", # Allow 1.x versions - "pre-commit >= 4.0.0, < 5", - "pyvis ==0.3.2", # Visualizing FlowSystem - "tsam >= 2.3.1, < 3", # Time series aggregation - "scipy >= 1.15.1, < 2", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257 - "gurobipy >= 10.0.0, < 13", - "dash >= 3.0.0, < 4", - "dash-cytoscape >= 1.0.0, < 2", - "dash-daq >= 0.6.0, < 1", - "networkx >= 3.0.0, < 4", - "werkzeug >= 3.0.0, < 4", + "pytest==8.4.2", + "nbformat==5.10.4", + "ruff==0.13.0", + "pre-commit==4.3.0", + "pyvis==0.3.2", + "tsam==2.3.1", + "scipy==1.16.1", + "gurobipy==12.0.3", + "dash==3.0.0", + "dash-cytoscape==1.0.0", + "dash-daq==0.6.0", + "networkx==3.0.0", + "werkzeug==3.0.0", ] # Documentation building docs = [ - "mkdocs-material >= 9.0.0, < 10", - "mkdocstrings-python >= 1.0.0, < 2", - "mkdocs-table-reader-plugin >= 2.0.0, < 4", - "mkdocs-gen-files >= 0.4.0, < 1", - "mkdocs-include-markdown-plugin >= 6.0.0, < 8", - "mkdocs-literate-nav >= 0.6.0, < 1", - "markdown-include >= 0.8.0, < 1", - "pymdown-extensions >= 10.0.0, < 11", - "pygments >= 2.14.0, < 3", - "mike >= 2.0.0, < 3", + "mkdocs-material==9.6.19", + "mkdocstrings-python==1.18.2", + "mkdocs-table-reader-plugin==3.1.0", + "mkdocs-gen-files==0.5.0", + "mkdocs-include-markdown-plugin==7.1.7", + "mkdocs-literate-nav==0.6.2", + "markdown-include==0.8.1", + "pymdown-extensions==10.16.1", + "pygments==2.19.2", + "mike==2.1.4", ] [project.urls] From 0aa6153aa8e1301687f7685d7ba63f96ac546bbe Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Tue, 16 Sep 2025 20:43:57 +0200 Subject: [PATCH 07/11] Fix scipy --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 69256fcfc..904510e99 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,7 +84,7 @@ dev = [ "pre-commit==4.3.0", "pyvis==0.3.2", "tsam==2.3.1", - "scipy==1.16.1", + "scipy==1.15.1", "gurobipy==12.0.3", "dash==3.0.0", "dash-cytoscape==1.0.0", From 11d52d3c947b9eb721417704ed4490ad30e76f29 Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Tue, 16 Sep 2025 21:25:28 +0200 Subject: [PATCH 08/11] Fix mike --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 904510e99..04b58ea2a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,7 +104,7 @@ docs = [ "markdown-include==0.8.1", "pymdown-extensions==10.16.1", "pygments==2.19.2", - "mike==2.1.4", + "mike==2.1.3", ] [project.urls] From 1c663f0591f3b6c371289f99ab18210e5a26b8bc Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Tue, 16 Sep 2025 23:00:20 +0200 Subject: [PATCH 09/11] Fix format --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 04b58ea2a..45b37604d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dependencies = [ "linopy >= 0.5.1, < 0.6", # Widened from patch pin to minor range "netcdf4 >= 1.6.1, < 2", # Utilities - "PyYAML >= 6.0.0, < 7", + "pyyaml >= 6.0.0, < 7", "rich >= 13.0.0, < 15", "tomli >= 2.0.1, < 3; python_version < '3.11'", # Only needed with python 3.10 or earlier # Default solver @@ -54,18 +54,18 @@ dependencies = [ [project.optional-dependencies] # Interactive network visualization with enhanced color picker -network-viz = [ +network_viz = [ "dash >= 3.0.0, < 4", "dash-cytoscape >= 1.0.0, < 2", "dash-daq >= 0.6.0, < 1", "networkx >= 3.0.0, < 4", "werkzeug >= 3.0.0, < 4", - "Flask >= 3.0.0, < 4", # Explicit Flask cap to prevent transitive major bumps + "flask >= 3.0.0, < 4", # Explicit Flask cap to prevent transitive major bumps ] # Full feature set (everything except dev tools) full = [ - "pyvis ==0.3.2", # Visualizing FlowSystem Network + "pyvis==0.3.2", # Visualizing FlowSystem Network "tsam >= 2.3.1, < 3", # Time series aggregation "scipy >= 1.15.1, < 2", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257 "gurobipy >= 10.0.0, < 13", From a34b7d41ddefa74eabb6ee0ed1d725682fd9d882 Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Tue, 16 Sep 2025 23:01:53 +0200 Subject: [PATCH 10/11] Fix Error Message --- flixopt/flow_system.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flixopt/flow_system.py b/flixopt/flow_system.py index 90913b05a..010199e62 100644 --- a/flixopt/flow_system.py +++ b/flixopt/flow_system.py @@ -258,7 +258,7 @@ def start_network_app(self): if not DASH_CYTOSCAPE_AVAILABLE: raise ImportError( f'Network visualization requires optional dependencies. ' - f'Install with: pip install flixopt[viz], flixopt[full] or pip install dash dash_cytoscape networkx werkzeug. ' + f'Install with: pip install flixopt[network_viz], flixopt[full] or pip install dash dash_cytoscape networkx werkzeug. ' f'Original error: {VISUALIZATION_ERROR}' ) @@ -278,7 +278,7 @@ def stop_network_app(self): if not DASH_CYTOSCAPE_AVAILABLE: raise ImportError( f'Network visualization requires optional dependencies. ' - f'Install with: pip install flixopt[viz]. ' + f'Install with: pip install flixopt[network_viz]. ' f'Original error: {VISUALIZATION_ERROR}' ) From 319ef5822c7e87dc5bbe0d397cae8952cded128d Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:35:31 +0200 Subject: [PATCH 11/11] Improve Errors --- flixopt/flow_system.py | 8 +++++--- pyproject.toml | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/flixopt/flow_system.py b/flixopt/flow_system.py index 010199e62..d911b8e63 100644 --- a/flixopt/flow_system.py +++ b/flixopt/flow_system.py @@ -245,7 +245,7 @@ def plot_network( def start_network_app(self): """Visualizes the network structure of a FlowSystem using Dash, Cytoscape, and networkx. - Requires optional dependencies: dash, dash-cytoscape, networkx, werkzeug. + Requires optional dependencies: dash, dash-cytoscape, dash-daq, networkx, flask, werkzeug. """ from .network_app import DASH_CYTOSCAPE_AVAILABLE, VISUALIZATION_ERROR, flow_graph, shownetwork @@ -258,7 +258,8 @@ def start_network_app(self): if not DASH_CYTOSCAPE_AVAILABLE: raise ImportError( f'Network visualization requires optional dependencies. ' - f'Install with: pip install flixopt[network_viz], flixopt[full] or pip install dash dash_cytoscape networkx werkzeug. ' + f'Install with: `pip install flixopt[network_viz]`, `pip install flixopt[full]` ' + f'or: `pip install dash dash-cytoscape dash-daq networkx werkzeug`. ' f'Original error: {VISUALIZATION_ERROR}' ) @@ -278,7 +279,8 @@ def stop_network_app(self): if not DASH_CYTOSCAPE_AVAILABLE: raise ImportError( f'Network visualization requires optional dependencies. ' - f'Install with: pip install flixopt[network_viz]. ' + f'Install with: `pip install flixopt[network_viz]`, `pip install flixopt[full]` ' + f'or: `pip install dash dash-cytoscape dash-daq networkx werkzeug`. ' f'Original error: {VISUALIZATION_ERROR}' ) diff --git a/pyproject.toml b/pyproject.toml index 45b37604d..b1c2461ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,6 +74,7 @@ full = [ "dash-daq >= 0.6.0, < 1", # Visualizing FlowSystem Network as app "networkx >= 3.0.0, < 4", # Visualizing FlowSystem Network as app "werkzeug >= 3.0.0, < 4", # Visualizing FlowSystem Network as app + "flask >= 3.0.0, < 4", # Explicit Flask cap to prevent transitive major bumps ] # Development tools and testing