tinybird 0.0.1.dev227__py3-none-any.whl → 0.0.1.dev229__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/cicd.py +1 -1
- tinybird/tb/modules/connection.py +37 -82
- tinybird/tb/modules/create.py +7 -7
- tinybird/tb/modules/feedback_manager.py +3 -3
- {tinybird-0.0.1.dev227.dist-info → tinybird-0.0.1.dev229.dist-info}/METADATA +1 -1
- {tinybird-0.0.1.dev227.dist-info → tinybird-0.0.1.dev229.dist-info}/RECORD +12 -12
- {tinybird-0.0.1.dev227.dist-info → tinybird-0.0.1.dev229.dist-info}/WHEEL +0 -0
- {tinybird-0.0.1.dev227.dist-info → tinybird-0.0.1.dev229.dist-info}/entry_points.txt +0 -0
- {tinybird-0.0.1.dev227.dist-info → tinybird-0.0.1.dev229.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.dev229'
|
|
8
|
+
__revision__ = '814718e'
|
tinybird/tb/modules/cicd.py
CHANGED
|
@@ -177,7 +177,7 @@ class CICDGeneratorBase:
|
|
|
177
177
|
continue
|
|
178
178
|
with open(f"{path}/{cicd_file.full_path}", "wb") as f:
|
|
179
179
|
f.write(content)
|
|
180
|
-
click.echo(FeedbackManager.
|
|
180
|
+
click.echo(FeedbackManager.info_file_created(file=cicd_file.full_path.replace("./.", ".")))
|
|
181
181
|
if cicd_file.warning_message is not None:
|
|
182
182
|
return FeedbackManager.warning_for_cicd_file(
|
|
183
183
|
file_name=cicd_file.file_name, warning_message=cicd_file.warning_message.format(**params)
|
|
@@ -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/create.py
CHANGED
|
@@ -120,7 +120,7 @@ async def create(
|
|
|
120
120
|
)
|
|
121
121
|
readme_result = extract_xml(readme_response, "readme")
|
|
122
122
|
readme_path.write_text(readme_result)
|
|
123
|
-
click.echo(FeedbackManager.
|
|
123
|
+
click.echo(FeedbackManager.info_file_created(file="README.md"))
|
|
124
124
|
created_something = True
|
|
125
125
|
|
|
126
126
|
if data or prompt:
|
|
@@ -142,14 +142,14 @@ async def create(
|
|
|
142
142
|
if not already_has_cursor_rules(root_folder):
|
|
143
143
|
click.echo(FeedbackManager.highlight(message="\n» Creating rules..."))
|
|
144
144
|
create_rules(root_folder, "tb", agent)
|
|
145
|
-
click.echo(FeedbackManager.
|
|
145
|
+
click.echo(FeedbackManager.info_file_created(file=".cursorrules"))
|
|
146
146
|
click.echo(FeedbackManager.success(message="✓ Done!\n"))
|
|
147
147
|
created_something = True
|
|
148
148
|
|
|
149
149
|
if not already_has_claude_rules(root_folder):
|
|
150
150
|
click.echo(FeedbackManager.highlight(message="\n» Creating Claude Code rules..."))
|
|
151
151
|
create_claude_rules(root_folder, "tb")
|
|
152
|
-
click.echo(FeedbackManager.
|
|
152
|
+
click.echo(FeedbackManager.info_file_created(file="CLAUDE.md"))
|
|
153
153
|
click.echo(FeedbackManager.success(message="✓ Done!\n"))
|
|
154
154
|
created_something = True
|
|
155
155
|
|
|
@@ -170,7 +170,7 @@ async def create(
|
|
|
170
170
|
|
|
171
171
|
ds_name = ds_path.stem
|
|
172
172
|
datasource_path = Path(folder) / "datasources" / f"{ds_name}.datasource"
|
|
173
|
-
click.echo(FeedbackManager.
|
|
173
|
+
click.echo(FeedbackManager.info_file_created(file=f"fixtures/{ds_name}.{data_format}"))
|
|
174
174
|
persist_fixture(ds_name, data_content, folder, format=data_format)
|
|
175
175
|
click.echo(FeedbackManager.success(message="✓ Done!"))
|
|
176
176
|
created_something = True
|
|
@@ -196,7 +196,7 @@ async def create(
|
|
|
196
196
|
)
|
|
197
197
|
if mock_data:
|
|
198
198
|
persist_fixture(datasource_name, mock_data, folder, format="ndjson")
|
|
199
|
-
click.echo(FeedbackManager.
|
|
199
|
+
click.echo(FeedbackManager.info_file_created(file=f"fixtures/{datasource_name}.ndjson"))
|
|
200
200
|
click.echo(FeedbackManager.success(message="✓ Done!"))
|
|
201
201
|
created_something = True
|
|
202
202
|
|
|
@@ -285,7 +285,7 @@ def create_project_structure(folder: str):
|
|
|
285
285
|
f = folder_path / path
|
|
286
286
|
f.mkdir()
|
|
287
287
|
click.echo(
|
|
288
|
-
FeedbackManager.info(message=f"
|
|
288
|
+
FeedbackManager.info(message=f"./{x} ") + FeedbackManager.gray(message=PROJECT_PATHS_DESCRIPTIONS[x])
|
|
289
289
|
)
|
|
290
290
|
except FileExistsError:
|
|
291
291
|
pass
|
|
@@ -386,7 +386,7 @@ def init_git(folder: str):
|
|
|
386
386
|
else:
|
|
387
387
|
gitignore_file.write_text(".tinyb\n.terraform\n")
|
|
388
388
|
|
|
389
|
-
click.echo(FeedbackManager.
|
|
389
|
+
click.echo(FeedbackManager.info_file_created(file=".gitignore"))
|
|
390
390
|
except Exception as e:
|
|
391
391
|
raise Exception(f"Error initializing Git: {e}")
|
|
392
392
|
|
|
@@ -895,9 +895,9 @@ STEP 3: ADD KEY TO SERVICE ACCOUNT
|
|
|
895
895
|
info_removing_pipe = info_message("** Removing pipe {pipe}")
|
|
896
896
|
info_removing_pipe_not_found = info_message("** {pipe} not found")
|
|
897
897
|
info_dry_removing_pipe = info_message("** [DRY RUN] Removing pipe {pipe}")
|
|
898
|
-
info_path_created = info_message("
|
|
899
|
-
info_file_created = info_message("
|
|
900
|
-
info_path_already_exists = info_message("
|
|
898
|
+
info_path_created = info_message("./{path}")
|
|
899
|
+
info_file_created = info_message("./{file}")
|
|
900
|
+
info_path_already_exists = info_message("./{path} already exists, skipping")
|
|
901
901
|
info_dottinyb_already_ignored = info_message("** - '.tinyb' already in .gitignore, skipping")
|
|
902
902
|
info_dotdifftemp_already_ignored = info_message("** - '.diff_tmp' not found or already in .gitignore, skipping")
|
|
903
903
|
info_dottinyenv_already_exists = info_message("** - '.tinyenv' already exists, skipping")
|
|
@@ -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,31 +12,31 @@ 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=abf6p2ld9Q1KITecyuYWTXBq4NqGO5evhTrj1jhr90M,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
|
-
tinybird/tb/modules/cicd.py,sha256=
|
|
26
|
+
tinybird/tb/modules/cicd.py,sha256=H22MaMsqAeDv-OmeHFOlUOAmfNzEzTFaEV9TQ0g4ehs,7338
|
|
27
27
|
tinybird/tb/modules/cli.py,sha256=zTUob6oSZszCx-lk6MJbQ_VuNOXBo8b0DOHPWezzMOg,15997
|
|
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
|
-
tinybird/tb/modules/create.py,sha256=
|
|
32
|
+
tinybird/tb/modules/create.py,sha256=56_x6nwj_oAr72X7AvdxXAuXCDKGJp-w1dP6E2XdxqU,23376
|
|
33
33
|
tinybird/tb/modules/datasource.py,sha256=UiQXDkSEmQIPj4NcUD_I4bAJe9IGVmlVW07yGgSu6kY,40941
|
|
34
34
|
tinybird/tb/modules/deployment.py,sha256=ByXIgEvwxB49pJEKKj0EJIfORWyflCYr04k8961nBkA,28391
|
|
35
35
|
tinybird/tb/modules/deprecations.py,sha256=rrszC1f_JJeJ8mUxGoCxckQTJFBCR8wREf4XXXN-PRc,4507
|
|
36
36
|
tinybird/tb/modules/dev_server.py,sha256=57FCKuWpErwYUYgHspYDkLWEm9F4pbvVOtMrFXX1fVU,10129
|
|
37
37
|
tinybird/tb/modules/endpoint.py,sha256=rC1CZiEZDMb5chByf4xZhv5PsfkoLeIVDScHQ-QcBsE,12072
|
|
38
38
|
tinybird/tb/modules/exceptions.py,sha256=5jK91w1LPmtqIUfDpHe_Op5OxGz8-p1BPgtLREMIni0,5217
|
|
39
|
-
tinybird/tb/modules/feedback_manager.py,sha256=
|
|
39
|
+
tinybird/tb/modules/feedback_manager.py,sha256=5N2S_ymq0nJPQcFetzoQOWfR6hhx8_gaTp318pe76zU,77966
|
|
40
40
|
tinybird/tb/modules/info.py,sha256=NqSsoyzFqbtUEGH_tSowNOI_jSsNuixibln6-plsfOY,6810
|
|
41
41
|
tinybird/tb/modules/infra.py,sha256=fve30Gj3mG9zbquGxS2e4ipcOYOxviWQCpNFfEzJN_Q,33195
|
|
42
42
|
tinybird/tb/modules/job.py,sha256=AsUCRNzy7HG5oJ4fyk9NpIm5NtNJgBZSy8MtJdXBe5A,3167
|
|
@@ -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.dev229.dist-info/METADATA,sha256=L3f2CdrGIrB29xoxfCof0f5s38emd119j3lnUUCZ3P8,1682
|
|
86
|
+
tinybird-0.0.1.dev229.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
87
|
+
tinybird-0.0.1.dev229.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
|
|
88
|
+
tinybird-0.0.1.dev229.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
|
|
89
|
+
tinybird-0.0.1.dev229.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|