diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 81d639f..a5ae64f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- python-version: ["3.10", "3.11", "3.12"]
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
steps:
- uses: actions/checkout@v4
@@ -23,7 +23,7 @@ jobs:
run: uv python install ${{ matrix.python-version }}
- name: Install dependencies
- run: uv sync --dev
+ run: uv sync --group dev --all-extras
- name: Run tests
run: uv run pytest tests/ -v --tb=short
@@ -40,7 +40,7 @@ jobs:
run: uv python install 3.12
- name: Install dependencies
- run: uv sync --dev
+ run: uv sync --group dev --all-extras
- name: Run ruff check
run: uv run ruff check .
@@ -65,6 +65,14 @@ jobs:
- name: Check build artifacts
run: uvx twine check dist/*
+ - name: Smoke test the core wheel
+ run: |
+ uv venv /tmp/tablint-smoke
+ uv pip install --python /tmp/tablint-smoke/bin/python dist/*.whl
+ status=0
+ /tmp/tablint-smoke/bin/tablint scan datasets/train.csv --target Survived --preset gate --fail-on critical --json || status=$?
+ test "$status" -eq 2
+
web-check:
runs-on: ubuntu-latest
steps:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b452be0..0b87d2a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -25,10 +25,14 @@ jobs:
- name: Build package
run: uv build
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: dist
+ path: dist/*
+
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
- # with:
- # repository-url: https://upload.pypi.org/legacy/ # Optional: defaults to PyPI
github-release:
runs-on: ubuntu-latest
@@ -37,6 +41,11 @@ jobs:
contents: write
steps:
- uses: actions/checkout@v4
+ - name: Download build artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: dist
+ path: dist
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
diff --git a/.gitignore b/.gitignore
index 01a5eda..9199f3e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -97,6 +97,9 @@ build/
dist/
hashprep-dev.json
+tablecheck-dev.json
+datalint-dev.json
+tablint-dev.json
todo.md
test.json
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8b95fc1..a3c47d1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,31 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.1.0b1] - 2026-10-23
+
+Project renamed from `hashprep` to `tablint`. This beta ships the training-gate behaviour previously developed as hashprep 0.2.0.
+
+### Changed
+- Distribution name, import package, and CLI are `tablint`.
+- `HashPrepConfig` is now `TablintConfig`.
+- Report filenames use the `_tablint_report` suffix.
+
+## [0.2.0] - 2026-10-20
+
+### Breaking
+- `critical` means a training blocker. Non-normality is always a warning. Drift is critical only when the shift is large, not merely when the p-value is small.
+- `DatasetAnalyzer` and `tablint scan` / `details` default to the `gate` preset. `tablint report` defaults to `profile`. Pass `preset="profile"` or `--preset profile` for the previous full catalogue.
+- Sampling is off unless `--sample-size` or `auto_sample=True` is set.
+- `scan --json` now uses `schema_version`, `critical_count`, `warning_count`, `total_issues`, `issues`, and `sampling_info`. `details --json` prints the same object.
+- F-statistic leakage thresholds are ignored. Leakage uses correlation, bias-corrected CramΓ©r's V, or correlation ratio.
+- Plots, HTML, and PDF require `pip install "tablint[reports]"`. Parquet requires `pip install "tablint[parquet]"`.
+
+### Added
+- Column roles (`target`, `identifier`, `boolean`, `categorical`, `numeric`, `datetime`, `text`) shared by every check.
+- `--preset`, `--fail-on`, and Parquet input.
+- `statistic` and `effect_size` on each issue.
+- Generated code escapes column names. Sklearn steps with the same transformation are grouped. Outlier clipping is a real pre-pipeline function.
+
## [0.1.0] - 2026-05-22
### Added
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 41d8778..a3bdc5c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,6 +1,6 @@
-# Contributing to HashPrep
+# Contributing to Tablint
-First off β thank you for considering contributing to HashPrep π
+First off β thank you for considering contributing to Tablint π
Your contributions help make this platform more useful for the ML community!
## How to Contribute
@@ -12,8 +12,8 @@ For new contributors, we suggest starting with Easy tasks.
### Fork and clone the repository
```bash
-git clone https://github.com/cachevector/hashprep.git
-cd hashprep
+git clone https://github.com/cachevector/tablint.git
+cd tablint
```
### Create a virtual environment
@@ -26,13 +26,13 @@ source .venv/bin/activate
### Install in development mode
```bash
-uv sync --extra dev
+uv sync --group dev --all-extras
```
-
+
-
+
@@ -27,15 +27,15 @@
> [!NOTE]
-> HashPrep is now in its first stable release (v0.1.0). Core features are fully tested with CI.
+> Tablint 0.1.0b1 is the first public beta. `critical` means "do not train this table as-is."
## Overview
-**HashPrep** is a Python library for intelligent dataset profiling and debugging that acts as a comprehensive pre-training quality assurance tool for machine learning projects.
+**Tablint** is a Python library for intelligent dataset profiling and debugging that acts as a comprehensive pre-training quality assurance tool for machine learning projects.
Think of it as **"Pandas Profiling + PyLint for datasets"**, designed specifically for machine learning workflows.
It catches critical dataset issues before they derail your ML pipeline, explains the problems, and suggests context-aware fixes.
-If you want, HashPrep can even apply those fixes for you automatically.
+If you want, Tablint can even apply those fixes for you automatically.
---
@@ -48,7 +48,7 @@ Key features include:
- **ML-Specific Checks**: Identify data leakage, dataset drift, class imbalance, and high-cardinality features.
- **Automated Preparation**: Get suggestions for encoding, imputation, scaling, and transformations.
- **Rich Reporting**: Generate statistical summaries and exportable reports (HTML/PDF/Markdown/JSON) with embedded visualizations.
-- **Production-Ready Pipelines**: Output reproducible cleaning and preprocessing code (`fixes.py`) that integrates seamlessly with ML workflows.
+- **Reviewed preparation code**: Write a pandas cleaning script and a scikit-learn pipeline. Fit the pipeline on the training split. The pandas script computes statistics from the frame you pass in.
- **Modern Themes**: Choose between "Minimal" (professional) and "Neubrutalism" (bold) report styles.
---
@@ -57,7 +57,7 @@ Key features include:
### Using pip
```bash
-pip install hashprep
+pip install tablint
```
### Using uv (recommended)
@@ -65,29 +65,29 @@ pip install hashprep
# Install uv if you haven't already
curl -LsSf https://astral.sh/uv/install.sh | sh
-# Install hashprep
-uv pip install hashprep
+# Install tablint
+uv pip install tablint
# Or for development from source
-git clone https://github.com/cachevector/hashprep.git
-cd hashprep
+git clone https://github.com/cachevector/tablint.git
+cd tablint
uv sync
```
-After installation, the `hashprep` command will be available directly in your terminal.
+After installation, the `tablint` command will be available directly in your terminal.
---
## Usage
-HashPrep can be used both as a **command-line tool** and as a **Python library**.
+Tablint can be used both as a **command-line tool** and as a **Python library**.
### CLI Usage
#### 1. Quick Scan
Get a quick summary of critical issues in your terminal.
```bash
-hashprep scan dataset.csv
+tablint scan dataset.csv
```
**Options:**
@@ -97,36 +97,38 @@ hashprep scan dataset.csv
- `--target COLUMN`: Specify target column for ML-specific checks
- `--checks CHECKS`: Run specific checks (comma-separated)
- `--comparison FILE`: Compare with another dataset for drift detection
-- `--sample-size N`: Limit analysis to N rows
-- `--no-sample`: Disable automatic sampling
+- `--preset {gate,profile}`: `gate` is the default and is the training-blocker set. `profile` runs every check.
+- `--fail-on {critical,warning}`: Exit 2 when that severity is present. Exit 0 means the bar was not hit. Exit 1 is a usage or runtime error.
+- `--sample-size N`: Analyze at most N rows. Sampling stays off unless this is set.
+- `--no-sample`: Disable sampling even when `--sample-size` is set.
- `--config FILE`: Load thresholds from a YAML/TOML/JSON config file
**Example:**
```bash
-# Scan with target column and specific checks
-hashprep scan train.csv --target Survived --checks outliers,high_missing_values,class_imbalance
+# Block a training job when the table is not trainable
+tablint scan train.csv --target Survived --preset gate --fail-on critical
# Quick scan with JSON output
-hashprep scan dataset.csv --json --quiet
+tablint scan dataset.csv --json --quiet
```
#### 2. Detailed Analysis
Get comprehensive details about all detected issues.
```bash
-hashprep details dataset.csv
+tablint details dataset.csv
```
**Options:** Same as `scan` command (including `--config`)
**Example:**
```bash
-hashprep details train.csv --target Survived
+tablint details train.csv --target Survived
```
#### 3. Generate Reports
Generate comprehensive reports in multiple formats with visualizations.
```bash
-hashprep report dataset.csv --format html --theme minimal
+tablint report dataset.csv --format html --theme minimal
```
**Options:**
@@ -139,43 +141,44 @@ hashprep report dataset.csv --format html --theme minimal
- `--target COLUMN`: Specify target column
- `--checks CHECKS`: Run specific checks
- `--comparison FILE`: Compare with another dataset for drift detection
-- `--sample-size N`: Limit analysis to N rows
-- `--no-sample`: Disable automatic sampling
+- `--preset {gate,profile}`: `profile` is the default for reports. `gate` runs only training blockers.
+- `--sample-size N`: Analyze at most N rows. Sampling stays off unless this is set.
+- `--no-sample`: Disable sampling even when `--sample-size` is set.
- `--config FILE`: Load thresholds from a YAML/TOML/JSON config file
**Examples:**
```bash
# Generate HTML report with minimal theme
-hashprep report dataset.csv --format html --theme minimal --full
+tablint report dataset.csv --format html --theme minimal --full
# Generate PDF report without visualizations (faster)
-hashprep report dataset.csv --format pdf --no-visualizations
+tablint report dataset.csv --format pdf --no-visualizations
# Generate report with automatic fix scripts
-hashprep report dataset.csv --with-code
+tablint report dataset.csv --with-code
# Generate report with custom output path
-hashprep report dataset.csv --format html --output my_reports/analysis.html
+tablint report dataset.csv --format html --output my_reports/analysis.html
# This creates:
-# - dataset_hashprep_report.md (or .html/.pdf/.json)
-# - dataset_hashprep_report_fixes.py (pandas script)
-# - dataset_hashprep_report_pipeline.py (sklearn pipeline)
+# - dataset_tablint_report.md (or .html/.pdf/.json)
+# - dataset_tablint_report_fixes.py (pandas script)
+# - dataset_tablint_report_pipeline.py (sklearn pipeline)
# Compare two datasets for drift detection
-hashprep report train.csv --comparison test.csv --format html
+tablint report train.csv --comparison test.csv --format html
```
#### 4. List Available Checks
-Discover all data quality checks that HashPrep can perform.
+Discover all data quality checks that Tablint can perform.
```bash
-hashprep checks
+tablint checks
```
#### 5. Version
-Check HashPrep version.
+Check Tablint version.
```bash
-hashprep version
+tablint version
```
#### Available Checks
@@ -218,7 +221,7 @@ hashprep version
#### Basic Analysis
```python
import pandas as pd
-from hashprep import DatasetAnalyzer
+from tablint import DatasetAnalyzer
# Load your dataset
df = pd.read_csv("dataset.csv")
@@ -283,7 +286,7 @@ summary = analyzer.analyze()
#### Generate Reports Programmatically
```python
-from hashprep.reports import generate_report
+from tablint.reports import generate_report
# Analyze dataset
analyzer = DatasetAnalyzer(df, include_plots=True)
@@ -325,10 +328,10 @@ generate_report(
#### Generate Fix Scripts
```python
-from hashprep.checks.core import Issue
-from hashprep.preparers.codegen import CodeGenerator
-from hashprep.preparers.pipeline_builder import PipelineBuilder
-from hashprep.preparers.suggestions import SuggestionProvider
+from tablint.checks.core import Issue
+from tablint.preparers.codegen import CodeGenerator
+from tablint.preparers.pipeline_builder import PipelineBuilder
+from tablint.preparers.suggestions import SuggestionProvider
# After running analysis
analyzer = DatasetAnalyzer(df, target_col='target')
@@ -361,17 +364,17 @@ with open('pipeline.py', 'w') as f:
#### Load Config from File
```python
-from hashprep.utils.config_loader import load_config
-from hashprep import DatasetAnalyzer
+from tablint.utils.config_loader import load_config
+from tablint import DatasetAnalyzer
# Load thresholds from YAML, TOML, or JSON
-config = load_config("hashprep.yaml") # or .toml / .json
+config = load_config("tablint.yaml") # or .toml / .json
analyzer = DatasetAnalyzer(df, config=config)
summary = analyzer.analyze()
```
-Example `hashprep.yaml`:
+Example `tablint.yaml`:
```yaml
missing_values:
warning: 0.3
@@ -386,7 +389,7 @@ Only the keys you specify are overridden; all others fall back to defaults.
#### Custom Sampling
```python
-from hashprep.utils.sampling import SamplingConfig
+from tablint.utils.sampling import SamplingConfig
# Configure sampling for large datasets
sampling_config = SamplingConfig(max_rows=10000)
@@ -406,6 +409,35 @@ if 'sampling_info' in summary:
---
+## Production gate
+
+`DatasetAnalyzer` defaults to the `gate` preset. `tablint report` defaults to `profile`.
+
+`critical` is reserved for defects that should stop a training job: an empty table, an all-null column, missingness at or above the critical threshold, infinite values, duplicate rows above the critical ratio, a column identical or nearly identical to the target, and drift whose effect size is large. Skew, non-normality, ordinary correlation with the target, and zero-inflation of a binary target are warnings, and most of them run only in the `profile` preset.
+
+Stable keys in `analyze()` and in `scan --json` / `details --json`:
+
+- `schema_version` (`"0.2"`), `critical_count`, `warning_count`, `total_issues`
+- `issues[]`: `category`, `severity`, `column`, `description`, `impact_score`, `quick_fix`, `statistic`, `effect_size`
+- `sampling_info`
+
+`summaries` and plots are best-effort and can change without a major version.
+
+```bash
+tablint scan train.csv --target Survived --preset gate --fail-on critical --json
+```
+
+Exit 2 when `--fail-on` matches. A job that only checks the exit code should pass `--fail-on critical`.
+
+### Limitations
+
+- Input is CSV, or Parquet when `tablint[parquet]` is installed. HTML, PDF, and plots need `tablint[reports]`.
+- Leakage means near-deterministic association with the target, not a proof that a column was built from the label.
+- Sampling is off unless you pass `--sample-size` or `auto_sample=True`. Checks then describe the analyzed frame, which is the full table by default.
+- Generated pandas code learns fill values from the frame you pass. Pass the training split, or fit the generated sklearn pipeline on that split.
+
+---
+
## License
This project is licensed under the [**MIT License**](./LICENSE).
@@ -414,7 +446,7 @@ This project is licensed under the [**MIT License**](./LICENSE).
## Contributing
-We welcome contributions from the community to make HashPrep better!
+We welcome contributions from the community to make Tablint better!
Before you get started, please:
diff --git a/RELEASE_TODO.md b/RELEASE_TODO.md
index 5c3bb49..b0620ea 100644
--- a/RELEASE_TODO.md
+++ b/RELEASE_TODO.md
@@ -1,10 +1,10 @@
-# HashPrep Official Release TODO
+# Tablint Official Release TODO
## Release Scope
- [x] Decide the official version target, likely `0.1.0` unless the release should signal `1.0.0`.
- [x] Freeze public API expectations for `DatasetAnalyzer`.
-- [x] Freeze public API expectations for `HashPrepConfig`.
+- [x] Freeze public API expectations for `TablintConfig`.
- [x] Freeze public API expectations for `load_config`.
- [x] Freeze public API expectations for `generate_report`.
- [x] Freeze CLI behavior for `scan`, `details`, `report`, and `version`.
@@ -65,11 +65,11 @@
### Strongly Recommended
-- [x] Add an `--output` option to `hashprep report`.
-- [x] Allow `hashprep report data.csv --format html --output reports/data.html`.
-- [x] Add machine-readable JSON output for `hashprep details`.
-- [x] Add check discovery through a command such as `hashprep checks`.
-- [x] Alternatively add check discovery through an option such as `hashprep scan --list-checks`.
+- [x] Add an `--output` option to `tablint report`.
+- [x] Allow `tablint report data.csv --format html --output reports/data.html`.
+- [x] Add machine-readable JSON output for `tablint details`.
+- [x] Add check discovery through a command such as `tablint checks`.
+- [x] Alternatively add check discovery through an option such as `tablint scan --list-checks`.
- [x] Document why issues are classified as `critical` versus `warning`.
- [x] Review whether PDF/reporting dependencies should move to optional extras in a future release.
- [x] Document any dependency-extra plan if it is deferred.
@@ -84,7 +84,7 @@
## Packaging
-- [x] Update `hashprep/__init__.py` from `0.1.0b3` to the official release version.
+- [x] Update `tablint/__init__.py` from `0.1.0b3` to the official release version.
- [x] Update the beta note in `README.md`.
- [x] Update the beta support table in `SECURITY.md`.
- [x] Add or verify PyPI classifiers in `pyproject.toml`.
@@ -96,10 +96,10 @@
- [x] Build wheel distribution.
- [x] Inspect built package artifacts.
- [x] Install the built wheel in a clean environment.
-- [x] Smoke test `import hashprep` from the built wheel.
-- [x] Smoke test `hashprep version` from the built wheel.
-- [x] Smoke test `hashprep scan datasets/train.csv` from the built wheel.
-- [x] Smoke test `hashprep report datasets/train.csv --format html` from the built wheel.
+- [x] Smoke test `import tablint` from the built wheel.
+- [x] Smoke test `tablint version` from the built wheel.
+- [x] Smoke test `tablint scan datasets/train.csv` from the built wheel.
+- [x] Smoke test `tablint report datasets/train.csv --format html` from the built wheel.
- [x] Confirm `MANIFEST.in` excludes dev/demo files intentionally.
- [x] Confirm `MANIFEST.in` includes all runtime files needed by reports and templates.
@@ -165,15 +165,15 @@
- [x] Tag the release, for example `v0.1.0`.
- [x] Publish to PyPI.
- [x] Create GitHub release with release notes.
-- [x] Verify public install with `pip install hashprep`.
-- [x] Verify public CLI with `hashprep version`.
+- [x] Verify public install with `pip install tablint`.
+- [x] Verify public CLI with `tablint version`.
- [x] Announce the release as the first stable release after alpha and beta.
## Known Immediate Gaps
- [x] Version is still `0.1.0b3`.
- [x] `README.md` still says beta.
-- [x] Website hero still says beta and shows `hashprep-0.1.0b3`.
+- [x] Website hero still says beta and shows `tablint-0.1.0b3`.
- [x] `SECURITY.md` only describes beta support.
- [x] `CHANGELOG.md` is not present.
- [x] CI does not currently build or check publish artifacts.
diff --git a/SECURITY.md b/SECURITY.md
index 4255a0d..3c900f6 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,23 +2,21 @@
## Supported Versions
-hashprep has reached a stable `0.1.0` release. Only the latest minor release is supported for security updates.
+Only the latest minor release is supported for security updates.
| Version | Supported |
| ---------- | ------------------ |
-| `0.1.0` | :white_check_mark: |
-| `< 0.1.0` | :x: |
-
-Once hashprep reaches a stable `0.1.0` release, this table will be updated to reflect supported minor versions.
+| `0.1.0b1` | :white_check_mark: |
+| `< 0.1.0b1`| :x: |
## Reporting a Vulnerability
-If you believe you have found a security vulnerability in hashprep (the Python package, the CLI, or the documentation website under `web/`), **please do not open a public GitHub issue**.
+If you believe you have found a security vulnerability in tablint (the Python package, the CLI, or the documentation website under `web/`), **please do not open a public GitHub issue**.
Instead, report it privately through one of the following channels:
-- **GitHub Private Vulnerability Reporting** β preferred. Open a report at VERSION: 0.1.0a4 VERSION: {{ version }} VERSION: {{ version }}HashPrep // Report
+ Tablint // Report
Tail (last 5 r
HashPrep // Report
- Tablint // Report
+ HashPrep Report
+ Tablint Report