tinybird 0.0.1.dev213__tar.gz → 0.0.1.dev214__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.

Potentially problematic release.


This version of tinybird might be problematic. Click here for more details.

Files changed (112) hide show
  1. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/PKG-INFO +1 -1
  2. {tinybird-0.0.1.dev213/tinybird/tb/modules → tinybird-0.0.1.dev214/tinybird}/datafile/common.py +26 -26
  3. tinybird-0.0.1.dev214/tinybird/datafile/parse_connection.py +60 -0
  4. {tinybird-0.0.1.dev213/tinybird/tb/modules → tinybird-0.0.1.dev214/tinybird}/datafile/parse_datasource.py +3 -3
  5. {tinybird-0.0.1.dev213/tinybird/tb/modules → tinybird-0.0.1.dev214/tinybird}/datafile/parse_pipe.py +3 -3
  6. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/__cli__.py +2 -2
  7. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/cli.py +1 -0
  8. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/client.py +3 -3
  9. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/build.py +3 -3
  10. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/common.py +4 -2
  11. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/connection.py +30 -5
  12. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/copy.py +2 -43
  13. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/build.py +15 -15
  14. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/build_datasource.py +1 -1
  15. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/build_pipe.py +1 -1
  16. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/diff.py +1 -1
  17. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/format_common.py +1 -1
  18. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/format_datasource.py +2 -2
  19. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/format_pipe.py +3 -3
  20. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/pipe_checker.py +1 -1
  21. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/playground.py +17 -17
  22. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datasource.py +1 -1
  23. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/endpoint.py +1 -1
  24. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/feedback_manager.py +9 -1
  25. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/materialization.py +1 -1
  26. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/pipe.py +1 -1
  27. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/project.py +5 -3
  28. tinybird-0.0.1.dev214/tinybird/tb/modules/sink.py +105 -0
  29. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/watch.py +1 -1
  30. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/branch.py +1 -1
  31. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/cli.py +1 -1
  32. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/datasource.py +1 -1
  33. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/fmt.py +1 -1
  34. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/pipe.py +1 -1
  35. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/workspace.py +1 -1
  36. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird.egg-info/PKG-INFO +1 -1
  37. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird.egg-info/SOURCES.txt +6 -5
  38. tinybird-0.0.1.dev213/tinybird/datafile.py +0 -5648
  39. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/setup.cfg +0 -0
  40. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/__cli__.py +0 -0
  41. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/ch_utils/constants.py +0 -0
  42. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/ch_utils/engine.py +0 -0
  43. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/check_pypi.py +0 -0
  44. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/client.py +0 -0
  45. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/config.py +0 -0
  46. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/connectors.py +0 -0
  47. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/context.py +0 -0
  48. {tinybird-0.0.1.dev213/tinybird/tb/modules → tinybird-0.0.1.dev214/tinybird}/datafile/exceptions.py +0 -0
  49. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/datatypes.py +0 -0
  50. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/feedback_manager.py +0 -0
  51. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/git_settings.py +0 -0
  52. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/prompts.py +0 -0
  53. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/sql.py +0 -0
  54. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/sql_template.py +0 -0
  55. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/sql_template_fmt.py +0 -0
  56. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/sql_toolset.py +0 -0
  57. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/syncasync.py +0 -0
  58. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/check_pypi.py +0 -0
  59. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/config.py +0 -0
  60. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/cicd.py +0 -0
  61. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/cli.py +0 -0
  62. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/config.py +0 -0
  63. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/create.py +0 -0
  64. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/build_common.py +0 -0
  65. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/fixture.py +0 -0
  66. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/datafile/pull.py +0 -0
  67. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/deployment.py +0 -0
  68. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/deprecations.py +0 -0
  69. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/dev_server.py +0 -0
  70. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/exceptions.py +0 -0
  71. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/info.py +0 -0
  72. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/infra.py +0 -0
  73. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/job.py +0 -0
  74. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/llm.py +0 -0
  75. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/llm_utils.py +0 -0
  76. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/local.py +0 -0
  77. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/local_common.py +0 -0
  78. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/login.py +0 -0
  79. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/logout.py +0 -0
  80. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/mock.py +0 -0
  81. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/open.py +0 -0
  82. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/regions.py +0 -0
  83. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/secret.py +0 -0
  84. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/shell.py +0 -0
  85. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/table.py +0 -0
  86. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/telemetry.py +0 -0
  87. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/test.py +0 -0
  88. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/tinyunit/tinyunit.py +0 -0
  89. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/tinyunit/tinyunit_lib.py +0 -0
  90. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/token.py +0 -0
  91. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/workspace.py +0 -0
  92. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb/modules/workspace_members.py +0 -0
  93. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli.py +0 -0
  94. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/auth.py +0 -0
  95. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/cicd.py +0 -0
  96. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/common.py +0 -0
  97. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/config.py +0 -0
  98. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/connection.py +0 -0
  99. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/exceptions.py +0 -0
  100. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/job.py +0 -0
  101. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/regions.py +0 -0
  102. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/tag.py +0 -0
  103. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/telemetry.py +0 -0
  104. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/test.py +0 -0
  105. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/tinyunit/tinyunit.py +0 -0
  106. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py +0 -0
  107. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tb_cli_modules/workspace_members.py +0 -0
  108. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird/tornado_template.py +0 -0
  109. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird.egg-info/dependency_links.txt +0 -0
  110. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird.egg-info/entry_points.txt +0 -0
  111. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird.egg-info/requires.txt +0 -0
  112. {tinybird-0.0.1.dev213 → tinybird-0.0.1.dev214}/tinybird.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tinybird
3
- Version: 0.0.1.dev213
3
+ Version: 0.0.1.dev214
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/forward/commands
6
6
  Author: Tinybird
@@ -25,7 +25,7 @@ from croniter import croniter
25
25
  from mypy_extensions import KwArg, VarArg
26
26
 
27
27
  from tinybird.ch_utils.engine import ENABLED_ENGINES
28
- from tinybird.tb.modules.datafile.exceptions import IncludeFileNotFoundException, ParseException, ValidationException
28
+ from tinybird.datafile.exceptions import IncludeFileNotFoundException, ParseException, ValidationException
29
29
  from tinybird.tb.modules.exceptions import CLIPipeException
30
30
  from tinybird.tb.modules.feedback_manager import FeedbackManager
31
31
 
@@ -473,19 +473,19 @@ def parse_indexes_structure(indexes: Optional[List[str]]) -> List[TableIndex]:
473
473
  >>> parse_indexes_structure(["index_name u64 * length(s)"])
474
474
  Traceback (most recent call last):
475
475
  ...
476
- tinybird.tb.modules.datafile.common.IndexesSyntaxError: Invalid INDEX syntax at 1:1.
476
+ tinybird.datafile.common.IndexesSyntaxError: Invalid INDEX syntax at 1:1.
477
477
  Usage: `[INDEX] name expr TYPE type_full GRANULARITY granularity`.
478
478
 
479
479
  >>> parse_indexes_structure(["index_name a TYPE set(100) GRANULARITY 100, index_name_bf mapValues(d) TYPE bloom_filter(0.001) GRANULARITY 16"])
480
480
  Traceback (most recent call last):
481
481
  ...
482
- tinybird.tb.modules.datafile.common.IndexesSyntaxError: Invalid INDEX syntax at 1:1.
482
+ tinybird.datafile.common.IndexesSyntaxError: Invalid INDEX syntax at 1:1.
483
483
  Usage: `[INDEX] name expr TYPE type_full GRANULARITY granularity`.
484
484
 
485
485
  >>> parse_indexes_structure(["", " ", " wrong_index_syntax,"])
486
486
  Traceback (most recent call last):
487
487
  ...
488
- tinybird.tb.modules.datafile.common.IndexesSyntaxError: Invalid INDEX syntax at 3:6.
488
+ tinybird.datafile.common.IndexesSyntaxError: Invalid INDEX syntax at 3:6.
489
489
  Usage: `[INDEX] name expr TYPE type_full GRANULARITY granularity`.
490
490
 
491
491
  >>> parse_indexes_structure(["my_index m['key'] TYPE ngrambf_v1(1, 1024, 1, 42) GRANULARITY 1"])
@@ -1164,49 +1164,49 @@ def parse_table_structure(schema: str) -> List[Dict[str, Any]]:
1164
1164
  >>> parse_table_structure('col') # Missing type
1165
1165
  Traceback (most recent call last):
1166
1166
  ...
1167
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: Column name and either type or DEFAULT are required at 1:1.
1167
+ tinybird.datafile.common.SchemaSyntaxError: Column name and either type or DEFAULT are required at 1:1.
1168
1168
 
1169
1169
  >>> parse_table_structure('`col Int32') # Unclosed backtick
1170
1170
  Traceback (most recent call last):
1171
1171
  ...
1172
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: Expected closing backtick at 1:5.
1172
+ tinybird.datafile.common.SchemaSyntaxError: Expected closing backtick at 1:5.
1173
1173
 
1174
1174
  >>> parse_table_structure('col Int32 DEFAULT') # Missing DEFAULT value
1175
1175
  Traceback (most recent call last):
1176
1176
  ...
1177
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: Missing mandatory value for DEFAULT at 1:18.
1177
+ tinybird.datafile.common.SchemaSyntaxError: Missing mandatory value for DEFAULT at 1:18.
1178
1178
 
1179
1179
  >>> parse_table_structure('col Int32 CODEC') # Missing CODEC parameters
1180
1180
  Traceback (most recent call last):
1181
1181
  ...
1182
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: Missing mandatory value for CODEC at 1:16.
1182
+ tinybird.datafile.common.SchemaSyntaxError: Missing mandatory value for CODEC at 1:16.
1183
1183
 
1184
1184
  >>> parse_table_structure('col#name Int32') # Invalid character in name
1185
1185
  Traceback (most recent call last):
1186
1186
  ...
1187
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: Column name contains invalid character '#' at 1:4.
1187
+ tinybird.datafile.common.SchemaSyntaxError: Column name contains invalid character '#' at 1:4.
1188
1188
  Hint: use backticks.
1189
1189
 
1190
1190
  >>> parse_table_structure('col Int32 MATERIALIZED expr') # Unsupported MATERIALIZED
1191
1191
  Traceback (most recent call last):
1192
1192
  ...
1193
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: MATERIALIZED columns are not supported at 1:11.
1193
+ tinybird.datafile.common.SchemaSyntaxError: MATERIALIZED columns are not supported at 1:11.
1194
1194
 
1195
1195
  >>> parse_table_structure('col Int32 TTL timestamp + INTERVAL 1 DAY') # Unsupported TTL
1196
1196
  Traceback (most recent call last):
1197
1197
  ...
1198
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: column TTL is not supported at 1:11.
1198
+ tinybird.datafile.common.SchemaSyntaxError: column TTL is not supported at 1:11.
1199
1199
 
1200
1200
  >>> parse_table_structure('col Int32 NULL') # Unsupported NULL
1201
1201
  Traceback (most recent call last):
1202
1202
  ...
1203
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: NULL column syntax not supported at 1:11.
1203
+ tinybird.datafile.common.SchemaSyntaxError: NULL column syntax not supported at 1:11.
1204
1204
  Hint: use Nullable(...).
1205
1205
 
1206
1206
  >>> parse_table_structure('col Int32 NOT NULL') # Unsupported NOT NULL
1207
1207
  Traceback (most recent call last):
1208
1208
  ...
1209
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: NOT NULL column syntax not supported at 1:11.
1209
+ tinybird.datafile.common.SchemaSyntaxError: NOT NULL column syntax not supported at 1:11.
1210
1210
  Hint: Columns are not nullable by default.
1211
1211
 
1212
1212
  >>> parse_table_structure('''
@@ -1215,7 +1215,7 @@ def parse_table_structure(schema: str) -> List[Dict[str, Any]]:
1215
1215
  ... ZSTD''') # Unclosed CODEC parenthesis across lines
1216
1216
  Traceback (most recent call last):
1217
1217
  ...
1218
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: Expected closing ) at 4:17.
1218
+ tinybird.datafile.common.SchemaSyntaxError: Expected closing ) at 4:17.
1219
1219
 
1220
1220
  >>> parse_table_structure('''
1221
1221
  ... timestamp DateTime
@@ -1223,7 +1223,7 @@ def parse_table_structure(schema: str) -> List[Dict[str, Any]]:
1223
1223
  ... CODEC(ZSTD)''') # Missing DEFAULT value with following CODEC
1224
1224
  Traceback (most recent call last):
1225
1225
  ...
1226
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: Missing mandatory value for DEFAULT at 3:16.
1226
+ tinybird.datafile.common.SchemaSyntaxError: Missing mandatory value for DEFAULT at 3:16.
1227
1227
 
1228
1228
  >>> parse_table_structure('''
1229
1229
  ... col String
@@ -1232,7 +1232,7 @@ def parse_table_structure(schema: str) -> List[Dict[str, Any]]:
1232
1232
  ... now()''') # MATERIALIZED with heavy indentation
1233
1233
  Traceback (most recent call last):
1234
1234
  ...
1235
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: MATERIALIZED columns are not supported at 4:13.
1235
+ tinybird.datafile.common.SchemaSyntaxError: MATERIALIZED columns are not supported at 4:13.
1236
1236
 
1237
1237
  >>> parse_table_structure('''
1238
1238
  ... `column.with.dots`
@@ -1241,7 +1241,7 @@ def parse_table_structure(schema: str) -> List[Dict[str, Any]]:
1241
1241
  ... timestamp + INTERVAL 1 DAY''') # TTL with increasing indentation
1242
1242
  Traceback (most recent call last):
1243
1243
  ...
1244
- tinybird.tb.modules.datafile.common.SchemaSyntaxError: column TTL is not supported at 4:18.
1244
+ tinybird.datafile.common.SchemaSyntaxError: column TTL is not supported at 4:18.
1245
1245
  """
1246
1246
  return _parse_table_structure(schema)
1247
1247
 
@@ -1666,15 +1666,6 @@ def parse(
1666
1666
  "shared_with": shared_with, # Not supported yet
1667
1667
  "export_service": export_service, # Deprecated
1668
1668
  "forward_query": sql("forward_query"),
1669
- "export_connection_name": assign_var("export_connection_name"),
1670
- "export_schedule": assign_var("export_schedule"),
1671
- "export_bucket_uri": assign_var("export_bucket_uri"),
1672
- "export_file_template": assign_var("export_file_template"),
1673
- "export_format": assign_var("export_format"),
1674
- "export_strategy": assign_var("export_strategy"),
1675
- "export_compression": assign_var("export_compression"),
1676
- "export_write_strategy": assign_var("export_write_strategy"),
1677
- "export_kafka_topic": assign_var("export_kafka_topic"),
1678
1669
  # ENGINE_* commands are added dynamically after this dict's definition
1679
1670
  },
1680
1671
  DatafileKind.pipe: {
@@ -1693,6 +1684,15 @@ def parse(
1693
1684
  "include": include,
1694
1685
  "sql": sql("sql"),
1695
1686
  "version": version,
1687
+ "export_connection_name": assign_var("export_connection_name"),
1688
+ "export_schedule": assign_var("export_schedule"),
1689
+ "export_bucket_uri": assign_var("export_bucket_uri"),
1690
+ "export_file_template": assign_var("export_file_template"),
1691
+ "export_format": assign_var("export_format"),
1692
+ "export_strategy": assign_var("export_strategy"),
1693
+ "export_compression": assign_var("export_compression"),
1694
+ "export_write_strategy": assign_var("export_write_strategy"),
1695
+ "export_kafka_topic": assign_var("export_kafka_topic"),
1696
1696
  },
1697
1697
  DatafileKind.connection: {
1698
1698
  "description": description,
@@ -0,0 +1,60 @@
1
+ import os
2
+ from typing import Dict, Optional
3
+
4
+ import click
5
+
6
+ from tinybird.datafile.common import (
7
+ DatafileKind,
8
+ DatafileSyntaxError,
9
+ ParseResult,
10
+ format_filename,
11
+ parse,
12
+ )
13
+ from tinybird.datafile.exceptions import ParseException
14
+ from tinybird.sql_template import render_template_with_secrets
15
+ from tinybird.tb.modules.feedback_manager import FeedbackManager
16
+
17
+
18
+ def parse_connection(
19
+ filename: str,
20
+ replace_includes: bool = True,
21
+ content: Optional[str] = None,
22
+ skip_eval: bool = False,
23
+ hide_folders: bool = False,
24
+ add_context_to_datafile_syntax_errors: bool = True,
25
+ secrets: Optional[Dict[str, str]] = None,
26
+ ) -> ParseResult:
27
+ basepath = ""
28
+ if not content:
29
+ with open(filename) as file:
30
+ s = file.read()
31
+ basepath = os.path.dirname(filename)
32
+ else:
33
+ s = content
34
+
35
+ s = render_template_with_secrets(filename, s, secrets=secrets or {})
36
+ filename = format_filename(filename, hide_folders)
37
+ try:
38
+ doc, warnings = parse(
39
+ s,
40
+ default_node="default",
41
+ basepath=basepath,
42
+ replace_includes=replace_includes,
43
+ skip_eval=skip_eval,
44
+ kind=DatafileKind.connection,
45
+ )
46
+ doc.validate()
47
+ except DatafileSyntaxError as e:
48
+ try:
49
+ if add_context_to_datafile_syntax_errors:
50
+ e.get_context_from_file_contents(s)
51
+ finally:
52
+ raise e
53
+ # TODO(eclbg): all these exceptions that trigger a ClickException shouldn't be here, as this code will only run in
54
+ # the server soon
55
+ except ParseException as e:
56
+ raise click.ClickException(
57
+ FeedbackManager.error_parsing_file(filename=filename, lineno=e.lineno, error=e)
58
+ ) from None
59
+
60
+ return ParseResult(datafile=doc, warnings=warnings)
@@ -3,15 +3,15 @@ from typing import Dict, Optional
3
3
 
4
4
  import click
5
5
 
6
- from tinybird.sql_template import render_template_with_secrets
7
- from tinybird.tb.modules.datafile.common import (
6
+ from tinybird.datafile.common import (
8
7
  DatafileKind,
9
8
  DatafileSyntaxError,
10
9
  ParseResult,
11
10
  format_filename,
12
11
  parse,
13
12
  )
14
- from tinybird.tb.modules.datafile.exceptions import ParseException
13
+ from tinybird.datafile.exceptions import ParseException
14
+ from tinybird.sql_template import render_template_with_secrets
15
15
  from tinybird.tb.modules.feedback_manager import FeedbackManager
16
16
 
17
17
 
@@ -3,15 +3,15 @@ from typing import Dict, List, Optional
3
3
 
4
4
  import click
5
5
 
6
- from tinybird.sql_template import get_template_and_variables, render_sql_template, secret_template_key
7
- from tinybird.tb.modules.datafile.common import (
6
+ from tinybird.datafile.common import (
8
7
  DatafileKind,
9
8
  DatafileSyntaxError,
10
9
  ParseResult,
11
10
  format_filename,
12
11
  parse,
13
12
  )
14
- from tinybird.tb.modules.datafile.exceptions import IncludeFileNotFoundException, ParseException
13
+ from tinybird.datafile.exceptions import IncludeFileNotFoundException, ParseException
14
+ from tinybird.sql_template import get_template_and_variables, render_sql_template, secret_template_key
15
15
  from tinybird.tb.modules.feedback_manager import FeedbackManager
16
16
  from tinybird.tornado_template import UnClosedIfError
17
17
 
@@ -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__ = '0.0.1.dev213'
8
- __revision__ = '36a1e58'
7
+ __version__ = '0.0.1.dev214'
8
+ __revision__ = '9ddb3a4'
@@ -25,6 +25,7 @@ import tinybird.tb.modules.mock
25
25
  import tinybird.tb.modules.open
26
26
  import tinybird.tb.modules.pipe
27
27
  import tinybird.tb.modules.secret
28
+ import tinybird.tb.modules.sink
28
29
  import tinybird.tb.modules.test
29
30
  import tinybird.tb.modules.token
30
31
  import tinybird.tb.modules.workspace
@@ -650,13 +650,13 @@ class TinyB:
650
650
  async def pipe_remove_copy(self, pipe_name_or_id: str, node_id: str):
651
651
  return await self._req(f"/v0/pipes/{pipe_name_or_id}/nodes/{node_id}/copy", method="DELETE")
652
652
 
653
- async def pipe_run_copy(
654
- self, pipe_name_or_id: str, params: Optional[Dict[str, str]] = None, mode: Optional[str] = None
653
+ async def pipe_run(
654
+ self, pipe_name_or_id: str, pipe_type: str, params: Optional[Dict[str, str]] = None, mode: Optional[str] = None
655
655
  ):
656
656
  params = {**params} if params else {}
657
657
  if mode:
658
658
  params["_mode"] = mode
659
- return await self._req(f"/v0/pipes/{pipe_name_or_id}/copy?{urlencode(params)}", method="POST")
659
+ return await self._req(f"/v0/pipes/{pipe_name_or_id}/{pipe_type}?{urlencode(params)}", method="POST")
660
660
 
661
661
  async def pipe_resume_copy(self, pipe_name_or_id: str):
662
662
  return await self._req(f"/v0/pipes/{pipe_name_or_id}/copy/resume", method="POST")
@@ -13,14 +13,14 @@ import click
13
13
  import requests
14
14
 
15
15
  import tinybird.context as context
16
+ from tinybird.datafile.exceptions import ParseException
17
+ from tinybird.datafile.parse_datasource import parse_datasource
18
+ from tinybird.datafile.parse_pipe import parse_pipe
16
19
  from tinybird.tb.client import TinyB
17
20
  from tinybird.tb.modules.cli import cli
18
21
  from tinybird.tb.modules.common import push_data, sys_exit
19
22
  from tinybird.tb.modules.config import CLIConfig
20
- from tinybird.tb.modules.datafile.exceptions import ParseException
21
23
  from tinybird.tb.modules.datafile.fixture import FixtureExtension, get_fixture_dir, persist_fixture
22
- from tinybird.tb.modules.datafile.parse_datasource import parse_datasource
23
- from tinybird.tb.modules.datafile.parse_pipe import parse_pipe
24
24
  from tinybird.tb.modules.datafile.playground import folder_playground
25
25
  from tinybird.tb.modules.dev_server import BuildStatus, start_server
26
26
  from tinybird.tb.modules.feedback_manager import FeedbackManager
@@ -1707,6 +1707,7 @@ async def run_aws_iamrole_connection_flow(
1707
1707
  service: str,
1708
1708
  environment: str,
1709
1709
  connection_name: str,
1710
+ policy: str,
1710
1711
  ) -> Tuple[str, str, str]:
1711
1712
  if service == DataConnectorType.AMAZON_DYNAMODB:
1712
1713
  raise NotImplementedError("DynamoDB is not supported")
@@ -1721,7 +1722,7 @@ async def run_aws_iamrole_connection_flow(
1721
1722
  validate_string_connector_param("Region", region)
1722
1723
 
1723
1724
  access_policy, trust_policy, _ = await get_aws_iamrole_policies(
1724
- client, service=service, policy="read", bucket=bucket_name, external_id_seed=connection_name
1725
+ client, service=service, policy=policy, bucket=bucket_name, external_id_seed=connection_name
1725
1726
  )
1726
1727
 
1727
1728
  click.echo(FeedbackManager.prompt_s3_iamrole_connection_login_aws())
@@ -1810,9 +1811,10 @@ async def production_aws_iamrole_only(
1810
1811
  bucket_name: str,
1811
1812
  environment: str,
1812
1813
  connection_name: str,
1814
+ policy: str,
1813
1815
  ) -> Tuple[str, str, str]:
1814
1816
  _, trust_policy, external_id = await get_aws_iamrole_policies(
1815
- prod_client, service=service, policy="read", bucket=bucket_name, external_id_seed=connection_name
1817
+ prod_client, service=service, policy=policy, bucket=bucket_name, external_id_seed=connection_name
1816
1818
  )
1817
1819
 
1818
1820
  trust_policy_copied = True
@@ -178,12 +178,28 @@ async def connection_create_s3(ctx: Context) -> None:
178
178
 
179
179
  service = DataConnectorType.AMAZON_S3
180
180
  click.echo(FeedbackManager.prompt_s3_connection_header())
181
+
182
+ # Ask user for access type
183
+ access_type = click.prompt(
184
+ FeedbackManager.highlight(
185
+ message="What type of access do you need for this S3 connection?\n"
186
+ ' - "read" for S3 Data Source (reading from S3)\n'
187
+ ' - "write" for S3 Sink (writing to S3)\n'
188
+ "Access type",
189
+ ),
190
+ type=click.Choice(["read", "write"], case_sensitive=False),
191
+ default="read",
192
+ show_choices=True,
193
+ show_default=True,
194
+ )
195
+
181
196
  connection_name = get_s3_connection_name(project.folder)
182
197
  role_arn, region, bucket_name = await run_aws_iamrole_connection_flow(
183
198
  client,
184
199
  service=service,
185
200
  environment=obj["env"],
186
201
  connection_name=connection_name,
202
+ policy=access_type.lower(),
187
203
  )
188
204
  unique_suffix = uuid.uuid4().hex[:8] # Use first 8 chars of a UUID for brevity
189
205
  secret_name = f"s3_role_arn_{connection_name}_{unique_suffix}"
@@ -211,6 +227,7 @@ async def connection_create_s3(ctx: Context) -> None:
211
227
  bucket_name=bucket_name,
212
228
  environment="cloud",
213
229
  connection_name=connection_name,
230
+ policy=access_type.lower(),
214
231
  )
215
232
  await prod_client.create_secret(name=secret_name, value=prod_role_arn)
216
233
 
@@ -222,12 +239,20 @@ async def connection_create_s3(ctx: Context) -> None:
222
239
  folder=project.folder,
223
240
  )
224
241
 
225
- click.echo(
226
- FeedbackManager.prompt_s3_iamrole_success(
227
- connection_name=connection_name,
228
- connection_path=str(connection_file_path),
242
+ if access_type.lower() == "write":
243
+ click.echo(
244
+ FeedbackManager.prompt_s3_iamrole_success_write(
245
+ connection_name=connection_name,
246
+ connection_path=str(connection_file_path),
247
+ )
248
+ )
249
+ else:
250
+ click.echo(
251
+ FeedbackManager.prompt_s3_iamrole_success_read(
252
+ connection_name=connection_name,
253
+ connection_path=str(connection_file_path),
254
+ )
229
255
  )
230
- )
231
256
 
232
257
 
233
258
  @connection_create.command(name="gcs", short_help="Creates a Google Cloud Storage connection.")
@@ -10,10 +10,10 @@ from typing import Optional, Tuple
10
10
  import click
11
11
  from click import Context
12
12
 
13
+ from tinybird.datafile.common import get_name_version
13
14
  from tinybird.tb.client import AuthNoTokenException, TinyB
14
15
  from tinybird.tb.modules.cli import cli
15
16
  from tinybird.tb.modules.common import coro, echo_safe_humanfriendly_tables_format_smart_table, wait_job
16
- from tinybird.tb.modules.datafile.common import get_name_version
17
17
  from tinybird.tb.modules.exceptions import CLIPipeException
18
18
  from tinybird.tb.modules.feedback_manager import FeedbackManager
19
19
 
@@ -93,8 +93,7 @@ async def copy_run(ctx: click.Context, pipe_name_or_id: str, wait: bool, mode: s
93
93
  client: TinyB = ctx.ensure_object(dict)["client"]
94
94
 
95
95
  try:
96
- response = await client.pipe_run_copy(pipe_name_or_id, params, mode)
97
-
96
+ response = await client.pipe_run(pipe_name_or_id, "copy", params, mode)
98
97
  job_id = response["job"]["job_id"]
99
98
  job_url = response["job"]["job_url"]
100
99
  target_datasource_id = response["tags"]["copy_target_datasource"]
@@ -112,43 +111,3 @@ async def copy_run(ctx: click.Context, pipe_name_or_id: str, wait: bool, mode: s
112
111
  raise
113
112
  except Exception as e:
114
113
  raise CLIPipeException(FeedbackManager.error_creating_copy_job(error=e))
115
-
116
-
117
- @copy.command(name="resume", short_help="Resume a paused copy pipe")
118
- @click.argument("pipe_name_or_id")
119
- @click.pass_context
120
- @coro
121
- async def copy_resume(ctx: click.Context, pipe_name_or_id: str):
122
- """Resume a paused copy pipe"""
123
-
124
- click.echo(FeedbackManager.info_copy_pipe_resuming(pipe=pipe_name_or_id))
125
- client: TinyB = ctx.ensure_object(dict)["client"]
126
-
127
- try:
128
- await client.pipe_resume_copy(pipe_name_or_id)
129
- click.echo(FeedbackManager.success_copy_pipe_resumed(pipe=pipe_name_or_id))
130
-
131
- except AuthNoTokenException:
132
- raise
133
- except Exception as e:
134
- raise CLIPipeException(FeedbackManager.error_resuming_copy_pipe(error=e))
135
-
136
-
137
- @copy.command(name="pause", short_help="Pause a running copy pipe")
138
- @click.argument("pipe_name_or_id")
139
- @click.pass_context
140
- @coro
141
- async def copy_pause(ctx: click.Context, pipe_name_or_id: str):
142
- """Pause a running copy pipe"""
143
-
144
- click.echo(FeedbackManager.info_copy_pipe_pausing(pipe=pipe_name_or_id))
145
- client: TinyB = ctx.ensure_object(dict)["client"]
146
-
147
- try:
148
- await client.pipe_pause_copy(pipe_name_or_id)
149
- click.echo(FeedbackManager.success_copy_pipe_paused(pipe=pipe_name_or_id))
150
-
151
- except AuthNoTokenException:
152
- raise
153
- except Exception as e:
154
- raise CLIPipeException(FeedbackManager.error_pausing_copy_pipe(error=e))
@@ -11,18 +11,7 @@ from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Union
11
11
  import click
12
12
  from toposort import toposort
13
13
 
14
- from tinybird.sql import parse_table_structure, schema_to_sql_columns
15
- from tinybird.sql_template import get_used_tables_in_template, render_sql_template
16
- from tinybird.tb.client import TinyB
17
- from tinybird.tb.modules.common import get_ca_pem_content
18
- from tinybird.tb.modules.datafile.build_datasource import is_datasource
19
- from tinybird.tb.modules.datafile.build_pipe import (
20
- get_target_materialized_data_source_name,
21
- is_endpoint,
22
- is_endpoint_with_no_dependencies,
23
- is_materialized,
24
- )
25
- from tinybird.tb.modules.datafile.common import (
14
+ from tinybird.datafile.common import (
26
15
  DEFAULT_CRON_PERIOD,
27
16
  INTERNAL_TABLES,
28
17
  ON_DEMAND,
@@ -38,9 +27,20 @@ from tinybird.tb.modules.datafile.common import (
38
27
  get_project_filenames,
39
28
  pp,
40
29
  )
41
- from tinybird.tb.modules.datafile.exceptions import AlreadyExistsException, IncludeFileNotFoundException
42
- from tinybird.tb.modules.datafile.parse_datasource import parse_datasource
43
- from tinybird.tb.modules.datafile.parse_pipe import parse_pipe
30
+ from tinybird.datafile.exceptions import AlreadyExistsException, IncludeFileNotFoundException
31
+ from tinybird.datafile.parse_datasource import parse_datasource
32
+ from tinybird.datafile.parse_pipe import parse_pipe
33
+ from tinybird.sql import parse_table_structure, schema_to_sql_columns
34
+ from tinybird.sql_template import get_used_tables_in_template, render_sql_template
35
+ from tinybird.tb.client import TinyB
36
+ from tinybird.tb.modules.common import get_ca_pem_content
37
+ from tinybird.tb.modules.datafile.build_datasource import is_datasource
38
+ from tinybird.tb.modules.datafile.build_pipe import (
39
+ get_target_materialized_data_source_name,
40
+ is_endpoint,
41
+ is_endpoint_with_no_dependencies,
42
+ is_materialized,
43
+ )
44
44
  from tinybird.tb.modules.feedback_manager import FeedbackManager
45
45
  from tinybird.tb.modules.project import Project
46
46
 
@@ -5,8 +5,8 @@ from typing import Any, Dict, List, Optional
5
5
 
6
6
  import click
7
7
 
8
+ from tinybird.datafile.common import PREVIEW_CONNECTOR_SERVICES, ImportReplacements
8
9
  from tinybird.tb.client import DoesNotExistException, TinyB
9
- from tinybird.tb.modules.datafile.common import PREVIEW_CONNECTOR_SERVICES, ImportReplacements
10
10
  from tinybird.tb.modules.feedback_manager import FeedbackManager
11
11
 
12
12
 
@@ -6,10 +6,10 @@ from urllib.parse import urlencode
6
6
  import click
7
7
  import requests
8
8
 
9
+ from tinybird.datafile.common import PipeNodeTypes
9
10
  from tinybird.tb.client import TinyB
10
11
  from tinybird.tb.modules.common import requests_get
11
12
  from tinybird.tb.modules.config import CLIConfig
12
- from tinybird.tb.modules.datafile.common import PipeNodeTypes
13
13
  from tinybird.tb.modules.feedback_manager import FeedbackManager
14
14
 
15
15
 
@@ -22,9 +22,9 @@ import sys
22
22
 
23
23
  import click
24
24
 
25
+ from tinybird.datafile.common import get_name_version, get_project_filenames, is_file_a_datasource, peek
25
26
  from tinybird.sql_template_fmt import DEFAULT_FMT_LINE_LENGTH
26
27
  from tinybird.tb.client import TinyB
27
- from tinybird.tb.modules.datafile.common import get_name_version, get_project_filenames, is_file_a_datasource, peek
28
28
  from tinybird.tb.modules.datafile.format_datasource import format_datasource
29
29
  from tinybird.tb.modules.datafile.format_pipe import format_pipe
30
30
  from tinybird.tb.modules.datafile.pull import folder_pull
@@ -1,6 +1,6 @@
1
1
  from typing import Any, List
2
2
 
3
- from tinybird.tb.modules.datafile.common import Datafile
3
+ from tinybird.datafile.common import Datafile
4
4
 
5
5
  DATAFILE_NEW_LINE = "\n"
6
6
  DATAFILE_INDENT = " " * 4
@@ -1,8 +1,9 @@
1
1
  from typing import Any, Dict, List, Optional
2
2
 
3
+ from tinybird.datafile.common import Datafile
4
+ from tinybird.datafile.parse_datasource import parse_datasource
3
5
  from tinybird.sql import schema_to_sql_columns
4
6
  from tinybird.tb.client import TinyB
5
- from tinybird.tb.modules.datafile.common import Datafile
6
7
  from tinybird.tb.modules.datafile.format_common import (
7
8
  DATAFILE_INDENT,
8
9
  DATAFILE_NEW_LINE,
@@ -12,7 +13,6 @@ from tinybird.tb.modules.datafile.format_common import (
12
13
  format_tags,
13
14
  format_tokens,
14
15
  )
15
- from tinybird.tb.modules.datafile.parse_datasource import parse_datasource
16
16
 
17
17
 
18
18
  async def format_datasource(
@@ -2,8 +2,7 @@ import os
2
2
  from pathlib import Path
3
3
  from typing import Any, Dict, List, Optional
4
4
 
5
- from tinybird.sql_template_fmt import DEFAULT_FMT_LINE_LENGTH, format_sql_template
6
- from tinybird.tb.modules.datafile.common import (
5
+ from tinybird.datafile.common import (
7
6
  ON_DEMAND,
8
7
  CopyParameters,
9
8
  Datafile,
@@ -12,6 +11,8 @@ from tinybird.tb.modules.datafile.common import (
12
11
  _unquote,
13
12
  eval_var,
14
13
  )
14
+ from tinybird.datafile.parse_pipe import parse_pipe
15
+ from tinybird.sql_template_fmt import DEFAULT_FMT_LINE_LENGTH, format_sql_template
15
16
  from tinybird.tb.modules.datafile.format_common import (
16
17
  DATAFILE_INDENT,
17
18
  DATAFILE_NEW_LINE,
@@ -21,7 +22,6 @@ from tinybird.tb.modules.datafile.format_common import (
21
22
  format_tokens,
22
23
  )
23
24
  from tinybird.tb.modules.datafile.format_datasource import format_engine
24
- from tinybird.tb.modules.datafile.parse_pipe import parse_pipe
25
25
 
26
26
 
27
27
  def format_node_sql(
@@ -14,8 +14,8 @@ import requests
14
14
  from humanfriendly import format_size
15
15
  from requests import Response
16
16
 
17
+ from tinybird.datafile.common import normalize_array
17
18
  from tinybird.tb.modules.common import getenv_bool
18
- from tinybird.tb.modules.datafile.common import normalize_array
19
19
 
20
20
  PIPE_CHECKER_RETRIES: int = 3
21
21