tinybird-cli 5.8.0.dev0__tar.gz → 5.8.0.dev1__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.
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/PKG-INFO +6 -1
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/__cli__.py +2 -2
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/client.py +33 -9
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/datafile.py +23 -9
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/feedback_manager.py +11 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli.py +1 -0
- tinybird-cli-5.8.0.dev1/tinybird/tb_cli_modules/tag.py +116 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird_cli.egg-info/PKG-INFO +6 -1
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird_cli.egg-info/SOURCES.txt +1 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/setup.cfg +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/ch_utils/constants.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/ch_utils/engine.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/check_pypi.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/config.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/connectors.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/context.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/datatypes.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/git_settings.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/sql.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/sql_template.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/sql_template_fmt.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/sql_toolset.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/syncasync.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/auth.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/branch.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/cicd.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/cli.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/common.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/config.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/connection.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/datasource.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/exceptions.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/job.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/pipe.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/regions.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/telemetry.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/test.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/tinyunit/tinyunit.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/token.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/workspace.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/workspace_members.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tornado_template.py +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird_cli.egg-info/dependency_links.txt +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird_cli.egg-info/entry_points.txt +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird_cli.egg-info/requires.txt +0 -0
- {tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird_cli.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: tinybird-cli
|
|
3
|
-
Version: 5.8.0.
|
|
3
|
+
Version: 5.8.0.dev1
|
|
4
4
|
Summary: Tinybird Command Line Tool
|
|
5
5
|
Home-page: https://www.tinybird.co/docs/cli/introduction.html
|
|
6
6
|
Author: Tinybird
|
|
@@ -18,6 +18,11 @@ The Tinybird command-line tool allows you to use all the Tinybird functionality
|
|
|
18
18
|
Changelog
|
|
19
19
|
----------
|
|
20
20
|
|
|
21
|
+
5.8.0.dev1
|
|
22
|
+
***********
|
|
23
|
+
|
|
24
|
+
- `Added` new `tb tag` command.
|
|
25
|
+
|
|
21
26
|
5.8.0.dev0
|
|
22
27
|
***********
|
|
23
28
|
|
|
@@ -4,5 +4,5 @@ __description__ = 'Tinybird Command Line Tool'
|
|
|
4
4
|
__url__ = 'https://www.tinybird.co/docs/cli/introduction.html'
|
|
5
5
|
__author__ = 'Tinybird'
|
|
6
6
|
__author_email__ = 'support@tinybird.co'
|
|
7
|
-
__version__ = '5.8.0.
|
|
8
|
-
__revision__ = '
|
|
7
|
+
__version__ = '5.8.0.dev1'
|
|
8
|
+
__revision__ = 'a3056db'
|
|
@@ -103,12 +103,20 @@ class TinyB(object):
|
|
|
103
103
|
self.semver = semver
|
|
104
104
|
|
|
105
105
|
async def _req(
|
|
106
|
-
self,
|
|
106
|
+
self,
|
|
107
|
+
endpoint: str,
|
|
108
|
+
data=None,
|
|
109
|
+
files=None,
|
|
110
|
+
method: str = "GET",
|
|
111
|
+
retries: int = LIMIT_RETRIES,
|
|
112
|
+
use_token: Optional[str] = None,
|
|
113
|
+
**kwargs,
|
|
107
114
|
): # noqa: C901
|
|
108
115
|
url = f"{self.host.strip('/')}/{endpoint.strip('/')}"
|
|
109
116
|
|
|
110
|
-
if self.token
|
|
111
|
-
|
|
117
|
+
token_to_use = use_token if use_token else self.token
|
|
118
|
+
if token_to_use:
|
|
119
|
+
url += ("&" if "?" in endpoint else "?") + "token=" + token_to_use
|
|
112
120
|
if self.version:
|
|
113
121
|
url += ("&" if "?" in url else "?") + "cli_version=" + quote(self.version)
|
|
114
122
|
if self.semver:
|
|
@@ -162,7 +170,7 @@ class TinyB(object):
|
|
|
162
170
|
|
|
163
171
|
if response.status_code == 403:
|
|
164
172
|
error = parse_error_response(response)
|
|
165
|
-
if not
|
|
173
|
+
if not token_to_use:
|
|
166
174
|
raise AuthNoTokenException(f"Forbidden: {error}")
|
|
167
175
|
raise AuthException(f"Forbidden: {error}")
|
|
168
176
|
if response.status_code == 204 or response.status_code == 205:
|
|
@@ -1211,10 +1219,12 @@ class TinyB(object):
|
|
|
1211
1219
|
async def check_auth_login(self) -> Dict[str, Any]:
|
|
1212
1220
|
return await self._req("/v0/auth")
|
|
1213
1221
|
|
|
1214
|
-
async def get_all_tags(self) -> Dict[str, Any]:
|
|
1215
|
-
return await self._req("/v0/tags")
|
|
1222
|
+
async def get_all_tags(self, token: Optional[str] = None) -> Dict[str, Any]:
|
|
1223
|
+
return await self._req("/v0/tags", use_token=token)
|
|
1216
1224
|
|
|
1217
|
-
async def create_tag_with_resource(
|
|
1225
|
+
async def create_tag_with_resource(
|
|
1226
|
+
self, name: str, resource_id: str, resource_name: str, resource_type: str, token: Optional[str] = None
|
|
1227
|
+
):
|
|
1218
1228
|
return await self._req(
|
|
1219
1229
|
"/v0/tags",
|
|
1220
1230
|
method="POST",
|
|
@@ -1222,12 +1232,22 @@ class TinyB(object):
|
|
|
1222
1232
|
data=json.dumps(
|
|
1223
1233
|
{
|
|
1224
1234
|
"name": name,
|
|
1225
|
-
"resources": [{"id":
|
|
1235
|
+
"resources": [{"id": resource_id, "name": resource_name, "type": resource_type}],
|
|
1226
1236
|
}
|
|
1227
1237
|
),
|
|
1238
|
+
use_token=token,
|
|
1228
1239
|
)
|
|
1229
1240
|
|
|
1230
|
-
async def
|
|
1241
|
+
async def create_tag(self, name: str, token: Optional[str] = None):
|
|
1242
|
+
return await self._req(
|
|
1243
|
+
"/v0/tags",
|
|
1244
|
+
method="POST",
|
|
1245
|
+
headers={"Content-Type": "application/json"},
|
|
1246
|
+
data=json.dumps({"name": name}),
|
|
1247
|
+
use_token=token,
|
|
1248
|
+
)
|
|
1249
|
+
|
|
1250
|
+
async def update_tag(self, name: str, resources: List[Dict[str, Any]], token: Optional[str] = None):
|
|
1231
1251
|
await self._req(
|
|
1232
1252
|
f"/v0/tags/{name}",
|
|
1233
1253
|
method="PUT",
|
|
@@ -1237,4 +1257,8 @@ class TinyB(object):
|
|
|
1237
1257
|
"resources": resources,
|
|
1238
1258
|
}
|
|
1239
1259
|
),
|
|
1260
|
+
use_token=token,
|
|
1240
1261
|
)
|
|
1262
|
+
|
|
1263
|
+
async def delete_tag(self, name: str, token: Optional[str] = None):
|
|
1264
|
+
await self._req(f"/v0/tags/{name}", method="DELETE", use_token=token)
|
|
@@ -2686,7 +2686,7 @@ def show_materialized_view_warnings(warnings):
|
|
|
2686
2686
|
)
|
|
2687
2687
|
|
|
2688
2688
|
|
|
2689
|
-
async def update_tags(
|
|
2689
|
+
async def update_tags(resource_id: str, resource_name: str, resource_type: str, tags: List[str], tb_client: TinyB):
|
|
2690
2690
|
def get_tags_for_resource(all_tags: dict, resource_id: str, resource_name: str) -> List[str]:
|
|
2691
2691
|
tag_names = []
|
|
2692
2692
|
|
|
@@ -2709,13 +2709,15 @@ async def update_tags(resourceId: str, resourceName: str, resource_type: str, ta
|
|
|
2709
2709
|
tags_to_remove = list(set(current_tags) - set(new_tags))
|
|
2710
2710
|
return tags_to_add, tags_to_remove
|
|
2711
2711
|
|
|
2712
|
+
token_from_main = await get_token_from_main_branch(tb_client)
|
|
2713
|
+
|
|
2712
2714
|
try:
|
|
2713
|
-
all_tags = await tb_client.get_all_tags()
|
|
2715
|
+
all_tags = await tb_client.get_all_tags(token=token_from_main)
|
|
2714
2716
|
except Exception as e:
|
|
2715
2717
|
raise Exception(FeedbackManager.error_getting_tags(error=str(e)))
|
|
2716
2718
|
|
|
2717
2719
|
# Get all tags of that resource
|
|
2718
|
-
current_tags = get_tags_for_resource(all_tags,
|
|
2720
|
+
current_tags = get_tags_for_resource(all_tags, resource_id, resource_name)
|
|
2719
2721
|
|
|
2720
2722
|
# Get the tags to add and remove
|
|
2721
2723
|
tags_to_add, tags_to_remove = compare_tags(current_tags, tags)
|
|
@@ -2727,15 +2729,21 @@ async def update_tags(resourceId: str, resourceName: str, resource_type: str, ta
|
|
|
2727
2729
|
if not tag:
|
|
2728
2730
|
# Create new tag
|
|
2729
2731
|
try:
|
|
2730
|
-
await tb_client.create_tag_with_resource(
|
|
2732
|
+
await tb_client.create_tag_with_resource(
|
|
2733
|
+
name=tag_name,
|
|
2734
|
+
resource_id=resource_id,
|
|
2735
|
+
resource_name=resource_name,
|
|
2736
|
+
resource_type=resource_type,
|
|
2737
|
+
token=token_from_main,
|
|
2738
|
+
)
|
|
2731
2739
|
except Exception as e:
|
|
2732
2740
|
raise Exception(FeedbackManager.error_creating_tag(error=str(e)))
|
|
2733
2741
|
else:
|
|
2734
2742
|
# Update tag with new resource
|
|
2735
2743
|
resources = tag.get("resources", [])
|
|
2736
|
-
resources.append({"id":
|
|
2744
|
+
resources.append({"id": resource_id, "name": resource_name, "type": resource_type})
|
|
2737
2745
|
try:
|
|
2738
|
-
await tb_client.update_tag(tag.get("name", tag_name), resources)
|
|
2746
|
+
await tb_client.update_tag(tag.get("name", tag_name), resources, token=token_from_main)
|
|
2739
2747
|
except Exception as e:
|
|
2740
2748
|
raise Exception(FeedbackManager.error_updating_tag(error=str(e)))
|
|
2741
2749
|
|
|
@@ -2745,9 +2753,9 @@ async def update_tags(resourceId: str, resourceName: str, resource_type: str, ta
|
|
|
2745
2753
|
|
|
2746
2754
|
if tag:
|
|
2747
2755
|
resources = tag.get("resources", [])
|
|
2748
|
-
resources = [resource for resource in resources if resource.get("name") !=
|
|
2756
|
+
resources = [resource for resource in resources if resource.get("name") != resource_name]
|
|
2749
2757
|
try:
|
|
2750
|
-
await tb_client.update_tag(tag.get("name", tag_name), resources)
|
|
2758
|
+
await tb_client.update_tag(tag.get("name", tag_name), resources, token=token_from_main)
|
|
2751
2759
|
except Exception as e:
|
|
2752
2760
|
raise Exception(FeedbackManager.error_updating_tag(error=str(e)))
|
|
2753
2761
|
|
|
@@ -2782,7 +2790,13 @@ async def update_tags_in_resource(rs: Dict[str, Any], resource_type: str, client
|
|
|
2782
2790
|
|
|
2783
2791
|
if resource_id and resource_name:
|
|
2784
2792
|
try:
|
|
2785
|
-
await update_tags(
|
|
2793
|
+
await update_tags(
|
|
2794
|
+
resource_id=resource_id,
|
|
2795
|
+
resource_name=resource_name,
|
|
2796
|
+
resource_type=resource_type,
|
|
2797
|
+
tags=filtering_tags,
|
|
2798
|
+
tb_client=client,
|
|
2799
|
+
)
|
|
2786
2800
|
except Exception as e:
|
|
2787
2801
|
click.echo(FeedbackManager.error_tag_generic(error=str(e)))
|
|
2788
2802
|
|
|
@@ -396,6 +396,7 @@ class FeedbackManager:
|
|
|
396
396
|
error_creating_tag = error_message("Error creating new tag: {error}")
|
|
397
397
|
error_updating_tag = error_message("Error updating tag: {error}")
|
|
398
398
|
error_tag_generic = error_message("There was an issue updating tags. {error}")
|
|
399
|
+
error_tag_not_found = error_message("Tag {tag_name} not found.")
|
|
399
400
|
|
|
400
401
|
info_incl_relative_path = info_message("** Relative path {path} does not exist, skipping.")
|
|
401
402
|
info_ignoring_incl_file = info_message(
|
|
@@ -610,6 +611,12 @@ Ready? """
|
|
|
610
611
|
warning_pipe_restricted_params = warning_message(
|
|
611
612
|
"** The parameter names {words} and '{last_word}' are reserved words. Please, choose another name or the pipe will not work as expected."
|
|
612
613
|
)
|
|
614
|
+
warning_tag_remove_no_resources = prompt_message(
|
|
615
|
+
"Tag {tag_name} is not used by any resource. Do you want to remove it?"
|
|
616
|
+
)
|
|
617
|
+
warning_tag_remove = prompt_message(
|
|
618
|
+
"Tag {tag_name} is used by {resources_len} resources. Do you want to remove it?"
|
|
619
|
+
)
|
|
613
620
|
|
|
614
621
|
info_fixtures_branch = info_message("** Data Fixtures are only pushed to Branches")
|
|
615
622
|
info_materialize_push_datasource_exists = warning_message("** Data Source {name} already exists")
|
|
@@ -801,6 +808,8 @@ Ready? """
|
|
|
801
808
|
info_release_rollback = info_message(
|
|
802
809
|
"** The following resources IDs are present in the {semver} Release and will be restored:"
|
|
803
810
|
)
|
|
811
|
+
info_tag_list = info_message("** Tags:")
|
|
812
|
+
info_tag_resources = info_message("** Resources tagged by {tag_name}:")
|
|
804
813
|
warning_no_release = warning_message(
|
|
805
814
|
"** Warning: Workspace does not have Releases, run `tb init --git` to activate them."
|
|
806
815
|
)
|
|
@@ -985,5 +994,7 @@ Ready? """
|
|
|
985
994
|
success_delete_token = success_message("** Token '{token}' removed successfully")
|
|
986
995
|
success_refresh_token = success_message("** Token '{token}' refreshed successfully")
|
|
987
996
|
success_copy_token = success_message("** Token '{token}' copied to clipboard")
|
|
997
|
+
success_tag_created = success_message("** Tag '{tag_name}' created!")
|
|
998
|
+
success_tag_removed = success_message("** Tag '{tag_name}' removed!")
|
|
988
999
|
|
|
989
1000
|
debug_running_file = print_message("** Running {file}", bcolors.CGREY)
|
|
@@ -12,6 +12,7 @@ import tinybird.tb_cli_modules.connection
|
|
|
12
12
|
import tinybird.tb_cli_modules.datasource
|
|
13
13
|
import tinybird.tb_cli_modules.job
|
|
14
14
|
import tinybird.tb_cli_modules.pipe
|
|
15
|
+
import tinybird.tb_cli_modules.tag
|
|
15
16
|
import tinybird.tb_cli_modules.test
|
|
16
17
|
import tinybird.tb_cli_modules.token
|
|
17
18
|
import tinybird.tb_cli_modules.workspace
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
from click import Context
|
|
5
|
+
|
|
6
|
+
from tinybird.feedback_manager import FeedbackManager
|
|
7
|
+
from tinybird.tb_cli_modules.cli import cli
|
|
8
|
+
from tinybird.tb_cli_modules.common import (
|
|
9
|
+
coro,
|
|
10
|
+
echo_safe_humanfriendly_tables_format_smart_table,
|
|
11
|
+
get_current_main_workspace,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@cli.group()
|
|
16
|
+
@click.pass_context
|
|
17
|
+
def tag(ctx: Context) -> None:
|
|
18
|
+
"""Tag commands"""
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@tag.command(name="ls")
|
|
22
|
+
@click.argument("tag_name", required=False)
|
|
23
|
+
@click.pass_context
|
|
24
|
+
@coro
|
|
25
|
+
async def tag_ls(ctx: Context, tag_name: Optional[str]) -> None:
|
|
26
|
+
"""List all the tags of the current Workspace or the resources associated to a specific tag."""
|
|
27
|
+
|
|
28
|
+
client = ctx.ensure_object(dict)["client"]
|
|
29
|
+
config = ctx.ensure_object(dict)["config"]
|
|
30
|
+
main_workspace = await get_current_main_workspace(client, config)
|
|
31
|
+
token = main_workspace.get("token") if main_workspace else None
|
|
32
|
+
|
|
33
|
+
response = await client.get_all_tags(token=token)
|
|
34
|
+
|
|
35
|
+
if tag_name:
|
|
36
|
+
the_tag = [tag for tag in response["tags"] if tag["name"] == tag_name]
|
|
37
|
+
|
|
38
|
+
columns = ["name", "id", "type"]
|
|
39
|
+
table = []
|
|
40
|
+
|
|
41
|
+
if len(the_tag) > 0:
|
|
42
|
+
for resource in the_tag[0]["resources"]:
|
|
43
|
+
table.append([resource["name"], resource["id"], resource["type"]])
|
|
44
|
+
|
|
45
|
+
click.echo(FeedbackManager.info_tag_resources(tag_name=tag_name))
|
|
46
|
+
echo_safe_humanfriendly_tables_format_smart_table(table, column_names=columns)
|
|
47
|
+
return
|
|
48
|
+
|
|
49
|
+
columns = ["tag", "resources"]
|
|
50
|
+
table = []
|
|
51
|
+
|
|
52
|
+
for tag in response["tags"]:
|
|
53
|
+
unique_resources = []
|
|
54
|
+
for resource in tag["resources"]:
|
|
55
|
+
if resource.get("name", "") not in unique_resources:
|
|
56
|
+
unique_resources.append(resource) # Reducing by name in case there are duplicates.
|
|
57
|
+
table.append([tag["name"], len(unique_resources)])
|
|
58
|
+
|
|
59
|
+
click.echo(FeedbackManager.info_tag_list())
|
|
60
|
+
echo_safe_humanfriendly_tables_format_smart_table(table, column_names=columns)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@tag.command(name="create")
|
|
64
|
+
@click.argument("tag_name")
|
|
65
|
+
@click.pass_context
|
|
66
|
+
@coro
|
|
67
|
+
async def tag_create(ctx: Context, tag_name: str) -> None:
|
|
68
|
+
"""Create a tag in the current Workspace."""
|
|
69
|
+
|
|
70
|
+
client = ctx.ensure_object(dict)["client"]
|
|
71
|
+
config = ctx.ensure_object(dict)["config"]
|
|
72
|
+
main_workspace = await get_current_main_workspace(client, config)
|
|
73
|
+
token = main_workspace.get("token") if main_workspace else None
|
|
74
|
+
|
|
75
|
+
await client.create_tag(name=tag_name, token=token)
|
|
76
|
+
|
|
77
|
+
click.echo(FeedbackManager.success_tag_created(tag_name=tag_name))
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@tag.command(name="rm")
|
|
81
|
+
@click.argument("tag_name")
|
|
82
|
+
@click.option("--yes", is_flag=True, default=False, help="Do not ask for confirmation to delete the tag.")
|
|
83
|
+
@click.pass_context
|
|
84
|
+
@coro
|
|
85
|
+
async def tag_rm(ctx: Context, tag_name: str, yes: bool) -> None:
|
|
86
|
+
"""Remove a tag from the current Workspace."""
|
|
87
|
+
|
|
88
|
+
client = ctx.ensure_object(dict)["client"]
|
|
89
|
+
config = ctx.ensure_object(dict)["config"]
|
|
90
|
+
main_workspace = await get_current_main_workspace(client, config)
|
|
91
|
+
token = main_workspace.get("token") if main_workspace else None
|
|
92
|
+
|
|
93
|
+
remove_tag = True
|
|
94
|
+
|
|
95
|
+
if not yes:
|
|
96
|
+
all_tags = await client.get_all_tags(token=token)
|
|
97
|
+
the_tag = [tag for tag in all_tags["tags"] if tag["name"] == tag_name]
|
|
98
|
+
if len(the_tag) > 0:
|
|
99
|
+
unique_resources = []
|
|
100
|
+
for resource in the_tag[0]["resources"]:
|
|
101
|
+
if resource.get("name", "") not in unique_resources:
|
|
102
|
+
unique_resources.append(resource) # Reducing by name in case there are duplicates.
|
|
103
|
+
|
|
104
|
+
if len(unique_resources) > 0:
|
|
105
|
+
remove_tag = click.confirm(
|
|
106
|
+
FeedbackManager.warning_tag_remove(tag_name=tag_name, resources_len=len(unique_resources))
|
|
107
|
+
)
|
|
108
|
+
else:
|
|
109
|
+
remove_tag = click.confirm(FeedbackManager.warning_tag_remove_no_resources(tag_name=tag_name))
|
|
110
|
+
else:
|
|
111
|
+
remove_tag = False
|
|
112
|
+
click.echo(FeedbackManager.error_tag_not_found(tag_name=tag_name))
|
|
113
|
+
|
|
114
|
+
if remove_tag:
|
|
115
|
+
await client.delete_tag(tag_name, token=token)
|
|
116
|
+
click.echo(FeedbackManager.success_tag_removed(tag_name=tag_name))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: tinybird-cli
|
|
3
|
-
Version: 5.8.0.
|
|
3
|
+
Version: 5.8.0.dev1
|
|
4
4
|
Summary: Tinybird Command Line Tool
|
|
5
5
|
Home-page: https://www.tinybird.co/docs/cli/introduction.html
|
|
6
6
|
Author: Tinybird
|
|
@@ -18,6 +18,11 @@ The Tinybird command-line tool allows you to use all the Tinybird functionality
|
|
|
18
18
|
Changelog
|
|
19
19
|
----------
|
|
20
20
|
|
|
21
|
+
5.8.0.dev1
|
|
22
|
+
***********
|
|
23
|
+
|
|
24
|
+
- `Added` new `tb tag` command.
|
|
25
|
+
|
|
21
26
|
5.8.0.dev0
|
|
22
27
|
***********
|
|
23
28
|
|
|
@@ -29,6 +29,7 @@ tinybird/tb_cli_modules/exceptions.py
|
|
|
29
29
|
tinybird/tb_cli_modules/job.py
|
|
30
30
|
tinybird/tb_cli_modules/pipe.py
|
|
31
31
|
tinybird/tb_cli_modules/regions.py
|
|
32
|
+
tinybird/tb_cli_modules/tag.py
|
|
32
33
|
tinybird/tb_cli_modules/telemetry.py
|
|
33
34
|
tinybird/tb_cli_modules/test.py
|
|
34
35
|
tinybird/tb_cli_modules/token.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/tinyunit/tinyunit.py
RENAMED
|
File without changes
|
{tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird/tb_cli_modules/workspace_members.py
RENAMED
|
File without changes
|
|
File without changes
|
{tinybird-cli-5.8.0.dev0 → tinybird-cli-5.8.0.dev1}/tinybird_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|