tabalyst 0.1.2__tar.gz → 0.3.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 (48) hide show
  1. tabalyst-0.3.0/PKG-INFO +304 -0
  2. tabalyst-0.3.0/README.md +270 -0
  3. {tabalyst-0.1.2 → tabalyst-0.3.0}/examples/README.md +2 -2
  4. {tabalyst-0.1.2 → tabalyst-0.3.0}/pyproject.toml +2 -2
  5. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/__init__.py +8 -0
  6. tabalyst-0.3.0/src/tabalyst/cli/__init__.py +5 -0
  7. tabalyst-0.3.0/src/tabalyst/cli/app.py +46 -0
  8. tabalyst-0.3.0/src/tabalyst/cli/report.py +189 -0
  9. tabalyst-0.3.0/src/tabalyst/cli/sample.py +132 -0
  10. tabalyst-0.3.0/src/tabalyst/progress.py +48 -0
  11. tabalyst-0.3.0/src/tabalyst/report_service.py +244 -0
  12. tabalyst-0.3.0/src/tabalyst/sampling.py +342 -0
  13. tabalyst-0.3.0/src/tabalyst/sampling_service.py +172 -0
  14. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/service.py +73 -25
  15. tabalyst-0.3.0/src/tabalyst.egg-info/PKG-INFO +304 -0
  16. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst.egg-info/SOURCES.txt +10 -2
  17. tabalyst-0.3.0/tests/test_cli.py +430 -0
  18. {tabalyst-0.1.2 → tabalyst-0.3.0}/tests/test_public_api.py +75 -11
  19. tabalyst-0.3.0/tests/test_sampling.py +346 -0
  20. tabalyst-0.1.2/PKG-INFO +0 -209
  21. tabalyst-0.1.2/README.md +0 -175
  22. tabalyst-0.1.2/src/tabalyst/cli.py +0 -208
  23. tabalyst-0.1.2/src/tabalyst.egg-info/PKG-INFO +0 -209
  24. tabalyst-0.1.2/tests/test_cli.py +0 -259
  25. {tabalyst-0.1.2 → tabalyst-0.3.0}/LICENSE +0 -0
  26. {tabalyst-0.1.2 → tabalyst-0.3.0}/MANIFEST.in +0 -0
  27. {tabalyst-0.1.2 → tabalyst-0.3.0}/examples/config.json +0 -0
  28. {tabalyst-0.1.2 → tabalyst-0.3.0}/examples/input/basic.csv +0 -0
  29. {tabalyst-0.1.2 → tabalyst-0.3.0}/examples/input/insurance-customers.csv +0 -0
  30. {tabalyst-0.1.2 → tabalyst-0.3.0}/setup.cfg +0 -0
  31. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/__main__.py +0 -0
  32. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/_version.py +0 -0
  33. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/analysis.py +0 -0
  34. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/config.py +0 -0
  35. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/errors.py +0 -0
  36. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/execution_log.py +0 -0
  37. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/ingestion.py +0 -0
  38. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/models.py +0 -0
  39. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/reporting.py +0 -0
  40. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/static/report.js +0 -0
  41. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/static/theme.css +0 -0
  42. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst/templates/report.html +0 -0
  43. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst.egg-info/dependency_links.txt +0 -0
  44. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst.egg-info/entry_points.txt +0 -0
  45. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst.egg-info/requires.txt +0 -0
  46. {tabalyst-0.1.2 → tabalyst-0.3.0}/src/tabalyst.egg-info/top_level.txt +0 -0
  47. {tabalyst-0.1.2 → tabalyst-0.3.0}/tests/test_analysis.py +0 -0
  48. {tabalyst-0.1.2 → tabalyst-0.3.0}/tests/test_reporting.py +0 -0
@@ -0,0 +1,304 @@
1
+ Metadata-Version: 2.4
2
+ Name: tabalyst
3
+ Version: 0.3.0
4
+ Summary: Open-source toolkit for understanding and working with unfamiliar data.
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
+ **Tools for unfamiliar data.**
38
+
39
+ Tabalyst is an open-source, local-first toolkit for understanding and working
40
+ with structured data.
41
+
42
+ Its first tool is **Tabalyst Report**. The current CSV implementation,
43
+ **Tabalyst CSV Report**, analyzes a CSV file and produces both a structured JSON
44
+ profile and a self-contained interactive HTML report.
45
+
46
+ Tabalyst is in active alpha development. Its interfaces may still change while
47
+ the shared toolkit architecture is being established.
48
+
49
+ ## Install
50
+
51
+ Tabalyst supports Python 3.11, 3.12, 3.13, and 3.14.
52
+
53
+ ```console
54
+ pip install --upgrade tabalyst
55
+ ```
56
+
57
+ The same command installs Tabalyst or updates it. Tabalyst is in alpha and
58
+ changes often: update it before each new test.
59
+
60
+ ## Tabalyst Report
61
+
62
+ | Use case | Command | Destination |
63
+ | --- | --- | --- |
64
+ | One file, automatic name | `tabalyst report data.csv` | `data.html` beside the source |
65
+ | One file, custom name | `tabalyst report data.csv -o report.html` | The file `report.html` |
66
+ | Several files, automatic names | `tabalyst report *.csv` | Beside each source |
67
+ | Several files, one directory | `tabalyst report *.csv -d reports/` | The directory `reports/` |
68
+
69
+ The simplest command keeps the source filename:
70
+
71
+ ```console
72
+ tabalyst report customers.csv
73
+ ```
74
+
75
+ It creates these files beside the source:
76
+
77
+ ```text
78
+ customers.csv
79
+ customers.html
80
+ customers.json
81
+ executions.json
82
+ ```
83
+
84
+ Use `-o` to choose a different HTML filename for one source:
85
+
86
+ ```console
87
+ tabalyst report customers.csv -o customer-analysis.html
88
+ ```
89
+
90
+ ### Multiple files
91
+
92
+ Report several CSV files at once:
93
+
94
+ ```console
95
+ tabalyst report *.csv
96
+ ```
97
+
98
+ Each report is created beside its source and keeps the source stem:
99
+
100
+ ```text
101
+ customers.csv → customers.html
102
+ orders.csv → orders.html
103
+ products.csv → products.html
104
+ ```
105
+
106
+ Use `-d` to place all reports in one directory:
107
+
108
+ ```console
109
+ tabalyst report *.csv -d reports/
110
+ ```
111
+
112
+ This produces:
113
+
114
+ ```text
115
+ reports/
116
+ ├── customers.html
117
+ ├── customers.json
118
+ ├── orders.html
119
+ ├── orders.json
120
+ ├── products.html
121
+ ├── products.json
122
+ └── executions.json
123
+ ```
124
+
125
+ Both `-d reports/` and `-d reports` are accepted. Quotes are only needed when a
126
+ path contains spaces.
127
+
128
+ `-o` always names one output file and therefore accepts only one input. `-d`
129
+ always names an output directory and accepts one or many inputs.
130
+
131
+ This is invalid because several inputs cannot share one output file:
132
+
133
+ ```console
134
+ tabalyst report *.csv -o report.html
135
+ ```
136
+
137
+ Tabalyst rejects the command before processing any file. Use `-d reports/`
138
+ instead.
139
+
140
+ ### Safe batch behavior
141
+
142
+ Before processing begins, Tabalyst resolves every input and planned output. It
143
+ stops the entire batch if output names collide or if an output already exists.
144
+ Use `--force` only when replacing all matching report artifacts is intentional:
145
+
146
+ ```console
147
+ tabalyst report *.csv -d reports/ --force
148
+ ```
149
+
150
+ If one CSV is malformed during analysis, Tabalyst reports that error, continues
151
+ with the remaining files, and returns a non-zero exit code at the end.
152
+
153
+ Interactive terminals show accurate file and phase progress:
154
+
155
+ ```text
156
+ [2/8] orders.csv - Analyzing
157
+ ```
158
+
159
+ Progress and diagnostics use standard error. Progress is disabled automatically
160
+ outside a terminal and can be disabled explicitly with `--no-progress` or
161
+ `--quiet`.
162
+
163
+ ### Useful options
164
+
165
+ ```console
166
+ tabalyst report data.csv --delimiter ";"
167
+ tabalyst report data.csv --encoding cp1252
168
+ tabalyst report data.csv --config tabalyst.json
169
+ tabalyst report data.csv --verbose
170
+ tabalyst report --help
171
+ tabalyst --version
172
+ ```
173
+
174
+ `python -m tabalyst` accepts the same commands.
175
+
176
+ ## Tabalyst Sample
177
+
178
+ Create a smaller CSV without modifying the source:
179
+
180
+ ```console
181
+ tabalyst sample customers.csv --sample-method random --rows 1000 --seed 42
182
+ ```
183
+
184
+ The default output is `customers.sample.csv` beside the source. Use `-o` to
185
+ name the output for one input, or `-d` to sample several files into one
186
+ directory:
187
+
188
+ ```console
189
+ tabalyst sample customers.csv --sample-method first --rows 100 -o test.csv
190
+ tabalyst sample *.csv --sample-method random --percent 5 -d samples/
191
+ ```
192
+
193
+ Available methods are `first`, `last`, `random` and `stratified`. Stratified
194
+ sampling approximately preserves the distribution of a selected field:
195
+
196
+ ```console
197
+ tabalyst sample customers.csv --sample-method stratified --field province --rows 1000 --seed 42
198
+ ```
199
+
200
+ Sampling reads CSV records as a stream. Random and stratified sampling keep
201
+ only the requested sample, plus stratum counts, in memory. Existing outputs
202
+ require `--force`, and an input file is never overwritten.
203
+
204
+ ## What the report analyzes
205
+
206
+ - Dataset dimensions, missing cells, duplicates, and quality observations.
207
+ - Physical and semantic types with confidence and error rates.
208
+ - Numeric, date, string-length, normalization, and value distributions.
209
+ - Distinct values, representative examples, enum candidates, and date formats.
210
+ - CSV record widths, quoting, encoding, and delimiter configuration.
211
+ - A bounded raw-data preview while every record is analyzed.
212
+
213
+ The HTML report is self-contained and works without a CDN or network connection.
214
+ The JSON profile contains the same canonical analysis result for scripts and
215
+ future Tabalyst tools.
216
+
217
+ ## Python API
218
+
219
+ The same operations are available without the CLI:
220
+
221
+ ```python
222
+ import tabalyst
223
+
224
+ result = tabalyst.analyze(
225
+ "customers.csv",
226
+ "customers.html",
227
+ separator=";",
228
+ )
229
+
230
+ batch = tabalyst.generate_reports(
231
+ ["*.csv"],
232
+ output_dir="reports",
233
+ )
234
+
235
+ sample = tabalyst.sample_csv(
236
+ "customers.csv",
237
+ method="random",
238
+ rows=1000,
239
+ seed=42,
240
+ )
241
+ ```
242
+
243
+ `analyze()` returns the JSON-serializable profile for one report.
244
+ `generate_reports()` returns the complete batch plan, successes, and failures.
245
+ Expected failures derive from `tabalyst.TabalystError`.
246
+
247
+ Existing artifacts are never replaced silently. Pass `force=True` when
248
+ replacement is intentional.
249
+
250
+ ## Configuration
251
+
252
+ Configuration files are strict JSON. A minimal file is:
253
+
254
+ ```json
255
+ {
256
+ "csv": {
257
+ "delimiter": ";",
258
+ "encoding": "cp1252"
259
+ }
260
+ }
261
+ ```
262
+
263
+ Explicit CLI or Python arguments override the configuration file, which overrides
264
+ Tabalyst defaults. See the
265
+ [configuration reference](https://github.com/loribel-labs/tabalyst/blob/main/docs/en/reference/configuration.md)
266
+ for all analysis settings.
267
+
268
+ ## Local-first behavior and current limits
269
+
270
+ Tabalyst performs analysis locally and adds no telemetry or remote processing.
271
+ Generated JSON and HTML may contain source values and should be shared
272
+ accordingly.
273
+
274
+ Report analysis currently loads the complete CSV into memory. Sampling uses a
275
+ streaming reader with bounded row storage. File and phase progress is available
276
+ for reports; row percentages, throughput estimates, recursive directory input,
277
+ and parallel batch execution will require later ingestion work.
278
+
279
+ ## Examples and development
280
+
281
+ The repository includes small and synthetic public examples under `examples/`.
282
+ See the [examples README](https://github.com/loribel-labs/tabalyst/blob/main/examples/README.md)
283
+ for regeneration commands.
284
+
285
+ ```console
286
+ python -m pytest
287
+ python -m ruff check .
288
+ python -m build
289
+ ```
290
+
291
+ Additional documentation:
292
+
293
+ - [Architecture](https://github.com/loribel-labs/tabalyst/blob/main/docs/dev/architecture.md)
294
+ - [Configuration](https://github.com/loribel-labs/tabalyst/blob/main/docs/en/reference/configuration.md)
295
+ - [Release procedure](https://github.com/loribel-labs/tabalyst/blob/main/RELEASING.md)
296
+
297
+ Please report defects and feature requests through the
298
+ [GitHub issue tracker](https://github.com/loribel-labs/tabalyst/issues).
299
+
300
+ ## License
301
+
302
+ Tabalyst is released under the [MIT License](LICENSE).
303
+
304
+ Created by Gregory Borelli — Catalyseur Numérique.
@@ -0,0 +1,270 @@
1
+ # Tabalyst
2
+
3
+ **Tools for unfamiliar data.**
4
+
5
+ Tabalyst is an open-source, local-first toolkit for understanding and working
6
+ with structured data.
7
+
8
+ Its first tool is **Tabalyst Report**. The current CSV implementation,
9
+ **Tabalyst CSV Report**, analyzes a CSV file and produces both a structured JSON
10
+ profile and a self-contained interactive HTML report.
11
+
12
+ Tabalyst is in active alpha development. Its interfaces may still change while
13
+ the shared toolkit architecture is being established.
14
+
15
+ ## Install
16
+
17
+ Tabalyst supports Python 3.11, 3.12, 3.13, and 3.14.
18
+
19
+ ```console
20
+ pip install --upgrade tabalyst
21
+ ```
22
+
23
+ The same command installs Tabalyst or updates it. Tabalyst is in alpha and
24
+ changes often: update it before each new test.
25
+
26
+ ## Tabalyst Report
27
+
28
+ | Use case | Command | Destination |
29
+ | --- | --- | --- |
30
+ | One file, automatic name | `tabalyst report data.csv` | `data.html` beside the source |
31
+ | One file, custom name | `tabalyst report data.csv -o report.html` | The file `report.html` |
32
+ | Several files, automatic names | `tabalyst report *.csv` | Beside each source |
33
+ | Several files, one directory | `tabalyst report *.csv -d reports/` | The directory `reports/` |
34
+
35
+ The simplest command keeps the source filename:
36
+
37
+ ```console
38
+ tabalyst report customers.csv
39
+ ```
40
+
41
+ It creates these files beside the source:
42
+
43
+ ```text
44
+ customers.csv
45
+ customers.html
46
+ customers.json
47
+ executions.json
48
+ ```
49
+
50
+ Use `-o` to choose a different HTML filename for one source:
51
+
52
+ ```console
53
+ tabalyst report customers.csv -o customer-analysis.html
54
+ ```
55
+
56
+ ### Multiple files
57
+
58
+ Report several CSV files at once:
59
+
60
+ ```console
61
+ tabalyst report *.csv
62
+ ```
63
+
64
+ Each report is created beside its source and keeps the source stem:
65
+
66
+ ```text
67
+ customers.csv → customers.html
68
+ orders.csv → orders.html
69
+ products.csv → products.html
70
+ ```
71
+
72
+ Use `-d` to place all reports in one directory:
73
+
74
+ ```console
75
+ tabalyst report *.csv -d reports/
76
+ ```
77
+
78
+ This produces:
79
+
80
+ ```text
81
+ reports/
82
+ ├── customers.html
83
+ ├── customers.json
84
+ ├── orders.html
85
+ ├── orders.json
86
+ ├── products.html
87
+ ├── products.json
88
+ └── executions.json
89
+ ```
90
+
91
+ Both `-d reports/` and `-d reports` are accepted. Quotes are only needed when a
92
+ path contains spaces.
93
+
94
+ `-o` always names one output file and therefore accepts only one input. `-d`
95
+ always names an output directory and accepts one or many inputs.
96
+
97
+ This is invalid because several inputs cannot share one output file:
98
+
99
+ ```console
100
+ tabalyst report *.csv -o report.html
101
+ ```
102
+
103
+ Tabalyst rejects the command before processing any file. Use `-d reports/`
104
+ instead.
105
+
106
+ ### Safe batch behavior
107
+
108
+ Before processing begins, Tabalyst resolves every input and planned output. It
109
+ stops the entire batch if output names collide or if an output already exists.
110
+ Use `--force` only when replacing all matching report artifacts is intentional:
111
+
112
+ ```console
113
+ tabalyst report *.csv -d reports/ --force
114
+ ```
115
+
116
+ If one CSV is malformed during analysis, Tabalyst reports that error, continues
117
+ with the remaining files, and returns a non-zero exit code at the end.
118
+
119
+ Interactive terminals show accurate file and phase progress:
120
+
121
+ ```text
122
+ [2/8] orders.csv - Analyzing
123
+ ```
124
+
125
+ Progress and diagnostics use standard error. Progress is disabled automatically
126
+ outside a terminal and can be disabled explicitly with `--no-progress` or
127
+ `--quiet`.
128
+
129
+ ### Useful options
130
+
131
+ ```console
132
+ tabalyst report data.csv --delimiter ";"
133
+ tabalyst report data.csv --encoding cp1252
134
+ tabalyst report data.csv --config tabalyst.json
135
+ tabalyst report data.csv --verbose
136
+ tabalyst report --help
137
+ tabalyst --version
138
+ ```
139
+
140
+ `python -m tabalyst` accepts the same commands.
141
+
142
+ ## Tabalyst Sample
143
+
144
+ Create a smaller CSV without modifying the source:
145
+
146
+ ```console
147
+ tabalyst sample customers.csv --sample-method random --rows 1000 --seed 42
148
+ ```
149
+
150
+ The default output is `customers.sample.csv` beside the source. Use `-o` to
151
+ name the output for one input, or `-d` to sample several files into one
152
+ directory:
153
+
154
+ ```console
155
+ tabalyst sample customers.csv --sample-method first --rows 100 -o test.csv
156
+ tabalyst sample *.csv --sample-method random --percent 5 -d samples/
157
+ ```
158
+
159
+ Available methods are `first`, `last`, `random` and `stratified`. Stratified
160
+ sampling approximately preserves the distribution of a selected field:
161
+
162
+ ```console
163
+ tabalyst sample customers.csv --sample-method stratified --field province --rows 1000 --seed 42
164
+ ```
165
+
166
+ Sampling reads CSV records as a stream. Random and stratified sampling keep
167
+ only the requested sample, plus stratum counts, in memory. Existing outputs
168
+ require `--force`, and an input file is never overwritten.
169
+
170
+ ## What the report analyzes
171
+
172
+ - Dataset dimensions, missing cells, duplicates, and quality observations.
173
+ - Physical and semantic types with confidence and error rates.
174
+ - Numeric, date, string-length, normalization, and value distributions.
175
+ - Distinct values, representative examples, enum candidates, and date formats.
176
+ - CSV record widths, quoting, encoding, and delimiter configuration.
177
+ - A bounded raw-data preview while every record is analyzed.
178
+
179
+ The HTML report is self-contained and works without a CDN or network connection.
180
+ The JSON profile contains the same canonical analysis result for scripts and
181
+ future Tabalyst tools.
182
+
183
+ ## Python API
184
+
185
+ The same operations are available without the CLI:
186
+
187
+ ```python
188
+ import tabalyst
189
+
190
+ result = tabalyst.analyze(
191
+ "customers.csv",
192
+ "customers.html",
193
+ separator=";",
194
+ )
195
+
196
+ batch = tabalyst.generate_reports(
197
+ ["*.csv"],
198
+ output_dir="reports",
199
+ )
200
+
201
+ sample = tabalyst.sample_csv(
202
+ "customers.csv",
203
+ method="random",
204
+ rows=1000,
205
+ seed=42,
206
+ )
207
+ ```
208
+
209
+ `analyze()` returns the JSON-serializable profile for one report.
210
+ `generate_reports()` returns the complete batch plan, successes, and failures.
211
+ Expected failures derive from `tabalyst.TabalystError`.
212
+
213
+ Existing artifacts are never replaced silently. Pass `force=True` when
214
+ replacement is intentional.
215
+
216
+ ## Configuration
217
+
218
+ Configuration files are strict JSON. A minimal file is:
219
+
220
+ ```json
221
+ {
222
+ "csv": {
223
+ "delimiter": ";",
224
+ "encoding": "cp1252"
225
+ }
226
+ }
227
+ ```
228
+
229
+ Explicit CLI or Python arguments override the configuration file, which overrides
230
+ Tabalyst defaults. See the
231
+ [configuration reference](https://github.com/loribel-labs/tabalyst/blob/main/docs/en/reference/configuration.md)
232
+ for all analysis settings.
233
+
234
+ ## Local-first behavior and current limits
235
+
236
+ Tabalyst performs analysis locally and adds no telemetry or remote processing.
237
+ Generated JSON and HTML may contain source values and should be shared
238
+ accordingly.
239
+
240
+ Report analysis currently loads the complete CSV into memory. Sampling uses a
241
+ streaming reader with bounded row storage. File and phase progress is available
242
+ for reports; row percentages, throughput estimates, recursive directory input,
243
+ and parallel batch execution will require later ingestion work.
244
+
245
+ ## Examples and development
246
+
247
+ The repository includes small and synthetic public examples under `examples/`.
248
+ See the [examples README](https://github.com/loribel-labs/tabalyst/blob/main/examples/README.md)
249
+ for regeneration commands.
250
+
251
+ ```console
252
+ python -m pytest
253
+ python -m ruff check .
254
+ python -m build
255
+ ```
256
+
257
+ Additional documentation:
258
+
259
+ - [Architecture](https://github.com/loribel-labs/tabalyst/blob/main/docs/dev/architecture.md)
260
+ - [Configuration](https://github.com/loribel-labs/tabalyst/blob/main/docs/en/reference/configuration.md)
261
+ - [Release procedure](https://github.com/loribel-labs/tabalyst/blob/main/RELEASING.md)
262
+
263
+ Please report defects and feature requests through the
264
+ [GitHub issue tracker](https://github.com/loribel-labs/tabalyst/issues).
265
+
266
+ ## License
267
+
268
+ Tabalyst is released under the [MIT License](LICENSE).
269
+
270
+ Created by Gregory Borelli — Catalyseur Numérique.
@@ -28,8 +28,8 @@ domains.
28
28
  From the repository root, regenerate both outputs with:
29
29
 
30
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
31
+ tabalyst report examples/input/basic.csv -o examples/output/basic/report.html --config examples/config.json --force
32
+ tabalyst report examples/input/insurance-customers.csv -o examples/output/insurance-customers/report.html --config examples/config.json --force
33
33
  ```
34
34
 
35
35
  Every output folder is independent and contains its own HTML report, canonical
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tabalyst"
7
- version = "0.1.2"
8
- description = "Open-source data profiling engine for structured JSON and customizable HTML reports."
7
+ version = "0.3.0"
8
+ description = "Open-source toolkit for understanding and working with unfamiliar data."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
11
11
  license = "MIT"
@@ -4,7 +4,12 @@ from tabalyst._version import __version__
4
4
  from tabalyst.analysis import analyze_column as analyze_column
5
5
  from tabalyst.config import AnalysisConfig as AnalysisConfig
6
6
  from tabalyst.errors import ConfigurationError, InputError, ReportError, TabalystError
7
+ from tabalyst.report_service import generate_reports as generate_reports
7
8
  from tabalyst.reporting import render_report as render_report
9
+ from tabalyst.sampling import SampleMethod as SampleMethod
10
+ from tabalyst.sampling import SampleResult as SampleResult
11
+ from tabalyst.sampling import sample_csv as sample_csv
12
+ from tabalyst.sampling_service import generate_samples as generate_samples
8
13
  from tabalyst.service import analyze
9
14
  from tabalyst.service import analyze_csv as analyze_csv
10
15
 
@@ -15,6 +20,9 @@ __all__ = [
15
20
  "TabalystError",
16
21
  "__version__",
17
22
  "analyze",
23
+ "generate_reports",
24
+ "generate_samples",
25
+ "sample_csv",
18
26
  ]
19
27
 
20
28
  # Alpha compatibility imports remain available, but are not part of the 0.1.0 API.
@@ -0,0 +1,5 @@
1
+ """Public command-line application for Tabalyst."""
2
+
3
+ from tabalyst.cli.app import app, main
4
+
5
+ __all__ = ["app", "main"]
@@ -0,0 +1,46 @@
1
+ """Tabalyst command-line application."""
2
+
3
+ from typing import Annotated
4
+
5
+ import typer
6
+
7
+ from tabalyst import __version__
8
+ from tabalyst.cli.report import report_command
9
+ from tabalyst.cli.sample import sample_command
10
+
11
+ app = typer.Typer(
12
+ add_completion=False,
13
+ no_args_is_help=True,
14
+ help="Tools for unfamiliar data.",
15
+ )
16
+
17
+
18
+ def _version_callback(value: bool) -> None:
19
+ if value:
20
+ typer.echo(__version__)
21
+ raise typer.Exit()
22
+
23
+
24
+ @app.callback()
25
+ def root(
26
+ version: Annotated[
27
+ bool,
28
+ typer.Option(
29
+ "--version",
30
+ "-V",
31
+ help="Show the installed Tabalyst version and exit.",
32
+ is_eager=True,
33
+ callback=_version_callback,
34
+ ),
35
+ ] = False,
36
+ ) -> None:
37
+ """Understand, explore, clean, and validate structured data."""
38
+
39
+
40
+ app.command("report")(report_command)
41
+ app.command("sample")(sample_command)
42
+
43
+
44
+ def main() -> None:
45
+ """Run the Tabalyst command-line application."""
46
+ app()