tabalyst 0.1.0__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.
- tabalyst-0.1.0/LICENSE +21 -0
- tabalyst-0.1.0/MANIFEST.in +5 -0
- tabalyst-0.1.0/PKG-INFO +208 -0
- tabalyst-0.1.0/README.md +174 -0
- tabalyst-0.1.0/examples/README.md +41 -0
- tabalyst-0.1.0/examples/config.json +48 -0
- tabalyst-0.1.0/examples/input/basic.csv +6 -0
- tabalyst-0.1.0/examples/input/insurance-customers.csv +3001 -0
- tabalyst-0.1.0/pyproject.toml +71 -0
- tabalyst-0.1.0/setup.cfg +4 -0
- tabalyst-0.1.0/src/tabalyst/__init__.py +20 -0
- tabalyst-0.1.0/src/tabalyst/__main__.py +6 -0
- tabalyst-0.1.0/src/tabalyst/_version.py +23 -0
- tabalyst-0.1.0/src/tabalyst/analysis.py +786 -0
- tabalyst-0.1.0/src/tabalyst/cli.py +208 -0
- tabalyst-0.1.0/src/tabalyst/config.py +214 -0
- tabalyst-0.1.0/src/tabalyst/errors.py +17 -0
- tabalyst-0.1.0/src/tabalyst/execution_log.py +102 -0
- tabalyst-0.1.0/src/tabalyst/ingestion.py +86 -0
- tabalyst-0.1.0/src/tabalyst/models.py +174 -0
- tabalyst-0.1.0/src/tabalyst/reporting.py +54 -0
- tabalyst-0.1.0/src/tabalyst/service.py +134 -0
- tabalyst-0.1.0/src/tabalyst/static/report.js +500 -0
- tabalyst-0.1.0/src/tabalyst/static/theme.css +411 -0
- tabalyst-0.1.0/src/tabalyst/templates/report.html +318 -0
- tabalyst-0.1.0/src/tabalyst.egg-info/PKG-INFO +208 -0
- tabalyst-0.1.0/src/tabalyst.egg-info/SOURCES.txt +33 -0
- tabalyst-0.1.0/src/tabalyst.egg-info/dependency_links.txt +1 -0
- tabalyst-0.1.0/src/tabalyst.egg-info/entry_points.txt +2 -0
- tabalyst-0.1.0/src/tabalyst.egg-info/requires.txt +10 -0
- tabalyst-0.1.0/src/tabalyst.egg-info/top_level.txt +1 -0
- tabalyst-0.1.0/tests/test_analysis.py +601 -0
- tabalyst-0.1.0/tests/test_cli.py +258 -0
- tabalyst-0.1.0/tests/test_public_api.py +132 -0
- tabalyst-0.1.0/tests/test_reporting.py +98 -0
tabalyst-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 chergreg
|
|
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.
|
tabalyst-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tabalyst
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Open-source data profiling engine for structured JSON and customizable HTML reports.
|
|
5
|
+
Author: Gregory Borelli
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/loribel-labs/tabalyst
|
|
8
|
+
Project-URL: Repository, https://github.com/loribel-labs/tabalyst.git
|
|
9
|
+
Project-URL: Issues, https://github.com/loribel-labs/tabalyst/issues
|
|
10
|
+
Keywords: csv,data-analysis,data-profiling,data-quality,eda,html-report,json
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: jinja2>=3.1
|
|
25
|
+
Requires-Dist: pandas>=2.2
|
|
26
|
+
Requires-Dist: pydantic>=2.10
|
|
27
|
+
Requires-Dist: typer>=0.12
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-cov>=6; extra == "dev"
|
|
32
|
+
Requires-Dist: ruff>=0.11; extra == "dev"
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
# Tabalyst
|
|
36
|
+
|
|
37
|
+
Tabalyst is a local-first CSV profiling library and command-line tool. It reads a
|
|
38
|
+
CSV file once, produces a structured JSON profile, and renders the same result as
|
|
39
|
+
an interactive HTML report.
|
|
40
|
+
|
|
41
|
+
Version `0.1.0` is the first packaged public API. The analysis format is still
|
|
42
|
+
young, so larger schema changes are reserved for future minor releases.
|
|
43
|
+
|
|
44
|
+
## Requirements and installation
|
|
45
|
+
|
|
46
|
+
Tabalyst supports Python 3.11, 3.12, 3.13, and 3.14.
|
|
47
|
+
|
|
48
|
+
```console
|
|
49
|
+
pip install tabalyst
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
For local development from a clone:
|
|
53
|
+
|
|
54
|
+
```console
|
|
55
|
+
python -m venv .venv
|
|
56
|
+
python -m pip install -e ".[dev]"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Command line
|
|
60
|
+
|
|
61
|
+
Pass the CSV source and the complete HTML report path as positional arguments:
|
|
62
|
+
|
|
63
|
+
```console
|
|
64
|
+
tabalyst data.csv reports/client-a.html
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The report path must end in `.html`. Parent directories are created
|
|
68
|
+
automatically, and existing artifacts are replaced. A successful run creates:
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
reports/
|
|
72
|
+
|-- client-a.html
|
|
73
|
+
|-- client-a.json
|
|
74
|
+
`-- executions.json
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The JSON profile always shares the HTML filename stem. `executions.json` keeps a
|
|
78
|
+
cumulative history for successful analyses in the same report directory, so
|
|
79
|
+
several named reports can coexist there.
|
|
80
|
+
|
|
81
|
+
Common options are:
|
|
82
|
+
|
|
83
|
+
```console
|
|
84
|
+
tabalyst data.csv reports/client-a.html --separator ";" --encoding cp1252
|
|
85
|
+
tabalyst data.csv reports/client-a.html --config tabalyst.json
|
|
86
|
+
tabalyst --help
|
|
87
|
+
tabalyst --version
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`python -m tabalyst` accepts the same arguments.
|
|
91
|
+
|
|
92
|
+
## Python API
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
import tabalyst
|
|
96
|
+
|
|
97
|
+
result = tabalyst.analyze(
|
|
98
|
+
"data.csv",
|
|
99
|
+
"reports/client-a.html",
|
|
100
|
+
separator=";",
|
|
101
|
+
encoding="cp1252",
|
|
102
|
+
config_path="tabalyst.json",
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
print(tabalyst.__version__)
|
|
106
|
+
print(result["summary"]["row_count"])
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`analyze()` returns a JSON-serializable dictionary whose logical content matches
|
|
110
|
+
the adjacent JSON file. The HTML is rendered from that canonical JSON profile.
|
|
111
|
+
Expected failures derive from `tabalyst.TabalystError`; callers may distinguish
|
|
112
|
+
`InputError`, `ConfigurationError`, and `ReportError`.
|
|
113
|
+
|
|
114
|
+
## Configuration
|
|
115
|
+
|
|
116
|
+
Configuration files are strict JSON. Unknown names and invalid values are errors.
|
|
117
|
+
The existing analysis settings remain available; the smallest useful file is:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"csv": {
|
|
122
|
+
"delimiter": ";",
|
|
123
|
+
"encoding": "cp1252"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Resolution order is:
|
|
129
|
+
|
|
130
|
+
1. an explicit `separator` or `encoding` argument;
|
|
131
|
+
2. the file passed with `config_path` or `--config`;
|
|
132
|
+
3. Tabalyst defaults: comma and `utf-8-sig`.
|
|
133
|
+
|
|
134
|
+
`utf-8-sig` accepts ordinary UTF-8 and UTF-8 with a byte-order mark. See the
|
|
135
|
+
[configuration reference](https://github.com/loribel-labs/tabalyst/blob/main/docs/configuration.md)
|
|
136
|
+
for analysis, normalization,
|
|
137
|
+
date, type-inference, sampling, and enum settings.
|
|
138
|
+
|
|
139
|
+
## Public examples
|
|
140
|
+
|
|
141
|
+
The repository contains two reproducible examples:
|
|
142
|
+
|
|
143
|
+
- `basic`: five rows covering common CSV values and one duplicate row.
|
|
144
|
+
- `insurance-customers`: 3,000 synthetic customer and contract records across
|
|
145
|
+
34 columns. Names and contact details are fictional, and email addresses use
|
|
146
|
+
reserved `.example` domains.
|
|
147
|
+
|
|
148
|
+
Each dataset under `examples/input/` has a matching generated report under
|
|
149
|
+
`examples/output/`. Regenerate both with:
|
|
150
|
+
|
|
151
|
+
```console
|
|
152
|
+
tabalyst examples/input/basic.csv examples/output/basic/report.html --config examples/config.json
|
|
153
|
+
tabalyst examples/input/insurance-customers.csv examples/output/insurance-customers/report.html --config examples/config.json
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
See the complete layout and maintenance notes in the
|
|
157
|
+
[examples README](https://github.com/loribel-labs/tabalyst/blob/main/examples/README.md).
|
|
158
|
+
|
|
159
|
+
## What the report contains
|
|
160
|
+
|
|
161
|
+
- Dataset dimensions, missing cells, duplicate rows, and quality observations.
|
|
162
|
+
- Physical and semantic type inference with explicit confidence and error rates.
|
|
163
|
+
- Numeric, date, string-length, normalization, and value-distribution profiles.
|
|
164
|
+
- A bounded raw-data preview while all records are analyzed.
|
|
165
|
+
- Sortable and filterable HTML tables.
|
|
166
|
+
|
|
167
|
+
Raw strings are preserved. The complete CSV is currently loaded into memory.
|
|
168
|
+
Report data remains local and Tabalyst adds no telemetry or remote analysis.
|
|
169
|
+
Bootstrap, DataTables, and Google Fonts are loaded from pinned CDNs for the full
|
|
170
|
+
interactive presentation; the Tabalyst template, theme, and report JavaScript are
|
|
171
|
+
included in the Python package.
|
|
172
|
+
|
|
173
|
+
## Compatibility with alpha commands
|
|
174
|
+
|
|
175
|
+
The earlier commands remain available during the `0.1.x` transition:
|
|
176
|
+
|
|
177
|
+
```console
|
|
178
|
+
tabalyst analyze data.csv -o reports/client-a.html
|
|
179
|
+
tabalyst render reports/client-a.json -o reports/regenerated.html
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
The alpha `analyze` form also retains automatic `tabalyst.json` discovery,
|
|
183
|
+
multiple `--config` overrides, and `--preview-rows`. New integrations should use
|
|
184
|
+
the direct command or `tabalyst.analyze()`.
|
|
185
|
+
|
|
186
|
+
## Development and packaging
|
|
187
|
+
|
|
188
|
+
```console
|
|
189
|
+
python -m pytest
|
|
190
|
+
python -m ruff check .
|
|
191
|
+
python -m build
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
The build creates a wheel and source distribution under `dist/`. Release steps,
|
|
195
|
+
including the clean-wheel smoke test and PyPI Trusted Publishing setup, are in
|
|
196
|
+
[RELEASING.md](https://github.com/loribel-labs/tabalyst/blob/main/RELEASING.md).
|
|
197
|
+
|
|
198
|
+
Report format details and internal boundaries are documented in
|
|
199
|
+
[docs/architecture.md](https://github.com/loribel-labs/tabalyst/blob/main/docs/architecture.md).
|
|
200
|
+
Please report defects through the
|
|
201
|
+
[GitHub issue tracker](https://github.com/loribel-labs/tabalyst/issues).
|
|
202
|
+
|
|
203
|
+
## License
|
|
204
|
+
|
|
205
|
+
Tabalyst is released under the
|
|
206
|
+
[MIT License](https://github.com/loribel-labs/tabalyst/blob/main/LICENSE).
|
|
207
|
+
|
|
208
|
+
Created by Gregory Borelli - Catalyseur Numérique.
|
tabalyst-0.1.0/README.md
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# Tabalyst
|
|
2
|
+
|
|
3
|
+
Tabalyst is a local-first CSV profiling library and command-line tool. It reads a
|
|
4
|
+
CSV file once, produces a structured JSON profile, and renders the same result as
|
|
5
|
+
an interactive HTML report.
|
|
6
|
+
|
|
7
|
+
Version `0.1.0` is the first packaged public API. The analysis format is still
|
|
8
|
+
young, so larger schema changes are reserved for future minor releases.
|
|
9
|
+
|
|
10
|
+
## Requirements and installation
|
|
11
|
+
|
|
12
|
+
Tabalyst supports Python 3.11, 3.12, 3.13, and 3.14.
|
|
13
|
+
|
|
14
|
+
```console
|
|
15
|
+
pip install tabalyst
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
For local development from a clone:
|
|
19
|
+
|
|
20
|
+
```console
|
|
21
|
+
python -m venv .venv
|
|
22
|
+
python -m pip install -e ".[dev]"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Command line
|
|
26
|
+
|
|
27
|
+
Pass the CSV source and the complete HTML report path as positional arguments:
|
|
28
|
+
|
|
29
|
+
```console
|
|
30
|
+
tabalyst data.csv reports/client-a.html
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The report path must end in `.html`. Parent directories are created
|
|
34
|
+
automatically, and existing artifacts are replaced. A successful run creates:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
reports/
|
|
38
|
+
|-- client-a.html
|
|
39
|
+
|-- client-a.json
|
|
40
|
+
`-- executions.json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The JSON profile always shares the HTML filename stem. `executions.json` keeps a
|
|
44
|
+
cumulative history for successful analyses in the same report directory, so
|
|
45
|
+
several named reports can coexist there.
|
|
46
|
+
|
|
47
|
+
Common options are:
|
|
48
|
+
|
|
49
|
+
```console
|
|
50
|
+
tabalyst data.csv reports/client-a.html --separator ";" --encoding cp1252
|
|
51
|
+
tabalyst data.csv reports/client-a.html --config tabalyst.json
|
|
52
|
+
tabalyst --help
|
|
53
|
+
tabalyst --version
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`python -m tabalyst` accepts the same arguments.
|
|
57
|
+
|
|
58
|
+
## Python API
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
import tabalyst
|
|
62
|
+
|
|
63
|
+
result = tabalyst.analyze(
|
|
64
|
+
"data.csv",
|
|
65
|
+
"reports/client-a.html",
|
|
66
|
+
separator=";",
|
|
67
|
+
encoding="cp1252",
|
|
68
|
+
config_path="tabalyst.json",
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
print(tabalyst.__version__)
|
|
72
|
+
print(result["summary"]["row_count"])
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`analyze()` returns a JSON-serializable dictionary whose logical content matches
|
|
76
|
+
the adjacent JSON file. The HTML is rendered from that canonical JSON profile.
|
|
77
|
+
Expected failures derive from `tabalyst.TabalystError`; callers may distinguish
|
|
78
|
+
`InputError`, `ConfigurationError`, and `ReportError`.
|
|
79
|
+
|
|
80
|
+
## Configuration
|
|
81
|
+
|
|
82
|
+
Configuration files are strict JSON. Unknown names and invalid values are errors.
|
|
83
|
+
The existing analysis settings remain available; the smallest useful file is:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"csv": {
|
|
88
|
+
"delimiter": ";",
|
|
89
|
+
"encoding": "cp1252"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Resolution order is:
|
|
95
|
+
|
|
96
|
+
1. an explicit `separator` or `encoding` argument;
|
|
97
|
+
2. the file passed with `config_path` or `--config`;
|
|
98
|
+
3. Tabalyst defaults: comma and `utf-8-sig`.
|
|
99
|
+
|
|
100
|
+
`utf-8-sig` accepts ordinary UTF-8 and UTF-8 with a byte-order mark. See the
|
|
101
|
+
[configuration reference](https://github.com/loribel-labs/tabalyst/blob/main/docs/configuration.md)
|
|
102
|
+
for analysis, normalization,
|
|
103
|
+
date, type-inference, sampling, and enum settings.
|
|
104
|
+
|
|
105
|
+
## Public examples
|
|
106
|
+
|
|
107
|
+
The repository contains two reproducible examples:
|
|
108
|
+
|
|
109
|
+
- `basic`: five rows covering common CSV values and one duplicate row.
|
|
110
|
+
- `insurance-customers`: 3,000 synthetic customer and contract records across
|
|
111
|
+
34 columns. Names and contact details are fictional, and email addresses use
|
|
112
|
+
reserved `.example` domains.
|
|
113
|
+
|
|
114
|
+
Each dataset under `examples/input/` has a matching generated report under
|
|
115
|
+
`examples/output/`. Regenerate both with:
|
|
116
|
+
|
|
117
|
+
```console
|
|
118
|
+
tabalyst examples/input/basic.csv examples/output/basic/report.html --config examples/config.json
|
|
119
|
+
tabalyst examples/input/insurance-customers.csv examples/output/insurance-customers/report.html --config examples/config.json
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
See the complete layout and maintenance notes in the
|
|
123
|
+
[examples README](https://github.com/loribel-labs/tabalyst/blob/main/examples/README.md).
|
|
124
|
+
|
|
125
|
+
## What the report contains
|
|
126
|
+
|
|
127
|
+
- Dataset dimensions, missing cells, duplicate rows, and quality observations.
|
|
128
|
+
- Physical and semantic type inference with explicit confidence and error rates.
|
|
129
|
+
- Numeric, date, string-length, normalization, and value-distribution profiles.
|
|
130
|
+
- A bounded raw-data preview while all records are analyzed.
|
|
131
|
+
- Sortable and filterable HTML tables.
|
|
132
|
+
|
|
133
|
+
Raw strings are preserved. The complete CSV is currently loaded into memory.
|
|
134
|
+
Report data remains local and Tabalyst adds no telemetry or remote analysis.
|
|
135
|
+
Bootstrap, DataTables, and Google Fonts are loaded from pinned CDNs for the full
|
|
136
|
+
interactive presentation; the Tabalyst template, theme, and report JavaScript are
|
|
137
|
+
included in the Python package.
|
|
138
|
+
|
|
139
|
+
## Compatibility with alpha commands
|
|
140
|
+
|
|
141
|
+
The earlier commands remain available during the `0.1.x` transition:
|
|
142
|
+
|
|
143
|
+
```console
|
|
144
|
+
tabalyst analyze data.csv -o reports/client-a.html
|
|
145
|
+
tabalyst render reports/client-a.json -o reports/regenerated.html
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The alpha `analyze` form also retains automatic `tabalyst.json` discovery,
|
|
149
|
+
multiple `--config` overrides, and `--preview-rows`. New integrations should use
|
|
150
|
+
the direct command or `tabalyst.analyze()`.
|
|
151
|
+
|
|
152
|
+
## Development and packaging
|
|
153
|
+
|
|
154
|
+
```console
|
|
155
|
+
python -m pytest
|
|
156
|
+
python -m ruff check .
|
|
157
|
+
python -m build
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The build creates a wheel and source distribution under `dist/`. Release steps,
|
|
161
|
+
including the clean-wheel smoke test and PyPI Trusted Publishing setup, are in
|
|
162
|
+
[RELEASING.md](https://github.com/loribel-labs/tabalyst/blob/main/RELEASING.md).
|
|
163
|
+
|
|
164
|
+
Report format details and internal boundaries are documented in
|
|
165
|
+
[docs/architecture.md](https://github.com/loribel-labs/tabalyst/blob/main/docs/architecture.md).
|
|
166
|
+
Please report defects through the
|
|
167
|
+
[GitHub issue tracker](https://github.com/loribel-labs/tabalyst/issues).
|
|
168
|
+
|
|
169
|
+
## License
|
|
170
|
+
|
|
171
|
+
Tabalyst is released under the
|
|
172
|
+
[MIT License](https://github.com/loribel-labs/tabalyst/blob/main/LICENSE).
|
|
173
|
+
|
|
174
|
+
Created by Gregory Borelli - Catalyseur Numérique.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Tabalyst examples
|
|
2
|
+
|
|
3
|
+
The examples are organized by input name so additional public datasets can be
|
|
4
|
+
added without mixing source data and generated artifacts.
|
|
5
|
+
|
|
6
|
+
```text
|
|
7
|
+
examples/
|
|
8
|
+
|-- config.json
|
|
9
|
+
|-- input/
|
|
10
|
+
| |-- basic.csv
|
|
11
|
+
| `-- insurance-customers.csv
|
|
12
|
+
`-- output/
|
|
13
|
+
|-- basic/
|
|
14
|
+
| |-- report.html
|
|
15
|
+
| |-- report.json
|
|
16
|
+
| `-- executions.json
|
|
17
|
+
`-- insurance-customers/
|
|
18
|
+
|-- report.html
|
|
19
|
+
|-- report.json
|
|
20
|
+
`-- executions.json
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`basic.csv` is a five-row smoke example. `insurance-customers.csv` contains 3,000
|
|
24
|
+
synthetic customer and contract records across 34 columns. Its people, contact
|
|
25
|
+
details, and contracts are fictional; email addresses use reserved `.example`
|
|
26
|
+
domains.
|
|
27
|
+
|
|
28
|
+
From the repository root, regenerate both outputs with:
|
|
29
|
+
|
|
30
|
+
```console
|
|
31
|
+
tabalyst examples/input/basic.csv examples/output/basic/report.html --config examples/config.json
|
|
32
|
+
tabalyst examples/input/insurance-customers.csv examples/output/insurance-customers/report.html --config examples/config.json
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Every output folder is independent and contains its own HTML report, canonical
|
|
36
|
+
JSON profile, and cumulative `executions.json` history. Delete an output folder
|
|
37
|
+
before regenerating when a fresh one-entry execution history is required.
|
|
38
|
+
|
|
39
|
+
The input datasets and generated output are public repository examples. The wheel
|
|
40
|
+
contains only the runtime package and report resources; examples are not installed
|
|
41
|
+
as package data.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"csv": {
|
|
3
|
+
"encoding": "utf-8-sig",
|
|
4
|
+
"delimiter": ","
|
|
5
|
+
},
|
|
6
|
+
"missing_values": ["", "N/A", "NULL"],
|
|
7
|
+
"preview_rows": 20,
|
|
8
|
+
"normalization": {
|
|
9
|
+
"trim": true,
|
|
10
|
+
"collapse_internal_whitespace": true
|
|
11
|
+
},
|
|
12
|
+
"date_detection": {
|
|
13
|
+
"enabled": true,
|
|
14
|
+
"orders": ["YMD", "MDY", "DMY"],
|
|
15
|
+
"separators": ["-", "/", "."],
|
|
16
|
+
"ambiguous_order": null
|
|
17
|
+
},
|
|
18
|
+
"type_inference": {
|
|
19
|
+
"minimum_confidence": 0.95
|
|
20
|
+
},
|
|
21
|
+
"string_analysis": {
|
|
22
|
+
"very_short_max_length": 5,
|
|
23
|
+
"short_max_length": 20,
|
|
24
|
+
"medium_max_length": 50,
|
|
25
|
+
"long_max_length": 255,
|
|
26
|
+
"length_distribution_max_length": 50,
|
|
27
|
+
"examples_per_length": 10
|
|
28
|
+
},
|
|
29
|
+
"value_examples": {
|
|
30
|
+
"full_distribution_max_distinct": 50,
|
|
31
|
+
"candidate_sample_size": 100,
|
|
32
|
+
"short_text_max_length": 20,
|
|
33
|
+
"short_text_percentile": 0.95,
|
|
34
|
+
"short_text_result_size": 20,
|
|
35
|
+
"long_text_result_size": 20,
|
|
36
|
+
"long_text_truncate_at": 30,
|
|
37
|
+
"truncation_suffix": "...",
|
|
38
|
+
"inline_display_size": 3,
|
|
39
|
+
"random_seed": 42
|
|
40
|
+
},
|
|
41
|
+
"enum_detection": {
|
|
42
|
+
"enabled": true,
|
|
43
|
+
"minimum_row_count": 500,
|
|
44
|
+
"maximum_distinct_values": 49,
|
|
45
|
+
"eligible_types": ["text"],
|
|
46
|
+
"case_sensitive": true
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
id,name,amount,joined,active,notes
|
|
2
|
+
001,Alice,12.50,2026-01-01,true,First order
|
|
3
|
+
002,Bob,,2026-02-01,false,
|
|
4
|
+
003,Charlie,25.00,2026-03-01,true,"Two items, one order"
|
|
5
|
+
003,Charlie,25.00,2026-03-01,true,"Two items, one order"
|
|
6
|
+
004,Dana,not available,2026-04-01,true,Pending review
|