tab-cli 0.1.9__tar.gz → 0.2.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.
Files changed (129) hide show
  1. {tab_cli-0.1.9 → tab_cli-0.2.1}/CHANGELOG.md +7 -2
  2. tab_cli-0.2.1/FSSPEC_GLOB_NOTES.md +226 -0
  3. tab_cli-0.2.1/PKG-INFO +169 -0
  4. tab_cli-0.1.9/PKG-INFO → tab_cli-0.2.1/README.md +36 -28
  5. {tab_cli-0.1.9 → tab_cli-0.2.1}/docs/cli-ref.md +18 -8
  6. {tab_cli-0.1.9 → tab_cli-0.2.1}/docs/cloud.md +14 -0
  7. {tab_cli-0.1.9 → tab_cli-0.2.1}/docs/configuration.md +1 -1
  8. tab_cli-0.2.1/docs/databases.md +117 -0
  9. tab_cli-0.2.1/docs/gen_assets.sh +3 -0
  10. {tab_cli-0.1.9 → tab_cli-0.2.1}/mkdocs.yml +1 -0
  11. {tab_cli-0.1.9 → tab_cli-0.2.1}/pyproject.toml +21 -9
  12. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/cli.py +66 -19
  13. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/config.py +7 -5
  14. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/formats/__init__.py +4 -0
  15. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/formats/avro.py +12 -2
  16. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/formats/base.py +28 -2
  17. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/formats/csv.py +12 -2
  18. tab_cli-0.2.1/src/tab_cli/formats/duckdb.py +128 -0
  19. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/formats/jsonl.py +12 -2
  20. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/formats/parquet.py +12 -2
  21. tab_cli-0.2.1/src/tab_cli/formats/sqlite.py +131 -0
  22. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/handlers/__init__.py +24 -2
  23. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/handlers/base.py +98 -26
  24. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/storage/fsspec.py +66 -0
  25. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/url_parser.py +1 -1
  26. {tab_cli-0.1.9 → tab_cli-0.2.1}/tests/test_cat.py +72 -0
  27. {tab_cli-0.1.9 → tab_cli-0.2.1}/tests/test_config.py +62 -28
  28. tab_cli-0.2.1/tests/test_storage.py +214 -0
  29. {tab_cli-0.1.9 → tab_cli-0.2.1}/tests/test_summary.py +52 -0
  30. {tab_cli-0.1.9 → tab_cli-0.2.1}/tests/test_view.py +47 -2
  31. {tab_cli-0.1.9 → tab_cli-0.2.1}/uv.lock +161 -13
  32. tab_cli-0.1.9/README.md +0 -94
  33. tab_cli-0.1.9/docs/gen_assets.sh +0 -3
  34. tab_cli-0.1.9/tests/test_storage.py +0 -83
  35. {tab_cli-0.1.9 → tab_cli-0.2.1}/.gitignore +0 -0
  36. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/.gitignore +0 -0
  37. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0 -0
  38. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/282ad8cf3324b2679a7d460c0fc324adfa21dcfad2f197ac6991b98ec91f98495bb3ddb2cba36ce5dfa28a52063a373bb03f5d2e34f6e0c7b6b81b3046a4d7d0 +0 -0
  39. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/891d7ed26f62b0f8757b081e9d76840636877f1613ee17b7695fe2ee8640258c56e01291934e3797728bc2300a1b5f41e3f3ef81ab532c0e5ab475bb9b6f097a +0 -0
  40. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/8926397375b8328137652c18cd4371808b214cb26864d77dd33c8eea895e10e62c297064c3d4c703d58ee11dee81bbf9851525e3a0c33151f54c164b8a4343b0 +0 -0
  41. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/89d29d938e64b1295e138faedfa5df6f6729a67e5ba8e0c3fdd1c9266e0f59a4bc35b8a21e14225072317879af3323fa0457e01d9b08608770bc23957feec6c0 +0 -0
  42. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/95fc2854c0fa2528b03e2bcabc7612f56f0bcb3d6f54a06293e21d1887885a449907b5b320a1a94bac712bf56fdad0a4184b17047c1fc179dfa83acab3f70d21 +0 -0
  43. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/9a58ceae46de4649375b6b880b8500c85d34c8e9bc650dc4c993afb2fa8d45c4180331821c6226a0fb1475b04a0b9a849502647ef9c4dcac74769eb501c885fa +0 -0
  44. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/a19ae062208aa20b7310705af3d26ef53095a9dabfad080883cc7a32e98687063179db95cb2c71ef9064801c59fa46d261f172d83e83f96a39c274387b59dca4 +0 -0
  45. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/d1169a8d10067493e42752c2a7615ff27f55bd90c38b91feef918958e29a2239ee289a0cde8385441d1f0fe9af1fb634fa6d56438b9f33ec382e81fa59d70b54 +0 -0
  46. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/e171e5c6039c050c2368584a537d36df221b1f9f23d285c0399b95b14608d67006229823e6831bff7d8b0c2f9e86ebaec9c6811461119195f430ade055073fed +0 -0
  47. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/op_links/ee118dd19aac4e1cb354f83a37dadca70bc5f086cc8d36cd0059b222bf8c7250824401ff681518d0120f8db1f96f0025c464dcfc3b1ee28777e8c76325760134 +0 -0
  48. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0 -0
  49. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/282ad8cf3324b2679a7d460c0fc324adfa21dcfad2f197ac6991b98ec91f98495bb3ddb2cba36ce5dfa28a52063a373bb03f5d2e34f6e0c7b6b81b3046a4d7d0 +0 -0
  50. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/891d7ed26f62b0f8757b081e9d76840636877f1613ee17b7695fe2ee8640258c56e01291934e3797728bc2300a1b5f41e3f3ef81ab532c0e5ab475bb9b6f097a +0 -0
  51. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/8926397375b8328137652c18cd4371808b214cb26864d77dd33c8eea895e10e62c297064c3d4c703d58ee11dee81bbf9851525e3a0c33151f54c164b8a4343b0 +0 -0
  52. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/89d29d938e64b1295e138faedfa5df6f6729a67e5ba8e0c3fdd1c9266e0f59a4bc35b8a21e14225072317879af3323fa0457e01d9b08608770bc23957feec6c0 +0 -0
  53. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/95fc2854c0fa2528b03e2bcabc7612f56f0bcb3d6f54a06293e21d1887885a449907b5b320a1a94bac712bf56fdad0a4184b17047c1fc179dfa83acab3f70d21 +0 -0
  54. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/9a58ceae46de4649375b6b880b8500c85d34c8e9bc650dc4c993afb2fa8d45c4180331821c6226a0fb1475b04a0b9a849502647ef9c4dcac74769eb501c885fa +0 -0
  55. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/a19ae062208aa20b7310705af3d26ef53095a9dabfad080883cc7a32e98687063179db95cb2c71ef9064801c59fa46d261f172d83e83f96a39c274387b59dca4 +0 -0
  56. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/d1169a8d10067493e42752c2a7615ff27f55bd90c38b91feef918958e29a2239ee289a0cde8385441d1f0fe9af1fb634fa6d56438b9f33ec382e81fa59d70b54 +0 -0
  57. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/e171e5c6039c050c2368584a537d36df221b1f9f23d285c0399b95b14608d67006229823e6831bff7d8b0c2f9e86ebaec9c6811461119195f430ade055073fed +0 -0
  58. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/operations/ee118dd19aac4e1cb354f83a37dadca70bc5f086cc8d36cd0059b222bf8c7250824401ff681518d0120f8db1f96f0025c464dcfc3b1ee28777e8c76325760134 +0 -0
  59. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/1029dd1c1f4430d8a667a0e48d0b817652c7ddca6f5ff56cac1755e5bb0c1cb7586935941c9b36f26cab05c0effe6154d073bd1dffbe37f22fed0a6e7d79201f +0 -0
  60. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/3228b9bef9d8374b5532b40df2da8be3bfc86de713bdad7fe620977ffa7c56db83928678caa792bf0d328db607028e045a9e41423ef7501e5b550651c3815ffe +0 -0
  61. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/424c9a53f5458b328d77ed6a943dc35662e949befa8725cfc7eead01a270417c8d07c1001b11623a088da8d2c9c34a41573314fa2394643147e4027e8a96a605 +0 -0
  62. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/44107e81054aa5544b36eab8d811908a559b4d9027dc3fa1762c44e39551652199ef2a31f9bbcda79773c906151c12578cb18c43e0045de8b20c357272e1c62a +0 -0
  63. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/52ea57bde33e8ef4718d833c2df3cf0a9e90fdcd5715c0caad50b4e37ea60aca2b8c71096de6920dc936c40b6291e896293f91c7cfd2aa96cf6c2aa49ef662c8 +0 -0
  64. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/5ea52f6d4771afda4747b9f44954102c02ae2d0686f8aa9eca36c29796bbba0d14e851c0dca0a6af17bfbbbac174e3be645ae708d958390168e85c64786fc9ef +0 -0
  65. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/86a1cfa113399acc7dd2dc90262a845558affb5e9373b6300dff68a485482c5e17ace9466bbc23b4301013ca1a27a577ca57ea838113f45bf321a64a242b1ad3 +0 -0
  66. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/8ef99a12ae0624db198d9ecd83014fb8353c4731e0ba9a472f1fc339784308e38f1287d0765a7b0444f1a89c218c76a820dc4c9a3a39c1cedcd7423a4f5f88dc +0 -0
  67. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/cb3e8da2bf2b7efae4a6e8fd0b8562dacd16ca0531b173a91480a9e60ee795ac5bec13fc6eb461e03edc9a26f5ff1d5ba53521a1c1a6c1ee1765b544b7d7bf73 +0 -0
  68. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/segments/d27ad326963b75736b636adad9fb812eb3f2871e0efb4bc7db37d4b701a4282911eaaee91bed3a759e940769b667be1ed66f2d7f2f41ac3906b87ab7eec19c3a +0 -0
  69. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/index/type +0 -0
  70. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_heads/heads/891d7ed26f62b0f8757b081e9d76840636877f1613ee17b7695fe2ee8640258c56e01291934e3797728bc2300a1b5f41e3f3ef81ab532c0e5ab475bb9b6f097a +0 -0
  71. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_heads/type +0 -0
  72. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/282ad8cf3324b2679a7d460c0fc324adfa21dcfad2f197ac6991b98ec91f98495bb3ddb2cba36ce5dfa28a52063a373bb03f5d2e34f6e0c7b6b81b3046a4d7d0 +0 -0
  73. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/891d7ed26f62b0f8757b081e9d76840636877f1613ee17b7695fe2ee8640258c56e01291934e3797728bc2300a1b5f41e3f3ef81ab532c0e5ab475bb9b6f097a +0 -0
  74. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/8926397375b8328137652c18cd4371808b214cb26864d77dd33c8eea895e10e62c297064c3d4c703d58ee11dee81bbf9851525e3a0c33151f54c164b8a4343b0 +0 -0
  75. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/89d29d938e64b1295e138faedfa5df6f6729a67e5ba8e0c3fdd1c9266e0f59a4bc35b8a21e14225072317879af3323fa0457e01d9b08608770bc23957feec6c0 +0 -0
  76. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/95fc2854c0fa2528b03e2bcabc7612f56f0bcb3d6f54a06293e21d1887885a449907b5b320a1a94bac712bf56fdad0a4184b17047c1fc179dfa83acab3f70d21 +0 -0
  77. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/9a58ceae46de4649375b6b880b8500c85d34c8e9bc650dc4c993afb2fa8d45c4180331821c6226a0fb1475b04a0b9a849502647ef9c4dcac74769eb501c885fa +0 -0
  78. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/a19ae062208aa20b7310705af3d26ef53095a9dabfad080883cc7a32e98687063179db95cb2c71ef9064801c59fa46d261f172d83e83f96a39c274387b59dca4 +0 -0
  79. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/d1169a8d10067493e42752c2a7615ff27f55bd90c38b91feef918958e29a2239ee289a0cde8385441d1f0fe9af1fb634fa6d56438b9f33ec382e81fa59d70b54 +0 -0
  80. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/e171e5c6039c050c2368584a537d36df221b1f9f23d285c0399b95b14608d67006229823e6831bff7d8b0c2f9e86ebaec9c6811461119195f430ade055073fed +0 -0
  81. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/operations/ee118dd19aac4e1cb354f83a37dadca70bc5f086cc8d36cd0059b222bf8c7250824401ff681518d0120f8db1f96f0025c464dcfc3b1ee28777e8c76325760134 +0 -0
  82. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/type +0 -0
  83. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/123b0e36150cf8e99d644d2dfd1a7b0c8d2f676a78248d6902516d9ae58903665c79ec3f5f6729b98a1237dcf2abc1d41e690ae0ad30888c84786bcc9de5e314 +0 -0
  84. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/2ac0b7d8b1fdfac82b3ff3926e0018f72ef2b48f85b41f5fa541271370e1197d41e37c2c6d62af0c6974658c4a9e5e945b8efcbcc7748bdd99bd9483f7e13e22 +0 -0
  85. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/67b8396b301935ff624ff98952c57d8ee021e7d885e1220053b993e7bc822a4cf061298e9643ded745c55f3ed8e923a6731524129993d2664f48b60660761145 +0 -0
  86. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/9c6fca696f77383cc87d068fe3f5912466b157dccc6465973e653dd4d2c02e2eca9c0725c071857bf3f4f0e263259eafc18f1739615a501e672bb2afd415316b +0 -0
  87. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/cae2e3e5952cb5ba93f27e3898d90dac6c41fc9e20c66ef0791e71b91dc103d924996c921c88179705264a224fb5d2bb29091fc8f18f0ea7a088aaabb859ea2a +0 -0
  88. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/cd8efb6da14127c81c37b56ead18a39b30f2cd154891185a6e906efb491dbf63f290eed3c31d4725f490a93208ffbe5cdc031d5b6de38fcb77cbb11f0357118f +0 -0
  89. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/e434359d6306a4f6997733b9b5308299984f05219c92e1b2a31f1203126be0fada5fc09a2ba86c98d1318981cb53997c7f8674ef25da6ca7bf9fd849598cd355 +0 -0
  90. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/ea75e7ccb42f52b013dc1b45bb4e6d692b37c5e38bd39356ba2806be83ca5ca03ce20481db2788428126f93663e6723f99f4d46c5c705f5b12b70e2127ab15ba +0 -0
  91. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/fa5dec7ee06fbc6cbb2798c8e98bab482a6750776de41406fb06893c83f71f5015ec7ee2873642714b7bbc1c496f880e3acf44ffdabf2f87a39e0fbd68a4cc46 +0 -0
  92. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/op_store/views/ffde172c6285c71851b22780e34962d8f9234067af59ff2dc38b74e905dc540fe35b944e8c0b2d4230dfcf778424a335494cd0aeea1bb4be2a11c4b5428ad465 +0 -0
  93. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/14e3f15273e204cadfe38dd2f38cebd1343a6bfbb91c6af0f5f9de6e9003d8ec8b0eb676975af9dca2d06ee5e6b3886c3c5d3755c6f149b6b09172cccc35adff +0 -0
  94. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/42e0f32dd10ba6ae9f2297ca8ad0bd16337f14545b29f956ce380a7ab92bab771cbc9e04755752a6fa13231286f724379d6662b0fb257ef2cc2c52fe680eb95d +0 -0
  95. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/466a441e56afdde383cef1d6127ca1d4c825157feb65a59f8f6ff5fa7a523bd683d0b7a6bb16c00afff53a890319a472d98da9af3dea5675168a4d424aa7af32 +0 -0
  96. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/482ae5a29fbe856c7272f2071b8b0f0359ee2d89ff392b8a900643fbd0836eccd067b8bf41909e206c90d45d6e7d8b6686b93ecaee5fe1a9060d87b672101310 +0 -0
  97. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/5403fa06049419ddcf620ce0dc20911583e1b1062b42630ee325aa5ac2f918dd266dfed93ebc808a2aecb37ac3a33e251fe1396fd24b8ed566bfbd61a81ff959 +0 -0
  98. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/56119fa0480cb66159978b1a8c9b031f9e978b7a3172eb87407a701fea34fdd90db7771cd433a2cf7e8a84a7b49c924f973eccb0eb05685ec42f36f7ef61cc06 +0 -0
  99. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/90b1f4de4ba65e0652f1de45e4c84b623f99bd9d9453667e19c7040857bd397e59e7a84406f2ab6204d25789d995c47c350d8abc47a4bbb102059f3111f20028 +0 -0
  100. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/9215bd4ac28fdecba111c63bace46d0f1c253ad3af44e0e74bd43d30757bef2e655538c1172c8f25769bce0a3c669b713440773c1859f0a136d9ca42501f2470 +0 -0
  101. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/a79320f784ef97b3d6297e55a48b17a517a38d95d5c61ba8d01c59d68dcd2ccf3a96479f4fc3c4cafdcd56dc7bd58b1cb987e079764c1646533ab32418900727 +0 -0
  102. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/abe6b7a350e1604cb8f5a2cd10cef13a019bd797770e6dc37414d33d98dcf36d8ec80a2ae13bd7dd2d2076772c0ffadec0b53ba72f4669b461fff2da5d30f1ba +0 -0
  103. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/b7689d54193a3798edd58d758966ad65ad57297c5276eab3e4ef07380779363efe9e462a149f4d42f55bbe004eb5ba88bf35df4c78ac975275530382390159d6 +0 -0
  104. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/e75f5f3431d172d7e9434dfaef2be50812105b3ead73eeb10345c9b6892e9cbb5ee0602ebb0ceaf5ab87d22f45930dc30d136d0aac77310fb0261b3857ffde9b +0 -0
  105. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/extra/heads/56119fa0480cb66159978b1a8c9b031f9e978b7a3172eb87407a701fea34fdd90db7771cd433a2cf7e8a84a7b49c924f973eccb0eb05685ec42f36f7ef61cc06 +0 -0
  106. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/git_target +0 -0
  107. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/store/type +0 -0
  108. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/submodule_store/type +0 -0
  109. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/repo/workspace_store/index +0 -0
  110. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/working_copy/checkout +0 -0
  111. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/working_copy/tree_state +0 -0
  112. {tab_cli-0.1.9 → tab_cli-0.2.1}/.jj/working_copy/type +0 -0
  113. {tab_cli-0.1.9 → tab_cli-0.2.1}/AGENTS.md +0 -0
  114. {tab_cli-0.1.9 → tab_cli-0.2.1}/LICENSE +0 -0
  115. {tab_cli-0.1.9 → tab_cli-0.2.1}/Makefile +0 -0
  116. {tab_cli-0.1.9 → tab_cli-0.2.1}/docs/index.md +0 -0
  117. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/__init__.py +0 -0
  118. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/handlers/cli_table.py +0 -0
  119. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/storage/__init__.py +0 -0
  120. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/storage/aws.py +0 -0
  121. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/storage/az.py +0 -0
  122. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/storage/base.py +0 -0
  123. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/storage/gcloud.py +0 -0
  124. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/storage/local.py +0 -0
  125. {tab_cli-0.1.9 → tab_cli-0.2.1}/src/tab_cli/style.py +0 -0
  126. {tab_cli-0.1.9 → tab_cli-0.2.1}/tests/__init__.py +0 -0
  127. {tab_cli-0.1.9 → tab_cli-0.2.1}/tests/assets/test.csv +0 -0
  128. {tab_cli-0.1.9 → tab_cli-0.2.1}/tests/conftest.py +0 -0
  129. {tab_cli-0.1.9 → tab_cli-0.2.1}/tests/test_stdin.py +0 -0
@@ -1,3 +1,8 @@
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.
1
6
  - 0.1.9:
2
7
  - Fixed `tab view` to render cell contents verbatim instead of interpreting bracketed text like `[red]...[/red]` as Rich markup.
3
8
  - 0.1.8:
@@ -7,7 +12,7 @@
7
12
  - Fixed S3 Polars `storage_options` to avoid nested `client_kwargs` values that could break native reads.
8
13
  - Added `default_num_view_rows` config so the default `tab view` preview size can be customized.
9
14
  - Added `log_level` config so the CLI log level can default from `~/.config/tab/config.json` when `--log-level` is omitted.
10
- - Added `max_cell_length` config so `tab view` can default to truncating long cell values without passing `--max-cell-len` every time.
15
+ - Added `max_cell_length` config so `tab view` can default to truncating long cell values without passing `--max-cell-length` every time.
11
16
  - Added `num_remote_workers` config to parallelize remote per-partition summary row counting.
12
17
  - Validated config file value types instead of silently accepting invalid JSON types.
13
18
  - Fixed the developer `Makefile` targets to point at `src/tab_cli`.
@@ -28,7 +33,7 @@
28
33
  - Automatic PyArrow fallback for Parquet files that fail to read with Polars' native reader.
29
34
  - 0.1.3:
30
35
  - Separate `tab view` from `tab cat`: `tab view` does not convert formats, `tab cat` does.
31
- - Added `--max-cell-len` option to `tab view` to truncate long cell contents.
36
+ - Added `--max-cell-length` option to `tab view` to truncate long cell contents.
32
37
  - 0.1.2:
33
38
  - Bugfix on reading directories.
34
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.1/PKG-INFO ADDED
@@ -0,0 +1,169 @@
1
+ Metadata-Version: 2.4
2
+ Name: tab-cli
3
+ Version: 0.2.1
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
+ [![pypi](https://img.shields.io/pypi/v/tab-cli)](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.9
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
  [![pypi](https://img.shields.io/pypi/v/tab-cli)](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 Avro -- locally or from S3, GCS, and Azure Blob Storage.
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-len` | Truncate cell contents longer than this. If omitted, `max_cell_length` from config is used when set. |
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. |
@@ -90,5 +100,5 @@ Options:
90
100
 
91
101
  | Option | Description |
92
102
  |-------------------------|------------------------------------------------------------------------------------------------------------------------------|
93
- | `--az-url-authority-is-account` | Interpret az:// URL authority as storage account name instead of container name. See [azure.md](Azure) for more information. |
94
- | `--log-level` | Log level from `{DEBUG, INFO, WARNING, ERROR, CRITICAL}`. If omitted, uses `log_level` from config. |
103
+ | `--az-url-authority-is-account` | Interpret az:// URL authority as storage account name instead of container name. See [Cloud](cloud.md) for more information. |
104
+ | `--log-level` | Log level from `{DEBUG, INFO, WARNING, ERROR, CRITICAL}`. If omitted, uses `log_level` from config. |
@@ -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-len` flag overrides it. |
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