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.
- tinybird/__cli__.py +2 -2
- tinybird/ch_utils/engine.py +1 -2
- tinybird/check_pypi.py +3 -1
- tinybird/client.py +6 -6
- tinybird/config.py +2 -1
- tinybird/connectors.py +6 -5
- tinybird/context.py +0 -1
- tinybird/datafile.py +102 -86
- tinybird/datatypes.py +1 -1
- tinybird/feedback_manager.py +1 -1
- tinybird/sql.py +1 -1
- tinybird/sql_template.py +10 -9
- tinybird/sql_template_fmt.py +6 -8
- tinybird/sql_toolset.py +9 -8
- tinybird/syncasync.py +1 -1
- tinybird/tb_cli.py +7 -8
- tinybird/tb_cli_modules/auth.py +4 -6
- tinybird/tb_cli_modules/branch.py +11 -10
- tinybird/tb_cli_modules/cicd.py +4 -4
- tinybird/tb_cli_modules/cli.py +24 -29
- tinybird/tb_cli_modules/common.py +32 -37
- tinybird/tb_cli_modules/config.py +5 -6
- tinybird/tb_cli_modules/connection.py +7 -8
- tinybird/tb_cli_modules/datasource.py +6 -9
- tinybird/tb_cli_modules/exceptions.py +1 -0
- tinybird/tb_cli_modules/job.py +2 -4
- tinybird/tb_cli_modules/pipe.py +6 -5
- tinybird/tb_cli_modules/regions.py +1 -1
- tinybird/tb_cli_modules/telemetry.py +5 -5
- tinybird/tb_cli_modules/test.py +4 -3
- tinybird/tb_cli_modules/tinyunit/tinyunit.py +3 -2
- tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py +1 -1
- tinybird/tb_cli_modules/token.py +5 -5
- tinybird/tb_cli_modules/workspace.py +7 -8
- tinybird/tb_cli_modules/workspace_members.py +5 -6
- tinybird/tornado_template.py +4 -3
- {tinybird_cli-2.1.0.dev10.dist-info → tinybird_cli-2.1.0.dev12.dist-info}/METADATA +11 -1
- tinybird_cli-2.1.0.dev12.dist-info/RECORD +43 -0
- tinybird_cli-2.1.0.dev10.dist-info/RECORD +0 -43
- {tinybird_cli-2.1.0.dev10.dist-info → tinybird_cli-2.1.0.dev12.dist-info}/WHEEL +0 -0
- {tinybird_cli-2.1.0.dev10.dist-info → tinybird_cli-2.1.0.dev12.dist-info}/entry_points.txt +0 -0
- {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.
|
|
8
|
-
__revision__ = '
|
|
7
|
+
__version__ = '2.1.0.dev12'
|
|
8
|
+
__revision__ = '8032292'
|
tinybird/ch_utils/engine.py
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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
tinybird/connectors.py
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import logging
|
|
3
|
-
|
|
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
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
|
|
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
|
|
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
|
-
|
|
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
|
|
28
|
-
|
|
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
|
|
50
|
-
import
|
|
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 .
|
|
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
|
|
63
|
+
from tinybird.tb_cli_modules.exceptions import CLIGitReleaseException, CLIPipeException
|
|
69
64
|
|
|
70
|
-
|
|
71
|
-
from
|
|
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
|
-
|
|
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
|
-
|
|
1906
|
-
AND url
|
|
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
|
-
|
|
4297
|
-
|
|
4298
|
-
|
|
4299
|
-
|
|
4300
|
-
|
|
4301
|
-
|
|
4302
|
-
|
|
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
|
-
|
|
4316
|
+
resource = await getattr(client, get_resource_function)(k["original_name"])
|
|
4308
4317
|
|
|
4309
|
-
|
|
4310
|
-
|
|
4311
|
-
|
|
4312
|
-
|
|
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
|
-
|
|
4315
|
-
|
|
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
|
-
|
|
4318
|
-
|
|
4326
|
+
if not f.exists():
|
|
4327
|
+
f.mkdir(parents=True)
|
|
4319
4328
|
|
|
4320
|
-
|
|
4321
|
-
|
|
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.
|
|
4325
|
-
|
|
4326
|
-
|
|
4327
|
-
|
|
4328
|
-
|
|
4329
|
-
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
4335
|
-
|
|
4336
|
-
|
|
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
tinybird/feedback_manager.py
CHANGED
tinybird/sql.py
CHANGED
tinybird/sql_template.py
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import
|
|
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
|
|
8
|
-
|
|
9
|
-
import
|
|
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 .
|
|
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):
|
tinybird/sql_template_fmt.py
CHANGED
|
@@ -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
|
|
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
|
-
"
|
|
242
|
-
"
|
|
243
|
-
"
|
|
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
|
|
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.
|
|
14
|
-
import tinybird.tb_cli_modules.
|
|
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
|
|
tinybird/tb_cli_modules/auth.py
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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
|
|
tinybird/tb_cli_modules/cicd.py
CHANGED
|
@@ -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
|
|
6
|
-
from
|
|
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
|