tab-cli 0.1.8__tar.gz → 0.2.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.
- {tab_cli-0.1.8 → tab_cli-0.2.0}/CHANGELOG.md +9 -2
- tab_cli-0.2.0/FSSPEC_GLOB_NOTES.md +226 -0
- tab_cli-0.2.0/PKG-INFO +169 -0
- tab_cli-0.1.8/PKG-INFO → tab_cli-0.2.0/README.md +36 -28
- {tab_cli-0.1.8 → tab_cli-0.2.0}/docs/cli-ref.md +16 -6
- {tab_cli-0.1.8 → tab_cli-0.2.0}/docs/cloud.md +14 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/docs/configuration.md +1 -1
- tab_cli-0.2.0/docs/databases.md +117 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/mkdocs.yml +1 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/pyproject.toml +21 -9
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/cli.py +32 -5
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/formats/__init__.py +4 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/formats/avro.py +12 -2
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/formats/base.py +28 -2
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/formats/csv.py +12 -2
- tab_cli-0.2.0/src/tab_cli/formats/duckdb.py +128 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/formats/jsonl.py +12 -2
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/formats/parquet.py +12 -2
- tab_cli-0.2.0/src/tab_cli/formats/sqlite.py +131 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/handlers/__init__.py +24 -2
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/handlers/base.py +98 -26
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/handlers/cli_table.py +8 -2
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/storage/fsspec.py +66 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/url_parser.py +1 -1
- {tab_cli-0.1.8 → tab_cli-0.2.0}/tests/test_cat.py +72 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/tests/test_config.py +4 -2
- tab_cli-0.2.0/tests/test_storage.py +214 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/tests/test_summary.py +52 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/tests/test_view.py +56 -2
- {tab_cli-0.1.8 → tab_cli-0.2.0}/uv.lock +161 -13
- tab_cli-0.1.8/README.md +0 -94
- tab_cli-0.1.8/tests/test_storage.py +0 -83
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.gitignore +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/.gitignore +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/282ad8cf3324b2679a7d460c0fc324adfa21dcfad2f197ac6991b98ec91f98495bb3ddb2cba36ce5dfa28a52063a373bb03f5d2e34f6e0c7b6b81b3046a4d7d0 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/891d7ed26f62b0f8757b081e9d76840636877f1613ee17b7695fe2ee8640258c56e01291934e3797728bc2300a1b5f41e3f3ef81ab532c0e5ab475bb9b6f097a +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/8926397375b8328137652c18cd4371808b214cb26864d77dd33c8eea895e10e62c297064c3d4c703d58ee11dee81bbf9851525e3a0c33151f54c164b8a4343b0 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/89d29d938e64b1295e138faedfa5df6f6729a67e5ba8e0c3fdd1c9266e0f59a4bc35b8a21e14225072317879af3323fa0457e01d9b08608770bc23957feec6c0 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/95fc2854c0fa2528b03e2bcabc7612f56f0bcb3d6f54a06293e21d1887885a449907b5b320a1a94bac712bf56fdad0a4184b17047c1fc179dfa83acab3f70d21 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/9a58ceae46de4649375b6b880b8500c85d34c8e9bc650dc4c993afb2fa8d45c4180331821c6226a0fb1475b04a0b9a849502647ef9c4dcac74769eb501c885fa +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/a19ae062208aa20b7310705af3d26ef53095a9dabfad080883cc7a32e98687063179db95cb2c71ef9064801c59fa46d261f172d83e83f96a39c274387b59dca4 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/d1169a8d10067493e42752c2a7615ff27f55bd90c38b91feef918958e29a2239ee289a0cde8385441d1f0fe9af1fb634fa6d56438b9f33ec382e81fa59d70b54 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/e171e5c6039c050c2368584a537d36df221b1f9f23d285c0399b95b14608d67006229823e6831bff7d8b0c2f9e86ebaec9c6811461119195f430ade055073fed +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/op_links/ee118dd19aac4e1cb354f83a37dadca70bc5f086cc8d36cd0059b222bf8c7250824401ff681518d0120f8db1f96f0025c464dcfc3b1ee28777e8c76325760134 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/282ad8cf3324b2679a7d460c0fc324adfa21dcfad2f197ac6991b98ec91f98495bb3ddb2cba36ce5dfa28a52063a373bb03f5d2e34f6e0c7b6b81b3046a4d7d0 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/891d7ed26f62b0f8757b081e9d76840636877f1613ee17b7695fe2ee8640258c56e01291934e3797728bc2300a1b5f41e3f3ef81ab532c0e5ab475bb9b6f097a +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/8926397375b8328137652c18cd4371808b214cb26864d77dd33c8eea895e10e62c297064c3d4c703d58ee11dee81bbf9851525e3a0c33151f54c164b8a4343b0 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/89d29d938e64b1295e138faedfa5df6f6729a67e5ba8e0c3fdd1c9266e0f59a4bc35b8a21e14225072317879af3323fa0457e01d9b08608770bc23957feec6c0 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/95fc2854c0fa2528b03e2bcabc7612f56f0bcb3d6f54a06293e21d1887885a449907b5b320a1a94bac712bf56fdad0a4184b17047c1fc179dfa83acab3f70d21 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/9a58ceae46de4649375b6b880b8500c85d34c8e9bc650dc4c993afb2fa8d45c4180331821c6226a0fb1475b04a0b9a849502647ef9c4dcac74769eb501c885fa +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/a19ae062208aa20b7310705af3d26ef53095a9dabfad080883cc7a32e98687063179db95cb2c71ef9064801c59fa46d261f172d83e83f96a39c274387b59dca4 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/d1169a8d10067493e42752c2a7615ff27f55bd90c38b91feef918958e29a2239ee289a0cde8385441d1f0fe9af1fb634fa6d56438b9f33ec382e81fa59d70b54 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/e171e5c6039c050c2368584a537d36df221b1f9f23d285c0399b95b14608d67006229823e6831bff7d8b0c2f9e86ebaec9c6811461119195f430ade055073fed +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/operations/ee118dd19aac4e1cb354f83a37dadca70bc5f086cc8d36cd0059b222bf8c7250824401ff681518d0120f8db1f96f0025c464dcfc3b1ee28777e8c76325760134 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/1029dd1c1f4430d8a667a0e48d0b817652c7ddca6f5ff56cac1755e5bb0c1cb7586935941c9b36f26cab05c0effe6154d073bd1dffbe37f22fed0a6e7d79201f +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/3228b9bef9d8374b5532b40df2da8be3bfc86de713bdad7fe620977ffa7c56db83928678caa792bf0d328db607028e045a9e41423ef7501e5b550651c3815ffe +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/424c9a53f5458b328d77ed6a943dc35662e949befa8725cfc7eead01a270417c8d07c1001b11623a088da8d2c9c34a41573314fa2394643147e4027e8a96a605 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/44107e81054aa5544b36eab8d811908a559b4d9027dc3fa1762c44e39551652199ef2a31f9bbcda79773c906151c12578cb18c43e0045de8b20c357272e1c62a +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/52ea57bde33e8ef4718d833c2df3cf0a9e90fdcd5715c0caad50b4e37ea60aca2b8c71096de6920dc936c40b6291e896293f91c7cfd2aa96cf6c2aa49ef662c8 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/5ea52f6d4771afda4747b9f44954102c02ae2d0686f8aa9eca36c29796bbba0d14e851c0dca0a6af17bfbbbac174e3be645ae708d958390168e85c64786fc9ef +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/86a1cfa113399acc7dd2dc90262a845558affb5e9373b6300dff68a485482c5e17ace9466bbc23b4301013ca1a27a577ca57ea838113f45bf321a64a242b1ad3 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/8ef99a12ae0624db198d9ecd83014fb8353c4731e0ba9a472f1fc339784308e38f1287d0765a7b0444f1a89c218c76a820dc4c9a3a39c1cedcd7423a4f5f88dc +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/cb3e8da2bf2b7efae4a6e8fd0b8562dacd16ca0531b173a91480a9e60ee795ac5bec13fc6eb461e03edc9a26f5ff1d5ba53521a1c1a6c1ee1765b544b7d7bf73 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/segments/d27ad326963b75736b636adad9fb812eb3f2871e0efb4bc7db37d4b701a4282911eaaee91bed3a759e940769b667be1ed66f2d7f2f41ac3906b87ab7eec19c3a +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/index/type +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_heads/heads/891d7ed26f62b0f8757b081e9d76840636877f1613ee17b7695fe2ee8640258c56e01291934e3797728bc2300a1b5f41e3f3ef81ab532c0e5ab475bb9b6f097a +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_heads/type +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/282ad8cf3324b2679a7d460c0fc324adfa21dcfad2f197ac6991b98ec91f98495bb3ddb2cba36ce5dfa28a52063a373bb03f5d2e34f6e0c7b6b81b3046a4d7d0 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/891d7ed26f62b0f8757b081e9d76840636877f1613ee17b7695fe2ee8640258c56e01291934e3797728bc2300a1b5f41e3f3ef81ab532c0e5ab475bb9b6f097a +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/8926397375b8328137652c18cd4371808b214cb26864d77dd33c8eea895e10e62c297064c3d4c703d58ee11dee81bbf9851525e3a0c33151f54c164b8a4343b0 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/89d29d938e64b1295e138faedfa5df6f6729a67e5ba8e0c3fdd1c9266e0f59a4bc35b8a21e14225072317879af3323fa0457e01d9b08608770bc23957feec6c0 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/95fc2854c0fa2528b03e2bcabc7612f56f0bcb3d6f54a06293e21d1887885a449907b5b320a1a94bac712bf56fdad0a4184b17047c1fc179dfa83acab3f70d21 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/9a58ceae46de4649375b6b880b8500c85d34c8e9bc650dc4c993afb2fa8d45c4180331821c6226a0fb1475b04a0b9a849502647ef9c4dcac74769eb501c885fa +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/a19ae062208aa20b7310705af3d26ef53095a9dabfad080883cc7a32e98687063179db95cb2c71ef9064801c59fa46d261f172d83e83f96a39c274387b59dca4 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/d1169a8d10067493e42752c2a7615ff27f55bd90c38b91feef918958e29a2239ee289a0cde8385441d1f0fe9af1fb634fa6d56438b9f33ec382e81fa59d70b54 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/e171e5c6039c050c2368584a537d36df221b1f9f23d285c0399b95b14608d67006229823e6831bff7d8b0c2f9e86ebaec9c6811461119195f430ade055073fed +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/operations/ee118dd19aac4e1cb354f83a37dadca70bc5f086cc8d36cd0059b222bf8c7250824401ff681518d0120f8db1f96f0025c464dcfc3b1ee28777e8c76325760134 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/type +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/123b0e36150cf8e99d644d2dfd1a7b0c8d2f676a78248d6902516d9ae58903665c79ec3f5f6729b98a1237dcf2abc1d41e690ae0ad30888c84786bcc9de5e314 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/2ac0b7d8b1fdfac82b3ff3926e0018f72ef2b48f85b41f5fa541271370e1197d41e37c2c6d62af0c6974658c4a9e5e945b8efcbcc7748bdd99bd9483f7e13e22 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/67b8396b301935ff624ff98952c57d8ee021e7d885e1220053b993e7bc822a4cf061298e9643ded745c55f3ed8e923a6731524129993d2664f48b60660761145 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/9c6fca696f77383cc87d068fe3f5912466b157dccc6465973e653dd4d2c02e2eca9c0725c071857bf3f4f0e263259eafc18f1739615a501e672bb2afd415316b +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/cae2e3e5952cb5ba93f27e3898d90dac6c41fc9e20c66ef0791e71b91dc103d924996c921c88179705264a224fb5d2bb29091fc8f18f0ea7a088aaabb859ea2a +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/cd8efb6da14127c81c37b56ead18a39b30f2cd154891185a6e906efb491dbf63f290eed3c31d4725f490a93208ffbe5cdc031d5b6de38fcb77cbb11f0357118f +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/e434359d6306a4f6997733b9b5308299984f05219c92e1b2a31f1203126be0fada5fc09a2ba86c98d1318981cb53997c7f8674ef25da6ca7bf9fd849598cd355 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/ea75e7ccb42f52b013dc1b45bb4e6d692b37c5e38bd39356ba2806be83ca5ca03ce20481db2788428126f93663e6723f99f4d46c5c705f5b12b70e2127ab15ba +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/fa5dec7ee06fbc6cbb2798c8e98bab482a6750776de41406fb06893c83f71f5015ec7ee2873642714b7bbc1c496f880e3acf44ffdabf2f87a39e0fbd68a4cc46 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/op_store/views/ffde172c6285c71851b22780e34962d8f9234067af59ff2dc38b74e905dc540fe35b944e8c0b2d4230dfcf778424a335494cd0aeea1bb4be2a11c4b5428ad465 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/14e3f15273e204cadfe38dd2f38cebd1343a6bfbb91c6af0f5f9de6e9003d8ec8b0eb676975af9dca2d06ee5e6b3886c3c5d3755c6f149b6b09172cccc35adff +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/42e0f32dd10ba6ae9f2297ca8ad0bd16337f14545b29f956ce380a7ab92bab771cbc9e04755752a6fa13231286f724379d6662b0fb257ef2cc2c52fe680eb95d +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/466a441e56afdde383cef1d6127ca1d4c825157feb65a59f8f6ff5fa7a523bd683d0b7a6bb16c00afff53a890319a472d98da9af3dea5675168a4d424aa7af32 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/482ae5a29fbe856c7272f2071b8b0f0359ee2d89ff392b8a900643fbd0836eccd067b8bf41909e206c90d45d6e7d8b6686b93ecaee5fe1a9060d87b672101310 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/5403fa06049419ddcf620ce0dc20911583e1b1062b42630ee325aa5ac2f918dd266dfed93ebc808a2aecb37ac3a33e251fe1396fd24b8ed566bfbd61a81ff959 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/56119fa0480cb66159978b1a8c9b031f9e978b7a3172eb87407a701fea34fdd90db7771cd433a2cf7e8a84a7b49c924f973eccb0eb05685ec42f36f7ef61cc06 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/90b1f4de4ba65e0652f1de45e4c84b623f99bd9d9453667e19c7040857bd397e59e7a84406f2ab6204d25789d995c47c350d8abc47a4bbb102059f3111f20028 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/9215bd4ac28fdecba111c63bace46d0f1c253ad3af44e0e74bd43d30757bef2e655538c1172c8f25769bce0a3c669b713440773c1859f0a136d9ca42501f2470 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/a79320f784ef97b3d6297e55a48b17a517a38d95d5c61ba8d01c59d68dcd2ccf3a96479f4fc3c4cafdcd56dc7bd58b1cb987e079764c1646533ab32418900727 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/abe6b7a350e1604cb8f5a2cd10cef13a019bd797770e6dc37414d33d98dcf36d8ec80a2ae13bd7dd2d2076772c0ffadec0b53ba72f4669b461fff2da5d30f1ba +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/b7689d54193a3798edd58d758966ad65ad57297c5276eab3e4ef07380779363efe9e462a149f4d42f55bbe004eb5ba88bf35df4c78ac975275530382390159d6 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/e75f5f3431d172d7e9434dfaef2be50812105b3ead73eeb10345c9b6892e9cbb5ee0602ebb0ceaf5ab87d22f45930dc30d136d0aac77310fb0261b3857ffde9b +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/extra/heads/56119fa0480cb66159978b1a8c9b031f9e978b7a3172eb87407a701fea34fdd90db7771cd433a2cf7e8a84a7b49c924f973eccb0eb05685ec42f36f7ef61cc06 +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/git_target +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/store/type +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/submodule_store/type +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/repo/workspace_store/index +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/working_copy/checkout +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/working_copy/tree_state +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/.jj/working_copy/type +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/AGENTS.md +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/LICENSE +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/Makefile +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/docs/gen_assets.sh +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/docs/index.md +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/__init__.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/config.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/storage/__init__.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/storage/aws.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/storage/az.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/storage/base.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/storage/gcloud.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/storage/local.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/src/tab_cli/style.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/tests/__init__.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/tests/assets/test.csv +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/tests/conftest.py +0 -0
- {tab_cli-0.1.8 → tab_cli-0.2.0}/tests/test_stdin.py +0 -0
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
- 0.2.0:
|
|
2
|
+
- Added read-only SQLite/DuckDB input support via `{url}#{table_name}`, including remote SQLite/DuckDB files that are materialized locally before querying with Polars.
|
|
3
|
+
- Added `tab-cli[all]` to install all optional integrations.
|
|
4
|
+
- Renamed the `tab view` CLI flag from `--max-cell-len` to `--max-cell-length` to match the `max_cell_length` config key.
|
|
5
|
+
- Optimized cloud partition-glob expansion for fsspec-backed object stores so common patterns like `date=2026-01-*/*` avoid very slow `glob(...)` calls.
|
|
6
|
+
- 0.1.9:
|
|
7
|
+
- Fixed `tab view` to render cell contents verbatim instead of interpreting bracketed text like `[red]...[/red]` as Rich markup.
|
|
1
8
|
- 0.1.8:
|
|
2
9
|
- Improved `tab view` performance for partitioned directories by reading only as many early partitions as needed for an unfiltered preview.
|
|
3
10
|
- Added glob-pattern support for multi-file inputs such as `s3://.../date=*/*.parquet`.
|
|
@@ -5,7 +12,7 @@
|
|
|
5
12
|
- Fixed S3 Polars `storage_options` to avoid nested `client_kwargs` values that could break native reads.
|
|
6
13
|
- Added `default_num_view_rows` config so the default `tab view` preview size can be customized.
|
|
7
14
|
- Added `log_level` config so the CLI log level can default from `~/.config/tab/config.json` when `--log-level` is omitted.
|
|
8
|
-
- Added `max_cell_length` config so `tab view` can default to truncating long cell values without passing `--max-cell-
|
|
15
|
+
- Added `max_cell_length` config so `tab view` can default to truncating long cell values without passing `--max-cell-length` every time.
|
|
9
16
|
- Added `num_remote_workers` config to parallelize remote per-partition summary row counting.
|
|
10
17
|
- Validated config file value types instead of silently accepting invalid JSON types.
|
|
11
18
|
- Fixed the developer `Makefile` targets to point at `src/tab_cli`.
|
|
@@ -26,7 +33,7 @@
|
|
|
26
33
|
- Automatic PyArrow fallback for Parquet files that fail to read with Polars' native reader.
|
|
27
34
|
- 0.1.3:
|
|
28
35
|
- Separate `tab view` from `tab cat`: `tab view` does not convert formats, `tab cat` does.
|
|
29
|
-
- Added `--max-cell-
|
|
36
|
+
- Added `--max-cell-length` option to `tab view` to truncate long cell contents.
|
|
30
37
|
- 0.1.2:
|
|
31
38
|
- Bugfix on reading directories.
|
|
32
39
|
- 0.1.1:
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Notes On Object-Store Glob Performance In `fsspec`
|
|
2
|
+
|
|
3
|
+
This note is intended as background for a future upstream issue or PR against `fsspec` and/or object-store backends such as `s3fs`, `adlfs`, and `gcsfs`.
|
|
4
|
+
|
|
5
|
+
It reflects two things:
|
|
6
|
+
|
|
7
|
+
- current code inspection
|
|
8
|
+
- practical measurements against a real S3 dataset
|
|
9
|
+
|
|
10
|
+
## Motivation
|
|
11
|
+
|
|
12
|
+
We observed severe slowdown on this pattern:
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
s3://aws-public-blockchain/v1.0/btc/blocks/date=2026-01-*/*
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
This should match one month of partition directories, where each partition contains a single Parquet file.
|
|
19
|
+
|
|
20
|
+
In practice, raw cloud globbing remained unacceptably slow, while a manual segmented expansion strategy completed in a few seconds.
|
|
21
|
+
|
|
22
|
+
## Important Clarification
|
|
23
|
+
|
|
24
|
+
An earlier simplified characterization of cloud globbing as just:
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
find(root) + regex filter
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
is too coarse for modern async/cloud implementations.
|
|
31
|
+
|
|
32
|
+
Current cloud backends may already do some server-side pruning by passing a fixed prefix down into backend-specific listing logic.
|
|
33
|
+
|
|
34
|
+
However, that optimization is still not sufficient for common partition-style patterns like:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
.../date=2026-01-*/*
|
|
38
|
+
.../year=2026/month=01/day=*/*
|
|
39
|
+
.../chain=btc/date=*/part-*.parquet
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The practical performance problem still exists.
|
|
43
|
+
|
|
44
|
+
## What Object Stores Actually Provide
|
|
45
|
+
|
|
46
|
+
Object stores like S3, GCS, and Azure Blob do not provide a true server-side glob primitive.
|
|
47
|
+
|
|
48
|
+
They typically provide:
|
|
49
|
+
|
|
50
|
+
- list by prefix
|
|
51
|
+
- get object metadata
|
|
52
|
+
- fetch object
|
|
53
|
+
|
|
54
|
+
So wildcard matching is always a derived client-side operation.
|
|
55
|
+
|
|
56
|
+
The main optimization opportunity is therefore not "make glob server-side", but rather:
|
|
57
|
+
|
|
58
|
+
- minimize how much gets listed
|
|
59
|
+
- keep listing aligned with prefix-oriented object-store APIs
|
|
60
|
+
|
|
61
|
+
## What We Observed In Practice
|
|
62
|
+
|
|
63
|
+
Using the public S3 dataset above:
|
|
64
|
+
|
|
65
|
+
- backend authentication was not the bottleneck
|
|
66
|
+
- listing the parent `blocks/` prefix was reasonable
|
|
67
|
+
- per-file metadata lookup for the final 31 files was negligible
|
|
68
|
+
- raw glob expansion was the expensive step
|
|
69
|
+
|
|
70
|
+
Measured behavior:
|
|
71
|
+
|
|
72
|
+
- `ls blocks/`: about 1.0 to 1.2 seconds
|
|
73
|
+
- filter matching `date=2026-01-*` partition directories locally: negligible
|
|
74
|
+
- `ls` the 31 matched directories: about 2.4 seconds
|
|
75
|
+
- total manual segmented expansion: about 3.6 seconds
|
|
76
|
+
- raw `s3fs.glob(...)`: still too slow to finish within 120 seconds in our testing
|
|
77
|
+
- raw async `_glob(...)`: also too slow to be useful for this pattern
|
|
78
|
+
|
|
79
|
+
So even if current cloud paths already do some fixed-prefix pruning, the remaining strategy is still too expensive for this type of layout.
|
|
80
|
+
|
|
81
|
+
## Why Partition Patterns Are Special
|
|
82
|
+
|
|
83
|
+
These layouts are common in data lakes:
|
|
84
|
+
|
|
85
|
+
- many sibling partition directories
|
|
86
|
+
- each segment encodes a structured partition key
|
|
87
|
+
- only one or two path levels after the wildcard segment
|
|
88
|
+
|
|
89
|
+
For this case, the optimal traversal is not a generic recursive discovery step.
|
|
90
|
+
|
|
91
|
+
The optimal traversal is:
|
|
92
|
+
|
|
93
|
+
1. list the fixed parent prefix
|
|
94
|
+
2. match only the next path segment against the wildcard pattern
|
|
95
|
+
3. recurse only into matched children
|
|
96
|
+
4. continue one segment at a time
|
|
97
|
+
|
|
98
|
+
That is a much closer match to object-store capabilities.
|
|
99
|
+
|
|
100
|
+
## Current State By Backend
|
|
101
|
+
|
|
102
|
+
### `s3fs`
|
|
103
|
+
|
|
104
|
+
`s3fs` has custom async `_find()` behavior and can use prefix-aware listing to narrow traversal.
|
|
105
|
+
|
|
106
|
+
This is better than the most naive possible implementation.
|
|
107
|
+
|
|
108
|
+
However, for the tested partition glob, it was still too slow in practice.
|
|
109
|
+
|
|
110
|
+
The missing piece is full segmented traversal by path component, not just fixed-prefix narrowing.
|
|
111
|
+
|
|
112
|
+
### `gcsfs`
|
|
113
|
+
|
|
114
|
+
`gcsfs` also has backend-specific listing behavior and can push fixed-prefix narrowing into object listing.
|
|
115
|
+
|
|
116
|
+
That improves things compared with a totally naive subtree walk.
|
|
117
|
+
|
|
118
|
+
But it still does not amount to path-segment-aware traversal.
|
|
119
|
+
|
|
120
|
+
### `adlfs`
|
|
121
|
+
|
|
122
|
+
`adlfs` similarly narrows object listing by fixed prefix.
|
|
123
|
+
|
|
124
|
+
Again, this is helpful, but still not the same as matching segment-by-segment and descending only through matched directories.
|
|
125
|
+
|
|
126
|
+
## Remaining Gap
|
|
127
|
+
|
|
128
|
+
The important gap is:
|
|
129
|
+
|
|
130
|
+
- current pruning is mostly based on the fixed prefix before wildcarding
|
|
131
|
+
- partition-style globs often still need a better strategy after that point
|
|
132
|
+
|
|
133
|
+
In other words, "prefix pruning exists" does not mean "glob is now efficient enough".
|
|
134
|
+
|
|
135
|
+
For the tested workload, it was not.
|
|
136
|
+
|
|
137
|
+
## Candidate Optimization
|
|
138
|
+
|
|
139
|
+
For object-store-style backends, use segmented traversal when the pattern is compatible.
|
|
140
|
+
|
|
141
|
+
### Proposed Strategy
|
|
142
|
+
|
|
143
|
+
1. Split the path into segments.
|
|
144
|
+
2. Keep the longest fixed prefix before the first wildcard segment.
|
|
145
|
+
3. List that prefix one level at a time using delimiter-based listing semantics.
|
|
146
|
+
4. Apply wildcard matching only to the current segment name.
|
|
147
|
+
5. Recurse only into matched directory segments.
|
|
148
|
+
6. Fall back to the current generic strategy for complex patterns.
|
|
149
|
+
|
|
150
|
+
### Good Candidates For Segmented Traversal
|
|
151
|
+
|
|
152
|
+
- `*`
|
|
153
|
+
- `?`
|
|
154
|
+
- character classes like `[abc]` or `[0-9]`
|
|
155
|
+
- partition-style patterns with a fixed bucket and a fixed leading prefix
|
|
156
|
+
|
|
157
|
+
### Fallback Cases
|
|
158
|
+
|
|
159
|
+
- `**`
|
|
160
|
+
- brace expansion if supported externally
|
|
161
|
+
- bucket-level wildcarding
|
|
162
|
+
- backend-specific edge cases that do not map cleanly to hierarchical traversal
|
|
163
|
+
|
|
164
|
+
## Why This Still Seems Worthwhile
|
|
165
|
+
|
|
166
|
+
Even if some newer implementations already do partial pruning:
|
|
167
|
+
|
|
168
|
+
- the observed wall-clock behavior is still poor
|
|
169
|
+
- the remaining inefficiency appears algorithmic
|
|
170
|
+
- the manual segmented approach performed much better on the motivating example
|
|
171
|
+
|
|
172
|
+
So there is still a strong case for improving glob expansion for object-store partition patterns.
|
|
173
|
+
|
|
174
|
+
## Where This Could Live
|
|
175
|
+
|
|
176
|
+
Two plausible options:
|
|
177
|
+
|
|
178
|
+
### Option 1: `fsspec` Core
|
|
179
|
+
|
|
180
|
+
Improve generic glob traversal in `fsspec` when the filesystem exposes object-store-style hierarchical listing semantics.
|
|
181
|
+
|
|
182
|
+
Pros:
|
|
183
|
+
|
|
184
|
+
- shared behavior across backends
|
|
185
|
+
- one place to reason about segmented traversal
|
|
186
|
+
|
|
187
|
+
Cons:
|
|
188
|
+
|
|
189
|
+
- may be too specialized for a generic base implementation
|
|
190
|
+
- care is needed not to regress non-object-store filesystems
|
|
191
|
+
|
|
192
|
+
### Option 2: Backend Overrides
|
|
193
|
+
|
|
194
|
+
Implement optimized segmented glob traversal directly in:
|
|
195
|
+
|
|
196
|
+
- `s3fs`
|
|
197
|
+
- `gcsfs`
|
|
198
|
+
- `adlfs`
|
|
199
|
+
|
|
200
|
+
Pros:
|
|
201
|
+
|
|
202
|
+
- easier to exploit backend-specific listing semantics
|
|
203
|
+
- simpler to tune for object stores
|
|
204
|
+
|
|
205
|
+
Cons:
|
|
206
|
+
|
|
207
|
+
- duplicated logic
|
|
208
|
+
- less consistency across backends
|
|
209
|
+
|
|
210
|
+
## Recommended Framing For An Upstream Discussion
|
|
211
|
+
|
|
212
|
+
Suggested framing:
|
|
213
|
+
|
|
214
|
+
- object stores do not provide server-side glob
|
|
215
|
+
- fixed-prefix pruning already exists in some newer cloud backends
|
|
216
|
+
- but partition-style patterns are still too slow in practice
|
|
217
|
+
- segmented traversal by path component would better match object-store APIs
|
|
218
|
+
- common data-lake glob patterns would benefit significantly
|
|
219
|
+
|
|
220
|
+
## Minimal Repro Pattern
|
|
221
|
+
|
|
222
|
+
```text
|
|
223
|
+
s3://aws-public-blockchain/v1.0/btc/blocks/date=2026-01-*/*
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Equivalent layouts are common across S3, GCS, and Azure.
|
tab_cli-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tab-cli
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: A CLI tool for tabular data
|
|
5
|
+
Author-email: Tongfei Chen <tongfei@pm.me>
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Requires-Dist: blobfile>=3.0
|
|
9
|
+
Requires-Dist: fsspec>=2026.1.0
|
|
10
|
+
Requires-Dist: jmespath>=1.0
|
|
11
|
+
Requires-Dist: loguru>=0.7.3
|
|
12
|
+
Requires-Dist: polars-fastavro>=0.5.1
|
|
13
|
+
Requires-Dist: polars>=1.0
|
|
14
|
+
Requires-Dist: pyarrow>=20.0
|
|
15
|
+
Requires-Dist: rich>=14.0
|
|
16
|
+
Requires-Dist: typer>=0.21
|
|
17
|
+
Provides-Extra: all
|
|
18
|
+
Requires-Dist: adbc-driver-sqlite>=1.0.0; extra == 'all'
|
|
19
|
+
Requires-Dist: adlfs>=2025.1.0; extra == 'all'
|
|
20
|
+
Requires-Dist: azure-identity>=1.10.0; extra == 'all'
|
|
21
|
+
Requires-Dist: boto3>=1.28.0; extra == 'all'
|
|
22
|
+
Requires-Dist: duckdb>=1.0.0; extra == 'all'
|
|
23
|
+
Requires-Dist: gcsfs>=2025.1.0; extra == 'all'
|
|
24
|
+
Requires-Dist: google-auth>=2.27.0; extra == 'all'
|
|
25
|
+
Requires-Dist: s3fs>=2025.1.0; extra == 'all'
|
|
26
|
+
Provides-Extra: az
|
|
27
|
+
Requires-Dist: adlfs>=2026.1.0; extra == 'az'
|
|
28
|
+
Requires-Dist: azure-identity>=1.10.0; extra == 'az'
|
|
29
|
+
Provides-Extra: duckdb
|
|
30
|
+
Requires-Dist: duckdb>=1.0.0; extra == 'duckdb'
|
|
31
|
+
Provides-Extra: gs
|
|
32
|
+
Requires-Dist: gcsfs>=2026.1.0; extra == 'gs'
|
|
33
|
+
Requires-Dist: google-auth>=2.27.0; extra == 'gs'
|
|
34
|
+
Provides-Extra: s3
|
|
35
|
+
Requires-Dist: boto3>=1.28.0; extra == 's3'
|
|
36
|
+
Requires-Dist: s3fs>=2026.1.0; extra == 's3'
|
|
37
|
+
Provides-Extra: sqlite
|
|
38
|
+
Requires-Dist: adbc-driver-sqlite>=1.0.0; extra == 'sqlite'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
# tab
|
|
42
|
+
|
|
43
|
+
[](https://pypi.org/project/tab-cli/)
|
|
44
|
+
|
|
45
|
+
A CLI tool for viewing, querying, and converting tabular data files.
|
|
46
|
+
Reads CSV, TSV, JSON Lines, Parquet, Avro, SQLite tables, and DuckDB tables -- locally or from S3, GCS, and Azure Blob Storage.
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
pip install tab-cli
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Documentation**: [tongfei.me/tab](https://tongfei.me/tab)
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Quick look
|
|
57
|
+
|
|
58
|
+
### View any tabular file
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
tab view data.csv
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
<p align="center">
|
|
65
|
+
<img src="https://raw.githubusercontent.com/ctongfei/tab/refs/heads/gh-pages/assets/test.svg" alt="tab view" width="680">
|
|
66
|
+
</p>
|
|
67
|
+
|
|
68
|
+
### Can be remote, with many partitions that is globbed together:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
tab view 's3://aws-public-blockchain/v1.0/btc/blocks/date=2026-01-*/*'
|
|
72
|
+
````
|
|
73
|
+
### Query with SQL
|
|
74
|
+
|
|
75
|
+
The table is always available as `t`:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
tab view --sql 'SELECT * FROM t WHERE Metric_A_Value > 80' data.csv
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
<p align="center">
|
|
82
|
+
<img src="https://raw.githubusercontent.com/ctongfei/tab/refs/heads/gh-pages/assets/test-where.svg" alt="tab view --sql" width="680">
|
|
83
|
+
</p>
|
|
84
|
+
|
|
85
|
+
### Reshape rows with JMESPath
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
tab view --jp '{id: participant.id, city: profile.address.city}' data.parquet
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Convert between formats
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
tab convert data.csv data.parquet
|
|
95
|
+
tab convert data.parquet data.jsonl -o jsonl
|
|
96
|
+
tab convert data.csv output_dir/ -o parquet -n 4 # partitioned
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Concatenate files
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
tab cat part1.csv part2.csv part3.csv -o jsonl > combined.jsonl
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Inspect schema and summary
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
tab schema data.parquet
|
|
109
|
+
tab summary data.parquet
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Read from stdin
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
curl -s https://example.com/data.csv | tab view -i csv -
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Read from cloud storage
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
tab view s3://bucket/path/data.parquet
|
|
122
|
+
tab view gs://bucket/path/data.csv
|
|
123
|
+
tab view az://container/path/data.jsonl
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Globbing is supported for local and cloud paths:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
tab view 'data/date=*/*.parquet'
|
|
130
|
+
tab view 's3://bucket/path/date=2026-01-*/*'
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Read a SQLite table
|
|
134
|
+
|
|
135
|
+
Use `{url}#{table_name}` for SQLite inputs:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
tab view data.db#users
|
|
139
|
+
tab view s3://bucket/path/data.db#users
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Read a DuckDB table
|
|
143
|
+
|
|
144
|
+
Use `{url}#{table_name}` for DuckDB inputs:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
tab view data.duckdb#users
|
|
148
|
+
tab view s3://bucket/path/data.duckdb#users
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Install cloud extras as needed:
|
|
152
|
+
|
|
153
|
+
```sh
|
|
154
|
+
pip install 'tab-cli[s3]' # AWS S3
|
|
155
|
+
pip install 'tab-cli[gs]' # Google Cloud Storage
|
|
156
|
+
pip install 'tab-cli[az]' # Azure Blob Storage
|
|
157
|
+
pip install 'tab-cli[duckdb]' # DuckDB input support
|
|
158
|
+
pip install 'tab-cli[sqlite]' # SQLite via Polars ADBC
|
|
159
|
+
pip install 'tab-cli[all]' # Install all optional integrations
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Supported formats
|
|
163
|
+
- csv
|
|
164
|
+
- tsv
|
|
165
|
+
- jsonl
|
|
166
|
+
- parquet
|
|
167
|
+
- avro
|
|
168
|
+
- duckdb (input only; use `{url}#{table_name}`)
|
|
169
|
+
- sqlite (input only; use `{url}#{table_name}`)
|
|
@@ -1,36 +1,9 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: tab-cli
|
|
3
|
-
Version: 0.1.8
|
|
4
|
-
Summary: A CLI tool for tabular data
|
|
5
|
-
Author-email: Tongfei Chen <tongfei@pm.me>
|
|
6
|
-
License-File: LICENSE
|
|
7
|
-
Requires-Python: >=3.10
|
|
8
|
-
Requires-Dist: blobfile>=3.0
|
|
9
|
-
Requires-Dist: fsspec>=2025.1.0
|
|
10
|
-
Requires-Dist: jmespath>=1.0
|
|
11
|
-
Requires-Dist: loguru>=0.7.3
|
|
12
|
-
Requires-Dist: polars-fastavro>=0.5.1
|
|
13
|
-
Requires-Dist: polars>=1.0
|
|
14
|
-
Requires-Dist: pyarrow>=15.0
|
|
15
|
-
Requires-Dist: rich>=13.0
|
|
16
|
-
Requires-Dist: typer>=0.21.1
|
|
17
|
-
Provides-Extra: az
|
|
18
|
-
Requires-Dist: adlfs>=2025.1.0; extra == 'az'
|
|
19
|
-
Requires-Dist: azure-identity>=1.10.0; extra == 'az'
|
|
20
|
-
Provides-Extra: gs
|
|
21
|
-
Requires-Dist: gcsfs>=2025.1.0; extra == 'gs'
|
|
22
|
-
Requires-Dist: google-auth>=2.27.0; extra == 'gs'
|
|
23
|
-
Provides-Extra: s3
|
|
24
|
-
Requires-Dist: boto3>=1.28.0; extra == 's3'
|
|
25
|
-
Requires-Dist: s3fs>=2025.1.0; extra == 's3'
|
|
26
|
-
Description-Content-Type: text/markdown
|
|
27
|
-
|
|
28
1
|
# tab
|
|
29
2
|
|
|
30
3
|
[](https://pypi.org/project/tab-cli/)
|
|
31
4
|
|
|
32
5
|
A CLI tool for viewing, querying, and converting tabular data files.
|
|
33
|
-
Reads CSV, TSV, JSON Lines, Parquet, and
|
|
6
|
+
Reads CSV, TSV, JSON Lines, Parquet, Avro, SQLite tables, and DuckDB tables -- locally or from S3, GCS, and Azure Blob Storage.
|
|
34
7
|
|
|
35
8
|
```sh
|
|
36
9
|
pip install tab-cli
|
|
@@ -52,6 +25,11 @@ tab view data.csv
|
|
|
52
25
|
<img src="https://raw.githubusercontent.com/ctongfei/tab/refs/heads/gh-pages/assets/test.svg" alt="tab view" width="680">
|
|
53
26
|
</p>
|
|
54
27
|
|
|
28
|
+
### Can be remote, with many partitions that is globbed together:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
tab view 's3://aws-public-blockchain/v1.0/btc/blocks/date=2026-01-*/*'
|
|
32
|
+
````
|
|
55
33
|
### Query with SQL
|
|
56
34
|
|
|
57
35
|
The table is always available as `t`:
|
|
@@ -105,12 +83,40 @@ tab view gs://bucket/path/data.csv
|
|
|
105
83
|
tab view az://container/path/data.jsonl
|
|
106
84
|
```
|
|
107
85
|
|
|
86
|
+
Globbing is supported for local and cloud paths:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
tab view 'data/date=*/*.parquet'
|
|
90
|
+
tab view 's3://bucket/path/date=2026-01-*/*'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Read a SQLite table
|
|
94
|
+
|
|
95
|
+
Use `{url}#{table_name}` for SQLite inputs:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
tab view data.db#users
|
|
99
|
+
tab view s3://bucket/path/data.db#users
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Read a DuckDB table
|
|
103
|
+
|
|
104
|
+
Use `{url}#{table_name}` for DuckDB inputs:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
tab view data.duckdb#users
|
|
108
|
+
tab view s3://bucket/path/data.duckdb#users
|
|
109
|
+
```
|
|
110
|
+
|
|
108
111
|
Install cloud extras as needed:
|
|
109
112
|
|
|
110
113
|
```sh
|
|
111
114
|
pip install 'tab-cli[s3]' # AWS S3
|
|
112
115
|
pip install 'tab-cli[gs]' # Google Cloud Storage
|
|
113
116
|
pip install 'tab-cli[az]' # Azure Blob Storage
|
|
117
|
+
pip install 'tab-cli[duckdb]' # DuckDB input support
|
|
118
|
+
pip install 'tab-cli[sqlite]' # SQLite via Polars ADBC
|
|
119
|
+
pip install 'tab-cli[all]' # Install all optional integrations
|
|
114
120
|
```
|
|
115
121
|
|
|
116
122
|
## Supported formats
|
|
@@ -119,3 +125,5 @@ pip install 'tab-cli[az]' # Azure Blob Storage
|
|
|
119
125
|
- jsonl
|
|
120
126
|
- parquet
|
|
121
127
|
- avro
|
|
128
|
+
- duckdb (input only; use `{url}#{table_name}`)
|
|
129
|
+
- sqlite (input only; use `{url}#{table_name}`)
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
View tabular data from a data file in a rich CLI format, or a directory of partitions of data files.
|
|
6
6
|
|
|
7
|
+
Paths may also use glob patterns such as `data/date=*/*.parquet` or `s3://bucket/path/date=2026-01-*/*`.
|
|
8
|
+
|
|
7
9
|
```bash
|
|
8
10
|
tab view $path [OPTIONS]
|
|
9
11
|
```
|
|
@@ -12,17 +14,19 @@ Options:
|
|
|
12
14
|
|
|
13
15
|
| Option | Description |
|
|
14
16
|
|-------------------------|-----------------------------------------------------------------------------------------------------------|
|
|
15
|
-
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`). Auto-detected from extension if omitted.
|
|
17
|
+
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`, `sqlite`, `duckdb`). Auto-detected from extension if omitted. SQLite and DuckDB input use `{url}#{table_name}`. |
|
|
16
18
|
| `--sql` | SQL query to apply before displaying. The table is available as `t`. Mutually exclusive with `--jmespath`. |
|
|
17
19
|
| `--jmespath` / `--jp` | JMESPath expression to apply to each row as JSON. Object outputs become columns; non-object outputs go to a `value` column. The result shape must stay consistent across rows. |
|
|
18
20
|
| `--limit` | Maximum number of rows to display. |
|
|
19
21
|
| `--skip` | Number of rows to skip from the beginning. |
|
|
20
|
-
| `--max-cell-
|
|
22
|
+
| `--max-cell-length` | Truncate cell contents longer than this. If omitted, `max_cell_length` from config is used when set. |
|
|
21
23
|
|
|
22
24
|
## `tab schema`
|
|
23
25
|
|
|
24
26
|
Display the schema of a tabular data file.
|
|
25
27
|
|
|
28
|
+
Paths may also use glob patterns.
|
|
29
|
+
|
|
26
30
|
```bash
|
|
27
31
|
tab schema $path [OPTIONS]
|
|
28
32
|
```
|
|
@@ -31,13 +35,15 @@ Options:
|
|
|
31
35
|
|
|
32
36
|
| Option | Description |
|
|
33
37
|
|-------------------------|-----------------------------------------------------------------------------------------------------------|
|
|
34
|
-
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`). Auto-detected from extension if omitted.
|
|
38
|
+
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`, `sqlite`, `duckdb`). Auto-detected from extension if omitted. SQLite and DuckDB input use `{url}#{table_name}`. |
|
|
35
39
|
|
|
36
40
|
|
|
37
41
|
## `tab summary`
|
|
38
42
|
|
|
39
43
|
Display summary information about a tabular data file.
|
|
40
44
|
|
|
45
|
+
Paths may also use glob patterns.
|
|
46
|
+
|
|
41
47
|
```bash
|
|
42
48
|
tab summary $path [OPTIONS]
|
|
43
49
|
```
|
|
@@ -46,13 +52,15 @@ Options:
|
|
|
46
52
|
|
|
47
53
|
| Option | Description |
|
|
48
54
|
|-------------------------|-----------------------------------------------------------------------------------------------------------|
|
|
49
|
-
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`). Auto-detected from extension if omitted.
|
|
55
|
+
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`, `sqlite`, `duckdb`). Auto-detected from extension if omitted. SQLite and DuckDB input use `{url}#{table_name}`. |
|
|
50
56
|
|
|
51
57
|
|
|
52
58
|
## `tab convert`
|
|
53
59
|
|
|
54
60
|
Convert tabular data from one format to another.
|
|
55
61
|
|
|
62
|
+
Input paths may also use glob patterns when the input format supports multi-file reads.
|
|
63
|
+
|
|
56
64
|
```bash
|
|
57
65
|
tab convert $src $dst [OPTIONS]
|
|
58
66
|
```
|
|
@@ -61,7 +69,7 @@ Options:
|
|
|
61
69
|
|
|
62
70
|
| Option | Description |
|
|
63
71
|
|-------------------------|---------------------------------------------------------------------------------------------------------|
|
|
64
|
-
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`). Auto-detected from extension if omitted.
|
|
72
|
+
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`, `sqlite`, `duckdb`). Auto-detected from extension if omitted. SQLite and DuckDB input use `{url}#{table_name}`. |
|
|
65
73
|
| `-o` / `--output-format` | Output format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`). If not specified, inherits from input format. |
|
|
66
74
|
| `--sql` | SQL query to apply before writing. The table is available as `t`. Mutually exclusive with `--jmespath`. |
|
|
67
75
|
| `--jmespath` / `--jp` | JMESPath expression to apply to each row as JSON. Object outputs become columns; non-object outputs go to a `value` column. The result shape must stay consistent across rows. |
|
|
@@ -72,6 +80,8 @@ Options:
|
|
|
72
80
|
|
|
73
81
|
Concatenate tabular data from multiple files.
|
|
74
82
|
|
|
83
|
+
Input paths may also use glob patterns.
|
|
84
|
+
|
|
75
85
|
```bash
|
|
76
86
|
tab cat $paths [OPTIONS]
|
|
77
87
|
```
|
|
@@ -80,7 +90,7 @@ Options:
|
|
|
80
90
|
|
|
81
91
|
| Option | Description |
|
|
82
92
|
|-------------------------|-----------------------------------------------------------------------------------------------------------|
|
|
83
|
-
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`). Auto-detected from extension if omitted.
|
|
93
|
+
| `-i` / `--input-format` | Input format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`, `sqlite`, `duckdb`). Auto-detected from extension if omitted. SQLite and DuckDB input use `{url}#{table_name}`. |
|
|
84
94
|
| `-o` / `--output-format` | Output format (`parquet`, `csv`, `tsv`, `jsonl`, `avro`). If not specified, print Rich table in terminal. |
|
|
85
95
|
| `--sql` | SQL query to apply after concatenation. The table is available as `t`. Mutually exclusive with `--jmespath`. |
|
|
86
96
|
| `--jmespath` / `--jp` | JMESPath expression to apply to each row as JSON. Object outputs become columns; non-object outputs go to a `value` column. The result shape must stay consistent across rows. |
|
|
@@ -9,6 +9,20 @@ tab view az://$container/$path
|
|
|
9
9
|
tab view abfss://$container@$account.dfs.core.windows.net/$path
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
+
Cloud paths may also use glob patterns:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
tab view 's3://$bucket/path/date=*/*.parquet'
|
|
16
|
+
tab view 'gs://$bucket/path/date=2026-01-*/*'
|
|
17
|
+
tab summary 'az://$container/path/date=*/*.jsonl'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Install all optional integrations with:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
pip install 'tab-cli[all]'
|
|
24
|
+
```
|
|
25
|
+
|
|
12
26
|
|
|
13
27
|
## AWS S3
|
|
14
28
|
|
|
@@ -27,7 +27,7 @@ EOF
|
|
|
27
27
|
| `az_url_authority_is_account` | `bool` | `false` | Interpret `az://` URL authority as storage account name instead of container name. |
|
|
28
28
|
| `default_num_view_rows` | `int` | `20` | Default number of rows shown by `tab view` when `--limit` is omitted. |
|
|
29
29
|
| `log_level` | `str` | `"INFO"` | Default CLI log level when `--log-level` is omitted. |
|
|
30
|
-
| `max_cell_length` | `int \| null` | `null` | Default maximum cell length for `tab view`. The CLI `--max-cell-
|
|
30
|
+
| `max_cell_length` | `int \| null` | `null` | Default maximum cell length for `tab view`. The CLI `--max-cell-length` flag overrides it. |
|
|
31
31
|
| `num_remote_workers` | `int` | `8` | Maximum worker threads for remote per-partition summary work such as Parquet row counts. |
|
|
32
32
|
| `sampling_size_for_schema_inference` | `int` | `32` | Number of rows sampled for schema inference (e.g. when using `--jp`). |
|
|
33
33
|
|