jupyterlab-mlflow 0.2.1__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.
Files changed (57) hide show
  1. jupyterlab_mlflow-0.2.1/.eslintrc.js +26 -0
  2. jupyterlab_mlflow-0.2.1/.github/workflows/ci.yml +95 -0
  3. jupyterlab_mlflow-0.2.1/.github/workflows/publish.yml +97 -0
  4. jupyterlab_mlflow-0.2.1/.gitignore +67 -0
  5. jupyterlab_mlflow-0.2.1/.prettierrc +8 -0
  6. jupyterlab_mlflow-0.2.1/.releaserc.json +21 -0
  7. jupyterlab_mlflow-0.2.1/LICENSE +30 -0
  8. jupyterlab_mlflow-0.2.1/Makefile +64 -0
  9. jupyterlab_mlflow-0.2.1/PKG-INFO +229 -0
  10. jupyterlab_mlflow-0.2.1/PUBLISHING.md +155 -0
  11. jupyterlab_mlflow-0.2.1/QUICK_START.md +69 -0
  12. jupyterlab_mlflow-0.2.1/README.md +167 -0
  13. jupyterlab_mlflow-0.2.1/TESTING.md +141 -0
  14. jupyterlab_mlflow-0.2.1/install.json +12 -0
  15. jupyterlab_mlflow-0.2.1/jupyter-config/jupyter_lab_config.d/jupyterlab-mlflow.json +8 -0
  16. jupyterlab_mlflow-0.2.1/jupyter-config/jupyter_notebook_config.d/jupyterlab-mlflow.json +8 -0
  17. jupyterlab_mlflow-0.2.1/jupyter-config/jupyterlab_mlflow.json +8 -0
  18. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/__init__.py +22 -0
  19. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/_version.py +6 -0
  20. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/labextension/package.json +103 -0
  21. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/labextension/schemas/jupyterlab-mlflow/package.json.orig +98 -0
  22. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/labextension/schemas/jupyterlab-mlflow/plugin.json +17 -0
  23. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/labextension/static/218.0cf25be5c060df009f4a.js +1 -0
  24. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/labextension/static/665.f3ea36ea04224fd9c2f3.js +1 -0
  25. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/labextension/static/remoteEntry.e03595deb6c914327f69.js +1 -0
  26. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/labextension/static/style.js +4 -0
  27. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/labextension/static/third-party-licenses.json +16 -0
  28. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/schema/plugin.json +17 -0
  29. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/serverextension/__init__.py +39 -0
  30. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/serverextension/handlers.py +522 -0
  31. jupyterlab_mlflow-0.2.1/jupyterlab_mlflow/serverextension/mlflow_server.py +214 -0
  32. jupyterlab_mlflow-0.2.1/package-lock.json +14290 -0
  33. jupyterlab_mlflow-0.2.1/package.json +98 -0
  34. jupyterlab_mlflow-0.2.1/pyproject.toml +71 -0
  35. jupyterlab_mlflow-0.2.1/setup_dev.py +89 -0
  36. jupyterlab_mlflow-0.2.1/src/components/ArtifactViewer.tsx +117 -0
  37. jupyterlab_mlflow-0.2.1/src/components/DetailsView.tsx +790 -0
  38. jupyterlab_mlflow-0.2.1/src/components/ListView.tsx +500 -0
  39. jupyterlab_mlflow-0.2.1/src/components/MLflowPanel.tsx +195 -0
  40. jupyterlab_mlflow-0.2.1/src/components/SettingsPanel.tsx +255 -0
  41. jupyterlab_mlflow-0.2.1/src/components/ShortcutsPanel.tsx +374 -0
  42. jupyterlab_mlflow-0.2.1/src/components/TreeView.tsx +443 -0
  43. jupyterlab_mlflow-0.2.1/src/index.ts +170 -0
  44. jupyterlab_mlflow-0.2.1/src/mlflow.ts +375 -0
  45. jupyterlab_mlflow-0.2.1/src/settings.ts +91 -0
  46. jupyterlab_mlflow-0.2.1/src/utils/codegen.ts +126 -0
  47. jupyterlab_mlflow-0.2.1/src/utils/copy.ts +115 -0
  48. jupyterlab_mlflow-0.2.1/src/utils/format.ts +14 -0
  49. jupyterlab_mlflow-0.2.1/src/widget.tsx +59 -0
  50. jupyterlab_mlflow-0.2.1/start_test.sh +21 -0
  51. jupyterlab_mlflow-0.2.1/style/icons/logo.png +0 -0
  52. jupyterlab_mlflow-0.2.1/style/index.css +727 -0
  53. jupyterlab_mlflow-0.2.1/test_api_endpoints.sh +71 -0
  54. jupyterlab_mlflow-0.2.1/test_local.sh +64 -0
  55. jupyterlab_mlflow-0.2.1/test_server_extension.sh +78 -0
  56. jupyterlab_mlflow-0.2.1/tsconfig.json +28 -0
  57. jupyterlab_mlflow-0.2.1/webpack.config.js +49 -0
@@ -0,0 +1,26 @@
1
+ module.exports = {
2
+ extends: [
3
+ 'eslint:recommended',
4
+ 'plugin:@typescript-eslint/recommended',
5
+ 'prettier'
6
+ ],
7
+ parser: '@typescript-eslint/parser',
8
+ parserOptions: {
9
+ ecmaVersion: 2020,
10
+ sourceType: 'module',
11
+ ecmaFeatures: {
12
+ jsx: true
13
+ }
14
+ },
15
+ plugins: ['@typescript-eslint'],
16
+ rules: {
17
+ '@typescript-eslint/no-explicit-any': 'warn',
18
+ '@typescript-eslint/explicit-module-boundary-types': 'off'
19
+ },
20
+ env: {
21
+ browser: true,
22
+ node: true,
23
+ es6: true
24
+ }
25
+ };
26
+
@@ -0,0 +1,95 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master]
6
+ pull_request:
7
+ branches: [main, master]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ['3.9', '3.10', '3.11']
15
+ node-version: ['18', '20']
16
+
17
+ steps:
18
+ - name: Checkout repository
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Set up Node.js ${{ matrix.node-version }}
22
+ uses: actions/setup-node@v4
23
+ with:
24
+ node-version: ${{ matrix.node-version }}
25
+
26
+ - name: Set up Python ${{ matrix.python-version }}
27
+ uses: actions/setup-python@v5
28
+ with:
29
+ python-version: ${{ matrix.python-version }}
30
+
31
+ - name: Install JupyterLab
32
+ run: |
33
+ python -m pip install --upgrade pip
34
+ pip install "jupyterlab>=4.0.0,<5"
35
+
36
+ - name: Install Node.js dependencies
37
+ run: |
38
+ npm install -g npm
39
+ npm ci
40
+
41
+ - name: Install Python dependencies
42
+ run: |
43
+ pip install -e .[test]
44
+
45
+ - name: Build extension
46
+ run: |
47
+ npm run clean:lib
48
+ npm run clean:labextension
49
+ npm run build:lib
50
+ python -m jupyter labextension build .
51
+
52
+ - name: Install build dependencies
53
+ run: |
54
+ pip install build hatchling hatch-nodejs-version
55
+
56
+ - name: Build Python package
57
+ run: |
58
+ python -m build
59
+
60
+ - name: Check package contents
61
+ run: |
62
+ pip install check-wheel-contents
63
+ check-wheel-contents dist/*.whl || true
64
+
65
+ version:
66
+ runs-on: ubuntu-latest
67
+ needs: test
68
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
69
+ permissions:
70
+ contents: write # Required to push version bumps and tags
71
+ steps:
72
+ - name: Checkout repository
73
+ uses: actions/checkout@v4
74
+ with:
75
+ fetch-depth: 0 # Required for semantic-release to analyze commits
76
+ token: ${{ secrets.GITHUB_TOKEN }}
77
+
78
+ - name: Set up Node.js
79
+ uses: actions/setup-node@v4
80
+ with:
81
+ node-version: '20'
82
+
83
+ - name: Configure Git
84
+ run: |
85
+ git config --local user.email "action@github.com"
86
+ git config --local user.name "GitHub Action"
87
+
88
+ - name: Install dependencies
89
+ run: npm ci
90
+
91
+ - name: Run semantic-release
92
+ env:
93
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
94
+ run: npx semantic-release
95
+
@@ -0,0 +1,97 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published] # Triggers on manual GitHub releases only
6
+ workflow_dispatch: # Allow manual triggering
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Checkout repository
13
+ uses: actions/checkout@v4
14
+
15
+ - name: Set up Node.js
16
+ uses: actions/setup-node@v4
17
+ with:
18
+ node-version: '20'
19
+
20
+ - name: Set up Python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: '3.11'
24
+
25
+ - name: Install JupyterLab
26
+ run: |
27
+ python -m pip install --upgrade pip
28
+ pip install "jupyterlab>=4.0.0,<5"
29
+
30
+ - name: Install Node.js dependencies
31
+ run: |
32
+ npm install -g npm
33
+ npm ci
34
+
35
+ - name: Build extension
36
+ run: |
37
+ npm run clean:lib
38
+ npm run clean:labextension
39
+ npm run build:lib
40
+ python -m jupyter labextension build .
41
+
42
+ - name: Install build dependencies
43
+ run: |
44
+ pip install build hatchling hatch-nodejs-version
45
+
46
+ - name: Build Python package
47
+ run: |
48
+ python -m build
49
+
50
+ - name: Upload artifacts
51
+ uses: actions/upload-artifact@v4
52
+ with:
53
+ name: python-dist
54
+ path: dist/
55
+ retention-days: 7
56
+
57
+ publish-testpypi:
58
+ runs-on: ubuntu-latest
59
+ needs: build
60
+ if: github.event_name == 'workflow_dispatch' && (github.event.inputs.repository == 'testpypi' || github.event.inputs.repository == '') || github.event_name == 'release' && contains(github.event.release.tag_name, 'rc')
61
+ environment:
62
+ name: testpypi
63
+ permissions:
64
+ id-token: write # Required for TestPyPI trusted publishing
65
+ steps:
66
+ - name: Download artifacts
67
+ uses: actions/download-artifact@v4
68
+ with:
69
+ name: python-dist
70
+ path: dist/
71
+
72
+ - name: Publish package to TestPyPI
73
+ uses: pypa/gh-action-pypi-publish@release/v1
74
+ with:
75
+ packages-dir: dist/
76
+ repository-url: https://test.pypi.org/legacy/
77
+
78
+ publish-pypi:
79
+ runs-on: ubuntu-latest
80
+ needs: build
81
+ if: github.event_name == 'release' && !contains(github.event.release.tag_name, 'rc') || github.event_name == 'workflow_dispatch' && github.event.inputs.repository == 'pypi'
82
+ environment:
83
+ name: pypi
84
+ permissions:
85
+ id-token: write # Required for PyPI trusted publishing
86
+ steps:
87
+ - name: Download artifacts
88
+ uses: actions/download-artifact@v4
89
+ with:
90
+ name: python-dist
91
+ path: dist/
92
+
93
+ - name: Publish package to PyPI
94
+ uses: pypa/gh-action-pypi-publish@release/v1
95
+ with:
96
+ packages-dir: dist/
97
+
@@ -0,0 +1,67 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Jupyter
24
+ .ipynb_checkpoints
25
+ *.ipynb
26
+
27
+ # Node
28
+ node_modules/
29
+ npm-debug.log
30
+ yarn-error.log
31
+ lerna-debug.log
32
+
33
+ # TypeScript
34
+ *.tsbuildinfo
35
+
36
+ # Lab extension files
37
+ jupyterlab_mlflow/labextension
38
+ *.tsbuildinfo
39
+
40
+ # IDEs
41
+ .vscode/
42
+ .idea/
43
+ *.swp
44
+ *.swo
45
+ *~
46
+
47
+ # OS
48
+ .DS_Store
49
+ Thumbs.db
50
+
51
+ # Environment
52
+ .env
53
+ .venv
54
+ env/
55
+ venv/
56
+
57
+ # Testing
58
+ .pytest_cache/
59
+ .coverage
60
+ htmlcov/
61
+
62
+ # Build artifacts
63
+ *.log
64
+
65
+ # MLflow local data
66
+ mlruns/
67
+
@@ -0,0 +1,8 @@
1
+ {
2
+ "singleQuote": true,
3
+ "trailingComma": "es5",
4
+ "printWidth": 100,
5
+ "tabWidth": 2,
6
+ "semi": true
7
+ }
8
+
@@ -0,0 +1,21 @@
1
+ {
2
+ "branches": ["main"],
3
+ "plugins": [
4
+ "@semantic-release/commit-analyzer",
5
+ "@semantic-release/release-notes-generator",
6
+ [
7
+ "@semantic-release/npm",
8
+ {
9
+ "npmPublish": false
10
+ }
11
+ ],
12
+ [
13
+ "@semantic-release/git",
14
+ {
15
+ "assets": ["package.json"],
16
+ "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
17
+ }
18
+ ]
19
+ ]
20
+ }
21
+
@@ -0,0 +1,30 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2024, JupyterLab MLflow Contributors
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
@@ -0,0 +1,64 @@
1
+ # Makefile for JupyterLab MLflow Extension Development
2
+
3
+ # Configuration
4
+ PYTHON_VERSION := 3.9
5
+ JUPYTERLAB_CORE_PATH := $(HOME)/Library/Python/$(PYTHON_VERSION)/lib/python/site-packages/jupyterlab/staging
6
+ LABEXTENSION_PATH := $(HOME)/Library/Python/$(PYTHON_VERSION)/share/jupyter/labextensions/jupyterlab-mlflow
7
+ SOURCE_LABEXTENSION := jupyterlab_mlflow/labextension
8
+
9
+ # Colors for output
10
+ GREEN := \033[0;32m
11
+ YELLOW := \033[0;33m
12
+ NC := \033[0m # No Color
13
+
14
+ .PHONY: help build build-lib build-labextension install clean install-deps rebuild dev-install
15
+
16
+ help: ## Show this help message
17
+ @echo "JupyterLab MLflow Extension - Development Makefile"
18
+ @echo ""
19
+ @echo "Available targets:"
20
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " $(GREEN)%-20s$(NC) %s\n", $$1, $$2}'
21
+
22
+ build-lib: ## Build TypeScript source files
23
+ @echo "$(YELLOW)Building TypeScript...$(NC)"
24
+ npm run build:lib
25
+
26
+ build-labextension: build-lib ## Build JupyterLab extension bundle
27
+ @echo "$(YELLOW)Building labextension...$(NC)"
28
+ node node_modules/@jupyterlab/builder/lib/build-labextension.js . --core-path $(JUPYTERLAB_CORE_PATH)
29
+
30
+ install: build-labextension ## Install extension to JupyterLab (removes old, copies new)
31
+ @echo "$(YELLOW)Installing extension...$(NC)"
32
+ @if [ -d "$(LABEXTENSION_PATH)" ]; then \
33
+ rm -rf "$(LABEXTENSION_PATH)"; \
34
+ fi
35
+ @cp -r $(SOURCE_LABEXTENSION) "$(LABEXTENSION_PATH)"
36
+ @echo "$(GREEN)✅ Extension installed to $(LABEXTENSION_PATH)$(NC)"
37
+
38
+ rebuild: clean build-labextension install ## Clean, build, and install extension
39
+
40
+ dev-install: build-labextension ## Quick install for development (assumes build already done)
41
+ @echo "$(YELLOW)Installing extension (dev mode)...$(NC)"
42
+ @if [ -d "$(LABEXTENSION_PATH)" ]; then \
43
+ rm -rf "$(LABEXTENSION_PATH)"; \
44
+ fi
45
+ @cp -r $(SOURCE_LABEXTENSION) "$(LABEXTENSION_PATH)"
46
+ @echo "$(GREEN)✅ Extension installed$(NC)"
47
+
48
+ clean: ## Clean build artifacts
49
+ @echo "$(YELLOW)Cleaning build artifacts...$(NC)"
50
+ @rm -rf lib
51
+ @rm -rf jupyterlab_mlflow/labextension
52
+ @rm -rf tsconfig.tsbuildinfo
53
+ @echo "$(GREEN)✅ Cleaned$(NC)"
54
+
55
+ install-deps: ## Install npm and Python dependencies
56
+ @echo "$(YELLOW)Installing dependencies...$(NC)"
57
+ npm install
58
+ @echo "$(GREEN)✅ Dependencies installed$(NC)"
59
+
60
+ build: build-labextension ## Alias for build-labextension
61
+
62
+ # Default target
63
+ .DEFAULT_GOAL := help
64
+
@@ -0,0 +1,229 @@
1
+ Metadata-Version: 2.4
2
+ Name: jupyterlab-mlflow
3
+ Version: 0.2.1
4
+ Project-URL: Homepage, https://github.com/BioLM/jupyterlab-mlflow
5
+ Project-URL: Bug Tracker, https://github.com/BioLM/jupyterlab-mlflow/issues
6
+ Project-URL: Documentation, https://github.com/BioLM/jupyterlab-mlflow#readme
7
+ Project-URL: Source, https://github.com/BioLM/jupyterlab-mlflow
8
+ Author: JupyterLab MLflow Contributors
9
+ License: BSD 3-Clause License
10
+
11
+ Copyright (c) 2024, JupyterLab MLflow Contributors
12
+ All rights reserved.
13
+
14
+ Redistribution and use in source and binary forms, with or without
15
+ modification, are permitted provided that the following conditions are met:
16
+
17
+ 1. Redistributions of source code must retain the above copyright notice, this
18
+ list of conditions and the following disclaimer.
19
+
20
+ 2. Redistributions in binary form must reproduce the above copyright notice,
21
+ this list of conditions and the following disclaimer in the documentation
22
+ and/or other materials provided with the distribution.
23
+
24
+ 3. Neither the name of the copyright holder nor the names of its
25
+ contributors may be used to endorse or promote products derived from
26
+ this software without specific prior written permission.
27
+
28
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
32
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
34
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
36
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
+
39
+ License-File: LICENSE
40
+ Keywords: Jupyter,JupyterLab,MLflow,jupyterlab-extension
41
+ Classifier: Framework :: Jupyter
42
+ Classifier: Framework :: Jupyter :: JupyterLab
43
+ Classifier: Framework :: Jupyter :: JupyterLab :: 4
44
+ Classifier: License :: OSI Approved :: BSD License
45
+ Classifier: Programming Language :: Python
46
+ Classifier: Programming Language :: Python :: 3
47
+ Classifier: Programming Language :: Python :: 3.8
48
+ Classifier: Programming Language :: Python :: 3.9
49
+ Classifier: Programming Language :: Python :: 3.10
50
+ Classifier: Programming Language :: Python :: 3.11
51
+ Requires-Python: >=3.8
52
+ Requires-Dist: jupyterlab<5,>=4.0.0
53
+ Requires-Dist: mlflow>=2.0.0
54
+ Requires-Dist: tornado>=6.0.0
55
+ Provides-Extra: test
56
+ Requires-Dist: playwright; extra == 'test'
57
+ Requires-Dist: pytest; extra == 'test'
58
+ Requires-Dist: pytest-asyncio; extra == 'test'
59
+ Requires-Dist: pytest-cov; extra == 'test'
60
+ Requires-Dist: pytest-jupyter[server]>=0.6.0; extra == 'test'
61
+ Description-Content-Type: text/markdown
62
+
63
+ # JupyterLab MLflow Extension
64
+
65
+ A JupyterLab extension for browsing MLflow experiments, runs, models, and artifacts directly from the JupyterLab sidebar.
66
+
67
+ ## Features
68
+
69
+ - Browse MLflow experiments, runs, models, and artifacts
70
+ - Tree view for hierarchical navigation
71
+ - Details/Object view for exploring metadata and child objects
72
+ - View artifacts in new JupyterLab tabs
73
+ - Copy experiment/run/model IDs to clipboard
74
+ - Generate and insert MLflow Python API code snippets
75
+ - Connect to remote MLflow tracking servers
76
+ - Launch local MLflow server with SQLite backend
77
+ - Settings UI with environment variable fallback
78
+ - MLflow shortcuts panel for common operations
79
+
80
+ ## Requirements
81
+
82
+ - JupyterLab >= 4.0.0
83
+ - Python >= 3.8
84
+ - MLflow >= 2.0.0
85
+
86
+ ## Installation
87
+
88
+ ```bash
89
+ pip install jupyterlab-mlflow
90
+ ```
91
+
92
+ Or install from source:
93
+
94
+ ```bash
95
+ git clone https://github.com/BioLM/jupyterlab-mlflow.git
96
+ cd jupyterlab-mlflow
97
+ pip install -e .
98
+ jlpm install
99
+ jlpm build
100
+ ```
101
+
102
+ ## Configuration
103
+
104
+ The extension can be configured via:
105
+
106
+ 1. **Settings UI**: Open JupyterLab Settings → Advanced Settings Editor → MLflow
107
+ 2. **Environment Variable**: Set `MLFLOW_TRACKING_URI` environment variable
108
+
109
+ ### Server Extension
110
+
111
+ The extension includes a server-side component that must be enabled. After installation, enable it with:
112
+
113
+ ```bash
114
+ jupyter server extension enable jupyterlab_mlflow.serverextension
115
+ ```
116
+
117
+ Or enable it system-wide:
118
+
119
+ ```bash
120
+ jupyter server extension enable jupyterlab_mlflow.serverextension --sys-prefix
121
+ ```
122
+
123
+ Verify it's enabled:
124
+
125
+ ```bash
126
+ jupyter server extension list
127
+ ```
128
+
129
+ You should see `jupyterlab_mlflow.serverextension` in the enabled extensions list.
130
+
131
+ **Note**: In some JupyterLab deployments (especially managed environments), the server extension may need to be enabled by an administrator or configured in the deployment settings.
132
+
133
+ ## Usage
134
+
135
+ 1. Configure your MLflow tracking URI in the settings or via environment variable
136
+ 2. The MLflow sidebar will appear in the left sidebar
137
+ 3. Browse experiments, runs, models, and artifacts
138
+ 4. Click on artifacts to view them in new tabs
139
+ 5. Right-click on items to copy IDs to clipboard
140
+
141
+ ## Development
142
+
143
+ ### Quick Local Testing
144
+
145
+ To test the extension locally without publishing to PyPI:
146
+
147
+ ```bash
148
+ # Option 1: Use the test script (recommended)
149
+ ./test_server_extension.sh
150
+
151
+ # Option 2: Manual steps
152
+ pip install -e .
153
+ npm run build:lib
154
+ python -m jupyter labextension build . --dev
155
+ jupyter server extension enable jupyterlab_mlflow.serverextension
156
+ jupyter lab
157
+ ```
158
+
159
+ ### Testing API Endpoints
160
+
161
+ After starting JupyterLab, test the server extension API endpoints:
162
+
163
+ ```bash
164
+ # In another terminal, test the endpoints
165
+ ./test_api_endpoints.sh http://localhost:8888 http://localhost:5000
166
+ ```
167
+
168
+ Or manually test with curl:
169
+
170
+ ```bash
171
+ # Test connection endpoint
172
+ curl "http://localhost:8888/mlflow/api/connection/test?tracking_uri=http://localhost:5000"
173
+
174
+ # Test local server status
175
+ curl "http://localhost:8888/mlflow/api/local-server"
176
+ ```
177
+
178
+ ### Development Workflow
179
+
180
+ ```bash
181
+ # Install dependencies
182
+ jlpm install
183
+
184
+ # Build the extension
185
+ jlpm build
186
+
187
+ # Watch for changes
188
+ jlpm watch
189
+
190
+ # Run tests
191
+ pytest
192
+ ```
193
+
194
+ ## Publishing
195
+
196
+ This package uses automatic version bumping and is published to PyPI when a new release is created on GitHub.
197
+
198
+ ### Automatic Version Bumping
199
+
200
+ Version bumping is handled automatically by `semantic-release` based on commit messages:
201
+
202
+ - `feat: something` → minor version bump (0.1.0 → 0.2.0)
203
+ - `fix: something` → patch version bump (0.1.0 → 0.1.1)
204
+ - `BREAKING: something` → major version bump (0.1.0 → 1.0.0)
205
+
206
+ When you push to `main`, semantic-release will:
207
+ 1. Analyze commits since last release
208
+ 2. Bump version in `package.json` (if needed)
209
+ 3. Create a git tag
210
+ 4. Push the tag to GitHub
211
+
212
+ ### Publishing to PyPI
213
+
214
+ 1. **Create a GitHub Release:**
215
+ - Go to: https://github.com/BioLM/jupyterlab-mlflow/releases/new
216
+ - Select the tag created by semantic-release (e.g., `v0.2.0`)
217
+ - Add release notes
218
+ - Click "Publish release"
219
+
220
+ 2. **Automatic Publishing:**
221
+ - The publish workflow automatically builds and publishes to PyPI
222
+ - No manual steps required after creating the release
223
+
224
+ See [PUBLISHING.md](PUBLISHING.md) for detailed instructions.
225
+
226
+ ## License
227
+
228
+ BSD-3-Clause
229
+