clickhouse-users-cli 0.1.3__tar.gz → 0.1.4__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 (18) hide show
  1. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/PKG-INFO +1 -1
  2. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/__init__.py +1 -1
  3. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/app.py +28 -14
  4. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/PKG-INFO +1 -1
  5. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/LICENSE +0 -0
  6. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/README.md +0 -0
  7. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/db.py +0 -0
  8. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/session.py +0 -0
  9. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/sql_builder.py +0 -0
  10. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/style.py +0 -0
  11. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/validators.py +0 -0
  12. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/SOURCES.txt +0 -0
  13. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/dependency_links.txt +0 -0
  14. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/entry_points.txt +0 -0
  15. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/requires.txt +0 -0
  16. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/top_level.txt +0 -0
  17. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/pyproject.toml +0 -0
  18. {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clickhouse-users-cli
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
5
5
  License-Expression: MIT
6
6
  Keywords: clickhouse,cli,users,access-control,least-privilege
@@ -1,5 +1,5 @@
1
1
  """ClickHouse Users CLI — crie usuários com escopo mínimo (least privilege)."""
2
2
 
3
- __version__ = "0.1.3"
3
+ __version__ = "0.1.4"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -106,11 +106,16 @@ def connect_with_retry(conn: ConnectionInfo) -> ClickHouseAdmin:
106
106
 
107
107
  # ── Etapa 2: perfil do novo usuário ───────────────────────────────────────────
108
108
 
109
- def ask_profile() -> str:
110
- step("2/6 · Tipo de usuário", "O perfil define os privilégios padrão (least privilege primeiro).")
109
+ def ask_profile(mode: str = "create") -> str:
110
+ if mode == "edit":
111
+ step("Editar · Tipo de acesso", "O perfil redefine os privilégios (os atuais serão zerados).")
112
+ question = "Qual o novo tipo de acesso?"
113
+ else:
114
+ step("2/6 · Tipo de usuário", "O perfil define os privilégios padrão (least privilege primeiro).")
115
+ question = "Que tipo de usuário criar?"
111
116
  return _ask_or_abort(
112
117
  Q.select(
113
- "Que tipo de usuário criar?",
118
+ question,
114
119
  choices=[Q.Choice(PROFILE_LABELS[k], value=k) for k in ("readonly", "readwrite", "admin", "custom")],
115
120
  default="readonly",
116
121
  style=APP_STYLE, qmark="›",
@@ -140,8 +145,11 @@ def ask_new_credentials() -> tuple[str, str]:
140
145
 
141
146
  # ── Etapa 4: escopo (bancos → tabelas) ────────────────────────────────────────
142
147
 
143
- def ask_databases(admin: ClickHouseAdmin) -> list[str]:
144
- step("4/6 · Escopo — bancos", "Espaço marca · A confirma · Ctrl+A inverte a seleção.")
148
+ def ask_databases(admin: ClickHouseAdmin, mode: str = "create") -> list[str]:
149
+ if mode == "edit":
150
+ step("Editar · Escopo — bancos", "Espaço marca · A confirma · Ctrl+A inverte a seleção.")
151
+ else:
152
+ step("4/6 · Escopo — bancos", "Espaço marca · A confirma · Ctrl+A inverte a seleção.")
145
153
  with console.status("[cyan]Listando bancos…[/]", spinner="dots"):
146
154
  try:
147
155
  databases = admin.list_databases()
@@ -176,8 +184,11 @@ def ask_databases(admin: ClickHouseAdmin) -> list[str]:
176
184
  return selected
177
185
 
178
186
 
179
- def ask_tables(admin: ClickHouseAdmin, databases: list[str]) -> list[GrantScope]:
180
- step("4/6 · Escopo — tabelas", "Escolha '*' para o banco inteiro ou marque tabelas específicas.")
187
+ def ask_tables(admin: ClickHouseAdmin, databases: list[str], mode: str = "create") -> list[GrantScope]:
188
+ if mode == "edit":
189
+ step("Editar · Escopo — tabelas", "Escolha '*' para o banco inteiro ou marque tabelas específicas.")
190
+ else:
191
+ step("4/6 · Escopo — tabelas", "Escolha '*' para o banco inteiro ou marque tabelas específicas.")
181
192
  scopes: list[GrantScope] = []
182
193
  for db in databases:
183
194
  try:
@@ -226,13 +237,16 @@ PRIVILEGE_CHOICES = [
226
237
  ]
227
238
 
228
239
 
229
- def ask_privileges(profile: str) -> tuple[list[str], bool]:
240
+ def ask_privileges(profile: str, mode: str = "create") -> tuple[list[str], bool]:
230
241
  """Retorna (privilégios, grant_option)."""
231
242
  if profile != "custom":
232
243
  grant_option = profile == "admin"
233
244
  return list(PROFILE_PRIVILEGES[profile]), grant_option
234
245
 
235
- step("5/6 · Privilégios personalizados", "Marque só o necessário — DROP/TRUNCATE exigem confirmação extra.")
246
+ if mode == "edit":
247
+ step("Editar · Privilégios personalizados", "Marque só o necessário — DROP/TRUNCATE exigem confirmação extra.")
248
+ else:
249
+ step("5/6 · Privilégios personalizados", "Marque só o necessário — DROP/TRUNCATE exigem confirmação extra.")
236
250
  privs: list[str] = _ask_or_abort(
237
251
  Q.checkbox(
238
252
  "Quais privilégios conceder?",
@@ -247,7 +261,7 @@ def ask_privileges(profile: str) -> tuple[list[str], bool]:
247
261
  Q.confirm("Você marcou privilégio destrutivo. Tem certeza?", default=False, style=APP_STYLE, qmark="›")
248
262
  )
249
263
  if not grant_option_confirm:
250
- return ask_privileges("custom")
264
+ return ask_privileges("custom", mode=mode)
251
265
  else:
252
266
  grant_option = _ask_or_abort(
253
267
  Q.confirm("Permitir repassar acessos (WITH GRANT OPTION)?", default=False, style=APP_STYLE, qmark="›")
@@ -511,12 +525,12 @@ def flow_edit_grants(admin: ClickHouseAdmin, username: str) -> None:
511
525
  if username == admin.conn.username:
512
526
  warn(f"'{username}' é o usuário conectado agora. Zerar os próprios acessos pode te derrubar.")
513
527
 
514
- profile = ask_profile()
515
- privileges, grant_option = ask_privileges(profile)
528
+ profile = ask_profile(mode="edit")
529
+ privileges, grant_option = ask_privileges(profile, mode="edit")
516
530
  if profile == "admin":
517
531
  grant_option = True
518
- databases = ask_databases(admin)
519
- scopes = ask_tables(admin, databases)
532
+ databases = ask_databases(admin, mode="edit")
533
+ scopes = ask_tables(admin, databases, mode="edit")
520
534
 
521
535
  statements = build_edit_grants_statements(username, privileges, scopes, grant_option)
522
536
  table = make_table(f"Novos acessos de '{username}'")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clickhouse-users-cli
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
5
5
  License-Expression: MIT
6
6
  Keywords: clickhouse,cli,users,access-control,least-privilege