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.
Files changed (35) hide show
  1. tabalyst-0.1.0/LICENSE +21 -0
  2. tabalyst-0.1.0/MANIFEST.in +5 -0
  3. tabalyst-0.1.0/PKG-INFO +208 -0
  4. tabalyst-0.1.0/README.md +174 -0
  5. tabalyst-0.1.0/examples/README.md +41 -0
  6. tabalyst-0.1.0/examples/config.json +48 -0
  7. tabalyst-0.1.0/examples/input/basic.csv +6 -0
  8. tabalyst-0.1.0/examples/input/insurance-customers.csv +3001 -0
  9. tabalyst-0.1.0/pyproject.toml +71 -0
  10. tabalyst-0.1.0/setup.cfg +4 -0
  11. tabalyst-0.1.0/src/tabalyst/__init__.py +20 -0
  12. tabalyst-0.1.0/src/tabalyst/__main__.py +6 -0
  13. tabalyst-0.1.0/src/tabalyst/_version.py +23 -0
  14. tabalyst-0.1.0/src/tabalyst/analysis.py +786 -0
  15. tabalyst-0.1.0/src/tabalyst/cli.py +208 -0
  16. tabalyst-0.1.0/src/tabalyst/config.py +214 -0
  17. tabalyst-0.1.0/src/tabalyst/errors.py +17 -0
  18. tabalyst-0.1.0/src/tabalyst/execution_log.py +102 -0
  19. tabalyst-0.1.0/src/tabalyst/ingestion.py +86 -0
  20. tabalyst-0.1.0/src/tabalyst/models.py +174 -0
  21. tabalyst-0.1.0/src/tabalyst/reporting.py +54 -0
  22. tabalyst-0.1.0/src/tabalyst/service.py +134 -0
  23. tabalyst-0.1.0/src/tabalyst/static/report.js +500 -0
  24. tabalyst-0.1.0/src/tabalyst/static/theme.css +411 -0
  25. tabalyst-0.1.0/src/tabalyst/templates/report.html +318 -0
  26. tabalyst-0.1.0/src/tabalyst.egg-info/PKG-INFO +208 -0
  27. tabalyst-0.1.0/src/tabalyst.egg-info/SOURCES.txt +33 -0
  28. tabalyst-0.1.0/src/tabalyst.egg-info/dependency_links.txt +1 -0
  29. tabalyst-0.1.0/src/tabalyst.egg-info/entry_points.txt +2 -0
  30. tabalyst-0.1.0/src/tabalyst.egg-info/requires.txt +10 -0
  31. tabalyst-0.1.0/src/tabalyst.egg-info/top_level.txt +1 -0
  32. tabalyst-0.1.0/tests/test_analysis.py +601 -0
  33. tabalyst-0.1.0/tests/test_cli.py +258 -0
  34. tabalyst-0.1.0/tests/test_public_api.py +132 -0
  35. 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.
@@ -0,0 +1,5 @@
1
+ include LICENSE
2
+ include README.md
3
+ include examples/README.md
4
+ include examples/config.json
5
+ recursive-include examples/input *.csv
@@ -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.
@@ -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