tinybird 0.0.1.dev191__py3-none-any.whl → 0.0.1.dev193__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/tb/__cli__.py +2 -2
- tinybird/tb/modules/build.py +1 -2
- tinybird/tb/modules/datasource.py +24 -9
- tinybird/tb/modules/deployment.py +30 -17
- tinybird/tb/modules/project.py +12 -3
- {tinybird-0.0.1.dev191.dist-info → tinybird-0.0.1.dev193.dist-info}/METADATA +1 -1
- {tinybird-0.0.1.dev191.dist-info → tinybird-0.0.1.dev193.dist-info}/RECORD +10 -10
- {tinybird-0.0.1.dev191.dist-info → tinybird-0.0.1.dev193.dist-info}/WHEEL +0 -0
- {tinybird-0.0.1.dev191.dist-info → tinybird-0.0.1.dev193.dist-info}/entry_points.txt +0 -0
- {tinybird-0.0.1.dev191.dist-info → tinybird-0.0.1.dev193.dist-info}/top_level.txt +0 -0
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.dev193'
|
|
8
|
+
__revision__ = '1b9821e'
|
tinybird/tb/modules/build.py
CHANGED
|
@@ -258,7 +258,6 @@ def show_data(tb_client: TinyB, filename: str, diff: Optional[str] = None):
|
|
|
258
258
|
table_name = diff
|
|
259
259
|
resource_path = Path(filename)
|
|
260
260
|
resource_name = resource_path.stem
|
|
261
|
-
resource_content = resource_path.read_text()
|
|
262
261
|
|
|
263
262
|
pipeline = resource_name if filename.endswith(".pipe") else None
|
|
264
263
|
|
|
@@ -269,7 +268,7 @@ def show_data(tb_client: TinyB, filename: str, diff: Optional[str] = None):
|
|
|
269
268
|
|
|
270
269
|
res = asyncio.run(tb_client.query(sql, pipeline=pipeline))
|
|
271
270
|
print_table_formatted(res, table_name)
|
|
272
|
-
if Project.
|
|
271
|
+
if Project.get_pipe_type(filename) == "endpoint":
|
|
273
272
|
example_params = {
|
|
274
273
|
"format": "json",
|
|
275
274
|
"pipe": resource_name,
|
|
@@ -127,7 +127,7 @@ async def datasource_ls(ctx: Context, match: Optional[str], format_: str):
|
|
|
127
127
|
|
|
128
128
|
@datasource.command(name="append")
|
|
129
129
|
@click.argument("datasource_name", required=False)
|
|
130
|
-
@click.argument("data",
|
|
130
|
+
@click.argument("data", required=False)
|
|
131
131
|
@click.option("--url", type=str, help="URL to append data from")
|
|
132
132
|
@click.option("--file", type=str, help="Local file to append data from")
|
|
133
133
|
@click.option("--events", type=str, help="Events to append data from")
|
|
@@ -159,15 +159,30 @@ async def datasource_append(
|
|
|
159
159
|
|
|
160
160
|
# If data is passed as argument, we detect if it's a JSON object, a URL or a file
|
|
161
161
|
if data:
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
VALID_EXTENSIONS = [
|
|
163
|
+
"csv",
|
|
164
|
+
"csv.gz",
|
|
165
|
+
"ndjson",
|
|
166
|
+
"ndjson.gz",
|
|
167
|
+
"jsonl",
|
|
168
|
+
"jsonl.gz",
|
|
169
|
+
"json",
|
|
170
|
+
"json.gz",
|
|
171
|
+
"parquet",
|
|
172
|
+
"parquet.gz",
|
|
173
|
+
]
|
|
174
|
+
is_file_or_url = data and (data.startswith("http") or any(data.endswith(f".{ext}") for ext in VALID_EXTENSIONS))
|
|
175
|
+
if is_file_or_url:
|
|
176
|
+
try:
|
|
177
|
+
if urlparse(data).scheme in ("http", "https"):
|
|
178
|
+
url = data
|
|
179
|
+
except Exception:
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
if not url:
|
|
183
|
+
file = data
|
|
184
|
+
else:
|
|
164
185
|
events = data
|
|
165
|
-
except Exception:
|
|
166
|
-
pass
|
|
167
|
-
if urlparse(data).scheme in ("http", "https"):
|
|
168
|
-
url = data
|
|
169
|
-
if not events and not url:
|
|
170
|
-
file = data
|
|
171
186
|
|
|
172
187
|
# If data is not passed as argument, we use the data from the options
|
|
173
188
|
if not data:
|
|
@@ -15,7 +15,7 @@ from tinybird.tb.modules.common import (
|
|
|
15
15
|
get_display_cloud_host,
|
|
16
16
|
sys_exit,
|
|
17
17
|
)
|
|
18
|
-
from tinybird.tb.modules.feedback_manager import FeedbackManager
|
|
18
|
+
from tinybird.tb.modules.feedback_manager import FeedbackManager, bcolors
|
|
19
19
|
from tinybird.tb.modules.project import Project
|
|
20
20
|
|
|
21
21
|
|
|
@@ -229,10 +229,17 @@ def promote_deployment(host: Optional[str], headers: dict, wait: bool) -> None:
|
|
|
229
229
|
|
|
230
230
|
last_deployment = result.get("deployment")
|
|
231
231
|
if last_deployment.get("status") == "deleted":
|
|
232
|
-
click.echo(FeedbackManager.success(message="✓ Deployment is live!"))
|
|
232
|
+
click.echo(FeedbackManager.success(message=f"✓ Deployment #{candidate_deployment.get('id')} is live!"))
|
|
233
233
|
break
|
|
234
234
|
|
|
235
235
|
time.sleep(5)
|
|
236
|
+
if last_deployment.get("id") == "0":
|
|
237
|
+
# This is the first deployment, so we prompt the user to ingest data
|
|
238
|
+
click.echo(
|
|
239
|
+
FeedbackManager.info(
|
|
240
|
+
message="A deployment with no data is useless. Learn how to ingest at https://www.tinybird.co/docs/forward/get-data-in"
|
|
241
|
+
)
|
|
242
|
+
)
|
|
236
243
|
|
|
237
244
|
|
|
238
245
|
# TODO(eclbg): This logic should be in the server, and there should be a dedicated endpoint for discarding a
|
|
@@ -590,8 +597,8 @@ def create_deployment(
|
|
|
590
597
|
if status == "success":
|
|
591
598
|
host = get_display_cloud_host(client.host)
|
|
592
599
|
click.echo(
|
|
593
|
-
FeedbackManager.
|
|
594
|
-
+
|
|
600
|
+
FeedbackManager.info(message="Deployment URL: ")
|
|
601
|
+
+ f"{bcolors.UNDERLINE}{host}/{config.get('name')}/deployments/{deployment.get('id')}{bcolors.ENDC}"
|
|
595
602
|
)
|
|
596
603
|
|
|
597
604
|
if wait:
|
|
@@ -655,40 +662,46 @@ def create_deployment(
|
|
|
655
662
|
|
|
656
663
|
def print_changes(result: dict, project: Project) -> None:
|
|
657
664
|
deployment = result.get("deployment", {})
|
|
658
|
-
resources_columns = ["status", "name", "path"]
|
|
665
|
+
resources_columns = ["status", "name", "type", "path"]
|
|
659
666
|
resources: list[list[Union[str, None]]] = []
|
|
660
667
|
tokens_columns = ["Change", "Token name", "Added permissions", "Removed permissions"]
|
|
661
668
|
tokens: list[Tuple[str, str, str, str]] = []
|
|
662
669
|
|
|
663
670
|
for ds in deployment.get("new_datasource_names", []):
|
|
664
|
-
resources.append(["new", ds, project.get_resource_path(ds, "datasource")])
|
|
671
|
+
resources.append(["new", ds, "datasource", project.get_resource_path(ds, "datasource")])
|
|
665
672
|
|
|
666
673
|
for p in deployment.get("new_pipe_names", []):
|
|
667
|
-
|
|
674
|
+
path = str(project.get_resource_path(p, "pipe"))
|
|
675
|
+
pipe_type = project.get_pipe_type(path)
|
|
676
|
+
resources.append(["new", p, pipe_type, path])
|
|
668
677
|
|
|
669
678
|
for dc in deployment.get("new_data_connector_names", []):
|
|
670
|
-
resources.append(["new", dc, project.get_resource_path(dc, "connection")])
|
|
679
|
+
resources.append(["new", dc, "connection", project.get_resource_path(dc, "connection")])
|
|
671
680
|
|
|
672
681
|
for ds in deployment.get("changed_datasource_names", []):
|
|
673
|
-
resources.append(["modified", ds, project.get_resource_path(ds, "datasource")])
|
|
682
|
+
resources.append(["modified", ds, "datasource", project.get_resource_path(ds, "datasource")])
|
|
674
683
|
|
|
675
684
|
for p in deployment.get("changed_pipe_names", []):
|
|
676
|
-
|
|
685
|
+
path = str(project.get_resource_path(p, "pipe"))
|
|
686
|
+
pipe_type = project.get_pipe_type(path)
|
|
687
|
+
resources.append(["modified", p, pipe_type, path])
|
|
677
688
|
|
|
678
689
|
for dc in deployment.get("changed_data_connector_names", []):
|
|
679
|
-
resources.append(["modified", dc, project.get_resource_path(dc, "connection")])
|
|
690
|
+
resources.append(["modified", dc, "connection", project.get_resource_path(dc, "connection")])
|
|
680
691
|
|
|
681
692
|
for ds in deployment.get("disconnected_data_source_names", []):
|
|
682
|
-
resources.append(["modified", ds, project.get_resource_path(ds, "datasource")])
|
|
693
|
+
resources.append(["modified", ds, "datasource", project.get_resource_path(ds, "datasource")])
|
|
683
694
|
|
|
684
695
|
for ds in deployment.get("deleted_datasource_names", []):
|
|
685
|
-
resources.append(["deleted", ds, project.get_resource_path(ds, "datasource")])
|
|
696
|
+
resources.append(["deleted", ds, "datasource", project.get_resource_path(ds, "datasource")])
|
|
686
697
|
|
|
687
698
|
for p in deployment.get("deleted_pipe_names", []):
|
|
688
|
-
|
|
699
|
+
path = str(project.get_resource_path(p, "pipe"))
|
|
700
|
+
pipe_type = project.get_pipe_type(path)
|
|
701
|
+
resources.append(["deleted", p, pipe_type, path])
|
|
689
702
|
|
|
690
703
|
for dc in deployment.get("deleted_data_connector_names", []):
|
|
691
|
-
resources.append(["deleted", dc, project.get_resource_path(dc, "connection")])
|
|
704
|
+
resources.append(["deleted", dc, "connection", project.get_resource_path(dc, "connection")])
|
|
692
705
|
|
|
693
706
|
for token_change in deployment.get("token_changes", []):
|
|
694
707
|
token_name = token_change.get("token_name")
|
|
@@ -707,9 +720,9 @@ def print_changes(result: dict, project: Project) -> None:
|
|
|
707
720
|
click.echo(FeedbackManager.info(message="\n* Changes to be deployed:"))
|
|
708
721
|
echo_safe_humanfriendly_tables_format_smart_table(resources, column_names=resources_columns)
|
|
709
722
|
else:
|
|
710
|
-
click.echo(FeedbackManager.
|
|
723
|
+
click.echo(FeedbackManager.gray(message="\n* No changes to be deployed"))
|
|
711
724
|
if tokens:
|
|
712
725
|
click.echo(FeedbackManager.info(message="\n* Changes in tokens to be deployed:"))
|
|
713
726
|
echo_safe_humanfriendly_tables_format_smart_table(tokens, column_names=tokens_columns)
|
|
714
727
|
else:
|
|
715
|
-
click.echo(FeedbackManager.
|
|
728
|
+
click.echo(FeedbackManager.gray(message="* No changes in tokens to be deployed"))
|
tinybird/tb/modules/project.py
CHANGED
|
@@ -51,7 +51,9 @@ class Project:
|
|
|
51
51
|
return project_files
|
|
52
52
|
|
|
53
53
|
def get_resource_path(self, resource_name: str, resource_type: str) -> Optional[str]:
|
|
54
|
-
full_path = next(
|
|
54
|
+
full_path = next(
|
|
55
|
+
(p for p in self.get_project_files() if p.endswith("/" + resource_name + f".{resource_type}")), ""
|
|
56
|
+
)
|
|
55
57
|
if not full_path:
|
|
56
58
|
return None
|
|
57
59
|
return Path(full_path).relative_to(self.path).as_posix()
|
|
@@ -114,8 +116,15 @@ class Project:
|
|
|
114
116
|
return datafiles
|
|
115
117
|
|
|
116
118
|
@staticmethod
|
|
117
|
-
def
|
|
118
|
-
|
|
119
|
+
def get_pipe_type(path: str) -> str:
|
|
120
|
+
content = Path(path).read_text()
|
|
121
|
+
if re.search(r"TYPE endpoint", content, re.IGNORECASE):
|
|
122
|
+
return "endpoint"
|
|
123
|
+
elif re.search(r"TYPE materialized", content, re.IGNORECASE):
|
|
124
|
+
return "materialization"
|
|
125
|
+
elif re.search(r"TYPE copy", content, re.IGNORECASE):
|
|
126
|
+
return "copy"
|
|
127
|
+
return "pipe"
|
|
119
128
|
|
|
120
129
|
@staticmethod
|
|
121
130
|
def is_kafka_connection(content: str) -> bool:
|
|
@@ -12,12 +12,12 @@ 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=aYvg2C_WxYWsnqPdZB1ZFoIr8ZY-XjUXYyHKE9Ansj0,3890
|
|
14
14
|
tinybird/ch_utils/engine.py,sha256=X4tE9OrfaUy6kO9cqVEzyI9cDcmOF3IAssRRzsTsfEQ,40781
|
|
15
|
-
tinybird/tb/__cli__.py,sha256=
|
|
15
|
+
tinybird/tb/__cli__.py,sha256=rqSzdlg51t2GUpwT8SnAfh-khtwhZTHokHMinOPEY-s,247
|
|
16
16
|
tinybird/tb/check_pypi.py,sha256=rW4QmDRbtgKdUUwJCnBkVjmTjZSZGN-XgZhx7vMkC0w,1009
|
|
17
17
|
tinybird/tb/cli.py,sha256=u3eGOhX0MHkuT6tiwaZ0_3twqLmqKXDAOxF7yV_Nn9Q,1075
|
|
18
18
|
tinybird/tb/client.py,sha256=CO-dQw8h28X6T6IO-Z79yPBKaJQT1Rwya5b6gexvw58,56491
|
|
19
19
|
tinybird/tb/config.py,sha256=jT9xndpeCY_g0HdB5qE2EquC0TFRRnkPnQFWZWd04jo,3998
|
|
20
|
-
tinybird/tb/modules/build.py,sha256=
|
|
20
|
+
tinybird/tb/modules/build.py,sha256=Deuq1Qk7c5Uapz92Vn9Bp7CrjDylRWER5hBvKGS3QxE,19370
|
|
21
21
|
tinybird/tb/modules/cicd.py,sha256=Njb6eZOHHbUkoJJx6KoixO9PsfA_T-3Ybkya9-50Ca8,7328
|
|
22
22
|
tinybird/tb/modules/cli.py,sha256=LW77oBqvZ6QB5X96158Kp13Tl24vKdxlyWvsSawpmCo,15399
|
|
23
23
|
tinybird/tb/modules/common.py,sha256=2NRDRll0czmYjwLh3qv3DYL9aP8XgRkRAv5S3meCGfM,84062
|
|
@@ -25,8 +25,8 @@ tinybird/tb/modules/config.py,sha256=ziqW_t_mRVvWOd85VoB4vKyvgMkEfpXDf9H4v38p2xc
|
|
|
25
25
|
tinybird/tb/modules/connection.py,sha256=z1xWP2gtjKEbjc4ZF1aD7QUgl8V--wf2IRNy-4sRFm8,9779
|
|
26
26
|
tinybird/tb/modules/copy.py,sha256=2Mm4FWKehOG7CoOhiF1m9UZJgJn0W1_cMolqju8ONYg,5805
|
|
27
27
|
tinybird/tb/modules/create.py,sha256=2uW-4t7c7e4xkZ-GpK_8XaA-nuXwklq7rTks4k6qrtI,20917
|
|
28
|
-
tinybird/tb/modules/datasource.py,sha256=
|
|
29
|
-
tinybird/tb/modules/deployment.py,sha256=
|
|
28
|
+
tinybird/tb/modules/datasource.py,sha256=7r7wxU56Cabkg-rqNVOPkANHtMtZ03A1mWCCuK9t-8Q,37436
|
|
29
|
+
tinybird/tb/modules/deployment.py,sha256=aVVg-ZqpZSNp8f8RQflAKijQsyRs9W6tys-xzHUUrMI,28169
|
|
30
30
|
tinybird/tb/modules/deprecations.py,sha256=rrszC1f_JJeJ8mUxGoCxckQTJFBCR8wREf4XXXN-PRc,4507
|
|
31
31
|
tinybird/tb/modules/dev_server.py,sha256=57FCKuWpErwYUYgHspYDkLWEm9F4pbvVOtMrFXX1fVU,10129
|
|
32
32
|
tinybird/tb/modules/endpoint.py,sha256=XySDt3pk66vxOZ0egUfz4bY8bEk3BjOXkv-L0OIJ3sc,12083
|
|
@@ -45,7 +45,7 @@ tinybird/tb/modules/materialization.py,sha256=QJX5kCPhhm6IXBO1JsalVfbQdypCe_eOUD
|
|
|
45
45
|
tinybird/tb/modules/mock.py,sha256=IyHweMUM6bUH8IhyiX2tTMpdVpTFUeAJ41lZ5P42-HQ,5303
|
|
46
46
|
tinybird/tb/modules/open.py,sha256=OuctINN77oexpSjth9uoIZPCelKO4Li-yyVxeSnk1io,1371
|
|
47
47
|
tinybird/tb/modules/pipe.py,sha256=AQKEDagO6e3psPVjJkS_MDbn8aK-apAiLp26k7jgAV0,2432
|
|
48
|
-
tinybird/tb/modules/project.py,sha256=
|
|
48
|
+
tinybird/tb/modules/project.py,sha256=eUO8WKfnBIEz9WofOdgXDiEl26dLJdK-3i3O8OHUOLk,5514
|
|
49
49
|
tinybird/tb/modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
|
|
50
50
|
tinybird/tb/modules/secret.py,sha256=WsqzxxLh9W_jkuHL2JofMXdIJy0lT5WEI-7bQSIDgAc,2921
|
|
51
51
|
tinybird/tb/modules/shell.py,sha256=Zd_4Ak_5tKVX-cw6B4ag36xZeEGHeh-jZpAsIXkoMoE,14116
|
|
@@ -80,8 +80,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
|
|
|
80
80
|
tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
|
|
81
81
|
tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
|
|
82
82
|
tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
|
|
83
|
-
tinybird-0.0.1.
|
|
84
|
-
tinybird-0.0.1.
|
|
85
|
-
tinybird-0.0.1.
|
|
86
|
-
tinybird-0.0.1.
|
|
87
|
-
tinybird-0.0.1.
|
|
83
|
+
tinybird-0.0.1.dev193.dist-info/METADATA,sha256=sn2-N11dklKkdkf6j2ZpXPDnjI2p8rDTLyzRV7JVp6Q,1608
|
|
84
|
+
tinybird-0.0.1.dev193.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
85
|
+
tinybird-0.0.1.dev193.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
|
|
86
|
+
tinybird-0.0.1.dev193.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
|
|
87
|
+
tinybird-0.0.1.dev193.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|