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.

Files changed (82) hide show
  1. holoviz_mcp-0.0.1a2/.copier-answers.yml +12 -0
  2. holoviz_mcp-0.0.1a2/.gitattributes +1 -0
  3. holoviz_mcp-0.0.1a2/.github/CODEOWNERS +1 -0
  4. holoviz_mcp-0.0.1a2/.github/copilot-instructions.md +23 -0
  5. holoviz_mcp-0.0.1a2/.github/dependabot.yml +10 -0
  6. holoviz_mcp-0.0.1a2/.github/prompts/developer_guide.prompt.md +8 -0
  7. holoviz_mcp-0.0.1a2/.github/prompts/holoviz.prompt.md +142 -0
  8. holoviz_mcp-0.0.1a2/.github/prompts/ruff_check.prompt.md +17 -0
  9. holoviz_mcp-0.0.1a2/.github/workflows/build.yml +45 -0
  10. holoviz_mcp-0.0.1a2/.github/workflows/ci.yml +170 -0
  11. holoviz_mcp-0.0.1a2/.github/workflows/docs.yml +55 -0
  12. holoviz_mcp-0.0.1a2/.github/workflows/update-lockfiles.yml +34 -0
  13. holoviz_mcp-0.0.1a2/.gitignore +383 -0
  14. holoviz_mcp-0.0.1a2/.pre-commit-config.yaml +69 -0
  15. holoviz_mcp-0.0.1a2/.prettierrc +7 -0
  16. holoviz_mcp-0.0.1a2/.vscode/settings.json +4 -0
  17. holoviz_mcp-0.0.1a2/LICENSE.txt +30 -0
  18. holoviz_mcp-0.0.1a2/MANIFEST.in +1 -0
  19. holoviz_mcp-0.0.1a2/PKG-INFO +641 -0
  20. holoviz_mcp-0.0.1a2/README.md +584 -0
  21. holoviz_mcp-0.0.1a2/docs/assets/images/holoviz-mcp-introduction.png +0 -0
  22. holoviz_mcp-0.0.1a2/docs/assets/images/vs-code-output-holoviz.png +0 -0
  23. holoviz_mcp-0.0.1a2/docs/assets/logo.svg +157 -0
  24. holoviz_mcp-0.0.1a2/docs/examples.md +13 -0
  25. holoviz_mcp-0.0.1a2/docs/index.md +1 -0
  26. holoviz_mcp-0.0.1a2/docs/reference/panel_mcp.md +3 -0
  27. holoviz_mcp-0.0.1a2/mkdocs.yml +108 -0
  28. holoviz_mcp-0.0.1a2/pixi.lock +30098 -0
  29. holoviz_mcp-0.0.1a2/pixi.toml +106 -0
  30. holoviz_mcp-0.0.1a2/pyproject.toml +172 -0
  31. holoviz_mcp-0.0.1a2/src/holoviz_mcp/__init__.py +18 -0
  32. holoviz_mcp-0.0.1a2/src/holoviz_mcp/apps/__init__.py +1 -0
  33. holoviz_mcp-0.0.1a2/src/holoviz_mcp/apps/configuration_viewer.py +116 -0
  34. holoviz_mcp-0.0.1a2/src/holoviz_mcp/apps/search.py +314 -0
  35. holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/__init__.py +31 -0
  36. holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/config.yaml +167 -0
  37. holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/loader.py +308 -0
  38. holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/models.py +216 -0
  39. holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/resources/best-practices/hvplot.md +62 -0
  40. holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/resources/best-practices/panel-material-ui.md +318 -0
  41. holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/resources/best-practices/panel.md +294 -0
  42. holoviz_mcp-0.0.1a2/src/holoviz_mcp/config/schema.json +203 -0
  43. holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/__init__.py +1 -0
  44. holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/data.py +963 -0
  45. holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/models.py +21 -0
  46. holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/pages_design.md +407 -0
  47. holoviz_mcp-0.0.1a2/src/holoviz_mcp/docs_mcp/server.py +220 -0
  48. holoviz_mcp-0.0.1a2/src/holoviz_mcp/hvplot_mcp/__init__.py +1 -0
  49. holoviz_mcp-0.0.1a2/src/holoviz_mcp/hvplot_mcp/server.py +152 -0
  50. holoviz_mcp-0.0.1a2/src/holoviz_mcp/panel_mcp/__init__.py +17 -0
  51. holoviz_mcp-0.0.1a2/src/holoviz_mcp/panel_mcp/data.py +316 -0
  52. holoviz_mcp-0.0.1a2/src/holoviz_mcp/panel_mcp/models.py +124 -0
  53. holoviz_mcp-0.0.1a2/src/holoviz_mcp/panel_mcp/server.py +650 -0
  54. holoviz_mcp-0.0.1a2/src/holoviz_mcp/serve.py +34 -0
  55. holoviz_mcp-0.0.1a2/src/holoviz_mcp/server.py +77 -0
  56. holoviz_mcp-0.0.1a2/src/holoviz_mcp/shared/__init__.py +1 -0
  57. holoviz_mcp-0.0.1a2/src/holoviz_mcp/shared/extract_tools.py +74 -0
  58. holoviz_mcp-0.0.1a2/tests/__init__.py +1 -0
  59. holoviz_mcp-0.0.1a2/tests/config/__init__.py +1 -0
  60. holoviz_mcp-0.0.1a2/tests/config/conftest.py +158 -0
  61. holoviz_mcp-0.0.1a2/tests/config/test_loader.py +238 -0
  62. holoviz_mcp-0.0.1a2/tests/config/test_models.py +191 -0
  63. holoviz_mcp-0.0.1a2/tests/config/test_new_features.py +138 -0
  64. holoviz_mcp-0.0.1a2/tests/docs_mcp/__init__.py +0 -0
  65. holoviz_mcp-0.0.1a2/tests/docs_mcp/test_data.py +247 -0
  66. holoviz_mcp-0.0.1a2/tests/docs_mcp/test_docs_mcp.py +165 -0
  67. holoviz_mcp-0.0.1a2/tests/docs_mcp/test_docs_mcp_reference_guide.py +336 -0
  68. holoviz_mcp-0.0.1a2/tests/panel_mcp/__init__.py +0 -0
  69. holoviz_mcp-0.0.1a2/tests/panel_mcp/test_data.py +42 -0
  70. holoviz_mcp-0.0.1a2/tests/test_panel_mcp.py +331 -0
  71. holoviz_mcp-0.0.1a2/tests/test_server.py +30 -0
  72. holoviz_mcp-0.0.1a2/tests/ui/__init__.py +1 -0
  73. holoviz_mcp-0.0.1a2/tests/ui/test_ui.py +26 -0
  74. holoviz_mcp-0.0.1a0/PKG-INFO +0 -6
  75. holoviz_mcp-0.0.1a0/holoviz_mcp.egg-info/PKG-INFO +0 -6
  76. holoviz_mcp-0.0.1a0/holoviz_mcp.egg-info/SOURCES.txt +0 -7
  77. holoviz_mcp-0.0.1a0/holoviz_mcp.egg-info/dependency_links.txt +0 -1
  78. holoviz_mcp-0.0.1a0/holoviz_mcp.egg-info/top_level.txt +0 -1
  79. holoviz_mcp-0.0.1a0/main.py +0 -6
  80. holoviz_mcp-0.0.1a0/pyproject.toml +0 -7
  81. holoviz_mcp-0.0.1a0/setup.cfg +0 -4
  82. /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,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: monthly
7
+ groups:
8
+ gh-actions:
9
+ patterns:
10
+ - "*"
@@ -0,0 +1,8 @@
1
+ For context please read :
2
+
3
+ - the README.md
4
+
5
+ and #fetch:
6
+
7
+ - https://gofastmcp.com/getting-started/welcome.md
8
+ - https://gofastmcp.com/patterns/testing.md
@@ -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