tinybird 3.1.0.dev0__tar.gz → 3.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.
Files changed (157) hide show
  1. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/PKG-INFO +6 -1
  2. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/datafile/common.py +3 -1
  3. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/__cli__.py +2 -2
  4. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/connection_s3.py +15 -1
  5. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/build_datasource.py +14 -3
  6. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datasource.py +33 -2
  7. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird.egg-info/PKG-INFO +6 -1
  8. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/setup.cfg +0 -0
  9. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/__cli__.py +0 -0
  10. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/ch_utils/constants.py +0 -0
  11. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/ch_utils/engine.py +0 -0
  12. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/check_pypi.py +0 -0
  13. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/client.py +0 -0
  14. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/config.py +0 -0
  15. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/context.py +0 -0
  16. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/datafile/exceptions.py +0 -0
  17. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/datafile/parse_connection.py +0 -0
  18. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/datafile/parse_datasource.py +0 -0
  19. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/datafile/parse_pipe.py +0 -0
  20. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/datatypes.py +0 -0
  21. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/feedback_manager.py +0 -0
  22. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/git_settings.py +0 -0
  23. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/prompts.py +0 -0
  24. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/service_datasources.py +0 -0
  25. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/sql.py +0 -0
  26. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/sql_template.py +0 -0
  27. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/sql_template_fmt.py +0 -0
  28. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/sql_toolset.py +0 -0
  29. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/syncasync.py +0 -0
  30. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/check_pypi.py +0 -0
  31. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/cli.py +0 -0
  32. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/client.py +0 -0
  33. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/config.py +0 -0
  34. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/__init__.py +0 -0
  35. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/agent.py +0 -0
  36. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/animations.py +0 -0
  37. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/banner.py +0 -0
  38. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/command_agent.py +0 -0
  39. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/compactor.py +0 -0
  40. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/explore_agent.py +0 -0
  41. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/file_agent.py +0 -0
  42. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/memory.py +0 -0
  43. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/mock_agent.py +0 -0
  44. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/models.py +0 -0
  45. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/prompts.py +0 -0
  46. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/testing_agent.py +0 -0
  47. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/__init__.py +0 -0
  48. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/analyze.py +0 -0
  49. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/append.py +0 -0
  50. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/build.py +0 -0
  51. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/datafile.py +0 -0
  52. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/deploy.py +0 -0
  53. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/deploy_check.py +0 -0
  54. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/diff_resource.py +0 -0
  55. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/execute_query.py +0 -0
  56. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/file.py +0 -0
  57. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/get_endpoint_stats.py +0 -0
  58. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/get_openapi_definition.py +0 -0
  59. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/mock.py +0 -0
  60. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/plan.py +0 -0
  61. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/request_endpoint.py +0 -0
  62. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/run_command.py +0 -0
  63. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/secret.py +0 -0
  64. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/tools/test.py +0 -0
  65. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/agent/utils.py +0 -0
  66. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/branch.py +0 -0
  67. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/build.py +0 -0
  68. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/build_common.py +0 -0
  69. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/cicd.py +0 -0
  70. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/cli.py +0 -0
  71. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/common.py +0 -0
  72. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/config.py +0 -0
  73. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/connection.py +0 -0
  74. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/connection_kafka.py +0 -0
  75. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/copy.py +0 -0
  76. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/create.py +0 -0
  77. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/build.py +0 -0
  78. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/build_common.py +0 -0
  79. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/build_pipe.py +0 -0
  80. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/diff.py +0 -0
  81. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/fixture.py +0 -0
  82. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/format_common.py +0 -0
  83. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/format_connection.py +0 -0
  84. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/format_datasource.py +0 -0
  85. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/format_pipe.py +0 -0
  86. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/pipe_checker.py +0 -0
  87. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/playground.py +0 -0
  88. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/datafile/pull.py +0 -0
  89. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/deployment.py +0 -0
  90. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/deployment_common.py +0 -0
  91. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/deprecations.py +0 -0
  92. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/dev_server.py +0 -0
  93. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/endpoint.py +0 -0
  94. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/exceptions.py +0 -0
  95. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/feedback_manager.py +0 -0
  96. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/fmt.py +0 -0
  97. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/info.py +0 -0
  98. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/infra.py +0 -0
  99. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/job.py +0 -0
  100. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/job_common.py +0 -0
  101. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/llm.py +0 -0
  102. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/llm_utils.py +0 -0
  103. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/local.py +0 -0
  104. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/local_common.py +0 -0
  105. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/local_logs.py +0 -0
  106. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/login.py +0 -0
  107. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/login_common.py +0 -0
  108. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/logout.py +0 -0
  109. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/materialization.py +0 -0
  110. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/mock.py +0 -0
  111. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/mock_common.py +0 -0
  112. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/open.py +0 -0
  113. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/pipe.py +0 -0
  114. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/project.py +0 -0
  115. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/project_commands.py +0 -0
  116. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/regions.py +0 -0
  117. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/secret.py +0 -0
  118. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/secret_common.py +0 -0
  119. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/shell.py +0 -0
  120. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/sink.py +0 -0
  121. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/table.py +0 -0
  122. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/telemetry.py +0 -0
  123. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/test.py +0 -0
  124. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/test_common.py +0 -0
  125. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/tinyunit/tinyunit.py +0 -0
  126. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/tinyunit/tinyunit_lib.py +0 -0
  127. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/token.py +0 -0
  128. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/watch.py +0 -0
  129. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/workspace.py +0 -0
  130. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb/modules/workspace_members.py +0 -0
  131. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli.py +0 -0
  132. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/auth.py +0 -0
  133. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/branch.py +0 -0
  134. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/cicd.py +0 -0
  135. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/cli.py +0 -0
  136. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/common.py +0 -0
  137. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/config.py +0 -0
  138. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/connection.py +0 -0
  139. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/datasource.py +0 -0
  140. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/exceptions.py +0 -0
  141. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/fmt.py +0 -0
  142. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/job.py +0 -0
  143. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/pipe.py +0 -0
  144. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/regions.py +0 -0
  145. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/tag.py +0 -0
  146. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/telemetry.py +0 -0
  147. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/test.py +0 -0
  148. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/tinyunit/tinyunit.py +0 -0
  149. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py +0 -0
  150. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/workspace.py +0 -0
  151. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tb_cli_modules/workspace_members.py +0 -0
  152. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird/tornado_template.py +0 -0
  153. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird.egg-info/SOURCES.txt +0 -0
  154. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird.egg-info/dependency_links.txt +0 -0
  155. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird.egg-info/entry_points.txt +0 -0
  156. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird.egg-info/requires.txt +0 -0
  157. {tinybird-3.1.0.dev0 → tinybird-3.2.0}/tinybird.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 3.1.0.dev0
3
+ Version: 3.2.0
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/forward/commands
6
6
  Author: Tinybird
@@ -57,6 +57,11 @@ The Tinybird command-line tool allows you to use all the Tinybird functionality
57
57
  Changelog
58
58
  ----------
59
59
 
60
+ 3.0.2
61
+ *******
62
+
63
+ - `Changed` `IMPORT_FORMAT` is now optional for S3/GCS data sources and will be automatically inferred from the file extension if not provided
64
+
60
65
  3.0.1
61
66
  *******
62
67
 
@@ -270,7 +270,7 @@ REQUIRED_BLOB_STORAGE_PARAMS = {
270
270
  "import_schedule",
271
271
  "import_bucket_uri",
272
272
  }
273
- BLOB_STORAGE_PARAMS = REQUIRED_BLOB_STORAGE_PARAMS.union({"import_from_timestamp"})
273
+ BLOB_STORAGE_PARAMS = REQUIRED_BLOB_STORAGE_PARAMS.union({"import_from_timestamp", "import_format"})
274
274
  VALID_BLOB_STORAGE_CRON_VALUES = {
275
275
  "@once",
276
276
  "@on-demand",
@@ -2017,6 +2017,7 @@ def parse(
2017
2017
  "import_schedule": assign_var("import_schedule"),
2018
2018
  "import_strategy": import_strategy_deprecated, # Deprecated, always append
2019
2019
  "import_bucket_uri": assign_var("import_bucket_uri"),
2020
+ "import_format": assign_var("import_format"),
2020
2021
  "import_from_timestamp": assign_var("import_from_timestamp"),
2021
2022
  "import_service": import_service_deprecated, # Deprecated
2022
2023
  "import_external_datasource": import_external_datasource_deprecated, # Deprecated, BQ and SFK
@@ -2196,6 +2197,7 @@ class ImportReplacements:
2196
2197
  ("import_connector", "connector", None),
2197
2198
  ("import_external_datasource", "external_data_source", None),
2198
2199
  ("import_bucket_uri", "bucket_uri", None),
2200
+ ("import_format", "format", None),
2199
2201
  ("import_from_timestamp", "from_time", None),
2200
2202
  ("import_table_arn", "dynamodb_table_arn", None),
2201
2203
  ("import_export_bucket", "dynamodb_export_bucket", None),
@@ -4,5 +4,5 @@ __description__ = 'Tinybird Command Line Tool'
4
4
  __url__ = 'https://www.tinybird.co/docs/forward/commands'
5
5
  __author__ = 'Tinybird'
6
6
  __author_email__ = 'support@tinybird.co'
7
- __version__ = '3.1.0.dev0'
8
- __revision__ = 'a987e5a'
7
+ __version__ = '3.2.0'
8
+ __revision__ = '5429eb1'
@@ -236,6 +236,9 @@ def meta_to_schema(meta: list[dict[str, Any]], file_format: str) -> str:
236
236
  Returns:
237
237
  The schema string
238
238
  """
239
+ # Normalize format to lowercase for case-insensitive comparison
240
+ file_format = file_format.lower()
241
+
239
242
  if file_format == "csv":
240
243
  # CSV files don't use JSONPath
241
244
  return ",\n ".join([f"`{col['name']}` {col['type']}" for col in meta])
@@ -249,6 +252,7 @@ def meta_to_s3_datasource_datafile(
249
252
  connection_name: str,
250
253
  bucket_uri: str,
251
254
  import_schedule: str = "@auto",
255
+ import_format: Optional[str] = None,
252
256
  ) -> str:
253
257
  """Generate S3 datasource datafile content from preview metadata.
254
258
 
@@ -257,11 +261,20 @@ def meta_to_s3_datasource_datafile(
257
261
  connection_name: The S3 connection name
258
262
  bucket_uri: The S3 bucket URI
259
263
  import_schedule: The import schedule (default: @auto)
264
+ import_format: The import format (default: auto-detected from bucket_uri)
260
265
 
261
266
  Returns:
262
267
  The datasource datafile content as a string
263
268
  """
264
- file_format = get_format_from_uri(bucket_uri)
269
+ # Use provided format or auto-detect from bucket URI
270
+ # Treat "auto" the same as None to trigger auto-detection
271
+ # Normalize import_format to lowercase if provided
272
+ if import_format is not None:
273
+ import_format = import_format.lower()
274
+
275
+ file_format = (
276
+ import_format if import_format is not None and import_format != "auto" else get_format_from_uri(bucket_uri)
277
+ )
265
278
  schema: str = meta_to_schema(meta, file_format)
266
279
  ds_content = f"""SCHEMA >
267
280
  {schema}
@@ -273,6 +286,7 @@ ENGINE "MergeTree"
273
286
  IMPORT_CONNECTION_NAME {connection_name}
274
287
  IMPORT_BUCKET_URI "{bucket_uri}"
275
288
  IMPORT_SCHEDULE "{import_schedule}"
289
+ IMPORT_FORMAT "{file_format}"
276
290
  # Learn more at https://www.tinybird.co/docs/forward/get-data-in/connectors/s3#datasource-settings
277
291
  """
278
292
  return ds_content
@@ -68,13 +68,24 @@ def new_ds(
68
68
  and params.get("bucket_uri")
69
69
  ):
70
70
  bucket_uri = params.get("bucket_uri")
71
+ file_format = params.get("format", "").lower()
71
72
  extension = bucket_uri.split(".")[-1]
72
73
  if extension == "gz":
73
74
  extension = bucket_uri.split(".")[-2]
74
75
  valid_formats = ["csv", "json", "jsonl", "ndjson", "parquet"]
75
- if extension not in valid_formats:
76
- raise Exception(FeedbackManager.error_format(extension=extension, valid_formats=valid_formats))
77
- params["format"] = extension
76
+
77
+ # If user provided a format, validate it specifically
78
+ if file_format:
79
+ if file_format not in valid_formats:
80
+ raise Exception(
81
+ FeedbackManager.error_format(extension=file_format, valid_formats=valid_formats)
82
+ )
83
+ params["format"] = file_format
84
+ else:
85
+ # Fall back to extension validation
86
+ if extension not in valid_formats:
87
+ raise Exception(FeedbackManager.error_format(extension=extension, valid_formats=valid_formats))
88
+ params["format"] = extension
78
89
  datasource_response = client.datasource_create_from_definition(params)
79
90
  datasource = datasource_response.get("datasource", {})
80
91
 
@@ -672,6 +672,12 @@ def datasource_sync(ctx: Context, datasource_name: str, yes: bool):
672
672
  type=click.Choice(["@auto", "@once"], case_sensitive=False),
673
673
  help="S3 import schedule (@auto for automatic ingestion, @once for on-demand)",
674
674
  )
675
+ @click.option(
676
+ "--s3-format",
677
+ "s3_format_param",
678
+ type=click.Choice(["csv", "ndjson", "parquet"], case_sensitive=False),
679
+ help="S3 import format (default: auto-detected from file extension)",
680
+ )
675
681
  @click.option("--yes", is_flag=True, default=False, help="Do not ask for confirmation")
676
682
  @click.pass_context
677
683
  def datasource_create(
@@ -691,6 +697,7 @@ def datasource_create(
691
697
  s3_bucket_uri_param: Optional[str],
692
698
  s3_sample_file_param: Optional[str],
693
699
  s3_schedule_param: Optional[str],
700
+ s3_format_param: Optional[str],
694
701
  yes: bool,
695
702
  ):
696
703
  wizard_data: dict[str, str | bool | float] = {
@@ -1174,6 +1181,7 @@ ENGINE "MergeTree"
1174
1181
  s3_bucket_uri = select_bucket_uri(None)
1175
1182
 
1176
1183
  s3_sample_file = select_sample_file_uri(s3_sample_file_param, s3_bucket_uri, s3_connection_id, client)
1184
+ s3_format: str = s3_format_param.lower() if s3_format_param else select_format_file(None)
1177
1185
 
1178
1186
  s3_schedule: Optional[str] = None
1179
1187
  if s3_schedule_param:
@@ -1194,10 +1202,13 @@ ENGINE "MergeTree"
1194
1202
  assert s3_bucket_uri is not None
1195
1203
  assert s3_sample_file is not None
1196
1204
  assert s3_schedule is not None
1205
+ assert s3_format is not None
1197
1206
  click.echo(FeedbackManager.gray(message="\n» Generating schema..."))
1198
1207
  response = client.preview_s3(s3_connection_id, s3_bucket_uri, s3_sample_file, None)
1199
1208
  meta = response.get("preview", {}).get("meta", [])
1200
- ds_content = meta_to_s3_datasource_datafile(meta, connection_name, s3_bucket_uri, s3_schedule)
1209
+ ds_content = meta_to_s3_datasource_datafile(
1210
+ meta, connection_name, s3_bucket_uri, s3_schedule, s3_format
1211
+ )
1201
1212
 
1202
1213
  while not confirmed:
1203
1214
  # Select connection if not set or if user wants to change it
@@ -1235,7 +1246,9 @@ ENGINE "MergeTree"
1235
1246
  preview_result = echo_s3_data(s3_connection_id, connection_name, s3_bucket_uri, s3_sample_file, client)
1236
1247
  click.echo(FeedbackManager.highlight(message=f"\n» Previewing {name}.datasource"))
1237
1248
  meta = preview_result["meta"]
1238
- ds_content = meta_to_s3_datasource_datafile(meta, connection_name, s3_bucket_uri, s3_schedule)
1249
+ ds_content = meta_to_s3_datasource_datafile(
1250
+ meta, connection_name, s3_bucket_uri, s3_schedule, s3_format
1251
+ )
1239
1252
  click.echo(create_terminal_box(ds_content, title=f"{name}.datasource"))
1240
1253
 
1241
1254
  # Confirmation step
@@ -1361,3 +1374,21 @@ def select_auto_offset_reset(current_value: Optional[str] = None) -> str:
1361
1374
  default=current_value or "latest",
1362
1375
  show_default=True,
1363
1376
  )
1377
+
1378
+
1379
+ def select_format_file(current_value: Optional[str] = None) -> str:
1380
+ """Select file format for import operations.
1381
+
1382
+ Args:
1383
+ current_value: Current format value to use as default
1384
+
1385
+ Returns:
1386
+ Selected format string ("auto", "csv", "ndjson", or "parquet")
1387
+ """
1388
+ result = click.prompt(
1389
+ FeedbackManager.highlight(message="? Import format"),
1390
+ type=click.Choice(["Auto", "CSV", "NDJSON", "Parquet"], case_sensitive=False),
1391
+ default=current_value or "Auto",
1392
+ show_default=True,
1393
+ )
1394
+ return result.lower()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 3.1.0.dev0
3
+ Version: 3.2.0
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/forward/commands
6
6
  Author: Tinybird
@@ -57,6 +57,11 @@ The Tinybird command-line tool allows you to use all the Tinybird functionality
57
57
  Changelog
58
58
  ----------
59
59
 
60
+ 3.0.2
61
+ *******
62
+
63
+ - `Changed` `IMPORT_FORMAT` is now optional for S3/GCS data sources and will be automatically inferred from the file extension if not provided
64
+
60
65
  3.0.1
61
66
  *******
62
67
 
File without changes
File without changes