tinybird 0.0.1.dev228__py3-none-any.whl → 0.0.1.dev230__py3-none-any.whl
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.
- tinybird/datafile/common.py +109 -2
- tinybird/prompts.py +1 -1
- tinybird/tb/__cli__.py +2 -2
- tinybird/tb/modules/cli.py +12 -1
- tinybird/tb/modules/connection.py +37 -82
- tinybird/tb/modules/info.py +9 -4
- {tinybird-0.0.1.dev228.dist-info → tinybird-0.0.1.dev230.dist-info}/METADATA +1 -1
- {tinybird-0.0.1.dev228.dist-info → tinybird-0.0.1.dev230.dist-info}/RECORD +11 -11
- {tinybird-0.0.1.dev228.dist-info → tinybird-0.0.1.dev230.dist-info}/WHEEL +0 -0
- {tinybird-0.0.1.dev228.dist-info → tinybird-0.0.1.dev230.dist-info}/entry_points.txt +0 -0
- {tinybird-0.0.1.dev228.dist-info → tinybird-0.0.1.dev230.dist-info}/top_level.txt +0 -0
tinybird/datafile/common.py
CHANGED
|
@@ -122,7 +122,12 @@ VALID_PIPE_NODE_TYPES = {
|
|
|
122
122
|
PipeNodeTypes.STREAM,
|
|
123
123
|
PipeNodeTypes.DATA_SINK,
|
|
124
124
|
}
|
|
125
|
-
VISIBLE_PIPE_NODE_TYPES = {
|
|
125
|
+
VISIBLE_PIPE_NODE_TYPES = {
|
|
126
|
+
PipeNodeTypes.MATERIALIZED,
|
|
127
|
+
PipeNodeTypes.COPY,
|
|
128
|
+
PipeNodeTypes.ENDPOINT,
|
|
129
|
+
PipeNodeTypes.DATA_SINK,
|
|
130
|
+
}
|
|
126
131
|
|
|
127
132
|
|
|
128
133
|
class DataFileExtensions:
|
|
@@ -182,6 +187,22 @@ class MaterializedParameters(Parameters):
|
|
|
182
187
|
ACCEPTED_ATTRIBUTES = PipeParameters.ACCEPTED_ATTRIBUTES.union(MANDATORY_ATTRIBUTES)
|
|
183
188
|
|
|
184
189
|
|
|
190
|
+
class SinkParameters(Parameters):
|
|
191
|
+
# For Kafka sinks
|
|
192
|
+
KAFKA_MANDATORY_ATTRIBUTES = PipeParameters.MANDATORY_ATTRIBUTES.union(
|
|
193
|
+
{"export_connection_name", "export_kafka_topic", "export_schedule"}
|
|
194
|
+
)
|
|
195
|
+
KAFKA_ACCEPTED_ATTRIBUTES = PipeParameters.ACCEPTED_ATTRIBUTES.union(KAFKA_MANDATORY_ATTRIBUTES)
|
|
196
|
+
|
|
197
|
+
# For S3/GCS sinks
|
|
198
|
+
BLOB_MANDATORY_ATTRIBUTES = PipeParameters.MANDATORY_ATTRIBUTES.union(
|
|
199
|
+
{"export_connection_name", "export_schedule", "export_bucket_uri", "export_file_template"}
|
|
200
|
+
)
|
|
201
|
+
BLOB_ACCEPTED_ATTRIBUTES = PipeParameters.ACCEPTED_ATTRIBUTES.union(BLOB_MANDATORY_ATTRIBUTES).union(
|
|
202
|
+
{"export_format", "export_compression", "export_write_strategy", "export_strategy"}
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
|
|
185
206
|
DATAFILE_NEW_LINE = "\n"
|
|
186
207
|
DATAFILE_INDENT = " " * 4
|
|
187
208
|
|
|
@@ -305,6 +326,90 @@ class Datafile:
|
|
|
305
326
|
f"Materialized node {repr(node['name'])} has an invalid attribute ({MaterializedParameters.canonical_name(key)})"
|
|
306
327
|
)
|
|
307
328
|
|
|
329
|
+
def validate_sink_node(self, node: Dict[str, Any]):
|
|
330
|
+
export_connection_name = node.get("export_connection_name")
|
|
331
|
+
|
|
332
|
+
if not export_connection_name:
|
|
333
|
+
raise DatafileValidationError(
|
|
334
|
+
f"Sink node {repr(node['name'])} is missing required parameter 'export_connection_name'"
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
# Determine connection type to validate appropriate parameters
|
|
338
|
+
# First, try to determine from presence of Kafka-specific parameters
|
|
339
|
+
has_kafka_topic = "export_kafka_topic" in node
|
|
340
|
+
has_s3_gcs_params = any(param in node for param in ["export_bucket_uri", "export_file_template"])
|
|
341
|
+
|
|
342
|
+
# If both types of parameters are present, that's an error
|
|
343
|
+
if has_kafka_topic and has_s3_gcs_params:
|
|
344
|
+
raise DatafileValidationError(
|
|
345
|
+
f"Sink node {repr(node['name'])} has mixed Kafka and S3/GCS parameters. Use either Kafka parameters (export_kafka_topic) or S3/GCS parameters (export_bucket_uri, export_file_template), not both."
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
# If we have Kafka-specific parameters, treat as Kafka sink
|
|
349
|
+
if has_kafka_topic:
|
|
350
|
+
# Kafka sink validation
|
|
351
|
+
if missing := [param for param in SinkParameters.KAFKA_MANDATORY_ATTRIBUTES if param not in node]:
|
|
352
|
+
raise DatafileValidationError(
|
|
353
|
+
f"Kafka sink node {repr(node['name'])} is missing required parameters: {missing}"
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
# For Kafka sinks, only specific parameters should be present
|
|
357
|
+
kafka_specific_params = (
|
|
358
|
+
{"export_kafka_topic", "export_schedule", "export_connection_name"}
|
|
359
|
+
| PipeParameters.MANDATORY_ATTRIBUTES
|
|
360
|
+
| PipeParameters.ACCEPTED_ATTRIBUTES
|
|
361
|
+
)
|
|
362
|
+
for key in node.keys():
|
|
363
|
+
if key not in kafka_specific_params:
|
|
364
|
+
raise DatafileValidationError(
|
|
365
|
+
f"Kafka sink node {repr(node['name'])} has invalid parameter '{key}'. Only export_kafka_topic, export_schedule, and export_connection_name are allowed for Kafka sinks."
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
# If we have S3/GCS-specific parameters, treat as S3/GCS sink
|
|
369
|
+
elif has_s3_gcs_params:
|
|
370
|
+
# S3/GCS sink validation
|
|
371
|
+
if missing := [param for param in SinkParameters.BLOB_MANDATORY_ATTRIBUTES if param not in node]:
|
|
372
|
+
raise DatafileValidationError(
|
|
373
|
+
f"S3/GCS sink node {repr(node['name'])} is missing required parameters: {missing}"
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
# Check that only valid parameters are present
|
|
377
|
+
for key in node.keys():
|
|
378
|
+
if key not in SinkParameters.BLOB_ACCEPTED_ATTRIBUTES:
|
|
379
|
+
raise DatafileValidationError(
|
|
380
|
+
f"S3/GCS sink node {repr(node['name'])} has invalid parameter '{key}'"
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
# If no type-specific parameters are present, we can't determine the type
|
|
384
|
+
# This means the sink is missing required parameters for any sink type
|
|
385
|
+
else:
|
|
386
|
+
# Check if we have any export parameters at all besides connection_name and schedule
|
|
387
|
+
export_params = {
|
|
388
|
+
k
|
|
389
|
+
for k in node.keys()
|
|
390
|
+
if k.startswith("export_") and k not in {"export_connection_name", "export_schedule"}
|
|
391
|
+
}
|
|
392
|
+
if not export_params:
|
|
393
|
+
raise DatafileValidationError(
|
|
394
|
+
f"Sink node {repr(node['name'])} is missing required parameters. "
|
|
395
|
+
f"For Kafka sinks, provide 'export_kafka_topic'. "
|
|
396
|
+
f"For S3/GCS sinks, provide 'export_bucket_uri' and 'export_file_template'."
|
|
397
|
+
)
|
|
398
|
+
else:
|
|
399
|
+
# There are some export parameters, but they don't match known patterns
|
|
400
|
+
raise DatafileValidationError(
|
|
401
|
+
f"Sink node {repr(node['name'])} has unrecognized export parameters: {export_params}. "
|
|
402
|
+
f"For Kafka sinks, use 'export_kafka_topic'. "
|
|
403
|
+
f"For S3/GCS sinks, use 'export_bucket_uri' and 'export_file_template'."
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
# Validate schedule format (common for both Kafka and S3/GCS)
|
|
407
|
+
export_schedule = node.get("export_schedule")
|
|
408
|
+
if export_schedule and export_schedule != ON_DEMAND and not croniter.is_valid(export_schedule):
|
|
409
|
+
raise DatafileValidationError(
|
|
410
|
+
f"Sink node {repr(node['name'])} has invalid export_schedule '{export_schedule}'. Must be @on-demand or a valid cron expression."
|
|
411
|
+
)
|
|
412
|
+
|
|
308
413
|
def validate(self):
|
|
309
414
|
if self.kind == DatafileKind.pipe:
|
|
310
415
|
# TODO(eclbg):
|
|
@@ -325,9 +430,11 @@ class Datafile:
|
|
|
325
430
|
self.validate_materialized_node(node)
|
|
326
431
|
if node_type == PipeNodeTypes.COPY:
|
|
327
432
|
self.validate_copy_node(node)
|
|
433
|
+
if node_type == PipeNodeTypes.DATA_SINK:
|
|
434
|
+
self.validate_sink_node(node)
|
|
328
435
|
if node_type not in VALID_PIPE_NODE_TYPES:
|
|
329
436
|
raise DatafileValidationError(
|
|
330
|
-
f"Invalid node
|
|
437
|
+
f"Invalid node '{repr(node['name'])}' of type ({node_type}). Allowed node types: {VISIBLE_PIPE_NODE_TYPES}"
|
|
331
438
|
)
|
|
332
439
|
for token in self.tokens:
|
|
333
440
|
if token["permission"].upper() != "READ":
|
tinybird/prompts.py
CHANGED
tinybird/tb/__cli__.py
CHANGED
|
@@ -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.
|
|
8
|
-
__revision__ = '
|
|
7
|
+
__version__ = '0.0.1.dev230'
|
|
8
|
+
__revision__ = '45e2fd2'
|
tinybird/tb/modules/cli.py
CHANGED
|
@@ -152,7 +152,18 @@ async def cli(
|
|
|
152
152
|
|
|
153
153
|
config = await get_config(host, token, user_token=user_token, config_file=config_temp._path)
|
|
154
154
|
client = _get_tb_client(config.get("token", None), config["host"])
|
|
155
|
-
|
|
155
|
+
|
|
156
|
+
# Calculate project folder path properly
|
|
157
|
+
tinyb_dir = os.path.dirname(config_temp._path) # Directory containing .tinyb file
|
|
158
|
+
cwd_config = config.get("cwd", ".")
|
|
159
|
+
|
|
160
|
+
if os.path.isabs(cwd_config):
|
|
161
|
+
# If cwd is absolute, use it directly
|
|
162
|
+
folder = cwd_config
|
|
163
|
+
else:
|
|
164
|
+
# If cwd is relative, resolve it relative to .tinyb directory
|
|
165
|
+
folder = os.path.normpath(os.path.join(tinyb_dir, cwd_config))
|
|
166
|
+
|
|
156
167
|
project = Project(folder=folder, workspace_name=config.get("name", ""), max_depth=max_depth)
|
|
157
168
|
config["path"] = str(project.path)
|
|
158
169
|
# If they have passed a token or host as parameter and it's different that record in .tinyb, refresh the workspace id
|
|
@@ -319,79 +319,23 @@ async def connection_create_gcs(ctx: Context) -> None:
|
|
|
319
319
|
|
|
320
320
|
|
|
321
321
|
@connection_create.command(name="kafka", short_help="Creates a Kafka connection.")
|
|
322
|
-
@click.option(
|
|
323
|
-
"--name",
|
|
324
|
-
default=None,
|
|
325
|
-
help="The name of your Kafka connection. If not provided, it's set as the bootstrap server",
|
|
326
|
-
)
|
|
327
|
-
@click.option("--bootstrap-servers", help="Kafka Bootstrap Server in form mykafka.mycloud.com:9092")
|
|
328
|
-
@click.option("--key", help="Key")
|
|
329
|
-
@click.option("--secret", help="Secret")
|
|
330
|
-
@click.option(
|
|
331
|
-
"--auto-offset-reset", default=None, help="Offset reset, can be 'latest' or 'earliest'. Defaults to 'latest'."
|
|
332
|
-
)
|
|
333
|
-
@click.option("--schema-registry-url", default=None, help="Avro Confluent Schema Registry URL")
|
|
334
|
-
@click.option(
|
|
335
|
-
"--sasl-mechanism",
|
|
336
|
-
default=None,
|
|
337
|
-
help="Authentication method for connection-based protocols. Defaults to 'PLAIN'",
|
|
338
|
-
)
|
|
339
|
-
@click.option(
|
|
340
|
-
"--security-protocol",
|
|
341
|
-
default="SASL_SSL",
|
|
342
|
-
help="Security protocol for connection-based protocols. Defaults to 'SASL_SSL'",
|
|
343
|
-
)
|
|
344
|
-
@click.option("--skip-secrets", is_flag=True, help="Skip Tinybird Secret creation")
|
|
345
322
|
@click.pass_context
|
|
346
323
|
@coro
|
|
347
|
-
async def connection_create_kafka_cmd(
|
|
348
|
-
ctx: Context,
|
|
349
|
-
name: str,
|
|
350
|
-
bootstrap_servers: str,
|
|
351
|
-
key: str,
|
|
352
|
-
secret: str,
|
|
353
|
-
schema_registry_url: str,
|
|
354
|
-
auto_offset_reset: str,
|
|
355
|
-
sasl_mechanism: str,
|
|
356
|
-
security_protocol: str,
|
|
357
|
-
skip_secrets: bool,
|
|
358
|
-
) -> None:
|
|
324
|
+
async def connection_create_kafka_cmd(ctx: Context) -> None:
|
|
359
325
|
"""
|
|
360
326
|
Creates a Kafka connection.
|
|
361
327
|
|
|
362
328
|
\b
|
|
363
329
|
$ tb connection create kafka
|
|
364
330
|
"""
|
|
365
|
-
await connection_create_kafka(
|
|
366
|
-
ctx,
|
|
367
|
-
name,
|
|
368
|
-
bootstrap_servers,
|
|
369
|
-
key,
|
|
370
|
-
secret,
|
|
371
|
-
schema_registry_url,
|
|
372
|
-
auto_offset_reset,
|
|
373
|
-
sasl_mechanism,
|
|
374
|
-
security_protocol,
|
|
375
|
-
skip_secrets,
|
|
376
|
-
)
|
|
331
|
+
await connection_create_kafka(ctx)
|
|
377
332
|
|
|
378
333
|
|
|
379
|
-
async def connection_create_kafka(
|
|
380
|
-
ctx: Context,
|
|
381
|
-
name="",
|
|
382
|
-
bootstrap_servers="",
|
|
383
|
-
key="",
|
|
384
|
-
secret="",
|
|
385
|
-
schema_registry_url="",
|
|
386
|
-
auto_offset_reset="",
|
|
387
|
-
sasl_mechanism="",
|
|
388
|
-
security_protocol="SASL_SSL",
|
|
389
|
-
skip_secrets=False,
|
|
390
|
-
) -> Tuple[str, str, str, str, str, str, str, str, List[str]]:
|
|
334
|
+
async def connection_create_kafka(ctx: Context) -> Tuple[str, str, str, str, str, str, str, str, List[str]]:
|
|
391
335
|
obj: Dict[str, Any] = ctx.ensure_object(dict)
|
|
392
336
|
click.echo(FeedbackManager.gray(message="\n» Creating Kafka connection..."))
|
|
393
337
|
project: Project = ctx.ensure_object(dict)["project"]
|
|
394
|
-
name = get_kafka_connection_name(project.folder,
|
|
338
|
+
name = get_kafka_connection_name(project.folder, "")
|
|
395
339
|
default_bootstrap_servers = "localhost:9092"
|
|
396
340
|
bootstrap_servers = click.prompt(
|
|
397
341
|
FeedbackManager.highlight(
|
|
@@ -404,7 +348,7 @@ async def connection_create_kafka(
|
|
|
404
348
|
bootstrap_servers = click.prompt("Bootstrap Server")
|
|
405
349
|
|
|
406
350
|
validate_kafka_bootstrap_servers(bootstrap_servers)
|
|
407
|
-
secret_required =
|
|
351
|
+
secret_required = click.confirm(
|
|
408
352
|
FeedbackManager.highlight(message=" ? Do you want to store the bootstrap server in a .env.local file? [Y/n]"),
|
|
409
353
|
default=True,
|
|
410
354
|
show_default=False,
|
|
@@ -420,12 +364,11 @@ async def connection_create_kafka(
|
|
|
420
364
|
except Exception as e:
|
|
421
365
|
raise CLIConnectionException(FeedbackManager.error(message=str(e)))
|
|
422
366
|
|
|
423
|
-
|
|
424
|
-
key = click.prompt(FeedbackManager.highlight(message="? Kafka key"))
|
|
367
|
+
key = click.prompt(FeedbackManager.highlight(message="? Kafka key"))
|
|
425
368
|
|
|
426
369
|
validate_kafka_key(key)
|
|
427
370
|
|
|
428
|
-
secret_required =
|
|
371
|
+
secret_required = click.confirm(
|
|
429
372
|
FeedbackManager.highlight(message=" ? Do you want to store the Kafka key in a .env.local file? [Y/n]"),
|
|
430
373
|
default=True,
|
|
431
374
|
show_default=False,
|
|
@@ -438,12 +381,11 @@ async def connection_create_kafka(
|
|
|
438
381
|
except Exception as e:
|
|
439
382
|
raise CLIConnectionException(FeedbackManager.error(message=str(e)))
|
|
440
383
|
|
|
441
|
-
|
|
442
|
-
secret = click.prompt(FeedbackManager.highlight(message="? Kafka secret"), hide_input=True)
|
|
384
|
+
secret = click.prompt(FeedbackManager.highlight(message="? Kafka secret"), hide_input=True)
|
|
443
385
|
|
|
444
386
|
validate_kafka_secret(secret)
|
|
445
387
|
|
|
446
|
-
secret_required =
|
|
388
|
+
secret_required = click.confirm(
|
|
447
389
|
FeedbackManager.highlight(message=" ? Do you want to store the Kafka secret in a .env.local file? [Y/n]"),
|
|
448
390
|
default=True,
|
|
449
391
|
show_default=False,
|
|
@@ -456,15 +398,14 @@ async def connection_create_kafka(
|
|
|
456
398
|
except Exception as e:
|
|
457
399
|
raise CLIConnectionException(FeedbackManager.error(message=str(e)))
|
|
458
400
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
)
|
|
401
|
+
sasl_mechanism_options = ["PLAIN", "SCRAM-SHA-256", "SCRAM-SHA-512"]
|
|
402
|
+
sasl_mechanism = click.prompt(
|
|
403
|
+
FeedbackManager.highlight(message="? SASL Mechanism (PLAIN, SCRAM-SHA-256, SCRAM-SHA-512) [PLAIN]"),
|
|
404
|
+
type=click.Choice(sasl_mechanism_options),
|
|
405
|
+
show_default=False,
|
|
406
|
+
show_choices=False,
|
|
407
|
+
default="PLAIN",
|
|
408
|
+
)
|
|
468
409
|
|
|
469
410
|
create_in_cloud = (
|
|
470
411
|
click.confirm(
|
|
@@ -474,9 +415,7 @@ async def connection_create_kafka(
|
|
|
474
415
|
default=True,
|
|
475
416
|
show_default=False,
|
|
476
417
|
)
|
|
477
|
-
if obj["env"] == "local"
|
|
478
|
-
and not skip_secrets
|
|
479
|
-
and (tb_secret_bootstrap_servers or tb_secret_key or tb_secret_secret)
|
|
418
|
+
if obj["env"] == "local" and (tb_secret_bootstrap_servers or tb_secret_key or tb_secret_secret)
|
|
480
419
|
else False
|
|
481
420
|
)
|
|
482
421
|
|
|
@@ -498,9 +437,25 @@ async def connection_create_kafka(
|
|
|
498
437
|
await prod_client.create_secret(name=tb_secret_secret, value=secret)
|
|
499
438
|
click.echo(FeedbackManager.success(message="✓ Secrets created!"))
|
|
500
439
|
|
|
501
|
-
schema_registry_url
|
|
502
|
-
|
|
440
|
+
schema_registry_url = click.prompt(
|
|
441
|
+
FeedbackManager.highlight(message="? Schema Registry URL (optional)"),
|
|
442
|
+
default="",
|
|
443
|
+
show_default=False,
|
|
444
|
+
)
|
|
445
|
+
if schema_registry_url:
|
|
446
|
+
validate_kafka_schema_registry_url(schema_registry_url)
|
|
447
|
+
|
|
448
|
+
auto_offset_reset_options = ["latest", "earliest"]
|
|
449
|
+
auto_offset_reset = click.prompt(
|
|
450
|
+
FeedbackManager.highlight(message="? Auto offset reset (latest, earliest) [latest]"),
|
|
451
|
+
type=click.Choice(auto_offset_reset_options),
|
|
452
|
+
default="latest",
|
|
453
|
+
show_default=False,
|
|
454
|
+
show_choices=False,
|
|
455
|
+
)
|
|
456
|
+
validate_kafka_auto_offset_reset(auto_offset_reset)
|
|
503
457
|
click.echo(FeedbackManager.gray(message="» Validating connection..."))
|
|
458
|
+
security_protocol = "SASL_SSL"
|
|
504
459
|
topics = list_kafka_topics(bootstrap_servers, key, secret, security_protocol, sasl_mechanism)
|
|
505
460
|
|
|
506
461
|
if topics is None:
|
|
@@ -515,7 +470,7 @@ async def connection_create_kafka(
|
|
|
515
470
|
tb_secret_key=tb_secret_key,
|
|
516
471
|
secret=secret,
|
|
517
472
|
tb_secret_secret=tb_secret_secret,
|
|
518
|
-
security_protocol=
|
|
473
|
+
security_protocol="SASL_SSL",
|
|
519
474
|
sasl_mechanism=sasl_mechanism,
|
|
520
475
|
folder=project.folder,
|
|
521
476
|
)
|
tinybird/tb/modules/info.py
CHANGED
|
@@ -140,11 +140,16 @@ async def get_project_info(project_path: Optional[str] = None) -> Tuple[Iterable
|
|
|
140
140
|
config = CLIConfig.get_project_config()
|
|
141
141
|
tinyb_path = config.get_tinyb_file()
|
|
142
142
|
current_path = os.getcwd()
|
|
143
|
-
|
|
144
|
-
if
|
|
145
|
-
|
|
146
|
-
|
|
143
|
+
|
|
144
|
+
if project_path:
|
|
145
|
+
# Use the provided project path
|
|
146
|
+
pass
|
|
147
|
+
elif tinyb_path:
|
|
148
|
+
# Use the directory containing the .tinyb file as the project path
|
|
149
|
+
project_path = os.path.dirname(tinyb_path)
|
|
147
150
|
else:
|
|
151
|
+
# No .tinyb file found, use current directory
|
|
152
|
+
project_path = current_path
|
|
148
153
|
tinyb_path = "Not found"
|
|
149
154
|
|
|
150
155
|
columns = ["current", ".tinyb", "project"]
|
|
@@ -3,7 +3,7 @@ tinybird/context.py,sha256=FfqYfrGX_I7PKGTQo93utaKPDNVYWelg4Hsp3evX5wM,1291
|
|
|
3
3
|
tinybird/datatypes.py,sha256=r4WCvspmrXTJHiPjjyOTiZyZl31FO3Ynkwq4LQsYm6E,11059
|
|
4
4
|
tinybird/feedback_manager.py,sha256=1INQFfRfuMCb9lfB8KNf4r6qC2khW568hoHjtk-wshI,69305
|
|
5
5
|
tinybird/git_settings.py,sha256=Sw_8rGmribEFJ4Z_6idrVytxpFYk7ez8ei0qHULzs3E,3934
|
|
6
|
-
tinybird/prompts.py,sha256=
|
|
6
|
+
tinybird/prompts.py,sha256=dg8Q8Q29X69j-PPP8KGooMz7-M3FNXEYqC0Fj0LcUbw,45316
|
|
7
7
|
tinybird/sql.py,sha256=BufnOgclQokDyihtuXesOwHBsebN6wRXIxO5wKRkOwE,48299
|
|
8
8
|
tinybird/sql_template.py,sha256=WjsTBjpQLVBHGZbY2dZuhZUurFR-rbJ_KRRy5vx4Y5E,99967
|
|
9
9
|
tinybird/sql_template_fmt.py,sha256=KUHdj5rYCYm_rKKdXYSJAE9vIyXUQLB0YSZnUXHeBlY,10196
|
|
@@ -12,22 +12,22 @@ tinybird/syncasync.py,sha256=IPnOx6lMbf9SNddN1eBtssg8vCLHMt76SuZ6YNYm-Yk,27761
|
|
|
12
12
|
tinybird/tornado_template.py,sha256=jjNVDMnkYFWXflmT8KU_Ssbo5vR8KQq3EJMk5vYgXRw,41959
|
|
13
13
|
tinybird/ch_utils/constants.py,sha256=yEKR11gLCL-irEXXF9QwShaR0JLXiBTlaxfolcCIoqY,4097
|
|
14
14
|
tinybird/ch_utils/engine.py,sha256=X4tE9OrfaUy6kO9cqVEzyI9cDcmOF3IAssRRzsTsfEQ,40781
|
|
15
|
-
tinybird/datafile/common.py,sha256=
|
|
15
|
+
tinybird/datafile/common.py,sha256=p--Zn09A4CRaSUQKLDoN3ITAX6E_mOsfFjK8aY9fVRk,97217
|
|
16
16
|
tinybird/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
|
|
17
17
|
tinybird/datafile/parse_connection.py,sha256=tRyn2Rpr1TeWet5BXmMoQgaotbGdYep1qiTak_OqC5E,1825
|
|
18
18
|
tinybird/datafile/parse_datasource.py,sha256=ssW8QeFSgglVFi3sDZj_HgkJiTJ2069v2JgqnH3CkDE,1825
|
|
19
19
|
tinybird/datafile/parse_pipe.py,sha256=xf4m0Tw44QWJzHzAm7Z7FwUoUUtr7noMYjU1NiWnX0k,3880
|
|
20
|
-
tinybird/tb/__cli__.py,sha256=
|
|
20
|
+
tinybird/tb/__cli__.py,sha256=74d7saA-6Srgl_5lAe0EHS41KrA0HpZjHHjG-kLMPA8,247
|
|
21
21
|
tinybird/tb/check_pypi.py,sha256=i3l2L8IajeB7sreikR7oPlYJki9MtS3c_M4crnmbByc,760
|
|
22
22
|
tinybird/tb/cli.py,sha256=0xYk2Ip4vb3nNFbxfTdG3VoIgdRvUKVbUVU_mviErPA,1107
|
|
23
23
|
tinybird/tb/client.py,sha256=FKj61vY9STPW03kfVcxYuY1_csI-kP-mc1ERQfqJtg8,56505
|
|
24
24
|
tinybird/tb/config.py,sha256=jT9xndpeCY_g0HdB5qE2EquC0TFRRnkPnQFWZWd04jo,3998
|
|
25
25
|
tinybird/tb/modules/build.py,sha256=T36msoBK5g9AZlrJnFRPvlZbrdE265LY1q3Y4YqvS3w,20067
|
|
26
26
|
tinybird/tb/modules/cicd.py,sha256=H22MaMsqAeDv-OmeHFOlUOAmfNzEzTFaEV9TQ0g4ehs,7338
|
|
27
|
-
tinybird/tb/modules/cli.py,sha256=
|
|
27
|
+
tinybird/tb/modules/cli.py,sha256=I1G7q3-hjYZuwq1GQoZd5_2i8btl33s6ms8I0yF5XDc,16332
|
|
28
28
|
tinybird/tb/modules/common.py,sha256=F6oaoFZ3aBxEMjiDKYhthsEIUqSFPkcdlMJ7h7A49Ac,83114
|
|
29
29
|
tinybird/tb/modules/config.py,sha256=VnzYVUo4q1RBEEMMce4_OCrKp4erhgkRPHElydVlKj0,11488
|
|
30
|
-
tinybird/tb/modules/connection.py,sha256=
|
|
30
|
+
tinybird/tb/modules/connection.py,sha256=KHZgu7sK1C4UBgwkKAMeNdKB0RrTls0LG3YoaUfeAfw,17648
|
|
31
31
|
tinybird/tb/modules/copy.py,sha256=zHN1d5NA-MFsgbk2kKJq2P9qA8dNOnIsIa60QpVnSwc,4458
|
|
32
32
|
tinybird/tb/modules/create.py,sha256=56_x6nwj_oAr72X7AvdxXAuXCDKGJp-w1dP6E2XdxqU,23376
|
|
33
33
|
tinybird/tb/modules/datasource.py,sha256=UiQXDkSEmQIPj4NcUD_I4bAJe9IGVmlVW07yGgSu6kY,40941
|
|
@@ -37,7 +37,7 @@ tinybird/tb/modules/dev_server.py,sha256=57FCKuWpErwYUYgHspYDkLWEm9F4pbvVOtMrFXX
|
|
|
37
37
|
tinybird/tb/modules/endpoint.py,sha256=rC1CZiEZDMb5chByf4xZhv5PsfkoLeIVDScHQ-QcBsE,12072
|
|
38
38
|
tinybird/tb/modules/exceptions.py,sha256=5jK91w1LPmtqIUfDpHe_Op5OxGz8-p1BPgtLREMIni0,5217
|
|
39
39
|
tinybird/tb/modules/feedback_manager.py,sha256=5N2S_ymq0nJPQcFetzoQOWfR6hhx8_gaTp318pe76zU,77966
|
|
40
|
-
tinybird/tb/modules/info.py,sha256=
|
|
40
|
+
tinybird/tb/modules/info.py,sha256=lAhZZhrp4bIBXIZ8R27jfPWfv4DA4aePgqpXzHU8d1c,6962
|
|
41
41
|
tinybird/tb/modules/infra.py,sha256=fve30Gj3mG9zbquGxS2e4ipcOYOxviWQCpNFfEzJN_Q,33195
|
|
42
42
|
tinybird/tb/modules/job.py,sha256=AsUCRNzy7HG5oJ4fyk9NpIm5NtNJgBZSy8MtJdXBe5A,3167
|
|
43
43
|
tinybird/tb/modules/llm.py,sha256=QbHRcMLgFmLKEh4zVb2ctR_5tIGUGdFJrAiRCDtMxDw,1572
|
|
@@ -82,8 +82,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
|
|
|
82
82
|
tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
|
|
83
83
|
tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
|
|
84
84
|
tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
|
|
85
|
-
tinybird-0.0.1.
|
|
86
|
-
tinybird-0.0.1.
|
|
87
|
-
tinybird-0.0.1.
|
|
88
|
-
tinybird-0.0.1.
|
|
89
|
-
tinybird-0.0.1.
|
|
85
|
+
tinybird-0.0.1.dev230.dist-info/METADATA,sha256=v4gUOshqYC8ekjqDD-6Vii3ijifIHdWAVrDJCPi5Br0,1682
|
|
86
|
+
tinybird-0.0.1.dev230.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
87
|
+
tinybird-0.0.1.dev230.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
|
|
88
|
+
tinybird-0.0.1.dev230.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
|
|
89
|
+
tinybird-0.0.1.dev230.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|