gpjax 0.12.0__tar.gz → 0.12.2__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.
- gpjax-0.12.2/.github/commitlint.config.js +70 -0
- gpjax-0.12.2/.github/dependabot.yml +71 -0
- gpjax-0.12.2/.github/labeler.yml +221 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/labels.yml +5 -2
- gpjax-0.12.2/.github/workflows/auto-label.yml +206 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/workflows/build_docs.yml +5 -5
- gpjax-0.12.2/.github/workflows/commit-lint.yml +54 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/workflows/integration.yml +3 -3
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/workflows/pr_greeting.yml +1 -1
- gpjax-0.12.2/.github/workflows/release.yml +305 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/workflows/ruff.yml +1 -1
- gpjax-0.12.2/.github/workflows/security-analysis.yml +73 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/workflows/test_docs.yml +7 -10
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/workflows/tests.yml +4 -4
- {gpjax-0.12.0 → gpjax-0.12.2}/Makefile +3 -8
- {gpjax-0.12.0 → gpjax-0.12.2}/PKG-INFO +9 -17
- {gpjax-0.12.0 → gpjax-0.12.2}/README.md +6 -14
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/scripts/gen_examples.py +40 -10
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/backend.py +18 -3
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/barycentres.py +2 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/classification.py +9 -6
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/collapsed_vi.py +4 -1
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/constructing_new_kernels.py +5 -4
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/deep_kernels.py +8 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/graph_kernels.py +2 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/intro_to_kernels.py +7 -2
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/oceanmodelling.py +2 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/poisson.py +15 -8
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/regression.py +1 -1
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/uncollapsed_vi.py +3 -1
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/yacht.py +2 -1
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/__init__.py +1 -4
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/fit.py +11 -6
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/gps.py +36 -34
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/approximations/rff.py +2 -5
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/base.py +1 -4
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/computations/basis_functions.py +1 -1
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/computations/eigen.py +1 -1
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/non_euclidean/graph.py +10 -11
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/nonstationary/arccosine.py +13 -21
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/nonstationary/polynomial.py +7 -8
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/periodic.py +3 -6
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/powered_exponential.py +3 -8
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/rational_quadratic.py +5 -8
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/likelihoods.py +11 -14
- gpjax-0.12.2/gpjax/linalg/utils.py +65 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/mean_functions.py +8 -7
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/objectives.py +4 -3
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/parameters.py +0 -10
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/variational_families.py +65 -45
- {gpjax-0.12.0 → gpjax-0.12.2}/pyproject.toml +10 -2
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_fit.py +193 -12
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_gps.py +1 -1
- gpjax-0.12.2/tests/test_imports.py +25 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_kernels/test_approximations.py +2 -2
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_kernels/test_non_euclidean.py +2 -2
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_kernels/test_nonstationary.py +4 -3
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_kernels/test_stationary.py +4 -3
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_linalg.py +74 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_mean_functions.py +81 -10
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_parameters.py +0 -2
- {gpjax-0.12.0 → gpjax-0.12.2}/uv.lock +251 -0
- gpjax-0.12.0/.claude/settings.local.json +0 -32
- gpjax-0.12.0/CLAUDE.md +0 -100
- gpjax-0.12.0/examples/oak_autompg_example.py +0 -603
- gpjax-0.12.0/gpjax/linalg/utils.py +0 -33
- gpjax-0.12.0/scripts/format.sh +0 -20
- gpjax-0.12.0/scripts/format_code.py +0 -48
- gpjax-0.12.0/tasks/prd-advanced-state-management.md +0 -51
- gpjax-0.12.0/tasks/prd-dynamic-parameter-training.md +0 -62
- gpjax-0.12.0/tasks/tasks-prd-advanced-state-management.md +0 -37
- gpjax-0.12.0/tasks/tasks-prd-dynamic-parameter-training.md +0 -53
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/CODE_OF_CONDUCT.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/ISSUE_TEMPLATE/01_BUG_REPORT.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/ISSUE_TEMPLATE/02_FEATURE_REQUEST.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/ISSUE_TEMPLATE/03_CODEBASE_IMPROVEMENT.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/ISSUE_TEMPLATE/04_DOCS_IMPROVEMENT.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/codecov.yml +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/pull_request_template.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.github/release-drafter.yml +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/.gitignore +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/CITATION.bib +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/LICENSE.txt +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/CODE_OF_CONDUCT.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/GOVERNANCE.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/contributing.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/design.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/index.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/index.rst +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/installation.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/javascripts/katex.js +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/refs.bib +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/scripts/gen_pages.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/scripts/notebook_converter.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/scripts/sharp_bits_figure.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/sharp_bits.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/GP.pdf +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/GP.svg +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/bijector_figure.svg +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/css/gpjax_theme.css +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/favicon.ico +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/gpjax.mplstyle +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/gpjax_logo.pdf +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/gpjax_logo.svg +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/jaxkern/lato.ttf +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/jaxkern/logo.png +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/jaxkern/logo.svg +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/jaxkern/main.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/step_size_figure.png +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/static/step_size_figure.svg +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/stylesheets/extra.css +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/docs/stylesheets/permalinks.css +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/barycentres/barycentre_gp.gif +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/data/max_tempeature_switzerland.csv +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/data/yacht_hydrodynamics.data +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/gpjax.mplstyle +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/intro_to_gps/decomposed_mll.png +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/intro_to_gps/generating_process.png +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/intro_to_gps.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/likelihoods_guide.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/examples/utils.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/citation.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/dataset.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/distributions.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/integrators.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/__init__.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/approximations/__init__.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/computations/__init__.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/computations/base.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/computations/constant_diagonal.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/computations/dense.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/computations/diagonal.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/non_euclidean/__init__.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/non_euclidean/utils.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/nonstationary/__init__.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/nonstationary/linear.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/__init__.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/base.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/matern12.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/matern32.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/matern52.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/rbf.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/utils.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/kernels/stationary/white.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/linalg/__init__.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/linalg/operations.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/linalg/operators.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/numpyro_extras.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/scan.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/gpjax/typing.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/mkdocs.yml +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/static/CONTRIBUTING.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/static/paper.bib +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/static/paper.md +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/static/paper.pdf +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/__init__.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/conftest.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/integration_tests.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_citations.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_dataset.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_gaussian_distribution.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_integrators.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_kernels/__init__.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_kernels/test_base.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_kernels/test_computation.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_kernels/test_utils.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_likelihoods.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_markdown.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_numpyro_extras.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_objectives.py +0 -0
- {gpjax-0.12.0 → gpjax-0.12.2}/tests/test_variational_families.py +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
extends: ['@commitlint/config-conventional'],
|
|
3
|
+
rules: {
|
|
4
|
+
'type-enum': [
|
|
5
|
+
2,
|
|
6
|
+
'always',
|
|
7
|
+
[
|
|
8
|
+
'build', // Changes that affect the build system or external dependencies
|
|
9
|
+
'chore', // Other changes that don't modify src or test files
|
|
10
|
+
'ci', // Changes to CI configuration files and scripts
|
|
11
|
+
'docs', // Documentation only changes
|
|
12
|
+
'feat', // A new feature
|
|
13
|
+
'fix', // A bug fix
|
|
14
|
+
'perf', // A code change that improves performance
|
|
15
|
+
'refactor', // A code change that neither fixes a bug nor adds a feature
|
|
16
|
+
'revert', // Reverts a previous commit
|
|
17
|
+
'style', // Changes that do not affect the meaning of the code
|
|
18
|
+
'test', // Adding missing tests or correcting existing tests
|
|
19
|
+
],
|
|
20
|
+
],
|
|
21
|
+
'type-case': [2, 'always', 'lower-case'],
|
|
22
|
+
'type-empty': [2, 'never'],
|
|
23
|
+
'scope-enum': [
|
|
24
|
+
2,
|
|
25
|
+
'always',
|
|
26
|
+
[
|
|
27
|
+
// Core components
|
|
28
|
+
'kernels', // Kernel implementations and computations
|
|
29
|
+
'gps', // Gaussian process models and inference
|
|
30
|
+
'likelihoods', // Likelihood functions
|
|
31
|
+
'mean-functions', // Mean function implementations
|
|
32
|
+
'variational', // Variational inference methods
|
|
33
|
+
'objectives', // Optimization objectives
|
|
34
|
+
'parameters', // Parameter management and transformations
|
|
35
|
+
'utils', // Utility functions
|
|
36
|
+
'linalg', // Linear algebra utilities
|
|
37
|
+
'scan', // Scan operations
|
|
38
|
+
'dataset', // Dataset handling
|
|
39
|
+
'fit', // Model fitting and optimization
|
|
40
|
+
|
|
41
|
+
// Testing and validation
|
|
42
|
+
'tests', // Test improvements
|
|
43
|
+
'examples', // Example notebooks and scripts
|
|
44
|
+
'benchmarks', // Performance benchmarks
|
|
45
|
+
'validation', // Model validation
|
|
46
|
+
|
|
47
|
+
// Infrastructure
|
|
48
|
+
'ci', // Continuous integration
|
|
49
|
+
'docs', // Documentation
|
|
50
|
+
'deps', // Dependency updates
|
|
51
|
+
'release', // Release related changes
|
|
52
|
+
'security', // Security improvements
|
|
53
|
+
'performance', // Performance improvements
|
|
54
|
+
|
|
55
|
+
// Development
|
|
56
|
+
'dev', // Development tools
|
|
57
|
+
'typing', // Type annotations
|
|
58
|
+
'format', // Code formatting
|
|
59
|
+
'lint', // Linting improvements
|
|
60
|
+
],
|
|
61
|
+
],
|
|
62
|
+
'scope-case': [2, 'always', 'lower-case'],
|
|
63
|
+
'subject-case': [2, 'always', 'lower-case'],
|
|
64
|
+
'subject-empty': [2, 'never'],
|
|
65
|
+
'subject-full-stop': [2, 'never', '.'],
|
|
66
|
+
'header-max-length': [2, 'always', 72],
|
|
67
|
+
'body-leading-blank': [2, 'always'],
|
|
68
|
+
'footer-leading-blank': [2, 'always'],
|
|
69
|
+
},
|
|
70
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
# Enable version updates for Python dependencies
|
|
4
|
+
- package-ecosystem: "pip"
|
|
5
|
+
directory: "/"
|
|
6
|
+
schedule:
|
|
7
|
+
interval: "weekly"
|
|
8
|
+
day: "monday"
|
|
9
|
+
time: "04:00"
|
|
10
|
+
timezone: "Europe/Amsterdam"
|
|
11
|
+
open-pull-requests-limit: 10
|
|
12
|
+
assignees:
|
|
13
|
+
- "thomaspinder"
|
|
14
|
+
commit-message:
|
|
15
|
+
prefix: "deps"
|
|
16
|
+
prefix-development: "dev-deps"
|
|
17
|
+
include: "scope"
|
|
18
|
+
labels:
|
|
19
|
+
- "dependencies"
|
|
20
|
+
- "automated"
|
|
21
|
+
# Group related updates together
|
|
22
|
+
groups:
|
|
23
|
+
jax-ecosystem:
|
|
24
|
+
patterns:
|
|
25
|
+
- "jax"
|
|
26
|
+
- "jaxlib"
|
|
27
|
+
- "flax"
|
|
28
|
+
- "optax"
|
|
29
|
+
- "jaxtyping"
|
|
30
|
+
- "equinox"
|
|
31
|
+
ml-tools:
|
|
32
|
+
patterns:
|
|
33
|
+
- "numpy"
|
|
34
|
+
- "scipy"
|
|
35
|
+
- "scikit-learn"
|
|
36
|
+
- "matplotlib"
|
|
37
|
+
- "pandas"
|
|
38
|
+
testing:
|
|
39
|
+
patterns:
|
|
40
|
+
- "pytest*"
|
|
41
|
+
- "coverage"
|
|
42
|
+
- "beartype"
|
|
43
|
+
dev-tools:
|
|
44
|
+
patterns:
|
|
45
|
+
- "black"
|
|
46
|
+
- "ruff"
|
|
47
|
+
- "isort"
|
|
48
|
+
- "pre-commit"
|
|
49
|
+
- "mypy"
|
|
50
|
+
# Ignore major version updates for stable dependencies
|
|
51
|
+
ignore:
|
|
52
|
+
- dependency-name: "numpy"
|
|
53
|
+
update-types: ["version-update:semver-major"]
|
|
54
|
+
- dependency-name: "scipy"
|
|
55
|
+
update-types: ["version-update:semver-major"]
|
|
56
|
+
|
|
57
|
+
# Enable version updates for GitHub Actions
|
|
58
|
+
- package-ecosystem: "github-actions"
|
|
59
|
+
directory: "/"
|
|
60
|
+
schedule:
|
|
61
|
+
interval: "weekly"
|
|
62
|
+
day: "monday"
|
|
63
|
+
time: "04:00"
|
|
64
|
+
timezone: "Europe/Amsterdam"
|
|
65
|
+
open-pull-requests-limit: 5
|
|
66
|
+
commit-message:
|
|
67
|
+
prefix: "ci"
|
|
68
|
+
include: "scope"
|
|
69
|
+
labels:
|
|
70
|
+
- "github-actions"
|
|
71
|
+
- "automated"
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Automatic labeling based on file paths - v5 format
|
|
2
|
+
# Format: label-name:
|
|
3
|
+
# - changed-files:
|
|
4
|
+
# - any-glob-to-any-file: pattern
|
|
5
|
+
|
|
6
|
+
# Core Components
|
|
7
|
+
kernels:
|
|
8
|
+
- changed-files:
|
|
9
|
+
- any-glob-to-any-file:
|
|
10
|
+
- 'gpjax/kernels/**'
|
|
11
|
+
- 'tests/test_kernels/**'
|
|
12
|
+
|
|
13
|
+
gps:
|
|
14
|
+
- changed-files:
|
|
15
|
+
- any-glob-to-any-file:
|
|
16
|
+
- 'gpjax/gps.py'
|
|
17
|
+
- 'gpjax/gps/**'
|
|
18
|
+
- 'tests/test_gps.py'
|
|
19
|
+
- 'tests/test_gps/**'
|
|
20
|
+
|
|
21
|
+
likelihoods:
|
|
22
|
+
- changed-files:
|
|
23
|
+
- any-glob-to-any-file:
|
|
24
|
+
- 'gpjax/likelihoods.py'
|
|
25
|
+
- 'gpjax/likelihoods/**'
|
|
26
|
+
- 'tests/test_likelihoods.py'
|
|
27
|
+
- 'tests/test_likelihoods/**'
|
|
28
|
+
|
|
29
|
+
mean-functions:
|
|
30
|
+
- changed-files:
|
|
31
|
+
- any-glob-to-any-file:
|
|
32
|
+
- 'gpjax/mean_functions.py'
|
|
33
|
+
- 'gpjax/mean_functions/**'
|
|
34
|
+
- 'tests/test_mean_functions.py'
|
|
35
|
+
- 'tests/test_mean_functions/**'
|
|
36
|
+
|
|
37
|
+
variational:
|
|
38
|
+
- changed-files:
|
|
39
|
+
- any-glob-to-any-file:
|
|
40
|
+
- 'gpjax/variational_families.py'
|
|
41
|
+
- 'gpjax/variational_families/**'
|
|
42
|
+
- 'tests/test_variational_families.py'
|
|
43
|
+
- 'tests/test_variational_families/**'
|
|
44
|
+
|
|
45
|
+
objectives:
|
|
46
|
+
- changed-files:
|
|
47
|
+
- any-glob-to-any-file:
|
|
48
|
+
- 'gpjax/objectives.py'
|
|
49
|
+
- 'gpjax/objectives/**'
|
|
50
|
+
- 'tests/test_objectives.py'
|
|
51
|
+
- 'tests/test_objectives/**'
|
|
52
|
+
|
|
53
|
+
parameters:
|
|
54
|
+
- changed-files:
|
|
55
|
+
- any-glob-to-any-file:
|
|
56
|
+
- 'gpjax/parameters.py'
|
|
57
|
+
- 'gpjax/parameters/**'
|
|
58
|
+
- 'tests/test_parameters.py'
|
|
59
|
+
- 'tests/test_parameters/**'
|
|
60
|
+
|
|
61
|
+
optimization:
|
|
62
|
+
- changed-files:
|
|
63
|
+
- any-glob-to-any-file:
|
|
64
|
+
- 'gpjax/fit.py'
|
|
65
|
+
- 'gpjax/fit/**'
|
|
66
|
+
- 'tests/test_fit.py'
|
|
67
|
+
- 'tests/test_fit/**'
|
|
68
|
+
|
|
69
|
+
linalg:
|
|
70
|
+
- changed-files:
|
|
71
|
+
- any-glob-to-any-file:
|
|
72
|
+
- 'gpjax/linalg/**'
|
|
73
|
+
- 'tests/test_linalg/**'
|
|
74
|
+
|
|
75
|
+
dataset:
|
|
76
|
+
- changed-files:
|
|
77
|
+
- any-glob-to-any-file:
|
|
78
|
+
- 'gpjax/dataset.py'
|
|
79
|
+
- 'tests/test_dataset.py'
|
|
80
|
+
|
|
81
|
+
utils:
|
|
82
|
+
- changed-files:
|
|
83
|
+
- any-glob-to-any-file:
|
|
84
|
+
- 'gpjax/utils/**'
|
|
85
|
+
- 'tests/test_utils/**'
|
|
86
|
+
|
|
87
|
+
scan:
|
|
88
|
+
- changed-files:
|
|
89
|
+
- any-glob-to-any-file:
|
|
90
|
+
- 'gpjax/scan.py'
|
|
91
|
+
- 'tests/test_scan.py'
|
|
92
|
+
|
|
93
|
+
# Testing and Validation
|
|
94
|
+
tests:
|
|
95
|
+
- changed-files:
|
|
96
|
+
- any-glob-to-any-file:
|
|
97
|
+
- 'tests/**'
|
|
98
|
+
- '**/test_*.py'
|
|
99
|
+
- '**/*_test.py'
|
|
100
|
+
|
|
101
|
+
integration-tests:
|
|
102
|
+
- changed-files:
|
|
103
|
+
- any-glob-to-any-file:
|
|
104
|
+
- 'tests/integration_tests.py'
|
|
105
|
+
- 'tests/integration/**'
|
|
106
|
+
|
|
107
|
+
benchmarks:
|
|
108
|
+
- changed-files:
|
|
109
|
+
- any-glob-to-any-file:
|
|
110
|
+
- 'benchmarks/**'
|
|
111
|
+
- '**/benchmark*.py'
|
|
112
|
+
|
|
113
|
+
validation:
|
|
114
|
+
- changed-files:
|
|
115
|
+
- any-glob-to-any-file:
|
|
116
|
+
- 'validation/**'
|
|
117
|
+
- '**/validation*.py'
|
|
118
|
+
|
|
119
|
+
# Examples and Documentation
|
|
120
|
+
examples:
|
|
121
|
+
- changed-files:
|
|
122
|
+
- any-glob-to-any-file:
|
|
123
|
+
- 'examples/**'
|
|
124
|
+
- 'docs/_examples/**'
|
|
125
|
+
|
|
126
|
+
documentation:
|
|
127
|
+
- changed-files:
|
|
128
|
+
- any-glob-to-any-file:
|
|
129
|
+
- 'docs/**'
|
|
130
|
+
- '**/*.md'
|
|
131
|
+
- '**/*.rst'
|
|
132
|
+
- '**/README*'
|
|
133
|
+
- 'CHANGELOG*'
|
|
134
|
+
- 'CONTRIBUTING*'
|
|
135
|
+
- 'CITATION*'
|
|
136
|
+
|
|
137
|
+
# Infrastructure
|
|
138
|
+
ci:
|
|
139
|
+
- changed-files:
|
|
140
|
+
- any-glob-to-any-file:
|
|
141
|
+
- '.github/**'
|
|
142
|
+
- '**/*.yml'
|
|
143
|
+
- '**/*.yaml'
|
|
144
|
+
- 'pyproject.toml'
|
|
145
|
+
- 'requirements*.txt'
|
|
146
|
+
|
|
147
|
+
dependencies:
|
|
148
|
+
- changed-files:
|
|
149
|
+
- any-glob-to-any-file:
|
|
150
|
+
- 'pyproject.toml'
|
|
151
|
+
- 'requirements*.txt'
|
|
152
|
+
- 'setup.py'
|
|
153
|
+
- 'setup.cfg'
|
|
154
|
+
|
|
155
|
+
security:
|
|
156
|
+
- changed-files:
|
|
157
|
+
- any-glob-to-any-file:
|
|
158
|
+
- '.github/workflows/*security*'
|
|
159
|
+
- '.github/workflows/*codeql*'
|
|
160
|
+
- '.github/dependabot.yml'
|
|
161
|
+
- 'SECURITY.md'
|
|
162
|
+
|
|
163
|
+
performance:
|
|
164
|
+
- changed-files:
|
|
165
|
+
- any-glob-to-any-file:
|
|
166
|
+
- '.github/workflows/*performance*'
|
|
167
|
+
- '.github/workflows/*benchmark*'
|
|
168
|
+
- 'benchmarks/**'
|
|
169
|
+
- '**/performance*.py'
|
|
170
|
+
|
|
171
|
+
# Development Tools
|
|
172
|
+
dev-tools:
|
|
173
|
+
- changed-files:
|
|
174
|
+
- any-glob-to-any-file:
|
|
175
|
+
- '.pre-commit-config.yaml'
|
|
176
|
+
- 'pyproject.toml'
|
|
177
|
+
- '.github/workflows/ruff.yml'
|
|
178
|
+
- '**/.gitignore'
|
|
179
|
+
|
|
180
|
+
formatting:
|
|
181
|
+
- changed-files:
|
|
182
|
+
- any-glob-to-any-file:
|
|
183
|
+
- '.github/workflows/ruff.yml'
|
|
184
|
+
- 'pyproject.toml'
|
|
185
|
+
|
|
186
|
+
typing:
|
|
187
|
+
- changed-files:
|
|
188
|
+
- any-glob-to-any-file:
|
|
189
|
+
- '**/*.pyi'
|
|
190
|
+
- '**/py.typed'
|
|
191
|
+
|
|
192
|
+
# Release and Packaging
|
|
193
|
+
release:
|
|
194
|
+
- changed-files:
|
|
195
|
+
- any-glob-to-any-file:
|
|
196
|
+
- '.github/workflows/release.yml'
|
|
197
|
+
- '.github/workflows/*release*'
|
|
198
|
+
- 'CHANGELOG*'
|
|
199
|
+
- '__init__.py'
|
|
200
|
+
|
|
201
|
+
# Model-specific labels for ML context
|
|
202
|
+
numerical-stability:
|
|
203
|
+
- changed-files:
|
|
204
|
+
- any-glob-to-any-file:
|
|
205
|
+
- 'gpjax/linalg/**'
|
|
206
|
+
- '**/numerical*.py'
|
|
207
|
+
- '**/stability*.py'
|
|
208
|
+
|
|
209
|
+
gpu-support:
|
|
210
|
+
- changed-files:
|
|
211
|
+
- any-glob-to-any-file:
|
|
212
|
+
- '**/*gpu*.py'
|
|
213
|
+
- '**/*device*.py'
|
|
214
|
+
- '**/*cuda*.py'
|
|
215
|
+
|
|
216
|
+
jax-compatibility:
|
|
217
|
+
- changed-files:
|
|
218
|
+
- any-glob-to-any-file:
|
|
219
|
+
- '**/*jax*.py'
|
|
220
|
+
- '**/*jit*.py'
|
|
221
|
+
- '**/*vmap*.py'
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
#
|
|
5
5
|
# The repository labels will be automatically configured using this file and
|
|
6
6
|
# the GitHub Action https://github.com/marketplace/actions/github-labeler.
|
|
7
|
+
- name: automated
|
|
8
|
+
description: Automated PRs
|
|
9
|
+
color: 000000
|
|
7
10
|
- name: breaking
|
|
8
11
|
description: Breaking Changes
|
|
9
12
|
color: bfd4f2
|
|
@@ -28,8 +31,8 @@
|
|
|
28
31
|
- name: enhancement
|
|
29
32
|
description: New feature or request
|
|
30
33
|
color: a2eeef
|
|
31
|
-
- name:
|
|
32
|
-
description: Pull requests that update
|
|
34
|
+
- name: github-actions
|
|
35
|
+
description: Pull requests that update Github actions code
|
|
33
36
|
color: "000000"
|
|
34
37
|
- name: good first issue
|
|
35
38
|
description: Good for newcomers
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
name: "Automatic Labeling"
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, synchronize, reopened]
|
|
6
|
+
issues:
|
|
7
|
+
types: [opened, reopened]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
auto-label:
|
|
11
|
+
name: "Apply Automatic Labels"
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
permissions:
|
|
14
|
+
issues: write
|
|
15
|
+
pull-requests: write
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout repository
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Auto-label based on files changed
|
|
22
|
+
if: github.event_name == 'pull_request'
|
|
23
|
+
uses: actions/labeler@v5
|
|
24
|
+
with:
|
|
25
|
+
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
26
|
+
configuration-path: .github/labeler.yml
|
|
27
|
+
|
|
28
|
+
- name: Size labeling for PRs
|
|
29
|
+
if: github.event_name == 'pull_request'
|
|
30
|
+
uses: codelytv/pr-size-labeler@v1
|
|
31
|
+
with:
|
|
32
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
33
|
+
xs_label: 'size/xs'
|
|
34
|
+
xs_max_size: '10'
|
|
35
|
+
s_label: 'size/s'
|
|
36
|
+
s_max_size: '100'
|
|
37
|
+
m_label: 'size/m'
|
|
38
|
+
m_max_size: '500'
|
|
39
|
+
l_label: 'size/l'
|
|
40
|
+
l_max_size: '1000'
|
|
41
|
+
xl_label: 'size/xl'
|
|
42
|
+
message_if_xl: >
|
|
43
|
+
This PR is very large. Consider breaking it down into smaller,
|
|
44
|
+
focused PRs for easier review and better maintainability.
|
|
45
|
+
|
|
46
|
+
- name: Label ML-specific issues
|
|
47
|
+
if: github.event_name == 'issues'
|
|
48
|
+
uses: actions/github-script@v7
|
|
49
|
+
with:
|
|
50
|
+
script: |
|
|
51
|
+
const title = context.payload.issue.title.toLowerCase();
|
|
52
|
+
const body = context.payload.issue.body?.toLowerCase() || '';
|
|
53
|
+
const text = title + ' ' + body;
|
|
54
|
+
|
|
55
|
+
const labels = [];
|
|
56
|
+
|
|
57
|
+
// GPU/Hardware related
|
|
58
|
+
if (text.includes('gpu') || text.includes('cuda') || text.includes('device') ||
|
|
59
|
+
text.includes('memory') || text.includes('jax.device')) {
|
|
60
|
+
labels.push('gpu-support');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Performance related
|
|
64
|
+
if (text.includes('slow') || text.includes('performance') || text.includes('speed') ||
|
|
65
|
+
text.includes('memory usage') || text.includes('regression') || text.includes('benchmark')) {
|
|
66
|
+
labels.push('performance');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Numerical stability
|
|
70
|
+
if (text.includes('numerical') || text.includes('instability') || text.includes('nan') ||
|
|
71
|
+
text.includes('inf') || text.includes('convergence') || text.includes('precision')) {
|
|
72
|
+
labels.push('numerical-stability');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// JAX compatibility
|
|
76
|
+
if (text.includes('jax') || text.includes('jit') || text.includes('vmap') ||
|
|
77
|
+
text.includes('pmap') || text.includes('xla')) {
|
|
78
|
+
labels.push('jax-compatibility');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Component detection
|
|
82
|
+
if (text.includes('kernel') || text.includes('rbf') || text.includes('matern')) {
|
|
83
|
+
labels.push('kernels');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (text.includes('gaussian process') || text.includes(' gp ') || text.includes('posterior') ||
|
|
87
|
+
text.includes('prior') || text.includes('inference')) {
|
|
88
|
+
labels.push('gps');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (text.includes('variational') || text.includes('elbo') || text.includes('svgp')) {
|
|
92
|
+
labels.push('variational');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (text.includes('likelihood') || text.includes('bernoulli') || text.includes('poisson')) {
|
|
96
|
+
labels.push('likelihoods');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (text.includes('optimization') || text.includes('optimizer') || text.includes('fit') ||
|
|
100
|
+
text.includes('scipy') || text.includes('optax')) {
|
|
101
|
+
labels.push('optimization');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Documentation related
|
|
105
|
+
if (text.includes('documentation') || text.includes('docs') || text.includes('example') ||
|
|
106
|
+
text.includes('tutorial') || text.includes('docstring')) {
|
|
107
|
+
labels.push('documentation');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Bug vs Feature detection
|
|
111
|
+
if (text.includes('bug') || text.includes('error') || text.includes('fail') ||
|
|
112
|
+
text.includes('broken') || text.includes('issue') || text.includes('problem')) {
|
|
113
|
+
labels.push('bug');
|
|
114
|
+
} else if (text.includes('feature') || text.includes('enhancement') || text.includes('add') ||
|
|
115
|
+
text.includes('implement') || text.includes('support') || text.includes('new')) {
|
|
116
|
+
labels.push('enhancement');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Difficulty assessment
|
|
120
|
+
if (text.includes('good first issue') || text.includes('beginner') || text.includes('easy')) {
|
|
121
|
+
labels.push('good first issue');
|
|
122
|
+
} else if (text.includes('help wanted') || text.includes('help needed')) {
|
|
123
|
+
labels.push('help wanted');
|
|
124
|
+
} else if (text.includes('complex') || text.includes('advanced') || text.includes('expert')) {
|
|
125
|
+
labels.push('expert-level');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Priority detection
|
|
129
|
+
if (text.includes('urgent') || text.includes('critical') || text.includes('blocking')) {
|
|
130
|
+
labels.push('priority/high');
|
|
131
|
+
} else if (text.includes('nice to have') || text.includes('low priority')) {
|
|
132
|
+
labels.push('priority/low');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Apply labels
|
|
136
|
+
if (labels.length > 0) {
|
|
137
|
+
await github.rest.issues.addLabels({
|
|
138
|
+
owner: context.repo.owner,
|
|
139
|
+
repo: context.repo.repo,
|
|
140
|
+
issue_number: context.payload.issue.number,
|
|
141
|
+
labels: labels
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
- name: Label PRs based on content
|
|
146
|
+
if: github.event_name == 'pull_request'
|
|
147
|
+
uses: actions/github-script@v7
|
|
148
|
+
with:
|
|
149
|
+
script: |
|
|
150
|
+
const title = context.payload.pull_request.title.toLowerCase();
|
|
151
|
+
const body = context.payload.pull_request.body?.toLowerCase() || '';
|
|
152
|
+
const text = title + ' ' + body;
|
|
153
|
+
|
|
154
|
+
const labels = [];
|
|
155
|
+
|
|
156
|
+
// Breaking changes
|
|
157
|
+
if (text.includes('breaking') || text.includes('breaking change') ||
|
|
158
|
+
title.includes('!:') || body.includes('breaking change')) {
|
|
159
|
+
labels.push('breaking-change');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Dependencies
|
|
163
|
+
if (title.includes('deps') || title.includes('dependenc') || title.includes('bump') ||
|
|
164
|
+
text.includes('requirements') || text.includes('pyproject.toml')) {
|
|
165
|
+
labels.push('dependencies');
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// CI/Infrastructure
|
|
169
|
+
if (text.includes('github actions') || text.includes('workflow') || text.includes('.yml') ||
|
|
170
|
+
text.includes('ci') || text.includes('pipeline')) {
|
|
171
|
+
labels.push('ci');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Performance improvements
|
|
175
|
+
if (text.includes('performance') || text.includes('optimization') || text.includes('faster') ||
|
|
176
|
+
text.includes('efficient') || text.includes('benchmark')) {
|
|
177
|
+
labels.push('performance');
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Documentation
|
|
181
|
+
if (text.includes('docs') || text.includes('readme') || text.includes('docstring') ||
|
|
182
|
+
text.includes('example') || text.includes('.md') || text.includes('tutorial')) {
|
|
183
|
+
labels.push('documentation');
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Tests
|
|
187
|
+
if (text.includes('test') || text.includes('pytest') || text.includes('coverage') ||
|
|
188
|
+
title.startsWith('test:') || text.includes('testing')) {
|
|
189
|
+
labels.push('tests');
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Security
|
|
193
|
+
if (text.includes('security') || text.includes('vulnerability') || text.includes('cve') ||
|
|
194
|
+
text.includes('safety') || text.includes('bandit')) {
|
|
195
|
+
labels.push('security');
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Apply labels
|
|
199
|
+
if (labels.length > 0) {
|
|
200
|
+
await github.rest.issues.addLabels({
|
|
201
|
+
owner: context.repo.owner,
|
|
202
|
+
repo: context.repo.repo,
|
|
203
|
+
issue_number: context.payload.pull_request.number,
|
|
204
|
+
labels: labels
|
|
205
|
+
});
|
|
206
|
+
}
|
|
@@ -27,20 +27,20 @@ jobs:
|
|
|
27
27
|
steps:
|
|
28
28
|
# Grap the latest commit from the branch
|
|
29
29
|
- name: Checkout the branch
|
|
30
|
-
uses: actions/checkout@
|
|
30
|
+
uses: actions/checkout@v4
|
|
31
31
|
with:
|
|
32
32
|
persist-credentials: false
|
|
33
33
|
|
|
34
34
|
# Create a virtual environment
|
|
35
35
|
- name: create Conda environment
|
|
36
|
-
uses: conda-incubator/setup-miniconda@
|
|
36
|
+
uses: conda-incubator/setup-miniconda@v3
|
|
37
37
|
with:
|
|
38
38
|
auto-update-conda: true
|
|
39
39
|
python-version: ${{ matrix.python-version }}
|
|
40
40
|
|
|
41
41
|
# Install katex for math support
|
|
42
42
|
- name: Install NPM
|
|
43
|
-
uses: actions/setup-node@
|
|
43
|
+
uses: actions/setup-node@v5
|
|
44
44
|
with:
|
|
45
45
|
node-version: 16
|
|
46
46
|
- name: Install KaTeX
|
|
@@ -49,7 +49,7 @@ jobs:
|
|
|
49
49
|
|
|
50
50
|
# Install uv
|
|
51
51
|
- name: Install uv
|
|
52
|
-
uses: astral-sh/setup-uv@
|
|
52
|
+
uses: astral-sh/setup-uv@v6
|
|
53
53
|
with:
|
|
54
54
|
version: "latest"
|
|
55
55
|
|
|
@@ -61,7 +61,7 @@ jobs:
|
|
|
61
61
|
uv run mkdocs build
|
|
62
62
|
|
|
63
63
|
- name: Deploy Page 🚀
|
|
64
|
-
uses: JamesIves/github-pages-deploy-action@v4.
|
|
64
|
+
uses: JamesIves/github-pages-deploy-action@v4.7.3
|
|
65
65
|
with:
|
|
66
66
|
branch: gh-pages
|
|
67
67
|
folder: site
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: "Commit Message Linting"
|
|
2
|
+
permissions:
|
|
3
|
+
contents: read
|
|
4
|
+
|
|
5
|
+
on:
|
|
6
|
+
pull_request:
|
|
7
|
+
types: [opened, edited, synchronize]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
commit-message-check:
|
|
11
|
+
name: "Check Commit Message Format"
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
steps:
|
|
15
|
+
- name: Checkout repository
|
|
16
|
+
uses: actions/checkout@v4
|
|
17
|
+
with:
|
|
18
|
+
fetch-depth: 0
|
|
19
|
+
|
|
20
|
+
- name: Check commit message format
|
|
21
|
+
run: |
|
|
22
|
+
# Get all commit messages in the PR
|
|
23
|
+
BASE_SHA=${{ github.event.pull_request.base.sha }}
|
|
24
|
+
HEAD_SHA=${{ github.event.pull_request.head.sha }}
|
|
25
|
+
|
|
26
|
+
# Check each commit message
|
|
27
|
+
ERRORS=0
|
|
28
|
+
while IFS= read -r commit_sha; do
|
|
29
|
+
COMMIT_MSG=$(git log --format=%s -n 1 $commit_sha)
|
|
30
|
+
echo "Checking commit: $commit_sha"
|
|
31
|
+
echo "Message: $COMMIT_MSG"
|
|
32
|
+
|
|
33
|
+
# Validate conventional commit format
|
|
34
|
+
if [[ $COMMIT_MSG =~ ^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\(.+\))?: ]]; then
|
|
35
|
+
echo "✅ Valid conventional commit format"
|
|
36
|
+
elif [[ $COMMIT_MSG =~ ^(BREAKING|Merge|Initial) ]]; then
|
|
37
|
+
echo "✅ Special commit type allowed"
|
|
38
|
+
else
|
|
39
|
+
echo "❌ Invalid commit format: $COMMIT_MSG"
|
|
40
|
+
echo "Expected format: type(scope): description"
|
|
41
|
+
echo "Valid types: build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test"
|
|
42
|
+
echo "Example: feat(kernels): add Matern kernel implementation"
|
|
43
|
+
ERRORS=$((ERRORS + 1))
|
|
44
|
+
fi
|
|
45
|
+
echo ""
|
|
46
|
+
done <<< "$(git rev-list $BASE_SHA..$HEAD_SHA)"
|
|
47
|
+
|
|
48
|
+
if [ $ERRORS -gt 0 ]; then
|
|
49
|
+
echo "::warning::Found $ERRORS commit(s) with invalid format"
|
|
50
|
+
echo "::warning::Consider using conventional commit format for better changelog generation"
|
|
51
|
+
echo "::warning::This is a warning only - PR can still be merged"
|
|
52
|
+
else
|
|
53
|
+
echo "All commit messages follow conventional commit format ✅"
|
|
54
|
+
fi
|