validio-cli 10.0.6__tar.gz → 10.0.7__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 (28) hide show
  1. {validio_cli-10.0.6 → validio_cli-10.0.7}/PKG-INFO +3 -3
  2. validio_cli-10.0.7/pyproject.toml +111 -0
  3. validio_cli-10.0.6/pyproject.toml → validio_cli-10.0.7/pyproject.toml.orig +7 -6
  4. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/__init__.py +2 -2
  5. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/code.py +53 -1
  6. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/namespaces.py +3 -18
  7. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/sources.py +2 -4
  8. {validio_cli-10.0.6 → validio_cli-10.0.7}/README_PUBLIC.md +0 -0
  9. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/channels.py +0 -0
  10. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/config.py +0 -0
  11. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/credentials.py +0 -0
  12. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/dbt.py +0 -0
  13. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/filters.py +0 -0
  14. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/incidents.py +0 -0
  15. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/integrations.py +0 -0
  16. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/metrics.py +0 -0
  17. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/notification_rules.py +0 -0
  18. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/resources.py +0 -0
  19. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/segmentations.py +0 -0
  20. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/segments.py +0 -0
  21. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/users.py +0 -0
  22. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/validators.py +0 -0
  23. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/entities/windows.py +0 -0
  24. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/bin/main.py +0 -0
  25. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/components.py +0 -0
  26. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/metadata.py +0 -0
  27. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/namespace.py +0 -0
  28. {validio_cli-10.0.6 → validio_cli-10.0.7}/validio_cli/schema.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: validio-cli
3
- Version: 10.0.6
3
+ Version: 10.0.7
4
4
  Summary: CLI tool to interact with the Validio platform
5
5
  Author: Validio
6
6
  Author-email: Validio <support@validio.io>
@@ -11,9 +11,9 @@ Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
12
  Classifier: Programming Language :: Python :: 3.13
13
13
  Classifier: Programming Language :: Python :: 3.14
14
- Requires-Dist: camel-converter>=3.0.0,<4
14
+ Requires-Dist: camel-converter>=5.1.0,<6
15
15
  Requires-Dist: classdiff>=0.5.2,<0.6
16
- Requires-Dist: typer[all]>=0.8.0,<0.16.0
16
+ Requires-Dist: typer>=0.27.0,<0.28.0
17
17
  Requires-Dist: prompt-toolkit>=3.0.38,<4
18
18
  Requires-Dist: tabulate>=0.9.0,<0.11
19
19
  Requires-Dist: types-tabulate>=0.9.0.2,<0.11
@@ -0,0 +1,111 @@
1
+ [project]
2
+ name = "validio-cli"
3
+ version = "10.0.7"
4
+ description = "CLI tool to interact with the Validio platform"
5
+ requires-python = ">=3.10,<4"
6
+ readme = "README_PUBLIC.md"
7
+ license = "Apache-2.0"
8
+ classifiers = [
9
+ "Programming Language :: Python :: 3",
10
+ "Programming Language :: Python :: 3.10",
11
+ "Programming Language :: Python :: 3.11",
12
+ "Programming Language :: Python :: 3.12",
13
+ "Programming Language :: Python :: 3.13",
14
+ "Programming Language :: Python :: 3.14",
15
+ ]
16
+ dependencies = [
17
+ "camel-converter>=5.1.0,<6",
18
+ "classdiff>=0.5.2,<0.6",
19
+ "typer>=0.27.0,<0.28.0",
20
+ "prompt-toolkit>=3.0.38,<4",
21
+ "tabulate>=0.9.0,<0.11",
22
+ "types-tabulate>=0.9.0.2,<0.11",
23
+ "validio-sdk",
24
+ ]
25
+
26
+ [[project.authors]]
27
+ name = "Validio"
28
+ email = "support@validio.io"
29
+
30
+ [project.urls]
31
+ Homepage = "https://validio.io/"
32
+ Documentation = "https://docs.validio.io/"
33
+
34
+ [project.scripts]
35
+ validio = "validio_cli.bin.main:main"
36
+
37
+ [dependency-groups]
38
+ dev = [
39
+ "ruff==0.16.1",
40
+ "mypy>=1.2.0,<2",
41
+ "licensecheck>=2025.1.0,<2026",
42
+ "pytest>=9.0.3,<10",
43
+ "flameprof>=0.4,<0.5",
44
+ "validio-sdk",
45
+ ]
46
+
47
+ [tool.uv]
48
+ default-groups = "all"
49
+
50
+ [tool.uv.sources.validio-sdk]
51
+ workspace = true
52
+
53
+ [tool.uv.build-backend]
54
+ module-name = ["validio_cli"]
55
+ module-root = ""
56
+
57
+ [tool.ruff]
58
+ fix = true
59
+
60
+ [tool.ruff.lint]
61
+ select = [
62
+ "ARG",
63
+ "C4",
64
+ "D",
65
+ "E",
66
+ "F",
67
+ "I",
68
+ "N",
69
+ "PIE",
70
+ "PL",
71
+ "PT",
72
+ "PTH",
73
+ "RET",
74
+ "RUF",
75
+ "SIM",
76
+ "UP",
77
+ "W",
78
+ ]
79
+ ignore = [
80
+ "D203",
81
+ "D212",
82
+ "PLR0913",
83
+ "PLR0917",
84
+ "PLC0415",
85
+ ]
86
+
87
+ [tool.ruff.lint.per-file-ignores]
88
+ "__init__.py" = ["D"]
89
+ "*/bin/*.py" = [
90
+ "D",
91
+ "UP007",
92
+ "UP045",
93
+ ]
94
+ "examples/*.py" = ["D"]
95
+
96
+ [tool.mypy]
97
+ ignore_missing_imports = true
98
+ disallow_untyped_calls = true
99
+ disallow_untyped_defs = true
100
+ disallow_incomplete_defs = true
101
+ check_untyped_defs = true
102
+ disallow_untyped_decorators = true
103
+
104
+ [tool.licensecheck]
105
+ license = "Apache-2.0"
106
+ ignore_packages = ["MYPY-EXTENSIONS"]
107
+ zero = true
108
+
109
+ [build-system]
110
+ requires = ["uv_build>=0.12.1,<0.13.0"]
111
+ build-backend = "uv_build"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "validio-cli"
3
- version = "10.0.6"
3
+ version = "10.0.7"
4
4
  description = "CLI tool to interact with the Validio platform"
5
5
  authors = [{ name = "Validio", email = "support@validio.io" }]
6
6
  requires-python = ">=3.10,<4"
@@ -15,9 +15,9 @@ classifiers = [
15
15
  "Programming Language :: Python :: 3.14",
16
16
  ]
17
17
  dependencies = [
18
- "camel-converter>=3.0.0,<4",
18
+ "camel-converter>=5.1.0,<6",
19
19
  "classdiff>=0.5.2,<0.6",
20
- "typer[all]>=0.8.0,<0.16.0",
20
+ "typer>=0.27.0,<0.28.0",
21
21
  "prompt-toolkit>=3.0.38,<4",
22
22
  "tabulate>=0.9.0,<0.11",
23
23
  "types-tabulate>=0.9.0.2,<0.11",
@@ -33,10 +33,10 @@ validio = "validio_cli.bin.main:main"
33
33
 
34
34
  [dependency-groups]
35
35
  dev = [
36
- "ruff==0.15.22",
36
+ "ruff==0.16.1",
37
37
  "mypy>=1.2.0,<2",
38
38
  "licensecheck>=2025.1.0,<2026",
39
- "pytest>=7.4.3,<8",
39
+ "pytest>=9.0.3,<10",
40
40
  "flameprof>=0.4,<0.5",
41
41
  "validio-sdk",
42
42
  ]
@@ -52,7 +52,7 @@ module-name = ["validio_cli"]
52
52
  module-root = ""
53
53
 
54
54
  [build-system]
55
- requires = ["uv_build>=0.9.5,<0.10.0"]
55
+ requires = ["uv_build>=0.12.1,<0.13.0"]
56
56
  build-backend = "uv_build"
57
57
 
58
58
  [tool.ruff]
@@ -82,6 +82,7 @@ ignore = [
82
82
  "D203", # `one-blank-line-before-class` Incompatible with D211
83
83
  "D212", # `multi-line-summary-first-line` Incompatible with D213
84
84
  "PLR0913", # `too-many-arguments` - Not relevant with only 6
85
+ "PLR0917", # `too-many-positional-arguments` - Same as PLR0913
85
86
  "PLC0415", # Imports are intentionally lazy (circular dependencies / startup perf)
86
87
  ]
87
88
 
@@ -11,10 +11,10 @@ from pathlib import Path
11
11
  from types import EllipsisType
12
12
  from typing import Any, TypeVar
13
13
 
14
- import click
15
14
  import typer
16
15
  from camel_converter import to_snake
17
16
  from tabulate import tabulate
17
+ from typer._click.globals import get_current_context
18
18
  from validio_sdk import config
19
19
  from validio_sdk._api.api import APIClient
20
20
  from validio_sdk.client import USER_AGENT as SDK_USER_AGENT
@@ -108,7 +108,7 @@ def _cli_headers(iac: bool = False) -> dict[str, str]:
108
108
  """
109
109
  headers: dict[str, str] = {}
110
110
 
111
- ctx = click.get_current_context(silent=True)
111
+ ctx = get_current_context(silent=True)
112
112
  if ctx is not None:
113
113
  # `command_path` is e.g. "validio channels get",
114
114
  # drop the program name to get the command itself.
@@ -20,7 +20,10 @@ from validio_sdk.resource._resource import (
20
20
  ResourceDeprecation,
21
21
  ResourceFeatureNotice,
22
22
  )
23
- from validio_sdk.resource._util import SourceSchemaReinference
23
+ from validio_sdk.resource._util import (
24
+ SourceSchemaInferenceSkip,
25
+ SourceSchemaReinference,
26
+ )
24
27
  from validio_sdk.resource.replacement import (
25
28
  ImmutableFieldReplacementReason,
26
29
  RecreateOnChangeReplacementReason,
@@ -130,6 +133,26 @@ update_all_schemas_option = typer.Option(
130
133
  ),
131
134
  )
132
135
 
136
+ skip_schema_inference_option = typer.Option(
137
+ [],
138
+ help=(
139
+ f"{BETA_BANNER} "
140
+ "Specify a Source name to create without inferring its schema. This will"
141
+ " fallback to the corresponding schema in the Validio catalog. You can use"
142
+ " --skip-schema-inference src1 --skip-schema-inference src2 to specify"
143
+ " multiple Sources."
144
+ ),
145
+ )
146
+
147
+ skip_all_schema_inference_option = typer.Option(
148
+ False,
149
+ help=(
150
+ f"{BETA_BANNER} "
151
+ "Similar to --skip-schema-inference. Skips schema inference for all Sources"
152
+ " being created"
153
+ ),
154
+ )
155
+
133
156
  show_progress_option = typer.Option(
134
157
  sys.stdout.isatty(),
135
158
  help=(
@@ -172,6 +195,8 @@ async def plan(
172
195
  config_dir: str = ConfigDir,
173
196
  update_schema: list[str] = update_schema_option,
174
197
  update_all_schemas: bool = update_all_schemas_option,
198
+ skip_schema_inference: list[str] = skip_schema_inference_option,
199
+ skip_all_schema_inference: bool = skip_all_schema_inference_option,
175
200
  show_schema: bool = show_schema_option,
176
201
  diff_output: DiffOutput = diff_option,
177
202
  destroy: bool = destroy_option,
@@ -193,6 +218,9 @@ async def plan(
193
218
  schema_reinference = create_source_schema_reinference(
194
219
  update_schema, update_all_schemas
195
220
  )
221
+ schema_inference_skip = create_source_schema_inference_skip(
222
+ skip_schema_inference, skip_all_schema_inference
223
+ )
196
224
 
197
225
  namespace = get_namespace(dir_path)
198
226
  await _plan(
@@ -200,6 +228,7 @@ async def plan(
200
228
  client=client,
201
229
  directory=dir_path,
202
230
  schema_reinference=schema_reinference,
231
+ schema_inference_skip=schema_inference_skip,
203
232
  destroy=destroy,
204
233
  no_capture=no_capture,
205
234
  color=color,
@@ -230,6 +259,8 @@ async def apply(
230
259
  config_dir: str = ConfigDir,
231
260
  update_schema: list[str] = update_schema_option,
232
261
  update_all_schemas: bool = update_all_schemas_option,
262
+ skip_schema_inference: list[str] = skip_schema_inference_option,
263
+ skip_all_schema_inference: bool = skip_all_schema_inference_option,
233
264
  show_schema: bool = show_schema_option,
234
265
  diff_output: DiffOutput = diff_option,
235
266
  destroy: bool = destroy_option,
@@ -263,6 +294,9 @@ async def apply(
263
294
  schema_reinference = create_source_schema_reinference(
264
295
  update_schema, update_all_schemas
265
296
  )
297
+ schema_inference_skip = create_source_schema_inference_skip(
298
+ skip_schema_inference, skip_all_schema_inference
299
+ )
266
300
 
267
301
  namespace = get_namespace(dir_path)
268
302
  plan_result = await _plan(
@@ -270,6 +304,7 @@ async def apply(
270
304
  client=client,
271
305
  directory=dir_path,
272
306
  schema_reinference=schema_reinference,
307
+ schema_inference_skip=schema_inference_skip,
273
308
  destroy=destroy,
274
309
  no_capture=no_capture,
275
310
  color=color,
@@ -308,6 +343,7 @@ async def apply(
308
343
  show_progress=progress,
309
344
  dry_run_sql=dry_run_sql,
310
345
  test_credentials=test_credentials,
346
+ schema_inference_skip=schema_inference_skip,
311
347
  )
312
348
 
313
349
  print(
@@ -435,6 +471,7 @@ async def _plan(
435
471
  destroy: bool,
436
472
  no_capture: bool,
437
473
  color: bool,
474
+ schema_inference_skip: SourceSchemaInferenceSkip = SourceSchemaInferenceSkip(),
438
475
  show_schema: bool = False,
439
476
  diff_output: DiffOutput = DiffOutput.FULL,
440
477
  show_secrets: bool = False,
@@ -447,6 +484,7 @@ async def _plan(
447
484
  client=client,
448
485
  directory=directory,
449
486
  schema_reinference=schema_reinference,
487
+ schema_inference_skip=schema_inference_skip,
450
488
  destroy=destroy,
451
489
  no_capture=no_capture,
452
490
  show_secrets=show_secrets,
@@ -741,6 +779,20 @@ def create_source_schema_reinference(
741
779
  )
742
780
 
743
781
 
782
+ def create_source_schema_inference_skip(
783
+ sources_to_skip: list[str], skip_all: bool
784
+ ) -> SourceSchemaInferenceSkip:
785
+ source_names = None
786
+ if skip_all:
787
+ source_names = []
788
+ elif len(sources_to_skip) > 0:
789
+ source_names = sources_to_skip
790
+
791
+ return SourceSchemaInferenceSkip(
792
+ set(source_names) if source_names is not None else None
793
+ )
794
+
795
+
744
796
  def _print_no_changes() -> None:
745
797
  print("No changes. The configuration is up-to-date!")
746
798
 
@@ -1,6 +1,5 @@
1
1
  from typing import Any, Optional
2
2
 
3
- import click
4
3
  import typer
5
4
  from validio_sdk import ValidioError
6
5
 
@@ -15,21 +14,7 @@ from validio_cli import (
15
14
  output_text,
16
15
  )
17
16
 
18
-
19
- class RoleSuggestion(click.ParamType):
20
- name = "role"
21
-
22
- def get_metavar(self, _: click.Parameter) -> str | None:
23
- return "[Admin|Editor|Viewer|<Custom>]"
24
-
25
- def convert(
26
- self,
27
- value: Any,
28
- _param: click.Parameter | None,
29
- _ctx: click.Context | None,
30
- ) -> Any:
31
- return value
32
-
17
+ ROLE_METAVAR = "[Admin|Editor|Viewer|<Custom>]"
33
18
 
34
19
  app = AsyncTyper(help="Namespaces used to separate resources")
35
20
 
@@ -63,7 +48,7 @@ async def create(
63
48
  identifier: str = typer.Argument(..., help="Namespace name"),
64
49
  role: str = typer.Option(
65
50
  None,
66
- click_type=RoleSuggestion(),
51
+ metavar=ROLE_METAVAR,
67
52
  help="The role (name or id) to assign --api-key and --member",
68
53
  ),
69
54
  api_key: list[str] = typer.Option(
@@ -134,7 +119,7 @@ async def update(
134
119
  identifier: str = typer.Argument(..., help="Namespace name"),
135
120
  role: str = typer.Option(
136
121
  None,
137
- click_type=RoleSuggestion(),
122
+ metavar=ROLE_METAVAR,
138
123
  help="The role (name or id) to assign --api-key and --member",
139
124
  ),
140
125
  api_key: list[str] = typer.Option(
@@ -4,7 +4,6 @@ import uuid
4
4
  from pathlib import Path
5
5
  from typing import Any, Optional, cast
6
6
 
7
- import click
8
7
  import typer
9
8
  from prompt_toolkit import PromptSession
10
9
  from prompt_toolkit.completion import WordCompleter
@@ -283,6 +282,7 @@ async def reset(
283
282
 
284
283
  @infer_schema_app.callback(invoke_without_command=True)
285
284
  def main(
285
+ ctx: typer.Context,
286
286
  interactive: bool = typer.Option(
287
287
  False, "--interactive", "-i", help="Infer schema with an interactive prompt"
288
288
  ),
@@ -290,8 +290,6 @@ def main(
290
290
  filename: Path = schema_filename_option("schema"),
291
291
  namespace: str = Namespace(),
292
292
  ) -> None:
293
- ctx = click.get_current_context()
294
-
295
293
  # A subcommand was run prior to this, nothing todo
296
294
  if ctx.invoked_subcommand is not None:
297
295
  return None
@@ -302,7 +300,7 @@ def main(
302
300
 
303
301
  # A flag for this command was used but not interactive, print the help as if
304
302
  # no command was given
305
- click.echo(ctx.get_help())
303
+ typer.echo(ctx.get_help())
306
304
 
307
305
  return None
308
306