holoviz-mcp 0.0.1a0__tar.gz → 0.0.1a2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of holoviz-mcp might be problematic. Click here for more details.
- holoviz_mcp-0.0.1a2/.copier-answers.yml +12 -0
- holoviz_mcp-0.0.1a2/.gitattributes +1 -0
- holoviz_mcp-0.0.1a2/.github/CODEOWNERS +1 -0
- holoviz_mcp-0.0.1a2/.github/copilot-instructions.md +23 -0
- holoviz_mcp-0.0.1a2/.github/dependabot.yml +10 -0
- holoviz_mcp-0.0.1a2/.github/prompts/developer_guide.prompt.md +8 -0
- holoviz_mcp-0.0.1a2/.github/prompts/holoviz.prompt.md +142 -0
- holoviz_mcp-0.0.1a2/.github/prompts/ruff_check.prompt.md +17 -0
- holoviz_mcp-0.0.1a2/.github/workflows/build.yml +45 -0
- holoviz_mcp-0.0.1a2/.github/workflows/ci.yml +170 -0
- holoviz_mcp-0.0.1a2/.github/workflows/docs.yml +55 -0
- holoviz_mcp-0.0.1a2/.github/workflows/update-lockfiles.yml +34 -0
- holoviz_mcp-0.0.1a2/.gitignore +383 -0
- holoviz_mcp-0.0.1a2/.pre-commit-config.yaml +69 -0
- holoviz_mcp-0.0.1a2/.prettierrc +7 -0
- holoviz_mcp-0.0.1a2/.vscode/settings.json +4 -0
- holoviz_mcp-0.0.1a2/LICENSE.txt +30 -0
- holoviz_mcp-0.0.1a2/MANIFEST.in +1 -0
- holoviz_mcp-0.0.1a2/PKG-INFO +641 -0
- holoviz_mcp-0.0.1a2/README.md +584 -0
- holoviz_mcp-0.0.1a2/docs/assets/images/holoviz-mcp-introduction.png +0 -0
- holoviz_mcp-0.0.1a2/docs/assets/images/vs-code-output-holoviz.png +0 -0
- holoviz_mcp-0.0.1a2/docs/assets/logo.svg +157 -0
- holoviz_mcp-0.0.1a2/docs/examples.md +13 -0
- holoviz_mcp-0.0.1a2/docs/index.md +1 -0
- holoviz_mcp-0.0.1a2/docs/reference/panel_mcp.md +3 -0
- holoviz_mcp-0.0.1a2/mkdocs.yml +108 -0
- holoviz_mcp-0.0.1a2/pixi.lock +30098 -0
- holoviz_mcp-0.0.1a2/pixi.toml +106 -0
- holoviz_mcp-0.0.1a2/pyproject.toml +172 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/__init__.py +18 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/apps/__init__.py +1 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/apps/configuration_viewer.py +116 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/apps/search.py +314 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/__init__.py +31 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/config.yaml +167 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/loader.py +308 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/models.py +216 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/resources/best-practices/hvplot.md +62 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/resources/best-practices/panel-material-ui.md +318 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/resources/best-practices/panel.md +294 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/schema.json +203 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/__init__.py +1 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/data.py +963 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/models.py +21 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/pages_design.md +407 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/server.py +220 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/hvplot_mcp/__init__.py +1 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/hvplot_mcp/server.py +152 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/panel_mcp/__init__.py +17 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/panel_mcp/data.py +316 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/panel_mcp/models.py +124 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/panel_mcp/server.py +650 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/serve.py +34 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/server.py +77 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/shared/__init__.py +1 -0
- holoviz_mcp-0.0.1a2/src/holoviz_mcp/shared/extract_tools.py +74 -0
- holoviz_mcp-0.0.1a2/tests/__init__.py +1 -0
- holoviz_mcp-0.0.1a2/tests/config/__init__.py +1 -0
- holoviz_mcp-0.0.1a2/tests/config/conftest.py +158 -0
- holoviz_mcp-0.0.1a2/tests/config/test_loader.py +238 -0
- holoviz_mcp-0.0.1a2/tests/config/test_models.py +191 -0
- holoviz_mcp-0.0.1a2/tests/config/test_new_features.py +138 -0
- holoviz_mcp-0.0.1a2/tests/docs_mcp/__init__.py +0 -0
- holoviz_mcp-0.0.1a2/tests/docs_mcp/test_data.py +247 -0
- holoviz_mcp-0.0.1a2/tests/docs_mcp/test_docs_mcp.py +165 -0
- holoviz_mcp-0.0.1a2/tests/docs_mcp/test_docs_mcp_reference_guide.py +336 -0
- holoviz_mcp-0.0.1a2/tests/panel_mcp/__init__.py +0 -0
- holoviz_mcp-0.0.1a2/tests/panel_mcp/test_data.py +42 -0
- holoviz_mcp-0.0.1a2/tests/test_panel_mcp.py +331 -0
- holoviz_mcp-0.0.1a2/tests/test_server.py +30 -0
- holoviz_mcp-0.0.1a2/tests/ui/__init__.py +1 -0
- holoviz_mcp-0.0.1a2/tests/ui/test_ui.py +26 -0
- holoviz_mcp-0.0.1a0/PKG-INFO +0 -6
- holoviz_mcp-0.0.1a0/holoviz_mcp.egg-info/PKG-INFO +0 -6
- holoviz_mcp-0.0.1a0/holoviz_mcp.egg-info/SOURCES.txt +0 -7
- holoviz_mcp-0.0.1a0/holoviz_mcp.egg-info/dependency_links.txt +0 -1
- holoviz_mcp-0.0.1a0/holoviz_mcp.egg-info/top_level.txt +0 -1
- holoviz_mcp-0.0.1a0/main.py +0 -6
- holoviz_mcp-0.0.1a0/pyproject.toml +0 -7
- holoviz_mcp-0.0.1a0/setup.cfg +0 -4
- /holoviz_mcp-0.0.1a0/README.md → /holoviz_mcp-0.0.1a2/src/holoviz_mcp/py.typed +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# This file is managed by Copier; DO NOT EDIT OR REMOVE.
|
|
2
|
+
_commit: ec05cb3
|
|
3
|
+
_src_path: https://github.com/panel-extensions/copier-template-panel-extension
|
|
4
|
+
add_autobump_workflow: true
|
|
5
|
+
author_email: marc.skov.madsen@gmail.com
|
|
6
|
+
author_name: MarcSkovMadsen
|
|
7
|
+
docs_url: https://MarcSkovMadsen.github.io/holoviz-mcp
|
|
8
|
+
github_url: https://github.com/MarcSkovMadsen/holoviz-mcp
|
|
9
|
+
github_user: MarcSkovMadsen
|
|
10
|
+
minimal_python_version: py311
|
|
11
|
+
project_short_description: A Model Context Protocol (MCP) server for the HoloViz ecosystem
|
|
12
|
+
project_slug: holoviz-mcp
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pixi.lock linguist-language=YAML linguist-generated=true
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @MarcSkovMadsen
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# HoloViz MCP
|
|
2
|
+
|
|
3
|
+
This Project provides a Model Context Protocol (MCP) server for the HoloViz ecosystem.
|
|
4
|
+
|
|
5
|
+
For context please:
|
|
6
|
+
|
|
7
|
+
- read the README.md
|
|
8
|
+
|
|
9
|
+
Before developing this project, please #fetch the following:
|
|
10
|
+
|
|
11
|
+
- https://raw.githubusercontent.com/holoviz/holoviz/refs/heads/main/README.md
|
|
12
|
+
- https://gofastmcp.com/getting-started/welcome.md
|
|
13
|
+
- https://gofastmcp.com/llms.txt
|
|
14
|
+
|
|
15
|
+
Before adding tests to this project, please #fetch the following:
|
|
16
|
+
|
|
17
|
+
- https://gofastmcp.com/patterns/testing.md
|
|
18
|
+
|
|
19
|
+
## Best Practices
|
|
20
|
+
|
|
21
|
+
- DO Write code and tests and an experienced, lead Python developer would be proud of.
|
|
22
|
+
- DO integration tests instead of mocking out integrations
|
|
23
|
+
- DO use pytest to test. DO not create custom scripts or notebooks.
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# HoloViz Development Guidelines
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Use the HoloViz ecosystem including Panel, Param, and hvPlot for building interactive data applications following intermediate to expert patterns.
|
|
6
|
+
|
|
7
|
+
## Panel Application Development
|
|
8
|
+
|
|
9
|
+
### Core Architecture Principles
|
|
10
|
+
|
|
11
|
+
**Parameter-Driven Design**
|
|
12
|
+
|
|
13
|
+
- Create applications as `param.Parameterized` or `pn.Viewable` classes
|
|
14
|
+
- Let Parameters drive application state, not widgets directly
|
|
15
|
+
- Structure code so user interactions can be tested using Parameterized classes
|
|
16
|
+
- Use a source `data` parameter to drive your app - structure code so app state resets when source data changes
|
|
17
|
+
|
|
18
|
+
**Widget and Display Patterns**
|
|
19
|
+
|
|
20
|
+
- Create widgets from parameters: `pn.widgets.Select.from_param(state.param.parameter_name, ...)`
|
|
21
|
+
- Display Parameter objects in panes: `pn.pane.HoloViews(state.param.parameter_name, ...)`
|
|
22
|
+
- Prefer `pn.bind` or `@param.depends` without `watch=True` for reactive updates
|
|
23
|
+
- Use `.on_click` for Button interactions over `watch=True` patterns
|
|
24
|
+
- Avoid `pn.bind` or `@pn.depends` with `watch=True`, `.watch`, or `.link` methods as they make apps harder to reason about
|
|
25
|
+
|
|
26
|
+
**other**
|
|
27
|
+
|
|
28
|
+
- prefer using `.servable()` over `.show()` for serving applications
|
|
29
|
+
- use `pn.state.served:` to check if the app is being served instead of `if __name__ == "__main__"
|
|
30
|
+
|
|
31
|
+
### Code Organization
|
|
32
|
+
|
|
33
|
+
**Module Structure**
|
|
34
|
+
|
|
35
|
+
- Put data extractions and transformations in `data.py` - keep clean and reusable without HoloViz dependencies
|
|
36
|
+
- Put plot functions in `plots.py` - keep clean and reusable without Panel code
|
|
37
|
+
- Separate business logic from UI concerns
|
|
38
|
+
|
|
39
|
+
**Component Selection**
|
|
40
|
+
|
|
41
|
+
- Use `panel-graphic-walker` package for Tableau-like data exploration components
|
|
42
|
+
- Use `panel-material-ui` components for new projects or projects already using this package
|
|
43
|
+
- Continue using standard Panel components in existing projects that already use them
|
|
44
|
+
|
|
45
|
+
### Testing Strategy
|
|
46
|
+
|
|
47
|
+
**Testable Architecture**
|
|
48
|
+
|
|
49
|
+
- Structure code so user interactions can be tested through Parameterized classes
|
|
50
|
+
- Separate UI logic from business logic to enable unit testing
|
|
51
|
+
- Use parameter watchers and dependencies for reactive behavior that can be tested
|
|
52
|
+
|
|
53
|
+
## Best Practices
|
|
54
|
+
|
|
55
|
+
### Reactive Programming
|
|
56
|
+
|
|
57
|
+
- Prefer declarative reactive patterns over imperative event handling
|
|
58
|
+
- Use `@param.depends` decorators to create reactive methods
|
|
59
|
+
- Leverage parameter watchers for automatic state management
|
|
60
|
+
|
|
61
|
+
### Performance Considerations
|
|
62
|
+
|
|
63
|
+
- Use `sizing_mode="stretch_width"` for responsive layouts
|
|
64
|
+
- Avoid unnecessary parameter watchers that could cause performance issues
|
|
65
|
+
- Structure data flows to minimize redundant computations
|
|
66
|
+
|
|
67
|
+
### Error Handling
|
|
68
|
+
|
|
69
|
+
- Implement graceful handling of missing or invalid data
|
|
70
|
+
- Provide meaningful feedback to users when operations fail
|
|
71
|
+
- Use safe data access patterns for robust applications
|
|
72
|
+
|
|
73
|
+
## Example Patterns
|
|
74
|
+
|
|
75
|
+
### Parameter-Driven Widget Creation
|
|
76
|
+
```python
|
|
77
|
+
# Good: Widget driven by parameter
|
|
78
|
+
select_widget = pn.widgets.Select.from_param(
|
|
79
|
+
self.param.model_type,
|
|
80
|
+
name="Model Type"
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# Avoid: Manual widget management
|
|
84
|
+
select_widget = pn.widgets.Select(
|
|
85
|
+
options=['Option1', 'Option2'],
|
|
86
|
+
value='Option1'
|
|
87
|
+
)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Reactive Display Updates
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
# Best: Depends functions and methods
|
|
94
|
+
@param.depends('model_results')
|
|
95
|
+
def create_plot(self):
|
|
96
|
+
return create_performance_plot(self.model_results)
|
|
97
|
+
|
|
98
|
+
plot_pane = pn.pane.Matplotlib(
|
|
99
|
+
self.create_plot
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# Good: Bound functions and methods
|
|
103
|
+
def create_plot(self):
|
|
104
|
+
return create_performance_plot(self.model_results)
|
|
105
|
+
|
|
106
|
+
plot_pane = pn.pane.Matplotlib(
|
|
107
|
+
pn.bind(self.create_plot)
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Avoid: Manual updates with watchers
|
|
111
|
+
def update_plot(self):
|
|
112
|
+
self.plot_pane.object = create_performance_plot(self.model_results)
|
|
113
|
+
|
|
114
|
+
self.param.watch(self.update_plot, 'model_results')
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Data-Driven Architecture
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
class DataApp(param.Parameterized):
|
|
121
|
+
data = param.DataFrame(default=pd.DataFrame())
|
|
122
|
+
|
|
123
|
+
@param.depends('data', watch=True)
|
|
124
|
+
def _reset_app_state(self):
|
|
125
|
+
"""Reset all app state when source data changes."""
|
|
126
|
+
# Reset or update parameters but not widgets directly
|
|
127
|
+
...
|
|
128
|
+
|
|
129
|
+
@param.depends('data')
|
|
130
|
+
def _get_xyz(self):
|
|
131
|
+
"""Return some transformed object like a DataFrame or a Plot/ Figure."""
|
|
132
|
+
# Keep this method short by using imported method from data or plots module
|
|
133
|
+
...
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Resources
|
|
137
|
+
|
|
138
|
+
- [Panel Intermediate Tutorials](https://panel.holoviz.org/tutorials/intermediate/index.html)
|
|
139
|
+
- [Panel Expert Tutorials](https://panel.holoviz.org/tutorials/expert/index.html)
|
|
140
|
+
- [Param Documentation](https://param.holoviz.org/)
|
|
141
|
+
- [Panel Material UI Components](https://panel-material-ui.holoviz.org/)
|
|
142
|
+
- [Panel Graphic Walker](https://panel-graphic-walker.holoviz.org/)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
When fixing ruff issues, please follow these guidelines below.
|
|
2
|
+
|
|
3
|
+
Please fix one issue at a time and test the change before progressing to next issue.
|
|
4
|
+
Please fix ruff issues in the 'src' and 'tests' folders only.
|
|
5
|
+
Please fix easy to fix issues before more complex ones.
|
|
6
|
+
For complex ones feel free to ask the user for guidance or help.
|
|
7
|
+
|
|
8
|
+
## Specific Rules
|
|
9
|
+
|
|
10
|
+
### D405
|
|
11
|
+
|
|
12
|
+
Please ensure the docstring change is meaningful to end users and Google style.
|
|
13
|
+
If the summary extends to multiple lines please reformulate instead of breaking the summary into two distinct lines.
|
|
14
|
+
|
|
15
|
+
### ARG001
|
|
16
|
+
|
|
17
|
+
If the argument is an unused pytest fixture please change it to a marker, e.g. to `@pytest.mark.usefixtures("name_of_fixture")`.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: Build
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
tags:
|
|
8
|
+
- "*"
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
15
|
+
with:
|
|
16
|
+
fetch-depth: 0
|
|
17
|
+
- name: Set up pixi
|
|
18
|
+
uses: prefix-dev/setup-pixi@ba3bb36eb2066252b2363392b7739741bb777659 # v0.8.1
|
|
19
|
+
with:
|
|
20
|
+
environments: build
|
|
21
|
+
- name: Build project
|
|
22
|
+
run: pixi run -e build build-wheel
|
|
23
|
+
- name: Check package
|
|
24
|
+
run: pixi run -e build check-wheel
|
|
25
|
+
- name: Upload package
|
|
26
|
+
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
|
|
27
|
+
with:
|
|
28
|
+
name: artifact
|
|
29
|
+
path: dist/*
|
|
30
|
+
|
|
31
|
+
release:
|
|
32
|
+
name: Publish package
|
|
33
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
34
|
+
needs: [build]
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
permissions:
|
|
37
|
+
id-token: write
|
|
38
|
+
environment: pypi
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
|
|
41
|
+
with:
|
|
42
|
+
name: artifact
|
|
43
|
+
path: dist
|
|
44
|
+
- name: Publish package on PyPi
|
|
45
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
branches:
|
|
5
|
+
- "*"
|
|
6
|
+
push:
|
|
7
|
+
branches:
|
|
8
|
+
- main
|
|
9
|
+
# Automatically stop old builds on the same branch/PR
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
jobs:
|
|
14
|
+
setup:
|
|
15
|
+
name: Setup workflow
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
permissions:
|
|
18
|
+
pull-requests: read
|
|
19
|
+
outputs:
|
|
20
|
+
code_change: ${{ steps.filter.outputs.code }}
|
|
21
|
+
matrix: ${{ env.MATRIX }}
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
if: github.event_name != 'pull_request'
|
|
25
|
+
- name: Check for code changes
|
|
26
|
+
uses: dorny/paths-filter@v3
|
|
27
|
+
id: filter
|
|
28
|
+
with:
|
|
29
|
+
filters: |
|
|
30
|
+
code:
|
|
31
|
+
- 'src/**'
|
|
32
|
+
- 'pyproject.toml'
|
|
33
|
+
- '.github/workflows/ci.yaml'
|
|
34
|
+
- name: Set matrix option
|
|
35
|
+
run: |
|
|
36
|
+
if [[ '${{ github.event_name }}' == 'workflow_dispatch' ]]; then
|
|
37
|
+
OPTION=${{ github.event.inputs.target }}
|
|
38
|
+
elif [[ '${{ github.event_name }}' == 'schedule' ]]; then
|
|
39
|
+
OPTION="full"
|
|
40
|
+
elif [[ '${{ github.event_name }}' == 'push' && '${{ github.ref_type }}' == 'tag' ]]; then
|
|
41
|
+
OPTION="full"
|
|
42
|
+
else
|
|
43
|
+
OPTION="default"
|
|
44
|
+
fi
|
|
45
|
+
echo "MATRIX_OPTION=$OPTION" >> $GITHUB_ENV
|
|
46
|
+
- name: Set test matrix with 'default' option
|
|
47
|
+
if: env.MATRIX_OPTION == 'default'
|
|
48
|
+
run: |
|
|
49
|
+
MATRIX=$(jq -nsc '{
|
|
50
|
+
"os": ["ubuntu-latest", "macos-latest", "windows-latest"],
|
|
51
|
+
"environment": ["test-310", "test-312"],
|
|
52
|
+
}')
|
|
53
|
+
echo "MATRIX=$MATRIX" >> $GITHUB_ENV
|
|
54
|
+
- name: Set test matrix with 'full' option
|
|
55
|
+
if: env.MATRIX_OPTION == 'full'
|
|
56
|
+
run: |
|
|
57
|
+
MATRIX=$(jq -nsc '{
|
|
58
|
+
"os": ["ubuntu-latest", "macos-latest", "windows-latest"],
|
|
59
|
+
"environment": ["test-310", "test-311", "test-312"]
|
|
60
|
+
}')
|
|
61
|
+
echo "MATRIX=$MATRIX" >> $GITHUB_ENV
|
|
62
|
+
- name: Set test matrix with 'downstream' option
|
|
63
|
+
if: env.MATRIX_OPTION == 'downstream'
|
|
64
|
+
run: |
|
|
65
|
+
MATRIX=$(jq -nsc '{
|
|
66
|
+
"os": ["ubuntu-latest"],
|
|
67
|
+
"environment": ["test-311"]
|
|
68
|
+
}')
|
|
69
|
+
echo "MATRIX=$MATRIX" >> $GITHUB_ENV
|
|
70
|
+
|
|
71
|
+
pixi_lock:
|
|
72
|
+
name: Pixi lock
|
|
73
|
+
runs-on: ubuntu-latest
|
|
74
|
+
steps:
|
|
75
|
+
- uses: holoviz-dev/holoviz_tasks/pixi_lock@v0
|
|
76
|
+
with:
|
|
77
|
+
cache: ${{ github.event.inputs.cache == 'true' || github.event.inputs.cache == '' }}
|
|
78
|
+
|
|
79
|
+
pre-commit:
|
|
80
|
+
timeout-minutes: 30
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
steps:
|
|
83
|
+
- name: Checkout branch
|
|
84
|
+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
85
|
+
- name: Set up pixi
|
|
86
|
+
uses: prefix-dev/setup-pixi@ba3bb36eb2066252b2363392b7739741bb777659 # v0.8.1
|
|
87
|
+
with:
|
|
88
|
+
environments: default lint
|
|
89
|
+
- name: pre-commit
|
|
90
|
+
run: pixi run pre-commit-run --color=always --show-diff-on-failure
|
|
91
|
+
pytest:
|
|
92
|
+
timeout-minutes: 30
|
|
93
|
+
runs-on: ubuntu-latest
|
|
94
|
+
strategy:
|
|
95
|
+
fail-fast: false
|
|
96
|
+
matrix:
|
|
97
|
+
environment:
|
|
98
|
+
- py311
|
|
99
|
+
- py312
|
|
100
|
+
os:
|
|
101
|
+
- ubuntu-latest
|
|
102
|
+
- macos-latest
|
|
103
|
+
- windows-latest
|
|
104
|
+
steps:
|
|
105
|
+
- name: Checkout branch
|
|
106
|
+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
107
|
+
with:
|
|
108
|
+
fetch-depth: 0
|
|
109
|
+
- name: Set up pixi
|
|
110
|
+
uses: prefix-dev/setup-pixi@ba3bb36eb2066252b2363392b7739741bb777659 # v0.8.1
|
|
111
|
+
with:
|
|
112
|
+
environments: ${{ matrix.environment }}
|
|
113
|
+
- name: Install repository
|
|
114
|
+
run: pixi run -e ${{ matrix.environment }} postinstall
|
|
115
|
+
- name: Run pytest
|
|
116
|
+
run: pixi run -e ${{ matrix.environment }} test-coverage --color=yes
|
|
117
|
+
|
|
118
|
+
pytest_ui:
|
|
119
|
+
name: ui:${{ matrix.environment }}:${{ matrix.os }}
|
|
120
|
+
needs: [pre-commit, setup, pixi_lock]
|
|
121
|
+
runs-on: ${{ matrix.os }}
|
|
122
|
+
if: needs.setup.outputs.code_change == 'true'
|
|
123
|
+
strategy:
|
|
124
|
+
fail-fast: false
|
|
125
|
+
matrix:
|
|
126
|
+
environment: ["test-ui"]
|
|
127
|
+
os: ["ubuntu-latest", "macos-latest", "windows-latest"]
|
|
128
|
+
timeout-minutes: 60
|
|
129
|
+
env:
|
|
130
|
+
PANEL_LOG_LEVEL: info
|
|
131
|
+
steps:
|
|
132
|
+
- name: Checkout branch
|
|
133
|
+
uses: actions/checkout@v4.2.2
|
|
134
|
+
with:
|
|
135
|
+
fetch-depth: 0
|
|
136
|
+
|
|
137
|
+
- name: Set up Pixi
|
|
138
|
+
uses: prefix-dev/setup-pixi@v0.8.1
|
|
139
|
+
with:
|
|
140
|
+
environments: ${{ matrix.environment }}
|
|
141
|
+
|
|
142
|
+
- name: Set up Python
|
|
143
|
+
uses: actions/setup-python@v5
|
|
144
|
+
with:
|
|
145
|
+
python-version: '3.11'
|
|
146
|
+
|
|
147
|
+
- name: Install Dependencies
|
|
148
|
+
run: |
|
|
149
|
+
pixi run -e ${{ matrix.environment }} postinstall
|
|
150
|
+
|
|
151
|
+
- name: Verify Pixi Installation
|
|
152
|
+
run: pixi --version
|
|
153
|
+
|
|
154
|
+
- name: Configure Coverage
|
|
155
|
+
run: |
|
|
156
|
+
echo "[run]" > .uicoveragerc
|
|
157
|
+
echo "concurrency = greenlet" >> .uicoveragerc
|
|
158
|
+
|
|
159
|
+
- name: Test UI
|
|
160
|
+
run: |
|
|
161
|
+
FAIL="--screenshot only-on-failure --full-page-screenshot --output ui_screenshots --tracing retain-on-failure"
|
|
162
|
+
pixi run -e ${{ matrix.environment }} test-ui --cov-config=.uicoveragerc $FAIL
|
|
163
|
+
|
|
164
|
+
- name: Upload UI Screenshots
|
|
165
|
+
uses: actions/upload-artifact@v4
|
|
166
|
+
if: always()
|
|
167
|
+
with:
|
|
168
|
+
name: ui_screenshots_${{ runner.os }}
|
|
169
|
+
path: ./ui_screenshots
|
|
170
|
+
if-no-files-found: ignore
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
name: Build documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
pages: write
|
|
12
|
+
id-token: write
|
|
13
|
+
|
|
14
|
+
# Allow one concurrent deployment
|
|
15
|
+
concurrency:
|
|
16
|
+
group: "pages"
|
|
17
|
+
cancel-in-progress: true
|
|
18
|
+
|
|
19
|
+
# Default to bash
|
|
20
|
+
defaults:
|
|
21
|
+
run:
|
|
22
|
+
shell: bash
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
build:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 0
|
|
32
|
+
|
|
33
|
+
- name: Set up Pixi
|
|
34
|
+
uses: prefix-dev/setup-pixi@ba3bb36eb2066252b2363392b7739741bb777659 # v0.8.1
|
|
35
|
+
with:
|
|
36
|
+
environments: docs
|
|
37
|
+
|
|
38
|
+
- name: Build documentation
|
|
39
|
+
run: pixi run -e docs docs-build
|
|
40
|
+
|
|
41
|
+
- name: Upload artifact
|
|
42
|
+
uses: actions/upload-pages-artifact@v3
|
|
43
|
+
with:
|
|
44
|
+
path: ./site
|
|
45
|
+
|
|
46
|
+
deploy:
|
|
47
|
+
environment:
|
|
48
|
+
name: github-pages
|
|
49
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
needs: build
|
|
52
|
+
steps:
|
|
53
|
+
- name: Deploy to GitHub Pages
|
|
54
|
+
id: deployment
|
|
55
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: Update lockfiles
|
|
2
|
+
permissions:
|
|
3
|
+
contents: write
|
|
4
|
+
pull-requests: write
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
schedule:
|
|
9
|
+
- cron: 0 5 1 * *
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
pixi-update:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
16
|
+
- name: Set up pixi
|
|
17
|
+
uses: prefix-dev/setup-pixi@ba3bb36eb2066252b2363392b7739741bb777659 # v0.8.1
|
|
18
|
+
with:
|
|
19
|
+
run-install: false
|
|
20
|
+
- name: Update lockfiles
|
|
21
|
+
run: |
|
|
22
|
+
pixi update --json --no-install | pixi exec pixi-diff-to-markdown >> diff.md
|
|
23
|
+
- name: Create pull request
|
|
24
|
+
uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
|
|
25
|
+
with:
|
|
26
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
27
|
+
commit-message: Update pixi lockfile
|
|
28
|
+
title: Update pixi lockfile
|
|
29
|
+
body-path: diff.md
|
|
30
|
+
branch: update-pixi
|
|
31
|
+
base: main
|
|
32
|
+
labels: pixi
|
|
33
|
+
delete-branch: true
|
|
34
|
+
add-paths: pixi.lock
|