profgabrielramos Claude Sonnet 4.6 commited on
Commit
6c2641f
·
1 Parent(s): 3faa51f

docs: expand architecture documentation with detailed 11-section template

Browse files

- Replace minimal 26-line document with comprehensive 319-line version
- Add complete project structure diagram with file descriptions
- Include Mermaid diagram showing data flow and component interactions
- Document all core components (Frontend UI, Backend logic, Static data)
- Detail data stores (progress.json format, in-memory dictionaries)
- Add deployment section for Hugging Face Spaces with Docker configuration
- Document security considerations and current limitations
- Include development environment setup and testing notes
- Add roadmap with technical debts and future improvements
- Provide project identification table and glossary of acronyms

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Files changed (1) hide show
  1. docs/architecture.md +311 -17
docs/architecture.md CHANGED
@@ -1,25 +1,319 @@
1
- # Arquitetura
2
 
3
- ## Visão Geral
4
 
5
- Aplicação monolítica em Streamlit (`app.py`) com estado em memória de sessão e persistência em JSON local.
6
 
7
- ## Componentes
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
- - `app.py`: UI, regras de filtro, métricas e escrita de progresso.
10
- - `progress.json`: armazenamento local de marcações do usuário.
11
- - `Dockerfile`: execução no Hugging Face Spaces (SDK Docker).
12
- - `requirements.txt`: dependências mínimas para runtime.
13
 
14
- ## Fluxo de Dados
 
 
 
15
 
16
- 1. App inicia e carrega `progress.json`.
17
- 2. Usuário interage com filtros/checkboxes.
18
- 3. Estado em `st.session_state` é atualizado.
19
- 4. Alterações são salvas em `progress.json`.
20
- 5. Interface renderiza grupos/tópicos conforme filtros ativos.
21
 
22
- ## Decisões
 
 
 
 
23
 
24
- - UI guiada por estado único (`ui_status_filter`, `ui_selected_discipline`, `ui_metrics_mode`).
25
- - Deploy em HF via Docker para compatibilidade estável.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Arquitetura - PMDF CFO 2025 | Dashboard de Estudos
2
 
3
+ Este documento descreve a arquitetura do **Dashboard de Estudos PMDF CFO 2025**, uma aplicação web para acompanhamento de progresso de estudos para concurso.
4
 
5
+ ## 1. Estrutura do Projeto
6
 
7
+ ```
8
+ /
9
+ ├── app.py # Monolito single-file (618 linhas) - UI, lógica de negócio e persistência
10
+ ├── progress.json # Persistência local (criado em runtime)
11
+ ├── requirements.txt # Dependências Python
12
+ ├── pyproject.toml # Configuração do projeto (uv)
13
+ ├── Dockerfile # Deploy no Hugging Face Spaces
14
+ ├── README.md # Documentação para usuários
15
+ ├── CHANGELOG.md # Histórico de mudanças
16
+ ├── llms.txt # Créditos de LLMs utilizados
17
+ ├── docs/
18
+ │ ├── architecture.md # Este documento
19
+ │ ├── contributing.md # Guia de contribuição
20
+ │ └── plans/ # Histórico de planejamento
21
+ ├── .venv/ # Ambiente virtual Python (desenvolvimento local)
22
+ └── .git/ # Controle de versão
23
+ ```
24
 
25
+ **Propósito dos componentes principais:**
 
 
 
26
 
27
+ - **app.py**: Contém toda a lógica da aplicação: definição do edital, gerenciamento de estado, filtros, cálculos de progresso e interface Streamlit
28
+ - **progress.json**: Armazena o progresso de estudos do usuário (tópicos marcados como concluídos)
29
+ - **Dockerfile**: Configuração para deploy no Hugging Face Spaces via container Docker
30
+ - **docs/**: Documentação técnica e guias de contribuição
31
 
32
+ ## 2. Diagrama de Alto Nível
 
 
 
 
33
 
34
+ ```mermaid
35
+ graph TB
36
+ subgraph "Navegador do Usuário"
37
+ Browser[Navegador Web]
38
+ end
39
 
40
+ subgraph "Hugging Face Spaces"
41
+ subgraph "Container Docker"
42
+ Streamlit[Streamlit Server<br/>app.py]
43
+ SessionState[st.session_state dict<br/>Estado em memória]
44
+ ProgressFile[progress.json<br/>Persistência local]
45
+ end
46
+ end
47
+
48
+ Browser <--> Streamlit
49
+ Streamlit --> SessionState
50
+ Streamlit --> ProgressFile
51
+
52
+ subgraph "Dados Estáticos"
53
+ EDITAL[Dicionário EDITAL<br/>Tópicos por disciplina]
54
+ GROUPS[DISCIPLINE_GROUPS<br/>Agrupamento]
55
+ COLORS[DISC_COLORS<br/>Cores UI]
56
+ end
57
+
58
+ Streamlit --> EDITAL
59
+ Streamlit --> GROUPS
60
+ Streamlit --> COLORS
61
+ ```
62
+
63
+ **Fluxo de dados:**
64
+ 1. Usuário acessa aplicação via navegador
65
+ 2. Streamlit carrega `progress.json` e inicializa `st.session_state`
66
+ 3. Interações do usuário (checkboxes, filtros) atualizam o estado
67
+ 4. Alterações são persistidas em `progress.json`
68
+ 5. Interface é re-renderizada via `st.rerun()`
69
+
70
+ ## 3. Componentes Principais
71
+
72
+ ### 3.1. Frontend (Interface Streamlit)
73
+
74
+ **Descrição:** Interface web interativa para acompanhamento de progresso de estudos, permitindo marcação de tópicos, filtragem por status/disciplina e visualização de métricas.
75
+
76
+ **Componentes UI:**
77
+ - `st.set_page_config()` - Configuração da página (título, ícone, layout)
78
+ - `st.sidebar` - Barra lateral com filtros, seleção de disciplina e métricas globais
79
+ - `st.checkbox()` - Toggle para marcar tópico como estudado
80
+ - `st.progress()` - Barra de progresso visual
81
+ - `st.metric()` - Cards de métricas (concluídos, total, percentual)
82
+ - `st.expander()` - Accordion para expandir/recolher disciplinas
83
+ - `st.radio()` - Seleção de modo de métricas e status
84
+
85
+ **Tecnologias:**
86
+ - Python 3.11+
87
+ - Streamlit 1.32+
88
+ - CSS customizado para estilização
89
+
90
+ **Deploy:**
91
+ - Hugging Face Spaces (Docker SDK)
92
+ - Porta: 7860
93
+
94
+ ### 3.2. Backend (Lógica de Negócio)
95
+
96
+ **Descrição:** Funções em Python que implementam a lógica de negócio da aplicação, incluindo persistência, cálculos de progresso e filtragem de dados.
97
+
98
+ **Funções principais:**
99
+
100
+ | Função | Responsabilidade |
101
+ |--------|------------------|
102
+ | `resolve_progress_file()` | Resolve caminho gravável para `progress.json` (com fallbacks) |
103
+ | `load_progress()` | Carrega estado persistido do arquivo JSON |
104
+ | `save_progress()` | Persiste estado no arquivo JSON |
105
+ | `calc_discipline_progress()` | Calcula progresso por disciplina |
106
+ | `calc_overall_progress()` | Calcula progresso global |
107
+ | `calc_filtered_progress()` | Calcula progresso considerando filtros ativos |
108
+ | `get_filtered_groups()` | Retorna grupos/disciplinas filtrados |
109
+ | `topic_matches_filter()` | Predicado para verificar se tópico atende ao filtro |
110
+ | `init_ui_state()` | Inicializa variáveis de estado da UI |
111
+ | `get_topic_key()` | Gera chave composta para tópico |
112
+ | `main()` | Função principal que orquestra a aplicação |
113
+
114
+ **Tecnologias:**
115
+ - Python Standard Library (json, pathlib, os, datetime)
116
+ - Streamlit (st.session_state, st.rerun)
117
+
118
+ **Deploy:**
119
+ - Hugging Face Spaces (Docker)
120
+ - Processo único (sem workers/multiple instances)
121
+
122
+ **Nota:** Em Streamlit, "Frontend" e "Backend" são conceituais. Todo o código executa no servidor; a UI é renderizada pelo framework via WebSocket.
123
+
124
+ ### 3.3. Dados Estáticos
125
+
126
+ **Dicionários em memória (hardcoded):**
127
+ - `EDITAL`: 15 disciplinas x ~246 tópicos do edital PMDF CFO 2025
128
+ - `DISCIPLINE_GROUPS`: 2 grupos (Conhecimentos Gerais / Específicos)
129
+ - `DISC_COLORS`: 15 cores hexadecimais para visualização
130
+
131
+ ## 4. Armazenamento de Dados
132
+
133
+ ### 4.1. progress.json
134
+
135
+ **Nome:** Arquivo de Progresso de Estudos
136
+
137
+ **Tipo:** Arquivo JSON local
138
+
139
+ **Propósito:** Persistir o progresso de estudos do usuário (tópicos marcados como concluídos)
140
+
141
+ **Localização (ordem de prioridade):**
142
+ 1. Variável de ambiente `PROGRESS_FILE` (se definida)
143
+ 2. `/data/progress.json` (Hugging Face Spaces com volume persistente)
144
+ 3. `progress.json` (diretório atual)
145
+ 4. `/tmp/progress.json` (fallback de último recurso)
146
+
147
+ **Formato:**
148
+ ```json
149
+ {
150
+ "Língua Portuguesa||1 Compreensão e interpretação de textos de gêneros variados": true,
151
+ "Língua Portuguesa||2 Reconhecimento de tipos e gêneros textuais": false,
152
+ "Direito Constitucional||1.1 Conceito, objeto, elementos e classificações da Constituição": true
153
+ }
154
+ ```
155
+
156
+ **Estrutura da chave:** `{disciplina}||{tópico}` → `boolean`
157
+
158
+ **Estratégia de persistência:**
159
+ - Escrita imediata a cada alteração de checkbox
160
+ - Backup automático em caso de JSON inválido (arquivo renomeado com timestamp)
161
+ - Estado limpo inicializado em caso de erro de leitura
162
+
163
+ ### 4.2. Dicionários em Memória
164
+
165
+ | Dicionário | Propósito | Tamanho |
166
+ |------------|-----------|---------|
167
+ | `EDITAL` | Conteúdo do edital (tópicos por disciplina) | 15 disciplinas x ~246 tópicos |
168
+ | `DISCIPLINE_GROUPS` | Agrupamento de disciplinas para UI | 2 grupos x 15 disciplinas |
169
+ | `DISC_COLORS` | Cores para visualização de disciplinas | 15 cores hexadecimais |
170
+
171
+ ## 5. Integrações Externas / APIs
172
+
173
+ **Não aplicável** - O projeto é autocontido, sem chamadas a APIs ou serviços externos.
174
+
175
+ ## 6. Deploy & Infraestrutura
176
+
177
+ ### Cloud Provider
178
+ - **Hugging Face Spaces** - Plataforma de hospedagem para aplicações ML/Python
179
+
180
+ ### Key Services Used
181
+ - **Docker Containers** - Runtime isolado
182
+ - **Volumes Persistentes** - Montagem em `/data` para persistência
183
+
184
+ ### CI/CD Pipeline
185
+ - Deploy manual via Git push para repositório Hugging Face
186
+ - Rebuild automático do container Docker
187
+
188
+ ### Monitoring & Logging
189
+ - Logs do container Hugging Face (via interface web)
190
+ - Sem monitoramento estruturado configurado
191
+
192
+ ### Dockerfile
193
+
194
+ **Base Image:** `python:3.11-slim`
195
+
196
+ **Porta:** 7860 (padrão Hugging Face / variável `PORT`)
197
+
198
+ **Comando:**
199
+ ```dockerfile
200
+ CMD ["streamlit", "run", "app.py", \
201
+ "--server.port=${PORT}", \
202
+ "--server.address=0.0.0.0", \
203
+ "--server.headless=true"]
204
+ ```
205
+
206
+ **Variáveis de Ambiente:**
207
+ - `PORT`: Porta HTTP (padrão: 7860) - já utilizada no CMD
208
+ - `PROGRESS_FILE`: Caminho customizado para progress.json (opcional)
209
+
210
+ ## 7. Considerações de Segurança
211
+
212
+ ### Autenticação
213
+ **Não implementado** - Aplicação pública sem controle de acesso
214
+
215
+ ### Autorização
216
+ **Não aplicável** - Sem autenticação, portanto sem autorização
217
+
218
+ ### Criptografia de Dados
219
+ - **Em trânsito:** TLS (fornecido pelo Hugging Face)
220
+ - **Em repouso:** Não implementada (progress.json em texto plano)
221
+
222
+ ### Validação de Entrada
223
+ **Limitada a controles nativos do Streamlit** (checkboxes retornam booleanos, radio buttons retornam opções pré-definidas)
224
+
225
+ ### Tratamento de Erros
226
+ - JSON inválido: backup automático + estado limpo
227
+ - Caminhos write-only: tentativa de múltiplos fallbacks
228
+ - I/O errors: capturados com try/except em `load_progress()`
229
+
230
+ ### Limitações (Dívidas Técnicas)
231
+ - Não há autenticação/autorização
232
+ - Não há criptografia de dados em repouso
233
+ - Não há proteção contra CSRF/XSS (inerente ao Streamlit)
234
+ - Não há auditoria de ações
235
+
236
+ ### Recomendações Futuras
237
+ - Para multi-usuario: implementar autenticacao
238
+ - Para dados sensíveis: criptografar progress.json
239
+
240
+ ## 8. Ambiente de Desenvolvimento & Testes
241
+
242
+ ### Setup Local
243
+
244
+ **Requisitos:**
245
+ - Python 3.11+
246
+ - `uv` (recomendado) ou `pip`
247
+
248
+ **Instalação:**
249
+ ```bash
250
+ uv sync
251
+ # ou
252
+ pip install -r requirements.txt
253
+ ```
254
+
255
+ **Execução:**
256
+ ```bash
257
+ uv run streamlit run app.py
258
+ # ou
259
+ streamlit run app.py
260
+ ```
261
+
262
+ ### Validação de Sintaxe
263
+ ```bash
264
+ uv run --no-project python -m py_compile app.py
265
+ ```
266
+
267
+ ### Frameworks de Teste
268
+ **Não implementado** - Ausência de testes automatizados (dívida técnica)
269
+
270
+ ### Ferramentas de Qualidade de Código
271
+ - Validação de sintaxe via `py_compile`
272
+ - PEP 8 não aplicado formalmente
273
+
274
+ ## 9. Considerações Futuras / Roadmap
275
+
276
+ ### Possíveis Evoluções
277
+
278
+ 1. **Modularização:** Separar UI de lógica de negócio (módulos Python)
279
+ 2. **Multi-usuario:** Autenticação + progresso individual (exigiria mudança de estratégia de persistência)
280
+ 3. **Banco de Dados:** Substituir JSON por SQLite ou PostgreSQL
281
+ 4. **Testes:** Implementar pytest com fixtures de estado
282
+ 5. **CI/CD:** GitHub Actions para validar sintaxe e rodar testes
283
+ 6. **Internacionalização:** Suporte a múltiplas línguas (i18n)
284
+ 7. **Edital externo:** Carregar edital de arquivo/config externa (não hardcoded)
285
+
286
+ ### Dívidas Técnicas Atuais
287
+
288
+ - Single-file monolito dificulta manutenção
289
+ - Ausência de testes automatizados
290
+ - Dados do edital hardcoded no código
291
+ - Não há tipagem estática (type hints)
292
+ - Não há linting configurado
293
+
294
+ ## 10. Identificação do Projeto
295
+
296
+ | Campo | Valor |
297
+ |-------|-------|
298
+ | **Nome** | PMDF CFO 2025 - Dashboard de Estudos |
299
+ | **Propósito** | Acompanhamento de progresso de estudos para concurso |
300
+ | **Stack** | Python 3.11+, Streamlit 1.32+ |
301
+ | **Licença** | Uso educacional/pessoal |
302
+ | **Repositório** | Git local (deploy via Hugging Face Spaces) |
303
+ | **Data da Última Atualização** | 2026-03-06 |
304
+
305
+ ## 11. Glossário / Acrônimos
306
+
307
+ | Termo | Definição |
308
+ |-------|-----------|
309
+ | **PMDF** | Polícia Militar do Distrito Federal |
310
+ | **CFO** | Curso de Formação de Oficiais |
311
+ | **Edital** | Documento oficial do concurso com conteúdo programático |
312
+ | **Streamlit** | Framework Python para aplicações web interativas |
313
+ | **st.session_state** | Mecanismo de estado em memória do Streamlit para persistir dados entre re-renderizações |
314
+ | **st.rerun()** | Função para forçar re-renderização da UI (recarregamento da página) |
315
+ | **Hugging Face Spaces** | Plataforma de hospedagem para aplicações de ML/Python |
316
+ | **Monolito** | Aplicação single-file sem modularização |
317
+ | **JSON** | JavaScript Object Notation - formato de intercâmbio de dados |
318
+ | **Docker** | Plataforma de containerização para aplicações |
319
+ | **uv** | Gerenciador de pacotes Python rápido (alternativa ao pip) |