tinybird-cli 2.1.0.dev10__py3-none-any.whl → 2.1.0.dev12__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.
Files changed (42) hide show
  1. tinybird/__cli__.py +2 -2
  2. tinybird/ch_utils/engine.py +1 -2
  3. tinybird/check_pypi.py +3 -1
  4. tinybird/client.py +6 -6
  5. tinybird/config.py +2 -1
  6. tinybird/connectors.py +6 -5
  7. tinybird/context.py +0 -1
  8. tinybird/datafile.py +102 -86
  9. tinybird/datatypes.py +1 -1
  10. tinybird/feedback_manager.py +1 -1
  11. tinybird/sql.py +1 -1
  12. tinybird/sql_template.py +10 -9
  13. tinybird/sql_template_fmt.py +6 -8
  14. tinybird/sql_toolset.py +9 -8
  15. tinybird/syncasync.py +1 -1
  16. tinybird/tb_cli.py +7 -8
  17. tinybird/tb_cli_modules/auth.py +4 -6
  18. tinybird/tb_cli_modules/branch.py +11 -10
  19. tinybird/tb_cli_modules/cicd.py +4 -4
  20. tinybird/tb_cli_modules/cli.py +24 -29
  21. tinybird/tb_cli_modules/common.py +32 -37
  22. tinybird/tb_cli_modules/config.py +5 -6
  23. tinybird/tb_cli_modules/connection.py +7 -8
  24. tinybird/tb_cli_modules/datasource.py +6 -9
  25. tinybird/tb_cli_modules/exceptions.py +1 -0
  26. tinybird/tb_cli_modules/job.py +2 -4
  27. tinybird/tb_cli_modules/pipe.py +6 -5
  28. tinybird/tb_cli_modules/regions.py +1 -1
  29. tinybird/tb_cli_modules/telemetry.py +5 -5
  30. tinybird/tb_cli_modules/test.py +4 -3
  31. tinybird/tb_cli_modules/tinyunit/tinyunit.py +3 -2
  32. tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py +1 -1
  33. tinybird/tb_cli_modules/token.py +5 -5
  34. tinybird/tb_cli_modules/workspace.py +7 -8
  35. tinybird/tb_cli_modules/workspace_members.py +5 -6
  36. tinybird/tornado_template.py +4 -3
  37. {tinybird_cli-2.1.0.dev10.dist-info → tinybird_cli-2.1.0.dev12.dist-info}/METADATA +11 -1
  38. tinybird_cli-2.1.0.dev12.dist-info/RECORD +43 -0
  39. tinybird_cli-2.1.0.dev10.dist-info/RECORD +0 -43
  40. {tinybird_cli-2.1.0.dev10.dist-info → tinybird_cli-2.1.0.dev12.dist-info}/WHEEL +0 -0
  41. {tinybird_cli-2.1.0.dev10.dist-info → tinybird_cli-2.1.0.dev12.dist-info}/entry_points.txt +0 -0
  42. {tinybird_cli-2.1.0.dev10.dist-info → tinybird_cli-2.1.0.dev12.dist-info}/top_level.txt +0 -0
tinybird/__cli__.py CHANGED
@@ -4,5 +4,5 @@ __description__ = 'Tinybird Command Line Tool'
4
4
  __url__ = 'https://docs.tinybird.co/cli.html'
5
5
  __author__ = 'Tinybird'
6
6
  __author_email__ = 'support@tinybird.co'
7
- __version__ = '2.1.0.dev10'
8
- __revision__ = '1fec830'
7
+ __version__ = '2.1.0.dev12'
8
+ __revision__ = '8032292'
@@ -1,11 +1,10 @@
1
+ import logging
1
2
  import re
2
3
  from collections import defaultdict
3
4
  from typing import Any, Callable, Dict, Iterable, List, Optional
4
- import logging
5
5
 
6
6
  from ..sql import col_name, engine_replicated_to_local, parse_table_structure
7
7
 
8
-
9
8
  DEFAULT_EMPTY_PARAMETERS = ["ttl", "partition_key", "sorting_key"]
10
9
  DEFAULT_JOIN_EMPTY_PARAMETERS = ["join_strictness", "join_type", "key_columns"]
11
10
 
tinybird/check_pypi.py CHANGED
@@ -1,7 +1,9 @@
1
1
  from typing import Optional
2
+
2
3
  import requests
3
- from tinybird.syncasync import sync_to_async
4
+
4
5
  from tinybird.feedback_manager import FeedbackManager
6
+ from tinybird.syncasync import sync_to_async
5
7
  from tinybird.tb_cli_modules.common import CLIException, getenv_bool
6
8
 
7
9
  PYPY_URL = "https://pypi.org/pypi/tinybird-cli/json"
tinybird/client.py CHANGED
@@ -1,19 +1,19 @@
1
1
  import asyncio
2
2
  import json
3
+ import logging
4
+ import ssl
3
5
  from pathlib import Path
4
- from typing import Any, Callable, Dict, List, Optional, Set, Mapping, Union
6
+ from typing import Any, Callable, Dict, List, Mapping, Optional, Set, Union
7
+ from urllib.parse import quote, urlencode
5
8
 
6
9
  import requests
7
10
  import requests.adapters
8
11
  from requests import Response
9
- import logging
10
- import ssl
11
- from urllib.parse import quote, urlencode
12
12
  from urllib3 import Retry
13
+
13
14
  from tinybird.syncasync import sync_to_async
14
- from tinybird.tb_cli_modules.telemetry import add_telemetry_event
15
15
  from tinybird.tb_cli_modules.regions import fill_with_public_regions
16
-
16
+ from tinybird.tb_cli_modules.telemetry import add_telemetry_event
17
17
 
18
18
  HOST = "https://api.tinybird.co"
19
19
  LIMIT_RETRIES = 10
tinybird/config.py CHANGED
@@ -1,7 +1,8 @@
1
+ import json
1
2
  from os import environ, getcwd
2
3
  from pathlib import Path
3
- import json
4
4
  from typing import Any, Dict, Optional
5
+
5
6
  import click
6
7
 
7
8
  from tinybird import __cli__
tinybird/connectors.py CHANGED
@@ -1,11 +1,12 @@
1
- import os
2
1
  import logging
3
- from typing import Any, Dict, List, Optional, Tuple
2
+ import os
4
3
  import time
4
+ from abc import ABC, abstractmethod
5
+ from datetime import datetime
6
+ from typing import Any, Dict, List, Optional, Tuple
5
7
  from urllib.parse import unquote
8
+
6
9
  import requests
7
- from datetime import datetime
8
- from abc import ABC, abstractmethod
9
10
 
10
11
  from .client import ConnectorNothingToLoad
11
12
 
@@ -26,8 +27,8 @@ except ImportError:
26
27
 
27
28
  try:
28
29
  import googleapiclient.discovery
29
- from google.api_core.exceptions import PreconditionFailed
30
30
  import snowflake.connector
31
+ from google.api_core.exceptions import PreconditionFailed
31
32
  except ImportError:
32
33
  UNINSTALLED_CONNECTORS += ["snowflake"]
33
34
 
tinybird/context.py CHANGED
@@ -1,6 +1,5 @@
1
1
  from contextvars import ContextVar
2
2
 
3
-
4
3
  workspace_id: ContextVar[str] = ContextVar("workspace_id")
5
4
  workspace: ContextVar[str] = ContextVar("workspace")
6
5
  table_id: ContextVar[str] = ContextVar("table_id")
tinybird/datafile.py CHANGED
@@ -1,10 +1,12 @@
1
1
  """
2
2
  Datafile is like a Dockerfile but to describe ETL processes
3
3
  """
4
+ from asyncio import Semaphore, gather
5
+
4
6
  from requests import Response
5
7
 
6
8
  try:
7
- from colorama import Fore, Back, Style, init
9
+ from colorama import Back, Fore, Style, init
8
10
 
9
11
  init()
10
12
  except ImportError: # fallback so that the imported classes always exist
@@ -15,61 +17,60 @@ except ImportError: # fallback so that the imported classes always exist
15
17
 
16
18
  Fore = Back = Style = ColorFallback()
17
19
 
18
- import os
20
+ import difflib
21
+ import glob
19
22
  import itertools
20
- from os import getcwd
21
- import logging
22
- import textwrap
23
23
  import json
24
- from operator import itemgetter
24
+ import logging
25
+ import math
26
+ import os
27
+ import os.path
28
+ import pprint
29
+ import re
25
30
  import shlex
31
+ import shutil
26
32
  import sys
27
- import re
28
- from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Tuple, Union, cast
29
- from enum import Enum
30
- from mypy_extensions import VarArg, KwArg
31
- import difflib
32
- import click
33
- import glob
34
- import pprint
35
- import requests
33
+ import textwrap
34
+ import traceback
36
35
  import unittest
37
- from string import Template
38
- from toposort import toposort
39
- from pathlib import Path
40
36
  import urllib.parse
41
- from urllib.parse import urlencode, urlparse, parse_qs
42
37
  from collections import namedtuple
43
- from io import StringIO
44
- import os.path
45
38
  from copy import deepcopy
46
- import traceback
47
39
  from dataclasses import dataclass
40
+ from enum import Enum
41
+ from io import StringIO
42
+ from operator import itemgetter
43
+ from os import getcwd
44
+ from pathlib import Path
45
+ from statistics import mean, median
46
+ from string import Template
47
+ from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Tuple, Union, cast
48
+ from urllib.parse import parse_qs, urlencode, urlparse
49
+
50
+ import click
51
+ import requests
48
52
  from croniter import croniter
49
- from contextlib import nullcontext
50
- import shutil
53
+ from humanfriendly import format_size
54
+ from humanfriendly.tables import format_pretty_table
55
+ from mypy_extensions import KwArg, VarArg
56
+ from toposort import toposort
51
57
 
52
- from .tornado_template import UnClosedIfError
53
- from .sql import parse_table_structure, schema_to_sql_columns
54
- from .client import TinyB, DoesNotExistException, AuthException, CanNotBeDeletedException
55
- from .sql_template import render_sql_template, get_used_tables_in_template
58
+ from tinybird.config import PROJECT_PATHS
56
59
  from tinybird.sql_template_fmt import format_sql_template
57
- from .feedback_manager import FeedbackManager
58
- from .ch_utils.engine import ENABLED_ENGINES
59
60
  from tinybird.syncasync import sync_to_async
60
- from tinybird.config import PROJECT_PATHS
61
- from statistics import mean, median
62
- import math
63
- from humanfriendly.tables import format_pretty_table
64
- from humanfriendly import format_size
65
-
66
61
  from tinybird.tb_cli_modules.common import _get_tb_client, get_current_main_workspace, getenv_bool, wait_job
67
62
  from tinybird.tb_cli_modules.config import CLIConfig
68
- from tinybird.tb_cli_modules.exceptions import CLIPipeException, CLIGitReleaseException
63
+ from tinybird.tb_cli_modules.exceptions import CLIGitReleaseException, CLIPipeException
69
64
 
70
- os.environ["GIT_PYTHON_REFRESH"] = "quiet"
71
- from git import Repo, HEAD, Diff, InvalidGitRepositoryError, GitCommandError # noqa: E402
65
+ from .ch_utils.engine import ENABLED_ENGINES
66
+ from .client import AuthException, CanNotBeDeletedException, DoesNotExistException, TinyB
67
+ from .feedback_manager import FeedbackManager
68
+ from .sql import parse_table_structure, schema_to_sql_columns
69
+ from .sql_template import get_used_tables_in_template, render_sql_template
70
+ from .tornado_template import UnClosedIfError
72
71
 
72
+ os.environ["GIT_PYTHON_REFRESH"] = "quiet"
73
+ from git import HEAD, Diff, GitCommandError, InvalidGitRepositoryError, Repo # noqa: E402
73
74
 
74
75
  INTERNAL_TABLES: Tuple[str, ...] = (
75
76
  "datasources_ops_log",
@@ -1876,7 +1877,7 @@ class PipeCheckerRunner:
1876
1877
  method as http_method
1877
1878
  FROM {pipe_stats_rt}
1878
1879
  WHERE
1879
- url like '%/{self.pipe_name}.%'
1880
+ pipe_name = '{self.pipe_name}'
1880
1881
  AND url IS NOT NULL
1881
1882
  AND extractURLParameter(assumeNotNull(url), 'from') <> 'ui'
1882
1883
  AND extractURLParameter(assumeNotNull(url), 'pipe_checker') <> 'true'
@@ -1885,6 +1886,7 @@ class PipeCheckerRunner:
1885
1886
  AND not mapContains(parameters, '__tb__semver')
1886
1887
  {" AND " + " AND ".join([f"mapContains(post_params, '{match}')" for match in matches]) if matches and len(matches) > 0 else ''}
1887
1888
  { extra_where_clause }
1889
+ Limit 5000000 -- Enough to bring data while not processing all requests from highly used pipes
1888
1890
  )
1889
1891
  group by request_param_names, http_method
1890
1892
  FORMAT JSON
@@ -1902,8 +1904,8 @@ class PipeCheckerRunner:
1902
1904
  method as http_method
1903
1905
  FROM {pipe_stats_rt}
1904
1906
  WHERE
1905
- url like '%/{self.pipe_name}.%'
1906
- AND url is not null
1907
+ pipe_name = '{self.pipe_name}'
1908
+ AND url IS NOT NULL
1907
1909
  AND extractURLParameter(assumeNotNull(url), 'from') <> 'ui'
1908
1910
  AND extractURLParameter(assumeNotNull(url), 'pipe_checker') <> 'true'
1909
1911
  AND extractURLParameter(assumeNotNull(url), 'debug') <> 'query'
@@ -4250,6 +4252,16 @@ def format_sql(sql: str, DATAFILE_INDENT: str, line_length: Optional[int] = None
4250
4252
  return "\n".join([f"{DATAFILE_INDENT}{part}" for part in sql.split("\n") if len(part.strip())])
4251
4253
 
4252
4254
 
4255
+ async def _gather_with_concurrency(n, *tasks):
4256
+ semaphore = Semaphore(n)
4257
+
4258
+ async def sem_task(task):
4259
+ async with semaphore:
4260
+ return await task
4261
+
4262
+ return await gather(*(sem_task(task) for task in tasks))
4263
+
4264
+
4253
4265
  async def folder_pull(
4254
4266
  client: TinyB,
4255
4267
  folder: str,
@@ -4293,54 +4305,60 @@ async def folder_pull(
4293
4305
  get_resource_function: str,
4294
4306
  progress_bar: bool = False,
4295
4307
  ):
4296
- values = versions.values()
4297
- with click.progressbar(values, label=f"Pulling {extension}s") if progress_bar else nullcontext(values) as values: # type: ignore
4298
- for k in values:
4299
- name = f"{k['name']}.{extension}"
4300
-
4301
- try:
4302
- if pattern and not pattern.search(name):
4303
- if verbose:
4304
- click.echo(FeedbackManager.info_skipping_resource(resource=name))
4305
- continue
4308
+ async def write_resource(k: Dict[str, Any]):
4309
+ name = f"{k['name']}.{extension}"
4310
+ try:
4311
+ if pattern and not pattern.search(name):
4312
+ if verbose:
4313
+ click.echo(FeedbackManager.info_skipping_resource(resource=name))
4314
+ return
4306
4315
 
4307
- resource = await getattr(client, get_resource_function)(k["original_name"])
4316
+ resource = await getattr(client, get_resource_function)(k["original_name"])
4308
4317
 
4309
- dest_folder = folder
4310
- if "." in k["name"] and extension != "token":
4311
- dest_folder = Path(folder) / "vendor" / k["name"].split(".", 1)[0]
4312
- name = f"{k['name'].split('.', 1)[1]}.{extension}"
4318
+ dest_folder = folder
4319
+ if "." in k["name"] and extension != "token":
4320
+ dest_folder = Path(folder) / "vendor" / k["name"].split(".", 1)[0]
4321
+ name = f"{k['name'].split('.', 1)[1]}.{extension}"
4313
4322
 
4314
- file_folder = get_file_folder(extension)
4315
- f = Path(dest_folder) / file_folder if file_folder is not None else Path(dest_folder)
4323
+ file_folder = get_file_folder(extension)
4324
+ f = Path(dest_folder) / file_folder if file_folder is not None else Path(dest_folder)
4316
4325
 
4317
- if not f.exists():
4318
- f.mkdir(parents=True)
4326
+ if not f.exists():
4327
+ f.mkdir(parents=True)
4319
4328
 
4320
- f = f / name
4321
- resource_names = [x.split(".")[-1] for x in resources]
4329
+ f = f / name
4330
+ resource_names = [x.split(".")[-1] for x in resources]
4322
4331
 
4332
+ if verbose:
4333
+ click.echo(FeedbackManager.info_writing_resource(resource=f))
4334
+ if not f.exists() or force:
4335
+ with open(f, "w") as fd:
4336
+ # versions are a client only thing so
4337
+ # datafiles from the server do not contains information about versions
4338
+ if k["version"] >= 0:
4339
+ resource = f"VERSION {k['version']}\n" + resource
4340
+ if resource:
4341
+ matches = re.findall(r"([^\s\.]*__v\d+)", resource)
4342
+ for match in set(matches):
4343
+ m = match.split("__v")[0]
4344
+ if m in resources or m in resource_names:
4345
+ resource = resource.replace(match, m)
4346
+ fd.write(resource)
4347
+ else:
4323
4348
  if verbose:
4324
- click.echo(FeedbackManager.info_writing_resource(resource=f))
4325
- if not f.exists() or force:
4326
- with open(f, "w") as fd:
4327
- # versions are a client only thing so
4328
- # datafiles from the server do not contains information about versions
4329
- if k["version"] >= 0:
4330
- resource = f"VERSION {k['version']}\n" + resource
4331
- if resource:
4332
- matches = re.findall(r"([^\s\.]*__v\d+)", resource)
4333
- for match in set(matches):
4334
- m = match.split("__v")[0]
4335
- if m in resources or m in resource_names:
4336
- resource = resource.replace(match, m)
4337
- fd.write(resource)
4338
- else:
4339
- if verbose:
4340
- click.echo(FeedbackManager.info_skip_already_exists())
4341
- except Exception as e:
4342
- raise click.ClickException(FeedbackManager.error_exception(error=e))
4343
- return
4349
+ click.echo(FeedbackManager.info_skip_already_exists())
4350
+ except Exception as e:
4351
+ raise click.ClickException(FeedbackManager.error_exception(error=e))
4352
+
4353
+ values = versions.values()
4354
+
4355
+ if progress_bar:
4356
+ with click.progressbar(values, label=f"Pulling {extension}s"):
4357
+ for k in values:
4358
+ await write_resource(k)
4359
+ else:
4360
+ tasks = [write_resource(k) for k in values]
4361
+ await _gather_with_concurrency(5, *tasks)
4344
4362
 
4345
4363
  try:
4346
4364
  datasources = await client.datasources()
@@ -4404,6 +4422,7 @@ async def diff_command(
4404
4422
  if filenames:
4405
4423
  if len(filenames) == 1:
4406
4424
  filenames = [filenames[0]] + get_project_filenames(filenames[0])
4425
+ await folder_pull(client, target_dir, False, None, True, verbose=False)
4407
4426
  else:
4408
4427
  filenames = get_project_filenames(".")
4409
4428
  if verbose:
@@ -4439,9 +4458,6 @@ async def diff_command(
4439
4458
  continue
4440
4459
 
4441
4460
  suffix = ".datasource" if ".datasource" in file else ".pipe"
4442
-
4443
- if with_explicit_filenames:
4444
- await folder_pull(client, target_dir, False, None, True, verbose=False)
4445
4461
  target = target_dir + os.path.sep + rfilename + suffix
4446
4462
 
4447
4463
  diff_lines = await diff_files(target, file, with_format=fmt, with_color=(not no_color), client=client)
tinybird/datatypes.py CHANGED
@@ -1,5 +1,5 @@
1
- import re
2
1
  import ast
2
+ import re
3
3
 
4
4
  datetime64_patterns = [
5
5
  r"\d\d\d\d.\d\d.\d\d(T|\s)\d\d:\d\d:\d\d.\d\d\d",
@@ -1,5 +1,5 @@
1
1
  from collections import namedtuple
2
- from typing import Callable, Any
2
+ from typing import Any, Callable
3
3
 
4
4
  FeedbackMessage = namedtuple("FeedbackMessage", "message")
5
5
 
tinybird/sql.py CHANGED
@@ -1,6 +1,6 @@
1
- from collections import namedtuple
2
1
  import re
3
2
  import string
3
+ from collections import namedtuple
4
4
  from typing import Any, Dict, Iterable, List, Optional
5
5
 
6
6
 
tinybird/sql_template.py CHANGED
@@ -1,17 +1,18 @@
1
- import logging
1
+ import ast
2
2
  import builtins
3
+ import linecache
4
+ import logging
5
+ import re
6
+ from datetime import datetime
3
7
  from functools import lru_cache
4
- from tornado import escape
5
- from typing import Optional, Tuple, Union
6
8
  from io import StringIO
7
- import ast
8
- import re
9
- import linecache
9
+ from typing import Optional, Tuple, Union
10
+
11
+ from tornado import escape
10
12
  from tornado.util import ObjectDict, exec_in, unicode_type
11
- from .datatypes import testers
12
- from datetime import datetime
13
13
 
14
- from .tornado_template import Template, SecurityException, VALID_CUSTOM_FUNCTION_NAMES
14
+ from .datatypes import testers
15
+ from .tornado_template import VALID_CUSTOM_FUNCTION_NAMES, SecurityException, Template
15
16
 
16
17
 
17
18
  class SQLTemplateCustomError(Exception):
@@ -1,20 +1,18 @@
1
1
  import logging
2
- from typing import Any, Dict, List, Optional
3
2
  from dataclasses import dataclass
4
3
  from types import MethodType
4
+ from typing import Any, Dict, List, Optional
5
5
 
6
- from sqlfmt import api
7
- from sqlfmt.mode import Mode
8
- from sqlfmt.dialect import ClickHouse
9
- from sqlfmt import actions
6
+ from sqlfmt import actions, api
10
7
  from sqlfmt.analyzer import Rule, group
11
- from sqlfmt.line import Line
12
8
  from sqlfmt.comment import Comment
9
+ from sqlfmt.dialect import ClickHouse
10
+ from sqlfmt.jinjafmt import JinjaFormatter, JinjaTag
11
+ from sqlfmt.line import Line
12
+ from sqlfmt.mode import Mode
13
13
  from sqlfmt.node import Node
14
14
  from sqlfmt.node_manager import NodeManager
15
15
  from sqlfmt.token import Token, TokenType
16
- from sqlfmt.jinjafmt import JinjaTag, JinjaFormatter
17
-
18
16
 
19
17
  # This class extends and monkey patches https://github.com/tconbeer/sqlfm
20
18
  INDENT = " " * 4
tinybird/sql_toolset.py CHANGED
@@ -1,13 +1,14 @@
1
+ import copy
1
2
  import logging
2
- from datetime import datetime
3
- from chtoolset import query as chquery
4
3
  from collections import defaultdict
4
+ from datetime import datetime
5
5
  from functools import lru_cache
6
+ from typing import Any, List, Optional, Set, Tuple
7
+
8
+ from chtoolset import query as chquery
6
9
  from toposort import toposort
7
- from typing import List, Tuple, Set, Optional, Any
8
- from tinybird.ch_utils.constants import ENABLED_TABLE_FUNCTIONS
9
10
 
10
- import copy
11
+ from tinybird.ch_utils.constants import ENABLED_TABLE_FUNCTIONS
11
12
 
12
13
  VALID_REMOTE = "VALID_REMOTE"
13
14
 
@@ -238,9 +239,9 @@ def replace_tables(
238
239
  logging.info(
239
240
  "Resource not found in replace_tables: %s",
240
241
  {
241
- "sql": sql,
242
- "replacements": replacements,
243
- "deps_sorted": deps_sorted,
242
+ "r": r,
243
+ "default_database": default_database,
244
+ "_replaced_with": _replaced_with,
244
245
  "valid_tables": valid_tables,
245
246
  },
246
247
  )
tinybird/syncasync.py CHANGED
@@ -37,7 +37,7 @@ import sys
37
37
  import threading
38
38
  import warnings
39
39
  import weakref
40
- from concurrent.futures import Future, ThreadPoolExecutor, Executor
40
+ from concurrent.futures import Executor, Future, ThreadPoolExecutor
41
41
  from typing import Any, Callable, Dict, Optional
42
42
 
43
43
  if sys.version_info >= (3, 7):
tinybird/tb_cli.py CHANGED
@@ -1,22 +1,21 @@
1
- import sys
2
1
  import asyncio
2
+ import sys
3
3
 
4
4
  if sys.platform == "win32":
5
5
  asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
6
6
 
7
- import tinybird.tb_cli_modules.common
8
- import tinybird.tb_cli_modules.cli
9
7
  import tinybird.tb_cli_modules.auth
10
- import tinybird.tb_cli_modules.workspace
11
- import tinybird.tb_cli_modules.workspace_members
12
8
  import tinybird.tb_cli_modules.branch
13
- import tinybird.tb_cli_modules.datasource
14
- import tinybird.tb_cli_modules.pipe
9
+ import tinybird.tb_cli_modules.cli
10
+ import tinybird.tb_cli_modules.common
15
11
  import tinybird.tb_cli_modules.connection
12
+ import tinybird.tb_cli_modules.datasource
16
13
  import tinybird.tb_cli_modules.job
14
+ import tinybird.tb_cli_modules.pipe
17
15
  import tinybird.tb_cli_modules.test
18
16
  import tinybird.tb_cli_modules.token
19
-
17
+ import tinybird.tb_cli_modules.workspace
18
+ import tinybird.tb_cli_modules.workspace_members
20
19
 
21
20
  cli = tinybird.tb_cli_modules.cli.cli
22
21
 
@@ -3,23 +3,21 @@
3
3
  # - If it makes sense and only when strictly necessary, you can create utility functions in this file.
4
4
  # - But please, **do not** interleave utility functions and command definitions.
5
5
 
6
- import click
7
-
8
6
  from typing import Any, Dict, List, Optional
9
7
 
8
+ import click
10
9
  import humanfriendly.tables
11
10
 
12
11
  from tinybird.feedback_manager import FeedbackManager
13
-
14
12
  from tinybird.tb_cli_modules.cli import cli
15
13
  from tinybird.tb_cli_modules.common import (
16
- try_update_config_with_remote,
17
- try_authenticate,
18
14
  configure_connector,
19
15
  coro,
16
+ echo_safe_humanfriendly_tables_format_smart_table,
20
17
  get_host_from_region_temp,
21
18
  get_regions_temp,
22
- echo_safe_humanfriendly_tables_format_smart_table,
19
+ try_authenticate,
20
+ try_update_config_with_remote,
23
21
  )
24
22
  from tinybird.tb_cli_modules.config import CLIConfig, ConfigValueOrigin
25
23
  from tinybird.tb_cli_modules.exceptions import CLIAuthException
@@ -3,30 +3,31 @@
3
3
  # - If it makes sense and only when strictly necessary, you can create utility functions in this file.
4
4
  # - But please, **do not** interleave utility functions and command definitions.
5
5
 
6
+ import os
6
7
  from os import getcwd
7
- from typing import List, Tuple, Optional
8
+ from typing import List, Optional, Tuple
9
+
8
10
  import click
9
11
  import yaml
10
- import os
11
12
 
13
+ from tinybird.datafile import create_release, wait_job
14
+ from tinybird.feedback_manager import FeedbackManager
12
15
  from tinybird.tb_cli_modules.cli import cli
13
16
  from tinybird.tb_cli_modules.common import (
17
+ MAIN_BRANCH,
14
18
  coro,
15
- get_current_main_workspace_temp,
16
19
  create_workspace_branch,
17
- switch_to_workspace_by_user_workspace_data,
18
- print_current_workspace,
19
- print_data_branch_summary,
20
20
  echo_safe_humanfriendly_tables_format_smart_table,
21
+ get_current_main_workspace_temp,
21
22
  get_current_workspace_branches,
22
- MAIN_BRANCH,
23
- print_current_branch,
24
23
  print_branch_regression_tests_summary,
24
+ print_current_branch,
25
+ print_current_workspace,
26
+ print_data_branch_summary,
27
+ switch_to_workspace_by_user_workspace_data,
25
28
  switch_workspace,
26
29
  try_update_config_with_remote,
27
30
  )
28
- from tinybird.feedback_manager import FeedbackManager
29
- from tinybird.datafile import wait_job, create_release
30
31
  from tinybird.tb_cli_modules.config import CLIConfig
31
32
  from tinybird.tb_cli_modules.exceptions import CLIBranchException, CLIException, CLIReleaseException
32
33
 
@@ -1,11 +1,11 @@
1
+ from dataclasses import dataclass
1
2
  from enum import Enum
2
- from pathlib import Path
3
- from typing import Optional, Any, Dict, Union, Type, List
4
3
  from os import getcwd
5
- from tornado.template import Template
6
- from dataclasses import dataclass
4
+ from pathlib import Path
5
+ from typing import Any, Dict, List, Optional, Type, Union
7
6
 
8
7
  import click
8
+ from tornado.template import Template
9
9
 
10
10
  from tinybird.client import TinyB
11
11
  from tinybird.feedback_manager import FeedbackManager