cloudcat 0.3.8__tar.gz → 0.5.1__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.
- {cloudcat-0.3.8 → cloudcat-0.5.1}/PKG-INFO +103 -35
- {cloudcat-0.3.8 → cloudcat-0.5.1}/README.md +89 -17
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/__init__.py +1 -1
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/cli.py +529 -268
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/compression.py +13 -4
- cloudcat-0.5.1/cloudcat/data/SKILL.md +114 -0
- cloudcat-0.5.1/cloudcat/filtering.py +225 -0
- cloudcat-0.5.1/cloudcat/formatters.py +159 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/progress.py +21 -9
- cloudcat-0.5.1/cloudcat/readers/avro.py +197 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/readers/csv.py +63 -18
- cloudcat-0.5.1/cloudcat/readers/json.py +372 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/readers/orc.py +88 -31
- cloudcat-0.5.1/cloudcat/readers/parquet.py +380 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/readers/text.py +92 -8
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/azure.py +67 -21
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/base.py +73 -25
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/gcs.py +4 -2
- cloudcat-0.5.1/cloudcat/storage/local.py +58 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/s3.py +4 -2
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/streaming/filesystems.py +23 -10
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/streaming/stats.py +7 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/streaming/tracking.py +2 -1
- cloudcat-0.5.1/cloudcat/user_config.py +107 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/PKG-INFO +103 -35
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/SOURCES.txt +16 -4
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/requires.txt +15 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/top_level.txt +0 -1
- cloudcat-0.5.1/pyproject.toml +104 -0
- cloudcat-0.5.1/tests/test_bugfix_round2.py +246 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_cli.py +6 -6
- cloudcat-0.5.1/tests/test_cli_features.py +121 -0
- cloudcat-0.5.1/tests/test_config_stats_completion.py +110 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_integration.py +9 -5
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_path_parsing.py +5 -5
- cloudcat-0.5.1/tests/test_read_data_streaming.py +59 -0
- cloudcat-0.5.1/tests/test_readers_roundtrip.py +122 -0
- cloudcat-0.5.1/tests/test_regressions.py +93 -0
- cloudcat-0.5.1/tests/test_skill_install.py +70 -0
- cloudcat-0.5.1/tests/test_storage_listing.py +75 -0
- cloudcat-0.5.1/tests/test_streaming_stats.py +60 -0
- cloudcat-0.5.1/tests/test_tracking.py +62 -0
- cloudcat-0.5.1/tests/test_v05_features.py +256 -0
- cloudcat-0.5.1/tests/test_visual_output.py +95 -0
- cloudcat-0.3.8/cloudcat/filtering.py +0 -120
- cloudcat-0.3.8/cloudcat/formatters.py +0 -93
- cloudcat-0.3.8/cloudcat/readers/avro.py +0 -144
- cloudcat-0.3.8/cloudcat/readers/json.py +0 -254
- cloudcat-0.3.8/cloudcat/readers/parquet.py +0 -282
- cloudcat-0.3.8/pyproject.toml +0 -3
- cloudcat-0.3.8/setup.py +0 -96
- cloudcat-0.3.8/tests/__init__.py +0 -0
- cloudcat-0.3.8/tests/conftest.py +0 -45
- {cloudcat-0.3.8 → cloudcat-0.5.1}/LICENSE +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/config.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/readers/__init__.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/storage/__init__.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat/streaming/__init__.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/dependency_links.txt +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/cloudcat.egg-info/entry_points.txt +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/setup.cfg +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_compression.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_config.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_data_reading.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_file_filtering.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_filtering.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_format_detection.py +0 -0
- {cloudcat-0.3.8 → cloudcat-0.5.1}/tests/test_output_formatting.py +0 -0
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cloudcat
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Summary: Preview and analyze data files in Google Cloud Storage, AWS S3, and Azure Data Lake Storage Gen2 from your terminal
|
|
5
|
-
Home-page: https://github.com/jonathansudhakar1/cloudcat
|
|
6
5
|
Author: Jonathan Sudhakar
|
|
7
|
-
|
|
6
|
+
License: MIT
|
|
8
7
|
Project-URL: Homepage, https://github.com/jonathansudhakar1/cloudcat
|
|
9
8
|
Project-URL: Documentation, https://cloudcatcli.com
|
|
10
9
|
Project-URL: Bug Reports, https://github.com/jonathansudhakar1/cloudcat/issues
|
|
@@ -22,14 +21,12 @@ Classifier: Environment :: Console
|
|
|
22
21
|
Classifier: License :: OSI Approved :: MIT License
|
|
23
22
|
Classifier: Operating System :: OS Independent
|
|
24
23
|
Classifier: Programming Language :: Python :: 3
|
|
25
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
26
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
27
24
|
Classifier: Programming Language :: Python :: 3.9
|
|
28
25
|
Classifier: Programming Language :: Python :: 3.10
|
|
29
26
|
Classifier: Programming Language :: Python :: 3.11
|
|
30
27
|
Classifier: Programming Language :: Python :: 3.12
|
|
31
28
|
Classifier: Programming Language :: Python :: 3.13
|
|
32
|
-
Requires-Python: >=3.
|
|
29
|
+
Requires-Python: >=3.9
|
|
33
30
|
Description-Content-Type: text/markdown
|
|
34
31
|
License-File: LICENSE
|
|
35
32
|
Requires-Dist: click>=8.0.0
|
|
@@ -39,7 +36,9 @@ Requires-Dist: colorama>=0.4.4
|
|
|
39
36
|
Requires-Dist: google-cloud-storage>=2.0.0
|
|
40
37
|
Requires-Dist: boto3>=1.18.0
|
|
41
38
|
Requires-Dist: azure-storage-file-datalake>=12.0.0
|
|
39
|
+
Requires-Dist: azure-storage-blob>=12.0.0
|
|
42
40
|
Requires-Dist: azure-identity>=1.0.0
|
|
41
|
+
Requires-Dist: tomli>=1.1.0; python_version < "3.11"
|
|
43
42
|
Provides-Extra: parquet
|
|
44
43
|
Requires-Dist: pyarrow>=5.0.0; extra == "parquet"
|
|
45
44
|
Provides-Extra: avro
|
|
@@ -62,19 +61,16 @@ Requires-Dist: fastavro>=1.4.0; extra == "all"
|
|
|
62
61
|
Requires-Dist: zstandard>=0.15.0; extra == "all"
|
|
63
62
|
Requires-Dist: lz4>=3.0.0; extra == "all"
|
|
64
63
|
Requires-Dist: python-snappy>=0.6.0; extra == "all"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
Provides-Extra: test
|
|
65
|
+
Requires-Dist: pytest>=6.0.0; extra == "test"
|
|
66
|
+
Requires-Dist: pytest-mock>=3.6.0; extra == "test"
|
|
67
|
+
Provides-Extra: dev
|
|
68
|
+
Requires-Dist: pytest>=6.0.0; extra == "dev"
|
|
69
|
+
Requires-Dist: pytest-mock>=3.6.0; extra == "dev"
|
|
70
|
+
Requires-Dist: moto>=4.0.0; extra == "dev"
|
|
71
|
+
Requires-Dist: build; extra == "dev"
|
|
72
|
+
Requires-Dist: twine; extra == "dev"
|
|
72
73
|
Dynamic: license-file
|
|
73
|
-
Dynamic: project-url
|
|
74
|
-
Dynamic: provides-extra
|
|
75
|
-
Dynamic: requires-dist
|
|
76
|
-
Dynamic: requires-python
|
|
77
|
-
Dynamic: summary
|
|
78
74
|
|
|
79
75
|
<p align="center">
|
|
80
76
|
<img src="https://raw.githubusercontent.com/jonathansudhakar1/cloudcat/main/assets/logo.png" alt="CloudCat Logo" width="200">
|
|
@@ -174,14 +170,17 @@ pip install --upgrade 'cloudcat[all]'
|
|
|
174
170
|
### Requirements
|
|
175
171
|
|
|
176
172
|
- **Homebrew**: macOS (Apple Silicon only). Intel Mac users should use pip.
|
|
177
|
-
- **pip**: Python 3.
|
|
173
|
+
- **pip**: Python 3.9+ (all platforms)
|
|
178
174
|
- Cloud provider credentials configured (see [Authentication](#authentication))
|
|
179
175
|
|
|
180
176
|
## Quick Start
|
|
181
177
|
|
|
182
178
|
```bash
|
|
183
|
-
# Preview a CSV file from GCS
|
|
184
|
-
cloudcat
|
|
179
|
+
# Preview a CSV file from GCS (PATH is positional; -p/--path also works)
|
|
180
|
+
cloudcat gcs://my-bucket/data.csv
|
|
181
|
+
|
|
182
|
+
# Preview a local file — no cloud credentials needed
|
|
183
|
+
cloudcat ./data.parquet
|
|
185
184
|
|
|
186
185
|
# Preview a Parquet file from S3
|
|
187
186
|
cloudcat -p s3://my-bucket/analytics/events.parquet
|
|
@@ -204,8 +203,8 @@ cloudcat -p s3://my-bucket/spark-output/ -i parquet
|
|
|
204
203
|
# Read compressed files (auto-detected)
|
|
205
204
|
cloudcat -p gcs://my-bucket/data.csv.gz
|
|
206
205
|
|
|
207
|
-
# Filter rows with WHERE
|
|
208
|
-
cloudcat
|
|
206
|
+
# Filter rows with WHERE (streams; stops at -n matches; AND/OR supported)
|
|
207
|
+
cloudcat s3://bucket/users.parquet --where "status=active AND age>30"
|
|
209
208
|
|
|
210
209
|
# Skip first 100 rows (pagination)
|
|
211
210
|
cloudcat -p gcs://bucket/data.csv --offset 100 -n 10
|
|
@@ -220,6 +219,7 @@ cloudcat -p gcs://bucket/data.csv --offset 100 -n 10
|
|
|
220
219
|
| Google Cloud Storage | `gcs://` or `gs://` | ✅ Supported |
|
|
221
220
|
| Amazon S3 | `s3://` | ✅ Supported |
|
|
222
221
|
| Azure Data Lake Gen2 | `abfss://` | ✅ Supported |
|
|
222
|
+
| Local files | `file://` or a plain path | ✅ Supported (no credentials needed) |
|
|
223
223
|
|
|
224
224
|
### File Format Support
|
|
225
225
|
|
|
@@ -242,8 +242,8 @@ CloudCat uses intelligent streaming to minimize data transfer and egress costs:
|
|
|
242
242
|
|--------|-------------|---------|-------------------|----------------|
|
|
243
243
|
| Parquet | None/Internal | ✅ | ✅ Range requests | ✅ |
|
|
244
244
|
| Parquet | External (.gz) | ❌ | ❌ | ❌ |
|
|
245
|
-
| ORC | None/Internal |
|
|
246
|
-
| ORC | External (.gz) | ❌ |
|
|
245
|
+
| ORC | None/Internal | ✅ Stripe-by-stripe | ✅ | ✅ |
|
|
246
|
+
| ORC | External (.gz) | ❌ | ✅ | ✅ |
|
|
247
247
|
| CSV | None | ✅ | ❌ | ✅ |
|
|
248
248
|
| CSV | gzip/zstd/lz4/bz2 | ✅ | ❌ | ✅ |
|
|
249
249
|
| CSV | snappy | ❌ | ❌ | ❌ |
|
|
@@ -272,7 +272,7 @@ CloudCat automatically detects and decompresses files based on extension (e.g.,
|
|
|
272
272
|
|
|
273
273
|
| Format | Flag | Description |
|
|
274
274
|
|--------|------|-------------|
|
|
275
|
-
| Table | `-o table` |
|
|
275
|
+
| Table | `-o table` | Rounded table with bold headers and type-aware coloring (default) |
|
|
276
276
|
| JSON | `-o json` | Standard JSON Lines output |
|
|
277
277
|
| Pretty JSON | `-o jsonp` | Syntax-highlighted, indented JSON |
|
|
278
278
|
| CSV | `-o csv` | Comma-separated values |
|
|
@@ -329,8 +329,8 @@ cloudcat -p gcs://bucket/events.jsonl
|
|
|
329
329
|
### Filtering and Pagination
|
|
330
330
|
|
|
331
331
|
```bash
|
|
332
|
-
# Filter rows with WHERE
|
|
333
|
-
cloudcat
|
|
332
|
+
# Filter rows with WHERE (streams; stops at -n matches; AND/OR supported)
|
|
333
|
+
cloudcat s3://bucket/users.parquet --where "status=active AND age>30"
|
|
334
334
|
cloudcat -p gcs://bucket/events.json --where "age>30"
|
|
335
335
|
cloudcat -p s3://bucket/logs.csv --where "level=ERROR"
|
|
336
336
|
|
|
@@ -479,13 +479,17 @@ cloudcat -p s3://api-dumps/response.json -o csv > data.csv
|
|
|
479
479
|
Usage: cloudcat [OPTIONS]
|
|
480
480
|
|
|
481
481
|
Options:
|
|
482
|
-
|
|
482
|
+
PATH Positional path: gs://, gcs://, s3://, abfss://,
|
|
483
|
+
file:// URL, or a plain local path
|
|
484
|
+
(-p/--path remains as a compatible alias)
|
|
483
485
|
Format: gcs://bucket/path, s3://bucket/path,
|
|
484
486
|
or abfss://container@account.dfs.core.windows.net/path
|
|
485
487
|
|
|
486
488
|
-o, --output-format TEXT Output format: table, json, jsonp, csv
|
|
487
489
|
[default: table]
|
|
488
490
|
|
|
491
|
+
-O, --output-file PATH Write rendered data to a file instead of stdout
|
|
492
|
+
|
|
489
493
|
-i, --input-format TEXT Input format: csv, json, parquet, avro, orc, text
|
|
490
494
|
[default: auto-detect from extension]
|
|
491
495
|
|
|
@@ -498,9 +502,12 @@ Options:
|
|
|
498
502
|
--offset INTEGER Skip first N rows
|
|
499
503
|
[default: 0]
|
|
500
504
|
|
|
501
|
-
-w, --where TEXT Filter rows with SQL-like conditions
|
|
502
|
-
|
|
503
|
-
|
|
505
|
+
-w, --where TEXT Filter rows with SQL-like conditions; combine
|
|
506
|
+
with AND/OR. Streams the file and stops at
|
|
507
|
+
--num-rows matches; Parquet skips row groups
|
|
508
|
+
via column statistics.
|
|
509
|
+
Examples: "status=active", "age>30 AND age<65",
|
|
510
|
+
"level=ERROR or level=FATAL"
|
|
504
511
|
|
|
505
512
|
-s, --schema TEXT Schema display: show, dont_show, schema_only
|
|
506
513
|
[default: show]
|
|
@@ -516,13 +523,25 @@ Options:
|
|
|
516
523
|
-d, --delimiter TEXT CSV delimiter (use \t for tab)
|
|
517
524
|
[default: comma]
|
|
518
525
|
|
|
526
|
+
--no-color Disable colored output (also honors NO_COLOR).
|
|
527
|
+
Color is auto-disabled when output is piped.
|
|
528
|
+
|
|
519
529
|
--profile TEXT AWS profile name (for S3 access)
|
|
520
530
|
|
|
521
531
|
--project TEXT GCP project ID (for GCS access)
|
|
522
532
|
|
|
523
533
|
--credentials TEXT Path to GCP service account JSON file
|
|
524
534
|
|
|
525
|
-
--
|
|
535
|
+
--stats Show per-column statistics (nulls, distinct,
|
|
536
|
+
min/max) over the retrieved rows
|
|
537
|
+
|
|
538
|
+
--config-profile TEXT Named profile from ~/.config/cloudcat/config.toml
|
|
539
|
+
|
|
540
|
+
--completion [bash|zsh|fish] Print the shell completion script and exit
|
|
541
|
+
|
|
542
|
+
--az-access-key TEXT Azure storage account access key
|
|
543
|
+
|
|
544
|
+
-y, --yes Skip confirmation prompts (for scripting)
|
|
526
545
|
|
|
527
546
|
--help Show this message and exit
|
|
528
547
|
```
|
|
@@ -696,6 +715,50 @@ pip install -e ".[all]"
|
|
|
696
715
|
pytest
|
|
697
716
|
```
|
|
698
717
|
|
|
718
|
+
## Use with AI Agents
|
|
719
|
+
|
|
720
|
+
CloudCat is optimized for AI coding agents: **stdout carries only data**
|
|
721
|
+
(diagnostics go to stderr, color auto-disables when piped), `-o json` emits
|
|
722
|
+
parseable NDJSON, `-y` makes every command non-interactive, filtering streams
|
|
723
|
+
with Parquet row-group pushdown, and local files need no credentials.
|
|
724
|
+
|
|
725
|
+
The repo ships an [Agent Skill](https://agentskills.io) at
|
|
726
|
+
[`skills/cloudcat/SKILL.md`](skills/cloudcat/SKILL.md) — a compact reference
|
|
727
|
+
that teaches agents the optimal scanning recipes (schema discovery, filtered
|
|
728
|
+
sampling, metadata-fast counts, column profiling) with zero trial-and-error.
|
|
729
|
+
|
|
730
|
+
Install the skill (pick one):
|
|
731
|
+
|
|
732
|
+
```bash
|
|
733
|
+
# 1. Built-in installer — the skill ships inside the package (works offline)
|
|
734
|
+
cloudcat --install-skill claude # Claude Code, all projects (~/.claude/skills)
|
|
735
|
+
cloudcat --install-skill claude-project # Claude Code, this project (./.claude/skills)
|
|
736
|
+
cloudcat --install-skill codex # OpenAI Codex CLI (~/.codex/skills)
|
|
737
|
+
cloudcat --install-skill print # stdout — pipe into any other agent's instructions
|
|
738
|
+
|
|
739
|
+
# 2. Claude Code plugin marketplace
|
|
740
|
+
/plugin marketplace add jonathansudhakar1/cloudcat
|
|
741
|
+
/plugin install cloudcat@cloudcat
|
|
742
|
+
|
|
743
|
+
# 3. Or fetch it directly (no cloudcat install needed)
|
|
744
|
+
curl -fsSL --create-dirs -o ~/.claude/skills/cloudcat/SKILL.md \
|
|
745
|
+
https://raw.githubusercontent.com/jonathansudhakar1/cloudcat/main/skills/cloudcat/SKILL.md
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
The recipes agents learn:
|
|
749
|
+
|
|
750
|
+
```bash
|
|
751
|
+
cloudcat s3://bucket/events/ -s schema_only -y # structure, no data read
|
|
752
|
+
cloudcat s3://bucket/events/ --count -s schema_only -y # exact rows (Parquet/ORC: metadata-only)
|
|
753
|
+
cloudcat s3://bucket/events/ -w "type=purchase AND amount>250" \
|
|
754
|
+
-n 5 -o json -s dont_show -y # filtered NDJSON sample
|
|
755
|
+
cloudcat s3://bucket/events/ --stats -n 0 -s dont_show -y # nulls/distinct/min/max per column
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
Works with any agent framework that can run shell commands and load the
|
|
759
|
+
SKILL.md (or plain markdown) as instructions. See the
|
|
760
|
+
[AI Agents docs](https://cloudcatcli.com/#agents) for details.
|
|
761
|
+
|
|
699
762
|
## Roadmap
|
|
700
763
|
|
|
701
764
|
- [x] Azure Blob Storage support
|
|
@@ -705,9 +768,14 @@ pytest
|
|
|
705
768
|
- [x] SQL-like filtering (`--where` clause)
|
|
706
769
|
- [x] Compression support (gzip, zstd, lz4, snappy, bz2)
|
|
707
770
|
- [x] Row offset/pagination (`--offset`)
|
|
771
|
+
- [x] Output to file with `--output-file`
|
|
772
|
+
- [x] Compound WHERE conditions (`AND`/`OR`)
|
|
773
|
+
- [x] Streaming WHERE with Parquet row-group pushdown
|
|
774
|
+
- [x] Local file support (`file://` or plain paths)
|
|
775
|
+
- [x] Configuration file with named profiles
|
|
776
|
+
- [x] Column statistics (`--stats`)
|
|
777
|
+
- [x] Shell completion (bash/zsh/fish)
|
|
708
778
|
- [ ] Interactive mode with pagination
|
|
709
|
-
- [ ] Output to file with `--output-file`
|
|
710
|
-
- [ ] Configuration file support
|
|
711
779
|
|
|
712
780
|
## Related Projects
|
|
713
781
|
|
|
@@ -96,14 +96,17 @@ pip install --upgrade 'cloudcat[all]'
|
|
|
96
96
|
### Requirements
|
|
97
97
|
|
|
98
98
|
- **Homebrew**: macOS (Apple Silicon only). Intel Mac users should use pip.
|
|
99
|
-
- **pip**: Python 3.
|
|
99
|
+
- **pip**: Python 3.9+ (all platforms)
|
|
100
100
|
- Cloud provider credentials configured (see [Authentication](#authentication))
|
|
101
101
|
|
|
102
102
|
## Quick Start
|
|
103
103
|
|
|
104
104
|
```bash
|
|
105
|
-
# Preview a CSV file from GCS
|
|
106
|
-
cloudcat
|
|
105
|
+
# Preview a CSV file from GCS (PATH is positional; -p/--path also works)
|
|
106
|
+
cloudcat gcs://my-bucket/data.csv
|
|
107
|
+
|
|
108
|
+
# Preview a local file — no cloud credentials needed
|
|
109
|
+
cloudcat ./data.parquet
|
|
107
110
|
|
|
108
111
|
# Preview a Parquet file from S3
|
|
109
112
|
cloudcat -p s3://my-bucket/analytics/events.parquet
|
|
@@ -126,8 +129,8 @@ cloudcat -p s3://my-bucket/spark-output/ -i parquet
|
|
|
126
129
|
# Read compressed files (auto-detected)
|
|
127
130
|
cloudcat -p gcs://my-bucket/data.csv.gz
|
|
128
131
|
|
|
129
|
-
# Filter rows with WHERE
|
|
130
|
-
cloudcat
|
|
132
|
+
# Filter rows with WHERE (streams; stops at -n matches; AND/OR supported)
|
|
133
|
+
cloudcat s3://bucket/users.parquet --where "status=active AND age>30"
|
|
131
134
|
|
|
132
135
|
# Skip first 100 rows (pagination)
|
|
133
136
|
cloudcat -p gcs://bucket/data.csv --offset 100 -n 10
|
|
@@ -142,6 +145,7 @@ cloudcat -p gcs://bucket/data.csv --offset 100 -n 10
|
|
|
142
145
|
| Google Cloud Storage | `gcs://` or `gs://` | ✅ Supported |
|
|
143
146
|
| Amazon S3 | `s3://` | ✅ Supported |
|
|
144
147
|
| Azure Data Lake Gen2 | `abfss://` | ✅ Supported |
|
|
148
|
+
| Local files | `file://` or a plain path | ✅ Supported (no credentials needed) |
|
|
145
149
|
|
|
146
150
|
### File Format Support
|
|
147
151
|
|
|
@@ -164,8 +168,8 @@ CloudCat uses intelligent streaming to minimize data transfer and egress costs:
|
|
|
164
168
|
|--------|-------------|---------|-------------------|----------------|
|
|
165
169
|
| Parquet | None/Internal | ✅ | ✅ Range requests | ✅ |
|
|
166
170
|
| Parquet | External (.gz) | ❌ | ❌ | ❌ |
|
|
167
|
-
| ORC | None/Internal |
|
|
168
|
-
| ORC | External (.gz) | ❌ |
|
|
171
|
+
| ORC | None/Internal | ✅ Stripe-by-stripe | ✅ | ✅ |
|
|
172
|
+
| ORC | External (.gz) | ❌ | ✅ | ✅ |
|
|
169
173
|
| CSV | None | ✅ | ❌ | ✅ |
|
|
170
174
|
| CSV | gzip/zstd/lz4/bz2 | ✅ | ❌ | ✅ |
|
|
171
175
|
| CSV | snappy | ❌ | ❌ | ❌ |
|
|
@@ -194,7 +198,7 @@ CloudCat automatically detects and decompresses files based on extension (e.g.,
|
|
|
194
198
|
|
|
195
199
|
| Format | Flag | Description |
|
|
196
200
|
|--------|------|-------------|
|
|
197
|
-
| Table | `-o table` |
|
|
201
|
+
| Table | `-o table` | Rounded table with bold headers and type-aware coloring (default) |
|
|
198
202
|
| JSON | `-o json` | Standard JSON Lines output |
|
|
199
203
|
| Pretty JSON | `-o jsonp` | Syntax-highlighted, indented JSON |
|
|
200
204
|
| CSV | `-o csv` | Comma-separated values |
|
|
@@ -251,8 +255,8 @@ cloudcat -p gcs://bucket/events.jsonl
|
|
|
251
255
|
### Filtering and Pagination
|
|
252
256
|
|
|
253
257
|
```bash
|
|
254
|
-
# Filter rows with WHERE
|
|
255
|
-
cloudcat
|
|
258
|
+
# Filter rows with WHERE (streams; stops at -n matches; AND/OR supported)
|
|
259
|
+
cloudcat s3://bucket/users.parquet --where "status=active AND age>30"
|
|
256
260
|
cloudcat -p gcs://bucket/events.json --where "age>30"
|
|
257
261
|
cloudcat -p s3://bucket/logs.csv --where "level=ERROR"
|
|
258
262
|
|
|
@@ -401,13 +405,17 @@ cloudcat -p s3://api-dumps/response.json -o csv > data.csv
|
|
|
401
405
|
Usage: cloudcat [OPTIONS]
|
|
402
406
|
|
|
403
407
|
Options:
|
|
404
|
-
|
|
408
|
+
PATH Positional path: gs://, gcs://, s3://, abfss://,
|
|
409
|
+
file:// URL, or a plain local path
|
|
410
|
+
(-p/--path remains as a compatible alias)
|
|
405
411
|
Format: gcs://bucket/path, s3://bucket/path,
|
|
406
412
|
or abfss://container@account.dfs.core.windows.net/path
|
|
407
413
|
|
|
408
414
|
-o, --output-format TEXT Output format: table, json, jsonp, csv
|
|
409
415
|
[default: table]
|
|
410
416
|
|
|
417
|
+
-O, --output-file PATH Write rendered data to a file instead of stdout
|
|
418
|
+
|
|
411
419
|
-i, --input-format TEXT Input format: csv, json, parquet, avro, orc, text
|
|
412
420
|
[default: auto-detect from extension]
|
|
413
421
|
|
|
@@ -420,9 +428,12 @@ Options:
|
|
|
420
428
|
--offset INTEGER Skip first N rows
|
|
421
429
|
[default: 0]
|
|
422
430
|
|
|
423
|
-
-w, --where TEXT Filter rows with SQL-like conditions
|
|
424
|
-
|
|
425
|
-
|
|
431
|
+
-w, --where TEXT Filter rows with SQL-like conditions; combine
|
|
432
|
+
with AND/OR. Streams the file and stops at
|
|
433
|
+
--num-rows matches; Parquet skips row groups
|
|
434
|
+
via column statistics.
|
|
435
|
+
Examples: "status=active", "age>30 AND age<65",
|
|
436
|
+
"level=ERROR or level=FATAL"
|
|
426
437
|
|
|
427
438
|
-s, --schema TEXT Schema display: show, dont_show, schema_only
|
|
428
439
|
[default: show]
|
|
@@ -438,13 +449,25 @@ Options:
|
|
|
438
449
|
-d, --delimiter TEXT CSV delimiter (use \t for tab)
|
|
439
450
|
[default: comma]
|
|
440
451
|
|
|
452
|
+
--no-color Disable colored output (also honors NO_COLOR).
|
|
453
|
+
Color is auto-disabled when output is piped.
|
|
454
|
+
|
|
441
455
|
--profile TEXT AWS profile name (for S3 access)
|
|
442
456
|
|
|
443
457
|
--project TEXT GCP project ID (for GCS access)
|
|
444
458
|
|
|
445
459
|
--credentials TEXT Path to GCP service account JSON file
|
|
446
460
|
|
|
447
|
-
--
|
|
461
|
+
--stats Show per-column statistics (nulls, distinct,
|
|
462
|
+
min/max) over the retrieved rows
|
|
463
|
+
|
|
464
|
+
--config-profile TEXT Named profile from ~/.config/cloudcat/config.toml
|
|
465
|
+
|
|
466
|
+
--completion [bash|zsh|fish] Print the shell completion script and exit
|
|
467
|
+
|
|
468
|
+
--az-access-key TEXT Azure storage account access key
|
|
469
|
+
|
|
470
|
+
-y, --yes Skip confirmation prompts (for scripting)
|
|
448
471
|
|
|
449
472
|
--help Show this message and exit
|
|
450
473
|
```
|
|
@@ -618,6 +641,50 @@ pip install -e ".[all]"
|
|
|
618
641
|
pytest
|
|
619
642
|
```
|
|
620
643
|
|
|
644
|
+
## Use with AI Agents
|
|
645
|
+
|
|
646
|
+
CloudCat is optimized for AI coding agents: **stdout carries only data**
|
|
647
|
+
(diagnostics go to stderr, color auto-disables when piped), `-o json` emits
|
|
648
|
+
parseable NDJSON, `-y` makes every command non-interactive, filtering streams
|
|
649
|
+
with Parquet row-group pushdown, and local files need no credentials.
|
|
650
|
+
|
|
651
|
+
The repo ships an [Agent Skill](https://agentskills.io) at
|
|
652
|
+
[`skills/cloudcat/SKILL.md`](skills/cloudcat/SKILL.md) — a compact reference
|
|
653
|
+
that teaches agents the optimal scanning recipes (schema discovery, filtered
|
|
654
|
+
sampling, metadata-fast counts, column profiling) with zero trial-and-error.
|
|
655
|
+
|
|
656
|
+
Install the skill (pick one):
|
|
657
|
+
|
|
658
|
+
```bash
|
|
659
|
+
# 1. Built-in installer — the skill ships inside the package (works offline)
|
|
660
|
+
cloudcat --install-skill claude # Claude Code, all projects (~/.claude/skills)
|
|
661
|
+
cloudcat --install-skill claude-project # Claude Code, this project (./.claude/skills)
|
|
662
|
+
cloudcat --install-skill codex # OpenAI Codex CLI (~/.codex/skills)
|
|
663
|
+
cloudcat --install-skill print # stdout — pipe into any other agent's instructions
|
|
664
|
+
|
|
665
|
+
# 2. Claude Code plugin marketplace
|
|
666
|
+
/plugin marketplace add jonathansudhakar1/cloudcat
|
|
667
|
+
/plugin install cloudcat@cloudcat
|
|
668
|
+
|
|
669
|
+
# 3. Or fetch it directly (no cloudcat install needed)
|
|
670
|
+
curl -fsSL --create-dirs -o ~/.claude/skills/cloudcat/SKILL.md \
|
|
671
|
+
https://raw.githubusercontent.com/jonathansudhakar1/cloudcat/main/skills/cloudcat/SKILL.md
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
The recipes agents learn:
|
|
675
|
+
|
|
676
|
+
```bash
|
|
677
|
+
cloudcat s3://bucket/events/ -s schema_only -y # structure, no data read
|
|
678
|
+
cloudcat s3://bucket/events/ --count -s schema_only -y # exact rows (Parquet/ORC: metadata-only)
|
|
679
|
+
cloudcat s3://bucket/events/ -w "type=purchase AND amount>250" \
|
|
680
|
+
-n 5 -o json -s dont_show -y # filtered NDJSON sample
|
|
681
|
+
cloudcat s3://bucket/events/ --stats -n 0 -s dont_show -y # nulls/distinct/min/max per column
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
Works with any agent framework that can run shell commands and load the
|
|
685
|
+
SKILL.md (or plain markdown) as instructions. See the
|
|
686
|
+
[AI Agents docs](https://cloudcatcli.com/#agents) for details.
|
|
687
|
+
|
|
621
688
|
## Roadmap
|
|
622
689
|
|
|
623
690
|
- [x] Azure Blob Storage support
|
|
@@ -627,9 +694,14 @@ pytest
|
|
|
627
694
|
- [x] SQL-like filtering (`--where` clause)
|
|
628
695
|
- [x] Compression support (gzip, zstd, lz4, snappy, bz2)
|
|
629
696
|
- [x] Row offset/pagination (`--offset`)
|
|
697
|
+
- [x] Output to file with `--output-file`
|
|
698
|
+
- [x] Compound WHERE conditions (`AND`/`OR`)
|
|
699
|
+
- [x] Streaming WHERE with Parquet row-group pushdown
|
|
700
|
+
- [x] Local file support (`file://` or plain paths)
|
|
701
|
+
- [x] Configuration file with named profiles
|
|
702
|
+
- [x] Column statistics (`--stats`)
|
|
703
|
+
- [x] Shell completion (bash/zsh/fish)
|
|
630
704
|
- [ ] Interactive mode with pagination
|
|
631
|
-
- [ ] Output to file with `--output-file`
|
|
632
|
-
- [ ] Configuration file support
|
|
633
705
|
|
|
634
706
|
## Related Projects
|
|
635
707
|
|