Skip to content

Commit 604bb47

Browse files
Secboneclaude
andcommitted
release: v0.1.6
Bump version to 0.1.6 with improved publish workflow safety. Changes in this release: - card2pmml() PMML export for scorecards - ChiMerge constraint_mode parameter - Rust migration for ChiMerge performance - pandas 3.x compatibility fixes - Publish workflow: per-platform wheel validation, explicit conclusion checks, fail on missing artifacts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 79e8f25 commit 604bb47

4 files changed

Lines changed: 74 additions & 14 deletions

File tree

.github/workflows/publish.yml

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,56 @@ concurrency:
1010
cancel-in-progress: false # Don't cancel publish jobs
1111

1212
jobs:
13-
# Wait for all test workflows to complete
13+
# Wait for all platform test workflows to complete successfully
1414
wait-for-tests:
1515
name: Wait for test workflows
1616
runs-on: ubuntu-latest
1717
steps:
1818
- name: Wait for Linux tests
1919
uses: fountainhead/action-wait-for-check@v1.2.0
20+
id: wait-linux
2021
with:
2122
token: ${{ secrets.GITHUB_TOKEN }}
22-
checkName: "Test py 3.10" # Representative test from linux.yml
23+
checkName: "Test py 3.10"
2324
ref: ${{ github.sha }}
2425
timeoutSeconds: 1800
2526

27+
- name: Fail if Linux tests failed
28+
if: steps.wait-linux.outputs.conclusion != 'success'
29+
run: |
30+
echo "❌ Linux tests failed or timed out (conclusion: ${{ steps.wait-linux.outputs.conclusion }})"
31+
exit 1
32+
2633
- name: Wait for macOS tests
2734
uses: fountainhead/action-wait-for-check@v1.2.0
35+
id: wait-macos
2836
with:
2937
token: ${{ secrets.GITHUB_TOKEN }}
30-
checkName: "Test py 3.10 macos-latest" # Representative test from macos.yml
38+
checkName: "Test py 3.10 macos-latest"
3139
ref: ${{ github.sha }}
3240
timeoutSeconds: 1800
3341

42+
- name: Fail if macOS tests failed
43+
if: steps.wait-macos.outputs.conclusion != 'success'
44+
run: |
45+
echo "❌ macOS tests failed or timed out (conclusion: ${{ steps.wait-macos.outputs.conclusion }})"
46+
exit 1
47+
3448
- name: Wait for Windows tests
3549
uses: fountainhead/action-wait-for-check@v1.2.0
50+
id: wait-windows
3651
with:
3752
token: ${{ secrets.GITHUB_TOKEN }}
38-
checkName: "Test py 3.10" # Representative test from windows.yml (different from Linux)
53+
checkName: "Test py 3.10"
3954
ref: ${{ github.sha }}
4055
timeoutSeconds: 1800
4156

57+
- name: Fail if Windows tests failed
58+
if: steps.wait-windows.outputs.conclusion != 'success'
59+
run: |
60+
echo "❌ Windows tests failed or timed out (conclusion: ${{ steps.wait-windows.outputs.conclusion }})"
61+
exit 1
62+
4263
download-wheels:
4364
name: Download tested wheels
4465
needs: [wait-for-tests]
@@ -52,6 +73,8 @@ jobs:
5273
path: dist/
5374
name_is_regexp: true
5475
name: wheel-linux-.*
76+
search_artifacts: true
77+
if_no_artifact_found: fail
5578

5679
- name: Download macOS wheels
5780
uses: dawidd6/action-download-artifact@v6
@@ -61,6 +84,8 @@ jobs:
6184
path: dist/
6285
name_is_regexp: true
6386
name: wheel-macos-.*
87+
search_artifacts: true
88+
if_no_artifact_found: fail
6489

6590
- name: Download Windows wheels
6691
uses: dawidd6/action-download-artifact@v6
@@ -70,6 +95,8 @@ jobs:
7095
path: dist/
7196
name_is_regexp: true
7297
name: wheel-windows-.*
98+
search_artifacts: true
99+
if_no_artifact_found: fail
73100

74101
- name: List downloaded wheels
75102
run: |
@@ -82,15 +109,30 @@ jobs:
82109
- name: Verify wheel count
83110
run: |
84111
wheel_count=$(ls dist/*.whl 2>/dev/null | wc -l)
85-
echo "Found $wheel_count wheels"
86-
87-
# Expected: Linux(5) + macOS(10) + Windows(5) = 20 wheels
88-
# But some may be experimental and fail, so check for minimum
89-
if [ "$wheel_count" -lt 15 ]; then
90-
echo "❌ Error: Expected at least 15 wheels, found $wheel_count"
112+
linux_count=$(ls dist/toad-*manylinux*.whl 2>/dev/null | wc -l)
113+
macos_count=$(ls dist/toad-*macosx*.whl 2>/dev/null | wc -l)
114+
windows_count=$(ls dist/toad-*win*.whl 2>/dev/null | wc -l)
115+
116+
echo "Total wheels: $wheel_count"
117+
echo " Linux: $linux_count (expected ≥5)"
118+
echo " macOS: $macos_count (expected ��5)"
119+
echo " Windows: $windows_count (expected ≥5)"
120+
121+
# Each platform must have at least 5 wheels (py3.9-3.13)
122+
# Experimental (py3.14) may fail, so we don't require them
123+
if [ "$linux_count" -lt 5 ]; then
124+
echo "❌ Error: Linux wheels incomplete ($linux_count < 5)"
125+
exit 1
126+
fi
127+
if [ "$macos_count" -lt 5 ]; then
128+
echo "❌ Error: macOS wheels incomplete ($macos_count < 5)"
129+
exit 1
130+
fi
131+
if [ "$windows_count" -lt 5 ]; then
132+
echo "❌ Error: Windows wheels incomplete ($windows_count < 5)"
91133
exit 1
92134
fi
93-
echo "✓ Wheel count OK"
135+
echo "✓ All platforms have sufficient wheels"
94136
95137
- name: Verify wheel integrity
96138
run: |

CHANGELOG.md

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.1.6] - 2026-04-14
11+
12+
### Added
13+
- Added `card2pmml()` method for exporting scorecards to PMML format
14+
- Added `constraint_mode` parameter for ChiMerge binning
15+
- Added `[pmml]` optional dependency group (`sklearn2pmml`, `sklearn-pandas`)
16+
17+
### Changed
18+
- Migrated ChiMerge to Rust (PyO3/maturin) for performance
19+
- Fixed pandas 3.x compatibility issues
20+
- Updated CI: Python 3.14 support, improved publish workflow safety
21+
1022
## [0.1.5] - 2025-02-18
1123

1224
### Add
@@ -196,7 +208,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
196208
- VIF independent statsmodels.
197209

198210

199-
[Unreleased]: https://github.com/amphibian-dev/toad/compare/0.1.0...HEAD
211+
[Unreleased]: https://github.com/amphibian-dev/toad/compare/0.1.6...HEAD
212+
[0.1.6]: https://github.com/amphibian-dev/toad/compare/0.1.5...0.1.6
213+
[0.1.5]: https://github.com/amphibian-dev/toad/compare/0.1.4...0.1.5
214+
[0.1.4]: https://github.com/amphibian-dev/toad/compare/0.1.3...0.1.4
215+
[0.1.3]: https://github.com/amphibian-dev/toad/compare/0.1.2...0.1.3
216+
[0.1.2]: https://github.com/amphibian-dev/toad/compare/0.1.1...0.1.2
217+
[0.1.1]: https://github.com/amphibian-dev/toad/compare/0.1.0...0.1.1
200218
[0.1.0]: https://github.com/amphibian-dev/toad/compare/0.0.65...0.1.0
201219
[0.0.65]: https://github.com/amphibian-dev/toad/compare/0.0.64...0.0.65
202220
[0.0.64]: https://github.com/amphibian-dev/toad/compare/0.0.62...0.0.64

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "toad"
3-
version = "0.1.5"
3+
version = "0.1.6"
44
edition = "2021"
55
authors = ["ESC Team <secbone@gmail.com>"]
66
description = "Toad is dedicated to facilitating model development process, especially for a scorecard."

toad/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version_info__ = (0, 1, 5, 'final', 0)
1+
__version_info__ = (0, 1, 6, 'final', 0)
22

33
def get_version(version):
44
main = '.'.join(str(x) for x in version[:3])

0 commit comments

Comments
 (0)