predikit 0.6.3__tar.gz → 0.6.4__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 (54) hide show
  1. {predikit-0.6.3 → predikit-0.6.4}/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
  2. {predikit-0.6.3 → predikit-0.6.4}/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
  3. {predikit-0.6.3 → predikit-0.6.4}/.github/workflows/publish.yml +31 -31
  4. {predikit-0.6.3 → predikit-0.6.4}/.github/workflows/test.yml +56 -56
  5. {predikit-0.6.3 → predikit-0.6.4}/.pre-commit-config.yaml +15 -15
  6. {predikit-0.6.3 → predikit-0.6.4}/CHANGELOG.md +7 -1
  7. {predikit-0.6.3 → predikit-0.6.4}/CLAUDE.md +71 -71
  8. {predikit-0.6.3 → predikit-0.6.4}/CONTRIBUTING.md +66 -66
  9. {predikit-0.6.3 → predikit-0.6.4}/LICENSE +21 -21
  10. {predikit-0.6.3 → predikit-0.6.4}/PKG-INFO +1 -1
  11. {predikit-0.6.3 → predikit-0.6.4}/examples/01_basic_sklearn.py +48 -48
  12. {predikit-0.6.3 → predikit-0.6.4}/examples/02_xgboost_regression.py +57 -57
  13. {predikit-0.6.3 → predikit-0.6.4}/examples/03_orlando_real_estate.py +127 -127
  14. {predikit-0.6.3 → predikit-0.6.4}/examples/04_confidence_routing.py +106 -106
  15. {predikit-0.6.3 → predikit-0.6.4}/examples/05_multi_model_ensemble.py +182 -182
  16. {predikit-0.6.3 → predikit-0.6.4}/examples/06_mlflow_loader.py +99 -99
  17. {predikit-0.6.3 → predikit-0.6.4}/examples/07_snowflake_loader.py +102 -102
  18. {predikit-0.6.3 → predikit-0.6.4}/pyproject.toml +98 -98
  19. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/__init__.py +1 -1
  20. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/cli.py +143 -143
  21. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/coerce.py +56 -56
  22. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/ensemble.py +121 -121
  23. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/exceptions.py +2 -2
  24. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/exporters/langchain.py +31 -31
  25. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/exporters/openai.py +22 -22
  26. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/introspect.py +20 -20
  27. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/loaders/__init__.py +4 -4
  28. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/loaders/mlflow.py +95 -95
  29. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/loaders/snowflake.py +104 -104
  30. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/registry.py +52 -52
  31. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/tool.py +206 -190
  32. {predikit-0.6.3 → predikit-0.6.4}/tests/test_cli.py +219 -219
  33. {predikit-0.6.3 → predikit-0.6.4}/tests/test_coerce.py +68 -68
  34. {predikit-0.6.3 → predikit-0.6.4}/tests/test_confidence.py +134 -134
  35. {predikit-0.6.3 → predikit-0.6.4}/tests/test_ensemble.py +189 -189
  36. {predikit-0.6.3 → predikit-0.6.4}/tests/test_exporters_openai.py +42 -42
  37. {predikit-0.6.3 → predikit-0.6.4}/tests/test_introspect.py +31 -31
  38. {predikit-0.6.3 → predikit-0.6.4}/tests/test_loaders_mlflow.py +202 -202
  39. {predikit-0.6.3 → predikit-0.6.4}/tests/test_loaders_snowflake.py +250 -250
  40. {predikit-0.6.3 → predikit-0.6.4}/tests/test_registry.py +117 -117
  41. {predikit-0.6.3 → predikit-0.6.4}/tests/test_tool.py +140 -120
  42. {predikit-0.6.3 → predikit-0.6.4}/tests/test_weighted_ensemble.py +176 -176
  43. {predikit-0.6.3 → predikit-0.6.4}/.gitattributes +0 -0
  44. {predikit-0.6.3 → predikit-0.6.4}/.gitignore +0 -0
  45. {predikit-0.6.3 → predikit-0.6.4}/README.md +0 -0
  46. {predikit-0.6.3 → predikit-0.6.4}/docs/logo.gif +0 -0
  47. {predikit-0.6.3 → predikit-0.6.4}/docs/logo.png +0 -0
  48. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/exporters/__init__.py +0 -0
  49. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/mcp.py +0 -0
  50. {predikit-0.6.3 → predikit-0.6.4}/src/predikit/py.typed +0 -0
  51. {predikit-0.6.3 → predikit-0.6.4}/tests/__init__.py +0 -0
  52. {predikit-0.6.3 → predikit-0.6.4}/tests/test_exporters_langchain.py +0 -0
  53. {predikit-0.6.3 → predikit-0.6.4}/tests/test_logging.py +0 -0
  54. {predikit-0.6.3 → predikit-0.6.4}/tests/test_mcp.py +0 -0
@@ -1,38 +1,38 @@
1
- ---
2
- name: Bug report
3
- about: Create a report to help us improve
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- **Describe the bug**
11
- A clear and concise description of what the bug is.
12
-
13
- **To Reproduce**
14
- Steps to reproduce the behavior:
15
- 1. Go to '...'
16
- 2. Click on '....'
17
- 3. Scroll down to '....'
18
- 4. See error
19
-
20
- **Expected behavior**
21
- A clear and concise description of what you expected to happen.
22
-
23
- **Screenshots**
24
- If applicable, add screenshots to help explain your problem.
25
-
26
- **Desktop (please complete the following information):**
27
- - OS: [e.g. iOS]
28
- - Browser [e.g. chrome, safari]
29
- - Version [e.g. 22]
30
-
31
- **Smartphone (please complete the following information):**
32
- - Device: [e.g. iPhone6]
33
- - OS: [e.g. iOS8.1]
34
- - Browser [e.g. stock browser, safari]
35
- - Version [e.g. 22]
36
-
37
- **Additional context**
38
- Add any other context about the problem here.
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+ Steps to reproduce the behavior:
15
+ 1. Go to '...'
16
+ 2. Click on '....'
17
+ 3. Scroll down to '....'
18
+ 4. See error
19
+
20
+ **Expected behavior**
21
+ A clear and concise description of what you expected to happen.
22
+
23
+ **Screenshots**
24
+ If applicable, add screenshots to help explain your problem.
25
+
26
+ **Desktop (please complete the following information):**
27
+ - OS: [e.g. iOS]
28
+ - Browser [e.g. chrome, safari]
29
+ - Version [e.g. 22]
30
+
31
+ **Smartphone (please complete the following information):**
32
+ - Device: [e.g. iPhone6]
33
+ - OS: [e.g. iOS8.1]
34
+ - Browser [e.g. stock browser, safari]
35
+ - Version [e.g. 22]
36
+
37
+ **Additional context**
38
+ Add any other context about the problem here.
@@ -1,20 +1,20 @@
1
- ---
2
- name: Feature request
3
- about: Suggest an idea for this project
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- **Is your feature request related to a problem? Please describe.**
11
- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
-
13
- **Describe the solution you'd like**
14
- A clear and concise description of what you want to happen.
15
-
16
- **Describe alternatives you've considered**
17
- A clear and concise description of any alternative solutions or features you've considered.
18
-
19
- **Additional context**
20
- Add any other context or screenshots about the feature request here.
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
@@ -1,31 +1,31 @@
1
- name: Publish to PyPI
2
-
3
- on:
4
- release:
5
- types: [published]
6
-
7
- permissions:
8
- contents: read
9
-
10
- jobs:
11
- publish:
12
- runs-on: ubuntu-latest
13
- environment: pypi
14
- permissions:
15
- contents: read
16
- id-token: write
17
-
18
- steps:
19
- - uses: actions/checkout@v4
20
-
21
- - uses: actions/setup-python@v5
22
- with:
23
- python-version: "3.12"
24
-
25
- - name: Build
26
- run: |
27
- pip install hatchling
28
- python -m hatchling build
29
-
30
- - name: Publish to PyPI
31
- uses: pypa/gh-action-pypi-publish@release/v1
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ publish:
12
+ runs-on: ubuntu-latest
13
+ environment: pypi
14
+ permissions:
15
+ contents: read
16
+ id-token: write
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.12"
24
+
25
+ - name: Build
26
+ run: |
27
+ pip install hatchling
28
+ python -m hatchling build
29
+
30
+ - name: Publish to PyPI
31
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -1,56 +1,56 @@
1
- name: Test
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
8
-
9
- permissions:
10
- contents: read
11
-
12
- jobs:
13
- lint:
14
- runs-on: ubuntu-latest
15
- steps:
16
- - uses: actions/checkout@v4
17
-
18
- - uses: actions/setup-python@v5
19
- with:
20
- python-version: "3.12"
21
-
22
- - name: Install dev dependencies
23
- run: pip install -e ".[dev]"
24
-
25
- - name: Ruff lint
26
- run: ruff check src/ tests/ examples/
27
-
28
- - name: Ruff format check
29
- run: ruff format --check src/ tests/ examples/
30
-
31
- - name: Mypy
32
- run: mypy src/predikit
33
-
34
- - name: Build package
35
- run: |
36
- python -m pip install hatchling
37
- python -m hatchling build
38
-
39
- test:
40
- runs-on: ubuntu-latest
41
- strategy:
42
- matrix:
43
- python-version: ["3.10", "3.11", "3.12", "3.13"]
44
-
45
- steps:
46
- - uses: actions/checkout@v4
47
-
48
- - uses: actions/setup-python@v5
49
- with:
50
- python-version: ${{ matrix.python-version }}
51
-
52
- - name: Install dependencies
53
- run: pip install -e ".[dev]"
54
-
55
- - name: Run tests
56
- run: pytest --cov=src/predikit --cov-report=term-missing
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ lint:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+
22
+ - name: Install dev dependencies
23
+ run: pip install -e ".[dev]"
24
+
25
+ - name: Ruff lint
26
+ run: ruff check src/ tests/ examples/
27
+
28
+ - name: Ruff format check
29
+ run: ruff format --check src/ tests/ examples/
30
+
31
+ - name: Mypy
32
+ run: mypy src/predikit
33
+
34
+ - name: Build package
35
+ run: |
36
+ python -m pip install hatchling
37
+ python -m hatchling build
38
+
39
+ test:
40
+ runs-on: ubuntu-latest
41
+ strategy:
42
+ matrix:
43
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
44
+
45
+ steps:
46
+ - uses: actions/checkout@v4
47
+
48
+ - uses: actions/setup-python@v5
49
+ with:
50
+ python-version: ${{ matrix.python-version }}
51
+
52
+ - name: Install dependencies
53
+ run: pip install -e ".[dev]"
54
+
55
+ - name: Run tests
56
+ run: pytest --cov=src/predikit --cov-report=term-missing
@@ -1,15 +1,15 @@
1
- repos:
2
- - repo: https://github.com/astral-sh/ruff-pre-commit
3
- rev: v0.5.0
4
- hooks:
5
- - id: ruff
6
- args: [--fix]
7
- - id: ruff-format
8
-
9
- - repo: https://github.com/pre-commit/mirrors-mypy
10
- rev: v1.10.0
11
- hooks:
12
- - id: mypy
13
- additional_dependencies:
14
- - pydantic>=2.0
15
- - numpy>=1.24
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.5.0
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - id: ruff-format
8
+
9
+ - repo: https://github.com/pre-commit/mirrors-mypy
10
+ rev: v1.10.0
11
+ hooks:
12
+ - id: mypy
13
+ additional_dependencies:
14
+ - pydantic>=2.0
15
+ - numpy>=1.24
@@ -6,6 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.6.4] - 2026-10-28
10
+
11
+ ### Fixed
12
+ - Validate unnamed model feature counts when creating a `ModelTool`, producing an actionable
13
+ schema/model mismatch error before the first prediction instead of exposing an estimator error.
14
+
9
15
  ## [0.6.3] - 2026-09-13
10
16
 
11
17
  ### Fixed
@@ -13,7 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
13
19
 
14
20
  ### Changed
15
21
  - Polished the README installation guidance and documented MCP HTTP host/port options.
16
-
22
+
17
23
  ## [0.6.2] - 2026-08-22
18
24
 
19
25
  ### Added
@@ -1,71 +1,71 @@
1
- # predikit — Claude Code context
2
-
3
- ## What this is
4
-
5
- predikit wraps fitted scikit-learn / XGBoost models as LLM-callable tools with auto-generated JSON schemas, typed I/O via Pydantic, and first-class support for OpenAI function calling and LangChain.
6
-
7
- ## Project layout
8
-
9
- ```
10
- src/predikit/ Core package (installed as `predikit`)
11
- tool.py ModelTool — main public class
12
- registry.py ToolRegistry — groups multiple tools for bulk export
13
- ensemble.py ModelEnsemble — multi-model reconciliation strategies
14
- exceptions.py LowConfidenceError
15
- coerce.py LLM-string → Python type coercion (bool, int, float, str)
16
- introspect.py Extract sklearn model metadata (feature names, task type)
17
- cli.py `predikit inspect` CLI (click + joblib)
18
- exporters/
19
- openai.py .to_openai() — OpenAI function-calling schema
20
- langchain.py .to_langchain() — LangChain StructuredTool
21
- loaders/
22
- mlflow.py from_mlflow() — load from MLflow Model Registry
23
- snowflake.py from_snowflake() — load from Snowflake Model Registry
24
- tests/ pytest suite (mirrors src/ layout)
25
- examples/ Standalone usage scripts (01–07)
26
- ```
27
-
28
- ## Commands
29
-
30
- ```bash
31
- # Install for development
32
- pip install -e ".[dev]"
33
-
34
- # Run tests
35
- pytest --cov=src/predikit --cov-report=term-missing
36
-
37
- # Lint (check only)
38
- ruff check src/ tests/ examples/
39
-
40
- # Format (check only)
41
- ruff format --check src/ tests/ examples/
42
-
43
- # Lint + format (auto-fix)
44
- ruff check --fix src/ tests/ examples/
45
- ruff format src/ tests/ examples/
46
-
47
- # Type check
48
- mypy src/predikit
49
-
50
- # All checks via pre-commit
51
- pre-commit run --all-files
52
-
53
- # Install pre-commit hooks
54
- pre-commit install
55
- ```
56
-
57
- ## Key conventions
58
-
59
- - **Public API** — `ModelTool`, `ToolRegistry`, `ModelEnsemble`, `LowConfidenceError` are all re-exported from `predikit/__init__.py`. Everything else is internal.
60
- - **Optional imports** — heavy optional deps (`langchain`, `xgboost`, `mlflow`, `snowflake`) are imported inside functions/methods, never at module level, so missing extras don't break core imports.
61
- - **Feature name matching** — inputs map to model features by column name (using `feature_names_in_` from sklearn), not by position. Mismatches raise a `ValueError` with a clear diff.
62
- - **Bool coercion** — `coerce_value()` converts LLM strings (`"yes"`, `"true"`, `"1"`, `"on"`) to Python bools before Pydantic validation.
63
- - **Async** — `ainvoke()` is a thin wrapper over `invoke()` via `loop.run_in_executor`. No async-native I/O involved.
64
- - **Ensemble strategies** — `"collect"`, `"mean"`, `"vote"`, `"weighted_mean"`, `"weighted_vote"`. Weighted strategies take a `weights` list parallel to `tools`.
65
-
66
- ## Release process
67
-
68
- 1. Bump `version` in `pyproject.toml` and `__version__` in `src/predikit/__init__.py`.
69
- 2. Add a section to `CHANGELOG.md`.
70
- 3. Commit, push to `main`, create a GitHub Release with the version tag (e.g. `v0.4.1`).
71
- 4. `publish.yml` auto-triggers a PyPI upload via OIDC trusted publishing.
1
+ # predikit — Claude Code context
2
+
3
+ ## What this is
4
+
5
+ predikit wraps fitted scikit-learn / XGBoost models as LLM-callable tools with auto-generated JSON schemas, typed I/O via Pydantic, and first-class support for OpenAI function calling and LangChain.
6
+
7
+ ## Project layout
8
+
9
+ ```
10
+ src/predikit/ Core package (installed as `predikit`)
11
+ tool.py ModelTool — main public class
12
+ registry.py ToolRegistry — groups multiple tools for bulk export
13
+ ensemble.py ModelEnsemble — multi-model reconciliation strategies
14
+ exceptions.py LowConfidenceError
15
+ coerce.py LLM-string → Python type coercion (bool, int, float, str)
16
+ introspect.py Extract sklearn model metadata (feature names, task type)
17
+ cli.py `predikit inspect` CLI (click + joblib)
18
+ exporters/
19
+ openai.py .to_openai() — OpenAI function-calling schema
20
+ langchain.py .to_langchain() — LangChain StructuredTool
21
+ loaders/
22
+ mlflow.py from_mlflow() — load from MLflow Model Registry
23
+ snowflake.py from_snowflake() — load from Snowflake Model Registry
24
+ tests/ pytest suite (mirrors src/ layout)
25
+ examples/ Standalone usage scripts (01–07)
26
+ ```
27
+
28
+ ## Commands
29
+
30
+ ```bash
31
+ # Install for development
32
+ pip install -e ".[dev]"
33
+
34
+ # Run tests
35
+ pytest --cov=src/predikit --cov-report=term-missing
36
+
37
+ # Lint (check only)
38
+ ruff check src/ tests/ examples/
39
+
40
+ # Format (check only)
41
+ ruff format --check src/ tests/ examples/
42
+
43
+ # Lint + format (auto-fix)
44
+ ruff check --fix src/ tests/ examples/
45
+ ruff format src/ tests/ examples/
46
+
47
+ # Type check
48
+ mypy src/predikit
49
+
50
+ # All checks via pre-commit
51
+ pre-commit run --all-files
52
+
53
+ # Install pre-commit hooks
54
+ pre-commit install
55
+ ```
56
+
57
+ ## Key conventions
58
+
59
+ - **Public API** — `ModelTool`, `ToolRegistry`, `ModelEnsemble`, `LowConfidenceError` are all re-exported from `predikit/__init__.py`. Everything else is internal.
60
+ - **Optional imports** — heavy optional deps (`langchain`, `xgboost`, `mlflow`, `snowflake`) are imported inside functions/methods, never at module level, so missing extras don't break core imports.
61
+ - **Feature name matching** — inputs map to model features by column name (using `feature_names_in_` from sklearn), not by position. Mismatches raise a `ValueError` with a clear diff.
62
+ - **Bool coercion** — `coerce_value()` converts LLM strings (`"yes"`, `"true"`, `"1"`, `"on"`) to Python bools before Pydantic validation.
63
+ - **Async** — `ainvoke()` is a thin wrapper over `invoke()` via `loop.run_in_executor`. No async-native I/O involved.
64
+ - **Ensemble strategies** — `"collect"`, `"mean"`, `"vote"`, `"weighted_mean"`, `"weighted_vote"`. Weighted strategies take a `weights` list parallel to `tools`.
65
+
66
+ ## Release process
67
+
68
+ 1. Bump `version` in `pyproject.toml` and `__version__` in `src/predikit/__init__.py`.
69
+ 2. Add a section to `CHANGELOG.md`.
70
+ 3. Commit, push to `main`, create a GitHub Release with the version tag (e.g. `v0.4.1`).
71
+ 4. `publish.yml` auto-triggers a PyPI upload via OIDC trusted publishing.
@@ -1,66 +1,66 @@
1
- # Contributing to predikit
2
-
3
- Thanks for your interest in contributing.
4
-
5
- ## Prerequisites
6
-
7
- - Python 3.10+
8
- - [pre-commit](https://pre-commit.com/) (`pip install pre-commit`)
9
-
10
- ## Development setup
11
-
12
- ```bash
13
- git clone https://github.com/Tejas-TA/predikit
14
- cd predikit
15
- pip install -e ".[dev]"
16
- pre-commit install
17
- ```
18
-
19
- `pre-commit install` wires up ruff and mypy to run automatically before every commit.
20
-
21
- ## Running tests
22
-
23
- ```bash
24
- pytest --cov=src/predikit --cov-report=term-missing
25
- ```
26
-
27
- ## Code style
28
-
29
- This project uses [ruff](https://docs.astral.sh/ruff/) for linting and formatting, and [mypy](https://mypy.readthedocs.io/) for type checking. All three are configured in `pyproject.toml`.
30
-
31
- ```bash
32
- # Check and auto-fix
33
- ruff check --fix src/ tests/ examples/
34
- ruff format src/ tests/ examples/
35
-
36
- # Type check
37
- mypy src/predikit
38
- ```
39
-
40
- Or run everything at once via pre-commit:
41
-
42
- ```bash
43
- pre-commit run --all-files
44
- ```
45
-
46
- CI enforces all three checks on every push and PR (see `.github/workflows/test.yml`).
47
-
48
- ## Pull request guidelines
49
-
50
- - Target `main`.
51
- - Keep changes focused — one feature or fix per PR.
52
- - Add or update tests for any changed behaviour.
53
- - Run `pre-commit run --all-files` before pushing; CI will catch failures regardless.
54
-
55
- ## Adding a new exporter or loader
56
-
57
- - Exporters live in `src/predikit/exporters/` and should expose a single function consumed by `ModelTool`.
58
- - Loaders live in `src/predikit/loaders/` and should return a `ModelTool` instance.
59
- - Any new optional dependency must be added to both the relevant optional group and `dev` in `pyproject.toml`, and imported inside the function body (not at module level).
60
-
61
- ## Release process (maintainers)
62
-
63
- 1. Bump `version` in `pyproject.toml` and `__version__` in `src/predikit/__init__.py`.
64
- 2. Add a section to `CHANGELOG.md`.
65
- 3. Merge to `main`, create a GitHub Release tagged `vX.Y.Z`.
66
- 4. `publish.yml` automatically publishes to PyPI via OIDC trusted publishing.
1
+ # Contributing to predikit
2
+
3
+ Thanks for your interest in contributing.
4
+
5
+ ## Prerequisites
6
+
7
+ - Python 3.10+
8
+ - [pre-commit](https://pre-commit.com/) (`pip install pre-commit`)
9
+
10
+ ## Development setup
11
+
12
+ ```bash
13
+ git clone https://github.com/Tejas-TA/predikit
14
+ cd predikit
15
+ pip install -e ".[dev]"
16
+ pre-commit install
17
+ ```
18
+
19
+ `pre-commit install` wires up ruff and mypy to run automatically before every commit.
20
+
21
+ ## Running tests
22
+
23
+ ```bash
24
+ pytest --cov=src/predikit --cov-report=term-missing
25
+ ```
26
+
27
+ ## Code style
28
+
29
+ This project uses [ruff](https://docs.astral.sh/ruff/) for linting and formatting, and [mypy](https://mypy.readthedocs.io/) for type checking. All three are configured in `pyproject.toml`.
30
+
31
+ ```bash
32
+ # Check and auto-fix
33
+ ruff check --fix src/ tests/ examples/
34
+ ruff format src/ tests/ examples/
35
+
36
+ # Type check
37
+ mypy src/predikit
38
+ ```
39
+
40
+ Or run everything at once via pre-commit:
41
+
42
+ ```bash
43
+ pre-commit run --all-files
44
+ ```
45
+
46
+ CI enforces all three checks on every push and PR (see `.github/workflows/test.yml`).
47
+
48
+ ## Pull request guidelines
49
+
50
+ - Target `main`.
51
+ - Keep changes focused — one feature or fix per PR.
52
+ - Add or update tests for any changed behaviour.
53
+ - Run `pre-commit run --all-files` before pushing; CI will catch failures regardless.
54
+
55
+ ## Adding a new exporter or loader
56
+
57
+ - Exporters live in `src/predikit/exporters/` and should expose a single function consumed by `ModelTool`.
58
+ - Loaders live in `src/predikit/loaders/` and should return a `ModelTool` instance.
59
+ - Any new optional dependency must be added to both the relevant optional group and `dev` in `pyproject.toml`, and imported inside the function body (not at module level).
60
+
61
+ ## Release process (maintainers)
62
+
63
+ 1. Bump `version` in `pyproject.toml` and `__version__` in `src/predikit/__init__.py`.
64
+ 2. Add a section to `CHANGELOG.md`.
65
+ 3. Merge to `main`, create a GitHub Release tagged `vX.Y.Z`.
66
+ 4. `publish.yml` automatically publishes to PyPI via OIDC trusted publishing.
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Tejas Tumakuru Ashok
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tejas Tumakuru Ashok
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.