tinybird 0.0.1.dev78__py3-none-any.whl → 0.0.1.dev79__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/config.py +5 -3
- tinybird/tb/__cli__.py +2 -2
- tinybird/tb/modules/auth.py +2 -2
- tinybird/tb/modules/build.py +2 -1
- tinybird/tb/modules/cli.py +4 -4
- tinybird/tb/modules/config.py +51 -34
- tinybird/tb/modules/create.py +28 -24
- tinybird/tb/modules/datafile/build_pipe.py +6 -135
- tinybird/tb/modules/datafile/playground.py +5 -0
- tinybird/tb/modules/deployment.py +9 -1
- tinybird/tb/modules/local_common.py +1 -1
- tinybird/tb/modules/login.py +3 -1
- tinybird/tb/modules/playground.py +4 -4
- tinybird/tb/modules/project.py +5 -7
- tinybird/tb/modules/test.py +1 -1
- {tinybird-0.0.1.dev78.dist-info → tinybird-0.0.1.dev79.dist-info}/METADATA +1 -1
- {tinybird-0.0.1.dev78.dist-info → tinybird-0.0.1.dev79.dist-info}/RECORD +20 -20
- {tinybird-0.0.1.dev78.dist-info → tinybird-0.0.1.dev79.dist-info}/WHEEL +0 -0
- {tinybird-0.0.1.dev78.dist-info → tinybird-0.0.1.dev79.dist-info}/entry_points.txt +0 -0
- {tinybird-0.0.1.dev78.dist-info → tinybird-0.0.1.dev79.dist-info}/top_level.txt +0 -0
tinybird/config.py
CHANGED
|
@@ -68,14 +68,15 @@ LEGACY_HOSTS = {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
async def get_config(
|
|
71
|
+
async def get_config(
|
|
72
|
+
host: str, token: Optional[str], semver: Optional[str] = None, config_file: Optional[str] = None
|
|
73
|
+
) -> Dict[str, Any]:
|
|
72
74
|
if host:
|
|
73
75
|
host = host.rstrip("/")
|
|
74
76
|
|
|
75
|
-
config_file = Path(getcwd()) / ".tinyb"
|
|
76
77
|
config = {}
|
|
77
78
|
try:
|
|
78
|
-
async with aiofiles.open(config_file) as file:
|
|
79
|
+
async with aiofiles.open(config_file or Path(getcwd()) / ".tinyb") as file:
|
|
79
80
|
res = await file.read()
|
|
80
81
|
config = json.loads(res)
|
|
81
82
|
except OSError:
|
|
@@ -89,6 +90,7 @@ async def get_config(host: str, token: Optional[str], semver: Optional[str] = No
|
|
|
89
90
|
config["semver"] = semver or config.get("semver", None)
|
|
90
91
|
config["host"] = host or config.get("host", DEFAULT_API_HOST)
|
|
91
92
|
config["workspaces"] = config.get("workspaces", [])
|
|
93
|
+
config["cwd"] = config.get("cwd", getcwd())
|
|
92
94
|
return config
|
|
93
95
|
|
|
94
96
|
|
tinybird/tb/__cli__.py
CHANGED
|
@@ -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__ = '0.0.1.
|
|
8
|
-
__revision__ = '
|
|
7
|
+
__version__ = '0.0.1.dev79'
|
|
8
|
+
__revision__ = 'f126631'
|
tinybird/tb/modules/auth.py
CHANGED
|
@@ -116,7 +116,7 @@ async def auth_login(host: Optional[str], token: Optional[str]) -> None:
|
|
|
116
116
|
Alternatively, tb will use the authentication token found in the environment
|
|
117
117
|
variable TB_USER_TOKEN. This method is most suitable for "headless" use of tb
|
|
118
118
|
such as in automations or in a CI environment."""
|
|
119
|
-
config = CLIConfig.
|
|
119
|
+
config = CLIConfig.get_project_config()
|
|
120
120
|
|
|
121
121
|
if host:
|
|
122
122
|
config.set_host(host)
|
|
@@ -146,7 +146,7 @@ async def auth_login(host: Optional[str], token: Optional[str]) -> None:
|
|
|
146
146
|
@coro
|
|
147
147
|
async def auth_logout() -> None:
|
|
148
148
|
"""Remove authentication from Tinybird."""
|
|
149
|
-
conf = CLIConfig.
|
|
149
|
+
conf = CLIConfig.get_project_config()
|
|
150
150
|
conf.set_user_token(None)
|
|
151
151
|
conf.persist_to_file()
|
|
152
152
|
|
tinybird/tb/modules/build.py
CHANGED
|
@@ -137,7 +137,8 @@ def build_project(project: Project, tb_client: TinyB, file_changed: Optional[str
|
|
|
137
137
|
error_msg = None
|
|
138
138
|
for build_error in build_errors:
|
|
139
139
|
filename_bit = f"{build_error.get('filename', '')}"
|
|
140
|
-
|
|
140
|
+
error_bit = build_error.get("error") or build_error.get("message") or ""
|
|
141
|
+
error_msg = ((filename_bit + "\n\n") if filename_bit else "") + error_bit
|
|
141
142
|
error = error_msg or "Unknown build error"
|
|
142
143
|
else:
|
|
143
144
|
error = f"Unknown build result. Error: {result.get('error')}"
|
tinybird/tb/modules/cli.py
CHANGED
|
@@ -75,7 +75,6 @@ async def cli(
|
|
|
75
75
|
"""
|
|
76
76
|
Use `OBFUSCATE_REGEX_PATTERN` and `OBFUSCATE_PATTERN_SEPARATOR` environment variables to define a regex pattern and a separator (in case of a single string with multiple regex) to obfuscate secrets in the CLI output.
|
|
77
77
|
"""
|
|
78
|
-
project = Project(folder=os.getcwd())
|
|
79
78
|
# We need to unpatch for our tests not to break
|
|
80
79
|
if show_tokens or not cloud or ctx.invoked_subcommand == "build" or build:
|
|
81
80
|
__unpatch_click_output()
|
|
@@ -88,7 +87,9 @@ async def cli(
|
|
|
88
87
|
if debug:
|
|
89
88
|
logging.basicConfig(level=logging.DEBUG)
|
|
90
89
|
|
|
91
|
-
config_temp = CLIConfig.get_project_config(
|
|
90
|
+
config_temp = CLIConfig.get_project_config()
|
|
91
|
+
project = Project(folder=config_temp.cwd)
|
|
92
|
+
|
|
92
93
|
if token:
|
|
93
94
|
config_temp.set_token(token)
|
|
94
95
|
if host:
|
|
@@ -106,10 +107,9 @@ async def cli(
|
|
|
106
107
|
if not host and "TB_HOST" in os.environ:
|
|
107
108
|
host = os.environ.get("TB_HOST", "")
|
|
108
109
|
|
|
109
|
-
config = await get_config(host, token)
|
|
110
|
+
config = await get_config(host, token, config_file=config_temp._path)
|
|
110
111
|
client = _get_tb_client(config.get("token", None), config["host"])
|
|
111
112
|
|
|
112
|
-
config["path"] = str(project.path)
|
|
113
113
|
# If they have passed a token or host as paramter and it's different that record in .tinyb, refresh the workspace id
|
|
114
114
|
if token or host:
|
|
115
115
|
try:
|
tinybird/tb/modules/config.py
CHANGED
|
@@ -70,6 +70,7 @@ class CLIConfig:
|
|
|
70
70
|
"token": "TB_TOKEN",
|
|
71
71
|
"user_token": "TB_USER_TOKEN",
|
|
72
72
|
"host": "TB_HOST",
|
|
73
|
+
"cwd": "TB_CWD",
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
DEFAULTS: Dict[str, str] = {"host": DEFAULT_API_HOST if not FeatureFlags.is_localhost() else DEFAULT_LOCALHOST}
|
|
@@ -77,9 +78,9 @@ class CLIConfig:
|
|
|
77
78
|
_global: Optional["CLIConfig"] = None
|
|
78
79
|
_projects: Dict[str, "CLIConfig"] = {}
|
|
79
80
|
|
|
80
|
-
def __init__(self, path: Optional[str] = None
|
|
81
|
-
self.
|
|
82
|
-
self.
|
|
81
|
+
def __init__(self, path: Optional[str] = None) -> None:
|
|
82
|
+
self.cwd = os.getcwd()
|
|
83
|
+
self._path = path or self.get_tinyb_file() or os.path.join(os.getcwd(), ".tinyb")
|
|
83
84
|
self._values: Dict[str, ConfigValue] = {}
|
|
84
85
|
self._values["version"] = ConfigValue("version", CURRENT_VERSION, ConfigValueOrigin.DEFAULT)
|
|
85
86
|
self._workspaces: List[Dict[str, Any]] = []
|
|
@@ -94,7 +95,7 @@ class CLIConfig:
|
|
|
94
95
|
|
|
95
96
|
def to_dict(self) -> Dict[str, Any]:
|
|
96
97
|
"""Helper to ease"""
|
|
97
|
-
result: Dict[str, Any] =
|
|
98
|
+
result: Dict[str, Any] = {}
|
|
98
99
|
result.update(dict((v.name, deepcopy(v.value)) for v in self._values.values()))
|
|
99
100
|
return result
|
|
100
101
|
|
|
@@ -107,8 +108,6 @@ class CLIConfig:
|
|
|
107
108
|
"""
|
|
108
109
|
if key in self._values:
|
|
109
110
|
return self._values[key].value
|
|
110
|
-
if self._parent:
|
|
111
|
-
return self._parent[key]
|
|
112
111
|
raise KeyError(key)
|
|
113
112
|
|
|
114
113
|
def __setitem__(self, key: str, value: Any) -> None:
|
|
@@ -126,18 +125,16 @@ class CLIConfig:
|
|
|
126
125
|
def get_value_origin(self, key: str) -> ConfigValueOrigin:
|
|
127
126
|
if key in self._values:
|
|
128
127
|
return self._values[key].origin
|
|
129
|
-
if self._parent:
|
|
130
|
-
return self._parent.get_value_origin(key)
|
|
131
128
|
else:
|
|
132
129
|
return ConfigValueOrigin.NONE
|
|
133
130
|
|
|
134
|
-
def persist_to_file(self,
|
|
131
|
+
def persist_to_file(self, override_with_path: Optional[str] = None) -> None:
|
|
132
|
+
if override_with_path:
|
|
133
|
+
self._path = override_with_path
|
|
134
|
+
|
|
135
135
|
if not self._path:
|
|
136
136
|
raise ValueError("Cannot persist configuration: `path` is None")
|
|
137
137
|
|
|
138
|
-
if override_with_values:
|
|
139
|
-
self.update(override_with_values)
|
|
140
|
-
|
|
141
138
|
os.makedirs(os.path.dirname(self._path), exist_ok=True)
|
|
142
139
|
values = dict(v.as_tuple() for v in self._values.values())
|
|
143
140
|
write_json_file(values, self._path)
|
|
@@ -149,6 +146,9 @@ class CLIConfig:
|
|
|
149
146
|
values: Dict[str, Any] = json.loads(file.read())
|
|
150
147
|
for k, v in values.items():
|
|
151
148
|
self[k] = v
|
|
149
|
+
if "cwd" in values:
|
|
150
|
+
self.set_cwd(values["cwd"])
|
|
151
|
+
|
|
152
152
|
return True
|
|
153
153
|
except OSError:
|
|
154
154
|
return False
|
|
@@ -211,6 +211,9 @@ class CLIConfig:
|
|
|
211
211
|
netloc: str = url_info.netloc.decode() if isinstance(url_info.netloc, bytes) else url_info.netloc
|
|
212
212
|
self["host"] = f"{scheme}://{netloc}"
|
|
213
213
|
|
|
214
|
+
def set_cwd(self, cwd: str) -> None:
|
|
215
|
+
self.cwd = os.path.join(os.path.dirname(self._path) if self._path else os.getcwd(), cwd)
|
|
216
|
+
|
|
214
217
|
def get_host(self, use_defaults_if_needed: bool = False) -> Optional[str]:
|
|
215
218
|
result: Optional[str] = self.get("host", None)
|
|
216
219
|
if result:
|
|
@@ -288,41 +291,55 @@ class CLIConfig:
|
|
|
288
291
|
|
|
289
292
|
return result
|
|
290
293
|
|
|
291
|
-
def spawn(self) -> "CLIConfig":
|
|
292
|
-
return CLIConfig(path=None, parent=self)
|
|
293
|
-
|
|
294
294
|
def update(self, other: Union["CLIConfig", Dict[str, Any]]):
|
|
295
295
|
values = other if isinstance(other, dict) else other._values
|
|
296
296
|
for k, v in values.items():
|
|
297
297
|
self[k] = v
|
|
298
298
|
|
|
299
299
|
@staticmethod
|
|
300
|
-
def
|
|
301
|
-
"""
|
|
300
|
+
def get_tinyb_file() -> Optional[str]:
|
|
301
|
+
"""Find the .tinyb file by traversing up directories from start_dir, stopping at user's home directory.
|
|
302
302
|
|
|
303
|
-
|
|
304
|
-
|
|
303
|
+
Args:
|
|
304
|
+
start_dir: Directory to start searching from. Defaults to current working directory.
|
|
305
305
|
|
|
306
|
-
|
|
306
|
+
Returns:
|
|
307
|
+
The path to the .tinyb file if found, current working directory otherwise.
|
|
307
308
|
"""
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
309
|
+
current_dir = os.getcwd()
|
|
310
|
+
path = os.path.join(current_dir, ".tinyb")
|
|
311
|
+
if os.path.isfile(path):
|
|
312
|
+
return path
|
|
313
|
+
|
|
314
|
+
home_dir = os.path.expanduser("~")
|
|
315
|
+
|
|
316
|
+
while current_dir != os.path.dirname(current_dir): # Stop at root directory
|
|
317
|
+
# Stop if we reach home directory
|
|
318
|
+
if current_dir == home_dir:
|
|
319
|
+
tinyb_path = os.path.join(current_dir, ".tinyb")
|
|
320
|
+
return tinyb_path if os.path.isfile(tinyb_path) else None
|
|
321
|
+
|
|
322
|
+
tinyb_path = os.path.join(current_dir, ".tinyb")
|
|
323
|
+
if os.path.isfile(tinyb_path):
|
|
324
|
+
return tinyb_path
|
|
325
|
+
|
|
326
|
+
# Stop if we would go beyond home directory
|
|
327
|
+
parent_dir = os.path.dirname(current_dir)
|
|
328
|
+
if not current_dir.startswith(home_dir) or not parent_dir.startswith(home_dir):
|
|
329
|
+
return None
|
|
330
|
+
|
|
331
|
+
current_dir = parent_dir
|
|
332
|
+
return None
|
|
316
333
|
|
|
317
334
|
@staticmethod
|
|
318
|
-
def get_project_config(
|
|
319
|
-
"""Returns the project-specific config
|
|
335
|
+
def get_project_config() -> "CLIConfig":
|
|
336
|
+
"""Returns the project-specific config by finding the closest .tinyb file in the directory tree.
|
|
320
337
|
|
|
321
|
-
|
|
338
|
+
Returns:
|
|
339
|
+
A CLIConfig instance with the project configuration.
|
|
322
340
|
"""
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
return CLIConfig(path, parent=CLIConfig.get_global_config())
|
|
341
|
+
tinyb_file = CLIConfig.get_tinyb_file()
|
|
342
|
+
return CLIConfig(tinyb_file)
|
|
326
343
|
|
|
327
344
|
@staticmethod
|
|
328
345
|
def reset() -> None:
|
tinybird/tb/modules/create.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import re
|
|
3
|
-
from os import getcwd
|
|
4
3
|
from pathlib import Path
|
|
5
4
|
from typing import Optional
|
|
6
5
|
|
|
@@ -34,20 +33,35 @@ from tinybird.tb.modules.project import Project
|
|
|
34
33
|
help="Prompt to be used to create the project",
|
|
35
34
|
)
|
|
36
35
|
@click.option("--rows", type=int, default=10, help="Number of events to send")
|
|
37
|
-
@click.option("--
|
|
36
|
+
@click.option("--folder", type=str, default=None, help="Folder to create the project in")
|
|
37
|
+
@click.option("--agent", type=str, default="cursor", help="Agent to use for rules")
|
|
38
38
|
@click.pass_context
|
|
39
39
|
@coro
|
|
40
|
-
async def create(
|
|
40
|
+
async def create(
|
|
41
|
+
ctx: click.Context, data: Optional[str], prompt: Optional[str], rows: int, folder: Optional[str], agent: str
|
|
42
|
+
) -> None:
|
|
41
43
|
"""Initialize a new project."""
|
|
42
|
-
project: Project = ctx.ensure_object(dict)["project"]
|
|
43
44
|
local_client: TinyB = ctx.ensure_object(dict)["client"]
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
project: Project = ctx.ensure_object(dict)["project"]
|
|
46
|
+
config = CLIConfig.get_project_config()
|
|
47
|
+
|
|
48
|
+
# If folder is provided, rewrite the config and project folder
|
|
49
|
+
if folder:
|
|
50
|
+
config.set_cwd(folder)
|
|
51
|
+
config.persist_to_file()
|
|
52
|
+
project.folder = folder
|
|
53
|
+
|
|
54
|
+
root_folder = os.getcwd()
|
|
55
|
+
if config._path:
|
|
56
|
+
root_folder = os.path.dirname(config._path)
|
|
57
|
+
|
|
58
|
+
folder = project.folder
|
|
59
|
+
folder_path = project.path
|
|
60
|
+
|
|
46
61
|
if not folder_path.exists():
|
|
47
62
|
folder_path.mkdir()
|
|
48
63
|
|
|
49
64
|
try:
|
|
50
|
-
config = CLIConfig.get_project_config(str(project.path))
|
|
51
65
|
tb_client = config.get_client()
|
|
52
66
|
user_token: Optional[str] = None
|
|
53
67
|
created = False
|
|
@@ -75,16 +89,16 @@ async def create(ctx: click.Context, data: Optional[str], prompt: Optional[str],
|
|
|
75
89
|
click.echo(FeedbackManager.highlight(message="\n» Creating resources..."))
|
|
76
90
|
result = await create_resources(local_client, tb_client, user_token, data, prompt, folder)
|
|
77
91
|
click.echo(FeedbackManager.success(message="✓ Done!\n"))
|
|
78
|
-
|
|
79
|
-
if not already_has_cicd(
|
|
92
|
+
|
|
93
|
+
if not already_has_cicd(root_folder):
|
|
80
94
|
click.echo(FeedbackManager.highlight(message="\n» Creating CI/CD files for GitHub and GitLab..."))
|
|
81
|
-
init_git(
|
|
82
|
-
await init_cicd(data_project_dir=os.path.relpath(folder))
|
|
95
|
+
init_git(root_folder)
|
|
96
|
+
await init_cicd(root_folder, data_project_dir=os.path.relpath(folder))
|
|
83
97
|
click.echo(FeedbackManager.success(message="✓ Done!\n"))
|
|
84
|
-
|
|
85
|
-
if not already_has_cursor_rules(
|
|
98
|
+
|
|
99
|
+
if not already_has_cursor_rules(root_folder):
|
|
86
100
|
click.echo(FeedbackManager.highlight(message="\n» Creating .cursorrules..."))
|
|
87
|
-
create_rules(
|
|
101
|
+
create_rules(root_folder, "tb", agent)
|
|
88
102
|
click.echo(FeedbackManager.success(message="✓ Done!\n"))
|
|
89
103
|
created = True
|
|
90
104
|
if should_generate_fixtures(result):
|
|
@@ -333,13 +347,3 @@ def get_context() -> str:
|
|
|
333
347
|
def save_context(prompt: str, feedback: str):
|
|
334
348
|
context_file = get_context_file()
|
|
335
349
|
context_file.write_text(f"- {prompt}\n{feedback}")
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
@cli.command("rules")
|
|
339
|
-
@click.option("--agent", type=str, default="cursor", help="Agent to use for rules")
|
|
340
|
-
@click.option("--source", type=str, default="tb", help="Source of the command")
|
|
341
|
-
@click.pass_context
|
|
342
|
-
def rules(ctx: click.Context, agent: str, source: str):
|
|
343
|
-
"""Create agent rules for the project."""
|
|
344
|
-
project: Project = ctx.ensure_object(dict)["project"]
|
|
345
|
-
create_rules(str(project.path), source, agent)
|
|
@@ -5,18 +5,17 @@ from urllib.parse import urlencode
|
|
|
5
5
|
|
|
6
6
|
import click
|
|
7
7
|
import requests
|
|
8
|
-
from croniter import croniter
|
|
9
8
|
|
|
10
|
-
from tinybird.client import
|
|
11
|
-
from tinybird.tb.modules.common import
|
|
9
|
+
from tinybird.client import TinyB
|
|
10
|
+
from tinybird.tb.modules.common import requests_get
|
|
12
11
|
from tinybird.tb.modules.config import CLIConfig
|
|
13
|
-
from tinybird.tb.modules.datafile.common import
|
|
14
|
-
from tinybird.tb.modules.exceptions import CLIPipeException
|
|
12
|
+
from tinybird.tb.modules.datafile.common import PipeNodeTypes
|
|
15
13
|
from tinybird.tb.modules.feedback_manager import FeedbackManager
|
|
16
14
|
|
|
17
15
|
|
|
18
16
|
async def new_pipe(
|
|
19
17
|
p,
|
|
18
|
+
config: CLIConfig,
|
|
20
19
|
tb_client: TinyB,
|
|
21
20
|
force: bool = False,
|
|
22
21
|
check: bool = True,
|
|
@@ -39,13 +38,11 @@ async def new_pipe(
|
|
|
39
38
|
tests_validate_processed_bytes: bool = False,
|
|
40
39
|
override_datasource: bool = False,
|
|
41
40
|
tests_check_requests_from_branch: bool = False,
|
|
42
|
-
config: Any = None,
|
|
43
41
|
fork_downstream: Optional[bool] = False,
|
|
44
42
|
fork: Optional[bool] = False,
|
|
45
43
|
):
|
|
46
44
|
# TODO use tb_client instead of calling the urls directly.
|
|
47
45
|
host = tb_client.host
|
|
48
|
-
config = CLIConfig().get_project_config()
|
|
49
46
|
token = config.get_user_token()
|
|
50
47
|
|
|
51
48
|
headers = {"Authorization": f"Bearer {token}"}
|
|
@@ -101,8 +98,8 @@ async def new_pipe(
|
|
|
101
98
|
|
|
102
99
|
try:
|
|
103
100
|
user_client = deepcopy(tb_client)
|
|
104
|
-
config = CLIConfig
|
|
105
|
-
user_client.token = config.get_user_token()
|
|
101
|
+
config = CLIConfig.get_project_config()
|
|
102
|
+
user_client.token = config.get_user_token() or ""
|
|
106
103
|
params["workspace_id"] = config.get("id", None)
|
|
107
104
|
body["name"] = p["name"] + "__tb__playground"
|
|
108
105
|
|
|
@@ -182,132 +179,6 @@ async def get_token_from_main_branch(branch_tb_client: TinyB) -> Optional[str]:
|
|
|
182
179
|
return token_from_main_branch
|
|
183
180
|
|
|
184
181
|
|
|
185
|
-
async def check_materialized(pipe, host, token, cl, override_datasource=False, current_pipe=None):
|
|
186
|
-
checker_pipe = deepcopy(pipe)
|
|
187
|
-
checker_pipe["name"] = f"{checker_pipe['name']}__checker"
|
|
188
|
-
headers = {"Authorization": f"Bearer {token}"}
|
|
189
|
-
|
|
190
|
-
if current_pipe:
|
|
191
|
-
from_copy_to_materialized = current_pipe["type"] == "copy"
|
|
192
|
-
if from_copy_to_materialized:
|
|
193
|
-
await cl.pipe_remove_copy(current_pipe["id"], current_pipe["copy_node"])
|
|
194
|
-
|
|
195
|
-
materialized_node = None
|
|
196
|
-
for node in checker_pipe["nodes"]:
|
|
197
|
-
if node["params"]["type"] == "materialized":
|
|
198
|
-
materialized_node = deepcopy(node)
|
|
199
|
-
materialized_node["params"]["override_datasource"] = "true" if override_datasource else "false"
|
|
200
|
-
node["params"]["type"] = "standard"
|
|
201
|
-
|
|
202
|
-
try:
|
|
203
|
-
pipe_created = False
|
|
204
|
-
await new_pipe(
|
|
205
|
-
checker_pipe, cl, force=True, check=False, populate=False, skip_tokens=True, ignore_sql_errors=False
|
|
206
|
-
)
|
|
207
|
-
pipe_created = True
|
|
208
|
-
response = await cl.analyze_pipe_node(checker_pipe["name"], materialized_node, dry_run="true")
|
|
209
|
-
if response.get("warnings"):
|
|
210
|
-
show_materialized_view_warnings(response["warnings"])
|
|
211
|
-
|
|
212
|
-
except Exception as e:
|
|
213
|
-
raise click.ClickException(FeedbackManager.error_while_check_materialized(error=str(e)))
|
|
214
|
-
finally:
|
|
215
|
-
if pipe_created:
|
|
216
|
-
r = await requests_delete(f"{host}/v0/pipes/{checker_pipe['name']}", headers=headers)
|
|
217
|
-
if r.status_code != 204:
|
|
218
|
-
click.echo(FeedbackManager.warning_check_pipe(content=r.content))
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
async def check_copy_pipe(pipe, copy_node, tb_client: TinyB):
|
|
222
|
-
target_datasource = copy_node["params"].get("target_datasource", None)
|
|
223
|
-
if not target_datasource:
|
|
224
|
-
raise CLIPipeException(FeedbackManager.error_creating_copy_pipe_target_datasource_required())
|
|
225
|
-
|
|
226
|
-
try:
|
|
227
|
-
await tb_client.get_datasource(target_datasource)
|
|
228
|
-
except DoesNotExistException:
|
|
229
|
-
raise CLIPipeException(
|
|
230
|
-
FeedbackManager.error_creating_copy_pipe_target_datasource_not_found(target_datasource=target_datasource)
|
|
231
|
-
)
|
|
232
|
-
except Exception as e:
|
|
233
|
-
raise CLIPipeException(FeedbackManager.error_exception(error=e))
|
|
234
|
-
|
|
235
|
-
schedule_cron = copy_node["params"].get(CopyParameters.COPY_SCHEDULE, None)
|
|
236
|
-
is_valid_cron = not schedule_cron or (
|
|
237
|
-
schedule_cron and (schedule_cron == ON_DEMAND or croniter.is_valid(schedule_cron))
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
if not is_valid_cron:
|
|
241
|
-
raise CLIPipeException(FeedbackManager.error_creating_copy_pipe_invalid_cron(schedule_cron=schedule_cron))
|
|
242
|
-
|
|
243
|
-
mode = copy_node["params"].get("mode", CopyModes.APPEND)
|
|
244
|
-
is_valid_mode = CopyModes.is_valid(mode)
|
|
245
|
-
|
|
246
|
-
if not is_valid_mode:
|
|
247
|
-
raise CLIPipeException(FeedbackManager.error_creating_copy_pipe_invalid_mode(mode=mode))
|
|
248
|
-
|
|
249
|
-
if not pipe:
|
|
250
|
-
return
|
|
251
|
-
|
|
252
|
-
pipe_name = pipe["name"]
|
|
253
|
-
pipe_type = pipe["type"]
|
|
254
|
-
|
|
255
|
-
if pipe_type == PipeTypes.ENDPOINT:
|
|
256
|
-
await tb_client.pipe_remove_endpoint(pipe_name, pipe["endpoint"])
|
|
257
|
-
|
|
258
|
-
if pipe_type == PipeTypes.DATA_SINK:
|
|
259
|
-
await tb_client.pipe_remove_sink(pipe_name, pipe["sink_node"])
|
|
260
|
-
|
|
261
|
-
if pipe_type == PipeTypes.STREAM:
|
|
262
|
-
await tb_client.pipe_remove_stream(pipe_name, pipe["stream_node"])
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
async def check_sink_pipe(pipe, sink_node, tb_client: TinyB):
|
|
266
|
-
if not sink_node["export_params"]:
|
|
267
|
-
return
|
|
268
|
-
|
|
269
|
-
if not pipe:
|
|
270
|
-
return
|
|
271
|
-
|
|
272
|
-
pipe_name = pipe["name"]
|
|
273
|
-
pipe_type = pipe["type"]
|
|
274
|
-
|
|
275
|
-
schedule_cron = sink_node["export_params"].get("schedule_cron", "")
|
|
276
|
-
is_valid_cron = not schedule_cron or (schedule_cron and croniter.is_valid(schedule_cron))
|
|
277
|
-
|
|
278
|
-
if not is_valid_cron:
|
|
279
|
-
raise CLIPipeException(FeedbackManager.error_creating_sink_pipe_invalid_cron(schedule_cron=schedule_cron))
|
|
280
|
-
|
|
281
|
-
if pipe_type == PipeTypes.ENDPOINT:
|
|
282
|
-
await tb_client.pipe_remove_endpoint(pipe_name, pipe["endpoint"])
|
|
283
|
-
|
|
284
|
-
if pipe_type == PipeTypes.COPY:
|
|
285
|
-
await tb_client.pipe_remove_copy(pipe_name, pipe["copy_node"])
|
|
286
|
-
|
|
287
|
-
if pipe_type == PipeTypes.STREAM:
|
|
288
|
-
await tb_client.pipe_remove_stream(pipe_name, pipe["stream_node"])
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
async def check_stream_pipe(pipe, stream_node, tb_client: TinyB):
|
|
292
|
-
if not stream_node["params"]:
|
|
293
|
-
return
|
|
294
|
-
|
|
295
|
-
if not pipe:
|
|
296
|
-
return
|
|
297
|
-
|
|
298
|
-
pipe_name = pipe["name"]
|
|
299
|
-
pipe_type = pipe["type"]
|
|
300
|
-
|
|
301
|
-
if pipe_type == PipeTypes.ENDPOINT:
|
|
302
|
-
await tb_client.pipe_remove_endpoint(pipe_name, pipe["endpoint"])
|
|
303
|
-
|
|
304
|
-
if pipe_type == PipeTypes.COPY:
|
|
305
|
-
await tb_client.pipe_remove_copy(pipe_name, pipe["copy_node"])
|
|
306
|
-
|
|
307
|
-
if pipe_type == PipeTypes.DATA_SINK:
|
|
308
|
-
await tb_client.pipe_remove_sink(pipe_name, pipe["sink_node"])
|
|
309
|
-
|
|
310
|
-
|
|
311
182
|
def show_materialized_view_warnings(warnings):
|
|
312
183
|
"""
|
|
313
184
|
>>> show_materialized_view_warnings([{'code': 'SIM', 'weight': 1}])
|
|
@@ -15,6 +15,7 @@ from tinybird.client import TinyB
|
|
|
15
15
|
from tinybird.sql import parse_table_structure, schema_to_sql_columns
|
|
16
16
|
from tinybird.sql_template import get_used_tables_in_template, render_sql_template
|
|
17
17
|
from tinybird.tb.modules.common import get_ca_pem_content
|
|
18
|
+
from tinybird.tb.modules.config import CLIConfig
|
|
18
19
|
from tinybird.tb.modules.datafile.build_datasource import is_datasource
|
|
19
20
|
from tinybird.tb.modules.datafile.build_pipe import (
|
|
20
21
|
get_target_materialized_data_source_name,
|
|
@@ -48,6 +49,7 @@ from tinybird.tb.modules.project import Project
|
|
|
48
49
|
|
|
49
50
|
async def folder_playground(
|
|
50
51
|
project: Project,
|
|
52
|
+
config: CLIConfig,
|
|
51
53
|
tb_client: TinyB,
|
|
52
54
|
filenames: Optional[List[str]] = None,
|
|
53
55
|
is_internal: bool = False,
|
|
@@ -163,6 +165,7 @@ async def folder_playground(
|
|
|
163
165
|
try:
|
|
164
166
|
await exec_file(
|
|
165
167
|
to_run[name],
|
|
168
|
+
config,
|
|
166
169
|
tb_client,
|
|
167
170
|
force,
|
|
168
171
|
check,
|
|
@@ -390,6 +393,7 @@ async def name_matches_existing_resource(resource: str, name: str, tb_client: Ti
|
|
|
390
393
|
|
|
391
394
|
async def exec_file(
|
|
392
395
|
r: Dict[str, Any],
|
|
396
|
+
config: CLIConfig,
|
|
393
397
|
tb_client: TinyB,
|
|
394
398
|
force: bool,
|
|
395
399
|
check: bool,
|
|
@@ -426,6 +430,7 @@ async def exec_file(
|
|
|
426
430
|
if r["resource"] == "pipes":
|
|
427
431
|
await new_pipe(
|
|
428
432
|
r,
|
|
433
|
+
config,
|
|
429
434
|
tb_client,
|
|
430
435
|
force,
|
|
431
436
|
check,
|
|
@@ -343,7 +343,15 @@ def create_deployment(
|
|
|
343
343
|
|
|
344
344
|
feedback = result.get("deployment", {}).get("feedback", [])
|
|
345
345
|
for f in feedback:
|
|
346
|
-
|
|
346
|
+
if f.get("level", "").upper() == "ERROR":
|
|
347
|
+
feedback_func = FeedbackManager.error
|
|
348
|
+
feedback_icon = ""
|
|
349
|
+
else:
|
|
350
|
+
feedback_func = FeedbackManager.warning
|
|
351
|
+
feedback_icon = "△ "
|
|
352
|
+
resource = f.get("resource")
|
|
353
|
+
resource_bit = f"{resource}: " if resource else ""
|
|
354
|
+
click.echo(feedback_func(message=f"{feedback_icon}{f.get('level')}: {resource_bit}{f.get('message')}"))
|
|
347
355
|
|
|
348
356
|
deploy_errors = result.get("deployment", {}).get("errors")
|
|
349
357
|
for deploy_error in deploy_errors:
|
|
@@ -27,7 +27,7 @@ async def get_tinybird_local_config(config_obj: Dict[str, Any], build: bool = Fa
|
|
|
27
27
|
It uses the tokens from tinybird local
|
|
28
28
|
"""
|
|
29
29
|
path = config_obj.get("path")
|
|
30
|
-
config = CLIConfig.get_project_config(
|
|
30
|
+
config = CLIConfig.get_project_config()
|
|
31
31
|
|
|
32
32
|
try:
|
|
33
33
|
# ruff: noqa: ASYNC210
|
tinybird/tb/modules/login.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import http.server
|
|
2
|
+
import os
|
|
2
3
|
import socketserver
|
|
3
4
|
import threading
|
|
4
5
|
import time
|
|
@@ -159,7 +160,8 @@ async def login(host: str, auth_host: str, workspace: str):
|
|
|
159
160
|
if k in ws:
|
|
160
161
|
cli_config[k] = ws[k]
|
|
161
162
|
|
|
162
|
-
|
|
163
|
+
path = os.path.join(os.getcwd(), ".tinyb")
|
|
164
|
+
cli_config.persist_to_file(override_with_path=path)
|
|
163
165
|
click.echo(FeedbackManager.gray(message="\nWorkspace: ") + FeedbackManager.info(message=ws["name"]))
|
|
164
166
|
click.echo(FeedbackManager.gray(message="User: ") + FeedbackManager.info(message=ws["user_email"]))
|
|
165
167
|
click.echo(FeedbackManager.gray(message="Host: ") + FeedbackManager.info(message=host))
|
|
@@ -62,6 +62,7 @@ def playground(
|
|
|
62
62
|
"""Build the project in Tinybird Local."""
|
|
63
63
|
project: Project = ctx.ensure_object(dict)["project"]
|
|
64
64
|
tb_client: TinyB = ctx.ensure_object(dict)["client"]
|
|
65
|
+
config: CLIConfig = ctx.ensure_object(dict)["config"]
|
|
65
66
|
context.disable_template_security_validation.set(True)
|
|
66
67
|
|
|
67
68
|
async def process(filenames: List[str], watch: bool = False):
|
|
@@ -69,11 +70,11 @@ def playground(
|
|
|
69
70
|
if len(datafiles) > 0:
|
|
70
71
|
check_filenames(filenames=datafiles)
|
|
71
72
|
await folder_playground(
|
|
72
|
-
project, tb_client, filenames=datafiles, is_internal=False, current_ws=None, local_ws=None
|
|
73
|
+
project, config, tb_client, filenames=datafiles, is_internal=False, current_ws=None, local_ws=None
|
|
73
74
|
)
|
|
74
75
|
if len(filenames) > 0 and watch:
|
|
75
76
|
filename = filenames[0]
|
|
76
|
-
await build_and_print_resource(tb_client, filename)
|
|
77
|
+
await build_and_print_resource(config, tb_client, filename)
|
|
77
78
|
|
|
78
79
|
datafiles = project.get_project_files()
|
|
79
80
|
filenames = datafiles
|
|
@@ -112,11 +113,10 @@ def playground(
|
|
|
112
113
|
shell.run()
|
|
113
114
|
|
|
114
115
|
|
|
115
|
-
async def build_and_print_resource(tb_client: TinyB, filename: str):
|
|
116
|
+
async def build_and_print_resource(config: CLIConfig, tb_client: TinyB, filename: str):
|
|
116
117
|
resource_path = Path(filename)
|
|
117
118
|
name = resource_path.stem
|
|
118
119
|
playground_name = name if filename.endswith(".pipe") else None
|
|
119
|
-
config = CLIConfig().get_project_config()
|
|
120
120
|
user_client = deepcopy(tb_client)
|
|
121
121
|
user_client.token = config.get_user_token() or ""
|
|
122
122
|
cli_params = {}
|
tinybird/tb/modules/project.py
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import glob
|
|
2
|
-
import os
|
|
3
2
|
import re
|
|
4
3
|
from pathlib import Path
|
|
5
4
|
from typing import Dict, List, Optional
|
|
6
5
|
|
|
7
|
-
from tinybird.tb.modules.config import CLIConfig
|
|
8
6
|
from tinybird.tb.modules.datafile.common import Datafile
|
|
9
7
|
from tinybird.tb.modules.datafile.parse_datasource import parse_datasource
|
|
10
8
|
from tinybird.tb.modules.datafile.parse_pipe import parse_pipe
|
|
@@ -13,12 +11,12 @@ from tinybird.tb.modules.datafile.parse_pipe import parse_pipe
|
|
|
13
11
|
class Project:
|
|
14
12
|
extensions = ("datasource", "pipe")
|
|
15
13
|
|
|
16
|
-
def __init__(self, folder:
|
|
17
|
-
self.folder = folder
|
|
18
|
-
self.path = Path(self.folder)
|
|
14
|
+
def __init__(self, folder: str):
|
|
15
|
+
self.folder = folder
|
|
19
16
|
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
@property
|
|
18
|
+
def path(self) -> Path:
|
|
19
|
+
return Path(self.folder)
|
|
22
20
|
|
|
23
21
|
@property
|
|
24
22
|
def vendor_path(self) -> str:
|
tinybird/tb/modules/test.py
CHANGED
|
@@ -75,6 +75,7 @@ async def test_create(ctx: click.Context, name_or_filename: str, prompt: str) ->
|
|
|
75
75
|
"""
|
|
76
76
|
project: Project = ctx.ensure_object(dict)["project"]
|
|
77
77
|
client: TinyB = ctx.ensure_object(dict)["client"]
|
|
78
|
+
config: CLIConfig = ctx.ensure_object(dict)["config"]
|
|
78
79
|
root_path = Path(project.folder)
|
|
79
80
|
folder = project.folder
|
|
80
81
|
try:
|
|
@@ -106,7 +107,6 @@ async def test_create(ctx: click.Context, name_or_filename: str, prompt: str) ->
|
|
|
106
107
|
content=pipe_content,
|
|
107
108
|
parameters=parameters or "No parameters",
|
|
108
109
|
)
|
|
109
|
-
config = CLIConfig.get_project_config(folder)
|
|
110
110
|
user_token = config.get_user_token()
|
|
111
111
|
if not user_token:
|
|
112
112
|
raise CLIException(FeedbackManager.error(message="No user token found"))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
tinybird/__cli__.py,sha256=esPl5QDTzuQgHe5FuxWLm-fURFigGGwjnYLh9GuWUw4,232
|
|
2
2
|
tinybird/client.py,sha256=ZRskFcS5Or-ELl_uaGfoTfioY_S2pwc_GyMQ6qIKqgM,52798
|
|
3
|
-
tinybird/config.py,sha256=
|
|
3
|
+
tinybird/config.py,sha256=GQSc8v7mT79pmMANvp758i8mGVsTPd1VjJzjJmFi0LM,5885
|
|
4
4
|
tinybird/connectors.py,sha256=7Gjms7b5MAaBFGi3xytsJurCylprONpFcYrzp4Fw2Rc,15241
|
|
5
5
|
tinybird/context.py,sha256=VaMhyHruH-uyMypPDfxtuo4scS18b7rxCCdeUVm6ysg,1301
|
|
6
6
|
tinybird/datatypes.py,sha256=XNypumfqNjsvLJ5iNXnbVHRvAJe0aQwI3lS6Cxox-e0,10979
|
|
@@ -15,18 +15,18 @@ tinybird/syncasync.py,sha256=IPnOx6lMbf9SNddN1eBtssg8vCLHMt76SuZ6YNYm-Yk,27761
|
|
|
15
15
|
tinybird/tornado_template.py,sha256=KmW_VD7y-NVqrc8YZKwIaxoJB0XpCcB2izdmxmtmApM,41944
|
|
16
16
|
tinybird/ch_utils/constants.py,sha256=aYvg2C_WxYWsnqPdZB1ZFoIr8ZY-XjUXYyHKE9Ansj0,3890
|
|
17
17
|
tinybird/ch_utils/engine.py,sha256=AUAww-KjGOZg9h0IBlKA3FeacJYB4rOtqcTGJhFM-g8,40392
|
|
18
|
-
tinybird/tb/__cli__.py,sha256
|
|
18
|
+
tinybird/tb/__cli__.py,sha256=4h3Zd94QaUFjupYU4sAptuNdOv1hzDTiY-M0a6d8a3M,251
|
|
19
19
|
tinybird/tb/cli.py,sha256=KpJ_-V6xVEzcdPRPnHhEdh2EgRPCyhZnfJVqeqMsftI,964
|
|
20
|
-
tinybird/tb/modules/auth.py,sha256=
|
|
21
|
-
tinybird/tb/modules/build.py,sha256=
|
|
20
|
+
tinybird/tb/modules/auth.py,sha256=L1IatO2arRSzys3t8px8xVt8uPWUL5EVD0sFzAV_uVU,9022
|
|
21
|
+
tinybird/tb/modules/build.py,sha256=46ZTxubughaq8QDV6yq9thatSVVY4yNqyzbfxRBcgDA,10446
|
|
22
22
|
tinybird/tb/modules/cicd.py,sha256=T0lb9u_bDdTUVe8TwNNb1qQ5KnSPHMVjqPfKF4BBNBw,5347
|
|
23
|
-
tinybird/tb/modules/cli.py,sha256=
|
|
23
|
+
tinybird/tb/modules/cli.py,sha256=GT1FSL700AP49g-g01Aw8SxbTn8lHftZFbk5tO0q-Nw,16296
|
|
24
24
|
tinybird/tb/modules/common.py,sha256=f5yKjb1dgUzR-SrC4UHnpHXYIu6INcTHwNO96jW8A9w,73201
|
|
25
|
-
tinybird/tb/modules/config.py,sha256=
|
|
25
|
+
tinybird/tb/modules/config.py,sha256=JVf2Kcafqmkid4voHecNvWdDVXmht-2zyNXkdcIyIm4,11509
|
|
26
26
|
tinybird/tb/modules/copy.py,sha256=MAVqKip8_QhOYq99U_XuqSO6hCLJEh5sFtbhcXtI3SI,5802
|
|
27
|
-
tinybird/tb/modules/create.py,sha256
|
|
27
|
+
tinybird/tb/modules/create.py,sha256=bWCKND9R16vtBZHThCnx87bPtufp3pNpNr_yt5xgEn8,12795
|
|
28
28
|
tinybird/tb/modules/datasource.py,sha256=dNCK9iCR2xPLfwqqwg2ixyE6NuoVEiJU2mBZBmOYrVY,16906
|
|
29
|
-
tinybird/tb/modules/deployment.py,sha256=
|
|
29
|
+
tinybird/tb/modules/deployment.py,sha256=eAQeOdSGpulgY7VK1eXMikJAe57s7ul0Td8OPvDZa9g,16910
|
|
30
30
|
tinybird/tb/modules/endpoint.py,sha256=EhVoGAXsFz-83Fiwj1gI-I73iRRvL49d0W81un7hvPE,12080
|
|
31
31
|
tinybird/tb/modules/exceptions.py,sha256=4A2sSjCEqKUMqpP3WI00zouCWW4uLaghXXLZBSw04mY,3363
|
|
32
32
|
tinybird/tb/modules/feedback_manager.py,sha256=Lv5MBGWNbIFTIy4nNSi0c61bmiQRv5J0nHRiiXUqDuc,68478
|
|
@@ -35,19 +35,19 @@ tinybird/tb/modules/job.py,sha256=956Pj8BEEsiD2GZsV9RKKVM3I_CveOLgS82lykO5ukk,29
|
|
|
35
35
|
tinybird/tb/modules/llm.py,sha256=AC0VSphTOM2t-v1_3NLvNN_FIbgMo4dTyMqIv5nniPo,835
|
|
36
36
|
tinybird/tb/modules/llm_utils.py,sha256=nS9r4FAElJw8yXtmdYrx-rtI2zXR8qXfi1QqUDCfxvg,3469
|
|
37
37
|
tinybird/tb/modules/local.py,sha256=9SZa-59eYROuwFNjJAHD0dRKLK5Reozh9WdchvfSsmQ,5680
|
|
38
|
-
tinybird/tb/modules/local_common.py,sha256=
|
|
39
|
-
tinybird/tb/modules/login.py,sha256=
|
|
38
|
+
tinybird/tb/modules/local_common.py,sha256=jWNyoMBxamjEWLqyIhF50t3vz75CuZThekhDmP4cgQ4,3055
|
|
39
|
+
tinybird/tb/modules/login.py,sha256=NB-evr7b00ChKPulX7c8YLN3EX6cr0CwALN0wroAq3o,6147
|
|
40
40
|
tinybird/tb/modules/materialization.py,sha256=r8Q9HXcYEmfrEzP4WpiasCKDJdSkTPaAKJtZMoJKhi8,5749
|
|
41
41
|
tinybird/tb/modules/mock.py,sha256=ASJTm4p11vkevGXCvU0h57aw7Inx03CTdxd5o2uzd8k,3870
|
|
42
42
|
tinybird/tb/modules/pipe.py,sha256=gcLz0qHgwKDLsWFY3yFLO9a0ETAV1dFbI8YeLHi9460,2429
|
|
43
|
-
tinybird/tb/modules/playground.py,sha256=
|
|
44
|
-
tinybird/tb/modules/project.py,sha256=
|
|
43
|
+
tinybird/tb/modules/playground.py,sha256=CQaz2JqFDdReK2fJY1yZsSwiSY24_jeTb9PKw1WUigA,4848
|
|
44
|
+
tinybird/tb/modules/project.py,sha256=vxNEsc5gIQJM7ybXklnT7wna2M-GfbUybj4nKckrZM8,2949
|
|
45
45
|
tinybird/tb/modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
|
|
46
46
|
tinybird/tb/modules/shell.py,sha256=a98W4L4gfrmxEyybtu6S4ENXrBYtgNASB5e_evuXQvI,13936
|
|
47
47
|
tinybird/tb/modules/table.py,sha256=4XrtjM-N0zfNtxVkbvLDQQazno1EPXnxTyo7llivfXk,11035
|
|
48
48
|
tinybird/tb/modules/tag.py,sha256=anPmMUBc-TbFovlpFi8GPkKA18y7Y0GczMsMms5TZsU,3502
|
|
49
49
|
tinybird/tb/modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
|
|
50
|
-
tinybird/tb/modules/test.py,sha256=
|
|
50
|
+
tinybird/tb/modules/test.py,sha256=oa6_ApTCT526W8-hngpZwNyl2AbIpOztOsxf0iwlSwc,11547
|
|
51
51
|
tinybird/tb/modules/token.py,sha256=OhqLFpCHVfYeBCxJ0n7n2qoho9E9eGcUfHgL7R1MUVQ,13485
|
|
52
52
|
tinybird/tb/modules/watch.py,sha256=ldB29Y_v1amXcYWhh2hhhV3tekPioXQ7noEhPZhW2Ok,8670
|
|
53
53
|
tinybird/tb/modules/workspace.py,sha256=fF0W6M5_qdwbbXpCUfuhon7CR0NhOOA0XOv5jD2l1JI,6401
|
|
@@ -55,7 +55,7 @@ tinybird/tb/modules/workspace_members.py,sha256=Vb5XEaKmkfONyfg2MS5EcpwolMvv7GLw
|
|
|
55
55
|
tinybird/tb/modules/datafile/build.py,sha256=seGFSvmgyRrAM1-icsKBkuog3WccfGUYFTPT-xoA5W8,50940
|
|
56
56
|
tinybird/tb/modules/datafile/build_common.py,sha256=rT7VJ5mnQ68R_8US91DAtkusfvjWuG_NObOzNgtN_ko,4562
|
|
57
57
|
tinybird/tb/modules/datafile/build_datasource.py,sha256=VjxaKKLZhPYt3XHOyMmfoqEAWAPI5D78T-8FOaN77MY,17355
|
|
58
|
-
tinybird/tb/modules/datafile/build_pipe.py,sha256=
|
|
58
|
+
tinybird/tb/modules/datafile/build_pipe.py,sha256=Tf49kZmXub45qGcePFfqGO7p-FH5eYM46DtVI3AQJEc,11358
|
|
59
59
|
tinybird/tb/modules/datafile/common.py,sha256=QhlQkYW5xLNEz_yZmMz1Dl8cnWG274Wu7QHVOIPcooM,79993
|
|
60
60
|
tinybird/tb/modules/datafile/diff.py,sha256=-0J7PsBO64T7LOZSkZ4ZFHHCPvT7cKItnJkbz2PkndU,6754
|
|
61
61
|
tinybird/tb/modules/datafile/exceptions.py,sha256=8rw2umdZjtby85QbuRKFO5ETz_eRHwUY5l7eHsy1wnI,556
|
|
@@ -66,7 +66,7 @@ tinybird/tb/modules/datafile/format_pipe.py,sha256=58iSTrJ5lg-IsbpX8TQumQTuZ6UIo
|
|
|
66
66
|
tinybird/tb/modules/datafile/parse_datasource.py,sha256=kk35PzesoJOd0LKjYp4kOyCwq4Qo4TiZnoI9qcXjB4k,1519
|
|
67
67
|
tinybird/tb/modules/datafile/parse_pipe.py,sha256=snoy8Ac_Sat7LIXLAKzxjJSl2-TKg9FaZTooxrx6muE,3420
|
|
68
68
|
tinybird/tb/modules/datafile/pipe_checker.py,sha256=LnDLGIHLJ3N7qHb2ptEbPr8CoczNfGwpjOY8EMdxfHQ,24649
|
|
69
|
-
tinybird/tb/modules/datafile/playground.py,sha256=
|
|
69
|
+
tinybird/tb/modules/datafile/playground.py,sha256=mVQNSLCXpBhupI3iJqRDdE7BJtkr8JjVhHxav3pYV2E,56533
|
|
70
70
|
tinybird/tb/modules/datafile/pull.py,sha256=vcjMUbjnZ9XQMGmL33J3ElpbXBTat8Yzp-haeDggZd4,5967
|
|
71
71
|
tinybird/tb/modules/tinyunit/tinyunit.py,sha256=GlDgEXc6TDO3ODxgfATAL2fvbKy-b_CzqoeDrApRm0g,11715
|
|
72
72
|
tinybird/tb/modules/tinyunit/tinyunit_lib.py,sha256=hGh1ZaXC1af7rKnX7222urkj0QJMhMWclqMy59dOqwE,1922
|
|
@@ -76,8 +76,8 @@ tinybird/tb_cli_modules/config.py,sha256=IsgdtFRnUrkY8-Zo32lmk6O7u3bHie1QCxLwgp4
|
|
|
76
76
|
tinybird/tb_cli_modules/exceptions.py,sha256=pmucP4kTF4irIt7dXiG-FcnI-o3mvDusPmch1L8RCWk,3367
|
|
77
77
|
tinybird/tb_cli_modules/regions.py,sha256=QjsL5H6Kg-qr0aYVLrvb1STeJ5Sx_sjvbOYO0LrEGMk,166
|
|
78
78
|
tinybird/tb_cli_modules/telemetry.py,sha256=Hh2Io8ZPROSunbOLuMvuIFU4TqwWPmQTqal4WS09K1A,10449
|
|
79
|
-
tinybird-0.0.1.
|
|
80
|
-
tinybird-0.0.1.
|
|
81
|
-
tinybird-0.0.1.
|
|
82
|
-
tinybird-0.0.1.
|
|
83
|
-
tinybird-0.0.1.
|
|
79
|
+
tinybird-0.0.1.dev79.dist-info/METADATA,sha256=fmRse4fg2cLgl065XvuqsPRrTVrnDEXMhHZsHLWvTAM,2585
|
|
80
|
+
tinybird-0.0.1.dev79.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
81
|
+
tinybird-0.0.1.dev79.dist-info/entry_points.txt,sha256=LwdHU6TfKx4Qs7BqqtaczEZbImgU7Abe9Lp920zb_fo,43
|
|
82
|
+
tinybird-0.0.1.dev79.dist-info/top_level.txt,sha256=VqqqEmkAy7UNaD8-V51FCoMMWXjLUlR0IstvK7tJYVY,54
|
|
83
|
+
tinybird-0.0.1.dev79.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|