tinybird-cli 3.6.1.dev5__tar.gz → 3.6.1.dev7__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.
Files changed (48) hide show
  1. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/PKG-INFO +11 -1
  2. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/__cli__.py +2 -2
  3. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/ch_utils/engine.py +23 -0
  4. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/datafile.py +42 -24
  5. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/feedback_manager.py +3 -0
  6. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird_cli.egg-info/PKG-INFO +11 -1
  7. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/setup.cfg +0 -0
  8. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/ch_utils/constants.py +0 -0
  9. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/check_pypi.py +0 -0
  10. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/client.py +0 -0
  11. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/config.py +0 -0
  12. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/connector_settings.py +0 -0
  13. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/connectors.py +0 -0
  14. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/context.py +0 -0
  15. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/data_connectors/credentials.py +0 -0
  16. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/datatypes.py +0 -0
  17. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/git_settings.py +0 -0
  18. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/sql.py +0 -0
  19. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/sql_template.py +0 -0
  20. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/sql_template_fmt.py +0 -0
  21. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/sql_toolset.py +0 -0
  22. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/syncasync.py +0 -0
  23. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli.py +0 -0
  24. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/auth.py +0 -0
  25. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/branch.py +0 -0
  26. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/cicd.py +0 -0
  27. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/cli.py +0 -0
  28. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/common.py +0 -0
  29. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/config.py +0 -0
  30. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/connection.py +0 -0
  31. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/datasource.py +0 -0
  32. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/exceptions.py +0 -0
  33. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/job.py +0 -0
  34. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/pipe.py +0 -0
  35. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/regions.py +0 -0
  36. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/telemetry.py +0 -0
  37. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/test.py +0 -0
  38. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/tinyunit/tinyunit.py +0 -0
  39. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py +0 -0
  40. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/token.py +0 -0
  41. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/workspace.py +0 -0
  42. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tb_cli_modules/workspace_members.py +0 -0
  43. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird/tornado_template.py +0 -0
  44. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird_cli.egg-info/SOURCES.txt +0 -0
  45. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird_cli.egg-info/dependency_links.txt +0 -0
  46. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird_cli.egg-info/entry_points.txt +0 -0
  47. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/tinybird_cli.egg-info/requires.txt +0 -0
  48. {tinybird-cli-3.6.1.dev5 → tinybird-cli-3.6.1.dev7}/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: 3.6.1.dev5
3
+ Version: 3.6.1.dev7
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -19,6 +19,16 @@ Changelog
19
19
 
20
20
  ---------
21
21
 
22
+ 3.6.1.dev7
23
+ ************
24
+
25
+ - `Fixed` `tb deploy` supports deployment when a `.incl` file is removed
26
+
27
+ 3.6.1.dev6
28
+ ************
29
+
30
+ - `Fixed` Some issues when using `--fmt: off` with `CASE` in the sql
31
+
22
32
  3.6.1.dev5
23
33
  ************
24
34
 
@@ -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__ = '3.6.1.dev5'
8
- __revision__ = '321fe96'
7
+ __version__ = '3.6.1.dev7'
8
+ __revision__ = 'c015232'
@@ -32,7 +32,20 @@ class TableDetails:
32
32
  >>> ed.to_datafile()
33
33
  ''
34
34
 
35
+ >>> ed = TableDetails({ "engine_full": "MergeTree() PARTITION BY toYear(timestamp) ORDER BY (timestamp, cityHash64(location)) SAMPLE BY cityHash64(location) SETTINGS index_granularity = 32, index_granularity_bytes = 2048", "engine": "MergeTree", "partition_key": "toYear(timestamp)", "sorting_key": "timestamp, cityHash64(location)", "primary_key": "timestamp, cityHash64(location)", "sampling_key": "cityHash64(location)", "settings": "index_granularity = 32, index_granularity_bytes = 2048", "ttl": None })
36
+ >>> ed.diff_ttl("toDate(timestamp) + toIntervalDay(1)")
37
+ True
35
38
  >>> ed = TableDetails({ "engine_full": "MergeTree() PARTITION BY toYear(timestamp) ORDER BY (timestamp, cityHash64(location)) SAMPLE BY cityHash64(location) SETTINGS index_granularity = 32, index_granularity_bytes = 2048 TTL toDate(timestamp) + INTERVAL 1 DAY", "engine": "MergeTree", "partition_key": "toYear(timestamp)", "sorting_key": "timestamp, cityHash64(location)", "primary_key": "timestamp, cityHash64(location)", "sampling_key": "cityHash64(location)", "settings": "index_granularity = 32, index_granularity_bytes = 2048", "ttl": "toDate(timestamp) + INTERVAL 1 DAY" })
39
+ >>> ed.diff_ttl("toDate(timestamp) + toIntervalDay(1)")
40
+ False
41
+ >>> ed.diff_ttl("toDate(timestamp) + toIntervalDay(2)")
42
+ True
43
+ >>> ed.diff_ttl("toDate(timestamp) + INTERVAL DAY 2")
44
+ True
45
+ >>> ed.diff_ttl("toDate(timestamp) + INTERVAL 1 DAY")
46
+ False
47
+ >>> ed.diff_ttl("")
48
+ True
36
49
  >>> ed.engine_full
37
50
  'MergeTree() PARTITION BY toYear(timestamp) ORDER BY (timestamp, cityHash64(location)) SAMPLE BY cityHash64(location) SETTINGS index_granularity = 32, index_granularity_bytes = 2048 TTL toDate(timestamp) + INTERVAL 1 DAY'
38
51
  >>> ed.engine
@@ -132,6 +145,16 @@ class TableDetails:
132
145
  return is_aggregating or is_replacing or is_collapsing
133
146
  return False
134
147
 
148
+ def diff_ttl(self, new_ttl: str) -> bool:
149
+ try:
150
+ from tinybird.sql_toolset import format_sql
151
+
152
+ current_ttl = format_sql(f"select {self.ttl}")[7:]
153
+ new_ttl = format_sql(f"select {new_ttl}")[7:]
154
+ return current_ttl != new_ttl
155
+ except Exception:
156
+ return self.ttl != new_ttl
157
+
135
158
  @property
136
159
  def partition_key(self) -> Optional[str]:
137
160
  return self.details.get("partition_key", None)
@@ -237,6 +237,10 @@ class ParseException(Exception):
237
237
  super().__init__(err)
238
238
 
239
239
 
240
+ class IncludeFileNotFoundException(Exception):
241
+ pass
242
+
243
+
240
244
  class ValidationException(Exception):
241
245
  def __init__(self, err: str, lineno: int = -1) -> None:
242
246
  self.lineno: int = lineno
@@ -411,16 +415,21 @@ class CLIGitRelease:
411
415
  parsed_resources: Dict[str, Datafile] = {}
412
416
 
413
417
  def _is_include(include_path, resource_path):
414
- if filename.endswith(".pipe"):
415
- parsed_func = parse_pipe
416
- else:
417
- parsed_func = parse_datasource
418
- parsed_resource = parsed_resources.get(resource_path, parsed_func(resource_path))
419
- parsed_resources[filename] = parsed_resource
420
- for include in parsed_resource.includes.keys():
421
- if Path(include_path).resolve().name in include.strip('"').strip("'"):
422
- return True
423
- return False
418
+ try:
419
+ if filename.endswith(".pipe"):
420
+ parsed_func = parse_pipe
421
+ else:
422
+ parsed_func = parse_datasource
423
+ parsed_resource = parsed_resources.get(resource_path, parsed_func(resource_path))
424
+ parsed_resources[filename] = parsed_resource
425
+ for include in parsed_resource.includes.keys():
426
+ if Path(include_path).resolve().name in include.strip('"').strip("'"):
427
+ return True
428
+ return False
429
+ except IncludeFileNotFoundException as e:
430
+ raise click.ClickException(
431
+ FeedbackManager.error_deleted_include(include_file=str(e), filename=filename)
432
+ )
424
433
 
425
434
  for diff in diffs:
426
435
  changes_in_includes = False
@@ -663,7 +672,9 @@ class Deployment:
663
672
  for dep in node["dependencies"]:
664
673
  if dep in [pipe["name"] for pipe in remote_pipes]:
665
674
  pipes_deps.setdefault(dep, []).append(pipe["name"])
666
- deleted_resources: Dict[str, str] = {Path(resource).resolve().stem: resource for resource in deleted}
675
+ deleted_resources: Dict[str, str] = {
676
+ Path(resource).resolve().stem: resource for resource in deleted if ".incl" not in resource
677
+ }
667
678
 
668
679
  for group in toposort(pipes_deps):
669
680
  # for each level keep materialized for the end
@@ -976,19 +987,22 @@ def parse(
976
987
  # be sure to replace the include line
977
988
  p = Path(basepath)
978
989
 
979
- with open(p / f) as file:
980
- try:
981
- ll = list(StringIO(file.read(), newline=None))
982
- node_line = [line for line in ll if "NODE" in line]
983
- if node_line and doc.includes[args_with_attrs]:
984
- doc.includes[node_line[0].split("NODE")[-1].split("\n")[0].strip()] = ""
985
- except Exception:
986
- pass
987
- finally:
988
- file.seek(0)
989
- lines[lineno : lineno + 1] = [""] + list(
990
- StringIO(Template(file.read()).safe_substitute(attrs), newline=None)
991
- )
990
+ try:
991
+ with open(p / f) as file:
992
+ try:
993
+ ll = list(StringIO(file.read(), newline=None))
994
+ node_line = [line for line in ll if "NODE" in line]
995
+ if node_line and doc.includes[args_with_attrs]:
996
+ doc.includes[node_line[0].split("NODE")[-1].split("\n")[0].strip()] = ""
997
+ except Exception:
998
+ pass
999
+ finally:
1000
+ file.seek(0)
1001
+ lines[lineno : lineno + 1] = [""] + list(
1002
+ StringIO(Template(file.read()).safe_substitute(attrs), newline=None)
1003
+ )
1004
+ except FileNotFoundError:
1005
+ raise IncludeFileNotFoundException(f)
992
1006
 
993
1007
  def version(*args: str, **kwargs: Any) -> None:
994
1008
  if len(args) < 1:
@@ -1152,6 +1166,8 @@ def parse(
1152
1166
  raise click.ClickException(FeedbackManager.error_missing_datasource_name())
1153
1167
  else:
1154
1168
  raise ValidationException(f"Validation error, found {line} in line {str(lineno)}: {str(e)}", lineno=lineno)
1169
+ except IncludeFileNotFoundException as e:
1170
+ raise e
1155
1171
  except Exception as e:
1156
1172
  traceback.print_tb(e.__traceback__)
1157
1173
  raise ParseException(f"Unexpected error: {e}", lineno=lineno)
@@ -3628,6 +3644,8 @@ async def build_graph(
3628
3644
  )
3629
3645
  except click.ClickException as e:
3630
3646
  raise e
3647
+ except IncludeFileNotFoundException as e:
3648
+ raise click.ClickException(FeedbackManager.error_deleted_include(include_file=str(e), filename=filename))
3631
3649
  except Exception as e:
3632
3650
  raise click.ClickException(str(e))
3633
3651
 
@@ -206,6 +206,9 @@ class FeedbackManager:
206
206
  error_connection_create = error_message("Connection {connection_name} could not be created: {error}")
207
207
  error_connection_integration_not_available = error_message("Connection could not be created: {error}")
208
208
  error_workspace = error_message("Workspace {workspace} not found. use 'tb workspace ls' to list your workspaces")
209
+ error_deleted_include = error_message(
210
+ "Related include file {include_file} was deleted and it's used in {filename}. Delete or remove dependency from {filename}."
211
+ )
209
212
  error_branch = error_message(
210
213
  "Branch {branch} not found. use 'tb branch ls' to list your Branches, make sure you are authenticated using the right workspace token"
211
214
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tinybird-cli
3
- Version: 3.6.1.dev5
3
+ Version: 3.6.1.dev7
4
4
  Summary: Tinybird Command Line Tool
5
5
  Home-page: https://www.tinybird.co/docs/cli/introduction.html
6
6
  Author: Tinybird
@@ -19,6 +19,16 @@ Changelog
19
19
 
20
20
  ---------
21
21
 
22
+ 3.6.1.dev7
23
+ ************
24
+
25
+ - `Fixed` `tb deploy` supports deployment when a `.incl` file is removed
26
+
27
+ 3.6.1.dev6
28
+ ************
29
+
30
+ - `Fixed` Some issues when using `--fmt: off` with `CASE` in the sql
31
+
22
32
  3.6.1.dev5
23
33
  ************
24
34