clickhouse-users-cli 0.1.5__tar.gz → 0.1.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 (26) hide show
  1. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/LICENSE +1 -1
  2. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/PKG-INFO +211 -205
  3. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/README.md +14 -8
  4. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli/__init__.py +1 -1
  5. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli/app.py +695 -703
  6. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli/db.py +5 -5
  7. clickhouse_users_cli-0.1.7/clickhouse_users_cli/i18n.py +495 -0
  8. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli/session.py +8 -10
  9. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli/sql_builder.py +8 -6
  10. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli/style.py +4 -3
  11. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli/validators.py +12 -10
  12. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli.egg-info/PKG-INFO +211 -205
  13. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli.egg-info/SOURCES.txt +9 -1
  14. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/pyproject.toml +8 -0
  15. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/setup.cfg +4 -4
  16. clickhouse_users_cli-0.1.7/tests/test_app.py +154 -0
  17. clickhouse_users_cli-0.1.7/tests/test_db.py +128 -0
  18. clickhouse_users_cli-0.1.7/tests/test_i18n.py +47 -0
  19. clickhouse_users_cli-0.1.7/tests/test_session.py +54 -0
  20. clickhouse_users_cli-0.1.7/tests/test_sql_builder.py +93 -0
  21. clickhouse_users_cli-0.1.7/tests/test_style.py +22 -0
  22. clickhouse_users_cli-0.1.7/tests/test_validators.py +53 -0
  23. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli.egg-info/dependency_links.txt +0 -0
  24. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli.egg-info/entry_points.txt +0 -0
  25. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli.egg-info/requires.txt +0 -0
  26. {clickhouse_users_cli-0.1.5 → clickhouse_users_cli-0.1.7}/clickhouse_users_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 TODO-SEU-NOME
3
+ Copyright (c) 2026 João Pedro Zanetti Gonçalves
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,205 +1,211 @@
1
- Metadata-Version: 2.4
2
- Name: clickhouse-users-cli
3
- Version: 0.1.5
4
- Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
5
- License-Expression: MIT
6
- Keywords: clickhouse,cli,users,access-control,least-privilege
7
- Classifier: Programming Language :: Python :: 3
8
- Classifier: Programming Language :: Python :: 3.10
9
- Classifier: Programming Language :: Python :: 3.11
10
- Classifier: Programming Language :: Python :: 3.12
11
- Classifier: Environment :: Console
12
- Classifier: Intended Audience :: System Administrators
13
- Classifier: Operating System :: OS Independent
14
- Classifier: Topic :: Database
15
- Classifier: Topic :: System :: Systems Administration
16
- Requires-Python: >=3.10
17
- Description-Content-Type: text/markdown
18
- License-File: LICENSE
19
- Requires-Dist: questionary>=2.0.0
20
- Requires-Dist: clickhouse-connect>=0.8.0
21
- Requires-Dist: rich>=13.0.0
22
- Requires-Dist: pyyaml>=6.0
23
- Dynamic: license-file
24
-
25
- # ⬢ ClickHouse Users CLI
26
-
27
- [![PyPI version](https://img.shields.io/pypi/v/clickhouse-users-cli.svg)](https://pypi.org/project/clickhouse-users-cli/)
28
- [![Python](https://img.shields.io/pypi/pyversions/clickhouse-users-cli.svg)](https://pypi.org/project/clickhouse-users-cli/)
29
- [![License: MIT](https://img.shields.io/badge/License-MIT-00d7ff.svg)](https://opensource.org/licenses/MIT)
30
-
31
- > Crie e gerencie usuários no ClickHouse com **privilégio mínimo** (*least privilege*) — sem decorar sintaxe de `GRANT`, sem acesso amplo por acidente.
32
-
33
- CLI interativa em Python ([`questionary`](https://questionary.readthedocs.io/) + [`rich`](https://github.com/Textualize/rich)): ela pergunta, você marca com `espaço`, confere o **SQL exato com preview** e só então executa. Nada roda sem confirmação.
34
-
35
- ```
36
- ╔══════════════════════════════════════════════════════════════════════════════╗
37
- ║ ║
38
- ║ ╭──────────╮ ║
39
- ║ │ ▓▓▓▓▓▓▓▓ │ ║
40
- ║ │ │ ║
41
- ║ ╰──────────╯ ║
42
- ║ ⬢ ClickHouse Users CLI ║
43
- ║ Crie usuários com escopo mínimo necessário ║
44
- ║ criar ◆ listar ◆ desativar ◆ auditar ║
45
- ║ ║
46
- ╚═════════════════════════ least privilege por padrão ═════════════════════════╝
47
- ```
48
-
49
- ---
50
-
51
- ## 🚀 Instalação
52
-
53
- ```powershell
54
- pip install clickhouse-users-cli
55
- ch-users
56
- ```
57
-
58
- | Cenário | Comando |
59
- |---|---|
60
- | Instalar / atualizar | `pip install -U clickhouse-users-cli` |
61
- | Rodar | `ch-users` |
62
- | Do código-fonte | `pip install -r requirements.txt` + `python main.py` |
63
- | Requisitos | Python `>= 3.10` + conta admin no ClickHouse (ex.: `default`) |
64
-
65
- ---
66
-
67
- ## ⚡ Comece em 60 segundos
68
-
69
- 1. Rode `ch-users` e conecte com sua conta admin (host, protocolo, porta, usuário/senha — testado com `SELECT 1`).
70
- 2. Escolha **Criar usuário** → perfil `readonly` → nome + senha → marque os bancos/tabelas → confira o preview.
71
- 3. Confirme. Pronto — o SQL abaixo foi executado:
72
-
73
- ```sql
74
- CREATE USER IF NOT EXISTS `analyst_julho` IDENTIFIED WITH plaintext_password BY '***' HOST ANY;
75
- GRANT SHOW, SELECT ON `vendas`.`pedidos` TO `analyst_julho`;
76
- GRANT SHOW, SELECT ON `vendas`.`clientes` TO `analyst_julho`;
77
- ```
78
-
79
- ---
80
-
81
- ## 🧭 Menu principal
82
-
83
- Após conectar, o menu fica em loop — dá para fazer várias operações sem reconectar:
84
-
85
- | Opção | O que faz |
86
- |---|---|
87
- | 🌱 **Criar usuário** | Fluxo guiado em 6 etapas (perfil → credenciais → escopo → hosts → revisão) |
88
- | 📋 **Listar usuários** | Tabela via `SHOW USERS` + detalhe opcional (`SHOW CREATE USER` e `SHOW GRANTS FOR`) |
89
- | 🛠️ **Gerenciar usuário** | Editar permissões · desativar · reativar · excluir |
90
- | 🧹 **Esquecer sessão** | Apaga o YAML de conexão salva *(aparece só se existir)* |
91
- | 👋 **Sair** | Encerra (Ctrl+C também sai limpo, sem executar nada) |
92
-
93
- ### Criar — as 6 etapas
94
-
95
- 1. 🔌 **Conexão** — host, protocolo (`http:8123` / `https:8443`), porta, usuário/senha admin. Falhou? Tentar de novo / editar / sair.
96
- 2. 🎭 **Tipo de usuário** — perfil com descrição (`readonly`, `readwrite`, `admin`, `custom`).
97
- 3. 🪪 **Novo usuário** — nome validado (letras, números, `_`; bloqueia `default`, `root`…) + senha com confirmação.
98
- 4. 🗂️ **Escopo** — `SHOW DATABASES` → marque bancos (nada vem marcado; há a opção `✓ Todos os bancos`) → por banco, marque tabelas ou `banco.*` (vale para tabelas futuras).
99
- 5. 🔑 **Privilégios + origem** — no `custom`, marque só o necessário (`DROP`/`TRUNCATE` pedem confirmação extra); depois `HOST ANY | LOCALHOST | IPs`.
100
- 6. 👀 **Revisão** — tabela-resumo + SQL com syntax highlight + confirmação final.
101
-
102
- ### Gerenciar — os 4 poderes
103
-
104
- Escolhe 1 usuário, vê status (`HOST NONE` = inativo) + grants atuais, depois:
105
-
106
- | Ação | SQL executado | Reversível? |
107
- |---|---|---|
108
- | ✏️ **Editar permissões** | `REVOKE ALL ON *.*` + novos `GRANTs` (perfil + escopo perguntados de novo, com frases próprias de edição) | ✅ ( reaplicando) |
109
- | 🚫 **Desativar** | `ALTER USER \`nome\` HOST NONE` (bloqueia login, mantém grants) | ✅ via Reativar |
110
- | ✅ **Reativar** | `ALTER USER \`nome\` HOST ANY` | — |
111
- | 🗑️ **Excluir** | `DROP USER IF EXISTS \`nome\`` | ❌ definitivo |
112
-
113
- > Todo DDL tem preview + confirmação com default **não**. Mexer no próprio usuário logado gera alerta extra. 👻
114
-
115
- ### 💾 Sessão salva (manter conectado)
116
-
117
- - Após conectar, o CLI pergunta se quer **manter conectado**: salva `~/.ch-users/connection.yaml` (host, porta, protocolo, usuário, senha).
118
- - Na próxima execução: **usar a salva · nova conexão · apagar a salva** (a senha nunca é exibida).
119
- - ⚠️ A senha fica em **texto puro** no arquivo (`0600` no Linux/mac; no Windows vale o aviso em tela). Use só em máquina confiável — nunca compartilhe o arquivo.
120
-
121
- ---
122
-
123
- ## 🔐 Permissões que sua conta admin precisa
124
-
125
- | Para… | Privilégio ClickHouse |
126
- |---|---|
127
- | Criar + conceder | `CREATE USER` + `GRANT` (nos escopos) |
128
- | Listar / auditar | `SHOW USERS` (+ acesso aos grants) |
129
- | Desativar / reativar / editar acessos | `ALTER USER` + `GRANT`/`REVOKE` nos escopos |
130
- | Excluir | `DROP USER` |
131
-
132
- Sem a permissão, o comando falha com mensagem amigável + dica — nada quebra pela metade sem aviso (na edição, se o `GRANT` falhar após o `REVOKE`, o CLI avisa para conferir em **Listar**).
133
-
134
- ---
135
-
136
- ## 🎭 Perfis (tipo de acesso)
137
-
138
- | Perfil | Privilégios | Feito para |
139
- |---|---|---|
140
- | `readonly` | `SHOW, SELECT` | BI, analistas |
141
- | `readwrite` | `SHOW, SELECT, INSERT` | Engenheiros, ingestão |
142
- | `admin` | `ALL ... WITH GRANT OPTION` | ⚠️ Acesso total — cuidado! |
143
- | `custom` | Você marca: `SELECT/SHOW/INSERT/CREATE/ALTER/DROP/TRUNCATE/OPTIMIZE/KILL QUERY` | Casos especiais |
144
-
145
- ---
146
-
147
- ## 🧠 Por que cada tela é do jeito que é
148
-
149
- | Dado | Widget | Motivo |
150
- |---|---|---|
151
- | Host, porta, nomes, IPs | `text` + validação + `default` | Entrada livre com exemplo; `default` acelera localhost:8123 |
152
- | Senhas | `password` mascarado | Não ecoa segredo; novo usuário pede confirmação |
153
- | Protocolo / perfil / ação | `select` com descrição | Escolha única; descrição explica o impacto |
154
- | Bancos, tabelas, privilégios | `checkbox` (espaço marca) | Multi-seleção; `banco.*` evita marcar 100 tabelas |
155
- | Confirmações destrutivas | `confirm` com default seguro | O "não" é sempre o padrão |
156
- | Progresso | spinner + cabeçalho de etapa | Você sempre sabe "onde estou" e o que está carregando |
157
- | Revisão | tabela + SQL destacado | Sem caixa-preta: o SQL exato antes de executar |
158
-
159
- Princípios: **opt-in explícito** (nada pré-marcado), **escape correto** (backticks em identificadores, aspas simples em strings), **SQL separado da UI** (`sql_builder.py` é puro e testável sem banco).
160
-
161
- ---
162
-
163
- ## 🧑‍💻 Desenvolvimento
164
-
165
- ```powershell
166
- pip install -r requirements.txt
167
- python main.py # roda do fonte
168
- python -m build # gera sdist + wheel em dist/
169
- python -m twine check dist/* # valida (inclusive este README)
170
- python -m twine upload dist/* # publica (precisa de token PyPI)
171
- ```
172
-
173
- Versão em fonte única: `clickhouse_users_cli/__init__.py` (`__version__`).
174
-
175
- ```
176
- main.py # entrypoint (dev local)
177
- requirements.txt
178
- pyproject.toml # build + metadados PyPI (comando: ch-users)
179
- clickhouse_users_cli/
180
- __init__.py # __version__
181
- app.py # fluxos interativos (criar, listar, gerenciar, sessão)
182
- db.py # clickhouse-connect: connect, SHOWs, DDL
183
- session.py # sessão YAML local (salvar/carregar/apagar)
184
- sql_builder.py # CREATE/ALTER/DROP/GRANT/REVOKE puros (testável)
185
- validators.py # validações por tipo de input
186
- style.py # banner, etapas, tabelas e mensagens (Rich)
187
- ```
188
-
189
- ---
190
-
191
- ## 📝 Changelog
192
-
193
- | Versão | Novidade |
194
- |---|---|
195
- | `0.1.4` | Frases próprias no modo edição (sem `2/6`, `4/6` da criação) |
196
- | `0.1.3` | Editar permissões (`REVOKE ALL` + novos `GRANTs`) |
197
- | `0.1.2` | Sessão salva em YAML + visual profissional (banner, badges, tabelas) |
198
- | `0.1.1` | Lista sem pré-seleção + opção `✓ Todos os bancos` |
199
- | `0.1.0` | Criar, listar e gerenciar (desativar/reativar/excluir) |
200
-
201
- ---
202
-
203
- ## 📄 Licença
204
-
205
- MIT — veja [LICENSE](LICENSE).
1
+ Metadata-Version: 2.4
2
+ Name: clickhouse-users-cli
3
+ Version: 0.1.7
4
+ Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
5
+ License-Expression: MIT
6
+ Keywords: clickhouse,cli,users,access-control,least-privilege
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: Programming Language :: Python :: 3.10
9
+ Classifier: Programming Language :: Python :: 3.11
10
+ Classifier: Programming Language :: Python :: 3.12
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: System Administrators
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Topic :: Database
15
+ Classifier: Topic :: System :: Systems Administration
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: questionary>=2.0.0
20
+ Requires-Dist: clickhouse-connect>=0.8.0
21
+ Requires-Dist: rich>=13.0.0
22
+ Requires-Dist: pyyaml>=6.0
23
+ Dynamic: license-file
24
+
25
+ # ⬢ ClickHouse Users CLI
26
+
27
+ [![PyPI version](https://img.shields.io/pypi/v/clickhouse-users-cli.svg)](https://pypi.org/project/clickhouse-users-cli/)
28
+ [![Python](https://img.shields.io/pypi/pyversions/clickhouse-users-cli.svg)](https://pypi.org/project/clickhouse-users-cli/)
29
+ [![License: MIT](https://img.shields.io/badge/License-MIT-00d7ff.svg)](https://opensource.org/licenses/MIT)
30
+
31
+ > Crie e gerencie usuários no ClickHouse com **privilégio mínimo** (*least privilege*) — sem decorar sintaxe de `GRANT`, sem acesso amplo por acidente.
32
+
33
+ CLI interativa em Python ([`questionary`](https://questionary.readthedocs.io/) + [`rich`](https://github.com/Textualize/rich)): ela pergunta, você marca com `espaço`, confere o **SQL exato com preview** e só então executa. Nada roda sem confirmação.
34
+
35
+ ```
36
+ ╔══════════════════════════════════════════════════════════════════════════════╗
37
+ ║ ║
38
+ ║ ╭──────────╮ ║
39
+ ║ │ ▓▓▓▓▓▓▓▓ │ ║
40
+ ║ │ │ ║
41
+ ║ ╰──────────╯ ║
42
+ ║ ⬢ ClickHouse Users CLI ║
43
+ ║ Crie usuários com escopo mínimo necessário ║
44
+ ║ criar ◆ listar ◆ desativar ◆ auditar ║
45
+ ║ ║
46
+ ╚═════════════════════════ least privilege por padrão ═════════════════════════╝
47
+ ```
48
+
49
+ ---
50
+
51
+ ## 🚀 Instalação
52
+
53
+ ```powershell
54
+ pip install clickhouse-users-cli
55
+ ch-users
56
+ ```
57
+
58
+ | Cenário | Comando |
59
+ |---|---|
60
+ | Instalar / atualizar | `pip install -U clickhouse-users-cli` |
61
+ | Rodar | `ch-users` |
62
+ | Do código-fonte | `uv sync` + `uv run ch-users` |
63
+ | Requisitos | Python `>= 3.10` ([UV](https://docs.astral.sh/uv/) gerencia tudo via `uv.lock`) + conta admin no ClickHouse (ex.: `default`) |
64
+ | Idioma | Automático pelo sistema operacional: PT em sistemas em português, EN nos demais. Force com `CH_USERS_LANG=pt` ou `CH_USERS_LANG=en` |
65
+
66
+ ---
67
+
68
+ ## ⚡ Comece em 60 segundos
69
+
70
+ 1. Rode `ch-users` e conecte com sua conta admin (host, protocolo, porta, usuário/senha — testado com `SELECT 1`).
71
+ 2. Escolha **Criar usuário** → perfil `readonly` → nome + senha → marque os bancos/tabelas → confira o preview.
72
+ 3. Confirme. Pronto — o SQL abaixo foi executado:
73
+
74
+ ```sql
75
+ CREATE USER IF NOT EXISTS `analyst_julho` IDENTIFIED WITH plaintext_password BY '***' HOST ANY;
76
+ GRANT SHOW, SELECT ON `vendas`.`pedidos` TO `analyst_julho`;
77
+ GRANT SHOW, SELECT ON `vendas`.`clientes` TO `analyst_julho`;
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 🧭 Menu principal
83
+
84
+ Após conectar, o menu fica em loop — dá para fazer várias operações sem reconectar:
85
+
86
+ | Opção | O que faz |
87
+ |---|---|
88
+ | 🌱 **Criar usuário** | Fluxo guiado em 6 etapas (perfil → credenciais → escopo → hosts → revisão) |
89
+ | 📋 **Listar usuários** | Tabela via `SHOW USERS` + detalhe opcional (`SHOW CREATE USER` e `SHOW GRANTS FOR`) |
90
+ | 🛠️ **Gerenciar usuário** | Editar permissões · desativar · reativar · excluir |
91
+ | 🧹 **Esquecer sessão** | Apaga o YAML de conexão salva *(aparece só se existir)* |
92
+ | 👋 **Sair** | Encerra (Ctrl+C também sai limpo, sem executar nada) |
93
+
94
+ ### Criar — as 6 etapas
95
+
96
+ 1. 🔌 **Conexão** — host, protocolo (`http:8123` / `https:8443`), porta, usuário/senha admin. Falhou? Tentar de novo / editar / sair.
97
+ 2. 🎭 **Tipo de usuário** — perfil com descrição (`readonly`, `readwrite`, `admin`, `custom`).
98
+ 3. 🪪 **Novo usuário** — nome validado (letras, números, `_`; bloqueia `default`, `root`…) + senha com confirmação.
99
+ 4. 🗂️ **Escopo** — `SHOW DATABASES` → marque bancos (nada vem marcado; há a opção `✓ Todos os bancos`) → por banco, marque tabelas ou `banco.*` (vale para tabelas futuras).
100
+ 5. 🔑 **Privilégios + origem** — no `custom`, marque só o necessário (`DROP`/`TRUNCATE` pedem confirmação extra); depois `HOST ANY | LOCALHOST | IPs`.
101
+ 6. 👀 **Revisão** — tabela-resumo + SQL com syntax highlight + confirmação final.
102
+
103
+ ### Gerenciar — os 4 poderes
104
+
105
+ Escolhe 1 usuário, vê status (`HOST NONE` = inativo) + grants atuais, depois:
106
+
107
+ | Ação | SQL executado | Reversível? |
108
+ |---|---|---|
109
+ | ✏️ **Editar permissões** | `REVOKE ALL ON *.*` + novos `GRANTs` (perfil + escopo perguntados de novo, com frases próprias de edição) | ✅ ( reaplicando) |
110
+ | 🚫 **Desativar** | `ALTER USER \`nome\` HOST NONE` (bloqueia login, mantém grants) | ✅ via Reativar |
111
+ | ✅ **Reativar** | `ALTER USER \`nome\` HOST ANY` | — |
112
+ | 🗑️ **Excluir** | `DROP USER IF EXISTS \`nome\`` | ❌ definitivo |
113
+
114
+ > Todo DDL tem preview + confirmação com default **não**. Mexer no próprio usuário logado gera alerta extra. 👻
115
+
116
+ ### 💾 Sessão salva (manter conectado)
117
+
118
+ - Após conectar, o CLI pergunta se quer **manter conectado**: salva `~/.ch-users/connection.yaml` (host, porta, protocolo, usuário, senha).
119
+ - Na próxima execução: **usar a salva · nova conexão · apagar a salva** (a senha nunca é exibida).
120
+ - ⚠️ A senha fica em **texto puro** no arquivo (`0600` no Linux/mac; no Windows vale o aviso em tela). Use só em máquina confiável — nunca compartilhe o arquivo.
121
+
122
+ ---
123
+
124
+ ## 🔐 Permissões que sua conta admin precisa
125
+
126
+ | Para… | Privilégio ClickHouse |
127
+ |---|---|
128
+ | Criar + conceder | `CREATE USER` + `GRANT` (nos escopos) |
129
+ | Listar / auditar | `SHOW USERS` (+ acesso aos grants) |
130
+ | Desativar / reativar / editar acessos | `ALTER USER` + `GRANT`/`REVOKE` nos escopos |
131
+ | Excluir | `DROP USER` |
132
+
133
+ Sem a permissão, o comando falha com mensagem amigável + dica — nada quebra pela metade sem aviso (na edição, se o `GRANT` falhar após o `REVOKE`, o CLI avisa para conferir em **Listar**).
134
+
135
+ ---
136
+
137
+ ## 🎭 Perfis (tipo de acesso)
138
+
139
+ | Perfil | Privilégios | Feito para |
140
+ |---|---|---|
141
+ | `readonly` | `SHOW, SELECT` | BI, analistas |
142
+ | `readwrite` | `SHOW, SELECT, INSERT` | Engenheiros, ingestão |
143
+ | `admin` | `ALL ... WITH GRANT OPTION` | ⚠️ Acesso total — cuidado! |
144
+ | `custom` | Você marca: `SELECT/SHOW/INSERT/CREATE/ALTER/DROP/TRUNCATE/OPTIMIZE/KILL QUERY` | Casos especiais |
145
+
146
+ ---
147
+
148
+ ## 🧠 Por que cada tela é do jeito que é
149
+
150
+ | Dado | Widget | Motivo |
151
+ |---|---|---|
152
+ | Host, porta, nomes, IPs | `text` + validação + `default` | Entrada livre com exemplo; `default` acelera localhost:8123 |
153
+ | Senhas | `password` mascarado | Não ecoa segredo; novo usuário pede confirmação |
154
+ | Protocolo / perfil / ação | `select` com descrição | Escolha única; descrição explica o impacto |
155
+ | Bancos, tabelas, privilégios | `checkbox` (espaço marca) | Multi-seleção; `banco.*` evita marcar 100 tabelas |
156
+ | Confirmações destrutivas | `confirm` com default seguro | O "não" é sempre o padrão |
157
+ | Progresso | spinner + cabeçalho de etapa | Você sempre sabe "onde estou" e o que está carregando |
158
+ | Revisão | tabela + SQL destacado | Sem caixa-preta: o SQL exato antes de executar |
159
+
160
+ Princípios: **opt-in explícito** (nada pré-marcado), **escape correto** (backticks em identificadores, aspas simples em strings), **SQL separado da UI** (`sql_builder.py` é puro e testável sem banco).
161
+
162
+ ---
163
+
164
+ ## 🧑‍💻 Desenvolvimento
165
+
166
+ ```powershell
167
+ uv sync # instala tudo (usa uv.lock)
168
+ uv run ch-users # roda o CLI do fonte
169
+ uv run python main.py # alternativa direta
170
+ uv run pytest -q # suíte de testes (44 testes, sem banco)
171
+ uv build # gera sdist + wheel em dist/
172
+ uvx twine check dist/* # valida (inclusive este README)
173
+ uv publish # publica (UV_PUBLISH_TOKEN)
174
+ ```
175
+
176
+ Versão em fonte única: `clickhouse_users_cli/__init__.py` (`__version__`).
177
+
178
+ > 🤖 **CI**: todo merge na `main` publica sozinho via `.github/workflows/publish.yml` — incrementa o patch, commita (`[skip ci]`), builda e sobe ao PyPI com o secret `KEI_API_PYPI`.
179
+
180
+ ```
181
+ main.py # entrypoint (dev local)
182
+ pyproject.toml # build + metadados PyPI (comando: ch-users)
183
+ uv.lock # dependências travadas
184
+ .python-version # Python do projeto (uv)
185
+ clickhouse_users_cli/
186
+ __init__.py # __version__
187
+ app.py # fluxos interativos (criar, listar, gerenciar, sessão)
188
+ db.py # clickhouse-connect: connect, SHOWs, DDL
189
+ session.py # sessão YAML local (salvar/carregar/apagar)
190
+ sql_builder.py # CREATE/ALTER/DROP/GRANT/REVOKE puros (testável)
191
+ validators.py # validações por tipo de input
192
+ style.py # banner, etapas, tabelas e mensagens (Rich)
193
+ ```
194
+
195
+ ---
196
+
197
+ ## 📝 Changelog
198
+
199
+ | Versão | Novidade |
200
+ |---|---|
201
+ | `0.1.4` | Frases próprias no modo edição (sem `2/6`, `4/6` da criação) |
202
+ | `0.1.3` | Editar permissões (`REVOKE ALL` + novos `GRANTs`) |
203
+ | `0.1.2` | Sessão salva em YAML + visual profissional (banner, badges, tabelas) |
204
+ | `0.1.1` | Lista sem pré-seleção + opção `✓ Todos os bancos` |
205
+ | `0.1.0` | Criar, listar e gerenciar (desativar/reativar/excluir) |
206
+
207
+ ---
208
+
209
+ ## 📄 Licença
210
+
211
+ MIT — veja [LICENSE](LICENSE).
@@ -35,8 +35,9 @@ ch-users
35
35
  |---|---|
36
36
  | Instalar / atualizar | `pip install -U clickhouse-users-cli` |
37
37
  | Rodar | `ch-users` |
38
- | Do código-fonte | `pip install -r requirements.txt` + `python main.py` |
39
- | Requisitos | Python `>= 3.10` + conta admin no ClickHouse (ex.: `default`) |
38
+ | Do código-fonte | `uv sync` + `uv run ch-users` |
39
+ | Requisitos | Python `>= 3.10` ([UV](https://docs.astral.sh/uv/) gerencia tudo via `uv.lock`) + conta admin no ClickHouse (ex.: `default`) |
40
+ | Idioma | Automático pelo sistema operacional: PT em sistemas em português, EN nos demais. Force com `CH_USERS_LANG=pt` ou `CH_USERS_LANG=en` |
40
41
 
41
42
  ---
42
43
 
@@ -139,19 +140,24 @@ Princípios: **opt-in explícito** (nada pré-marcado), **escape correto** (back
139
140
  ## 🧑‍💻 Desenvolvimento
140
141
 
141
142
  ```powershell
142
- pip install -r requirements.txt
143
- python main.py # roda do fonte
144
- python -m build # gera sdist + wheel em dist/
145
- python -m twine check dist/* # valida (inclusive este README)
146
- python -m twine upload dist/* # publica (precisa de token PyPI)
143
+ uv sync # instala tudo (usa uv.lock)
144
+ uv run ch-users # roda o CLI do fonte
145
+ uv run python main.py # alternativa direta
146
+ uv run pytest -q # suíte de testes (44 testes, sem banco)
147
+ uv build # gera sdist + wheel em dist/
148
+ uvx twine check dist/* # valida (inclusive este README)
149
+ uv publish # publica (UV_PUBLISH_TOKEN)
147
150
  ```
148
151
 
149
152
  Versão em fonte única: `clickhouse_users_cli/__init__.py` (`__version__`).
150
153
 
154
+ > 🤖 **CI**: todo merge na `main` publica sozinho via `.github/workflows/publish.yml` — incrementa o patch, commita (`[skip ci]`), builda e sobe ao PyPI com o secret `KEI_API_PYPI`.
155
+
151
156
  ```
152
157
  main.py # entrypoint (dev local)
153
- requirements.txt
154
158
  pyproject.toml # build + metadados PyPI (comando: ch-users)
159
+ uv.lock # dependências travadas
160
+ .python-version # Python do projeto (uv)
155
161
  clickhouse_users_cli/
156
162
  __init__.py # __version__
157
163
  app.py # fluxos interativos (criar, listar, gerenciar, sessão)
@@ -1,5 +1,5 @@
1
1
  """ClickHouse Users CLI — crie usuários com escopo mínimo (least privilege)."""
2
2
 
3
- __version__ = "0.1.5"
3
+ __version__ = "0.1.7"
4
4
 
5
5
  __all__ = ["__version__"]