safepatch 0.1.0__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.
@@ -0,0 +1,281 @@
1
+ Metadata-Version: 2.4
2
+ Name: safepatch
3
+ Version: 0.1.0
4
+ Summary: Ferramenta CLI de auditoria e comparação de pacotes Java/compactados (.jar, .war, .zip) com detecção de conflitos e diff descompilado
5
+ Author-email: Matheus Braga <contato@matheusbraga.dev>
6
+ Maintainer-email: Matheus Braga <contato@matheusbraga.dev>
7
+ License: MIT
8
+ Project-URL: Homepage, https://matheusbraga.dev
9
+ Project-URL: Repository, https://github.com/matheusbraga-dev/safepatch
10
+ Project-URL: Issues, https://github.com/matheusbraga-dev/safepatch/issues
11
+ Project-URL: Documentation, https://github.com/matheusbraga-dev/safepatch#readme
12
+ Keywords: java,jar,war,zip,diff,decompiler,cfr,patch,audit,cli
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: System Administrators
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.8
21
+ Classifier: Programming Language :: Python :: 3.9
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Topic :: Software Development :: Build Tools
27
+ Classifier: Topic :: Software Development :: Version Control
28
+ Classifier: Topic :: Utilities
29
+ Requires-Python: >=3.8
30
+ Description-Content-Type: text/markdown
31
+
32
+ # 📦 Analisador de Pacotes (.jar / .zip)
33
+
34
+ Uma ferramenta de linha de comando (CLI) em Python de alta performance para inspeção, auditoria e comparação de pacotes compactados (`.jar`, `.war`, `.zip`). Desenvolvida para detectar conflitos, arquivos alterados, adições e remoções entre versões de artefatos de release, patches e bibliotecas.
35
+
36
+ Zero dependências externas: construída exclusivamente com a **biblioteca padrão do Python**.
37
+
38
+ ---
39
+
40
+ ## 🚀 Funcionalidades
41
+
42
+ * ⚡ **Leitura Otimizada em Streaming**: Processa pacotes lendo blocos de 64KB sob demanda, permitindo analisar arquivos pesados com consumo mínimo de memória RAM.
43
+ * 🔒 **Verificação de Integridade (SHA-256)**: Compara o hash SHA-256 de cada arquivo interno para garantir a detecção exata de modificações lógicas, mesmo quando as datas de modificação ou atributos forem alterados.
44
+ * 📊 **Cálculo de Variação (Delta)**: Exibe a diferença de tamanho (em bytes, KB, MB) para cada arquivo modificado (ex: `1.81 KB → 2.39 KB | +602 B`).
45
+ * 🔍 **Diff no Estilo Git (`-d / --diff`)**:
46
+ * Mostra as linhas adicionadas (`+`) e removidas (`-`) em arquivos modificados, novos e deletados.
47
+ * Suporta arquivos de texto puro (XML, JSON, properties, YAML, SQL, código-fonte, etc.).
48
+ * **Desmontagem de Bytecode Java (.class)**: Se o utilitário `javap` estiver instalado no sistema, desmonta automaticamente os arquivos `.class` e compara as assinaturas de métodos e atributos no estilo Git.
49
+ * 🎯 **Filtro de Exclusão com Padrões Glob (`-i / --ignorar`)**: Permite ignorar metadados voláteis como `META-INF/*`, arquivos de documentação (`*.md`) ou logs.
50
+ * 📄 **Múltiplos Formatos de Relatório**:
51
+ * **Console (Terminal)**: Colorido via ANSI com modo compacto ou verboso (`--verbose`).
52
+ * **JSON (`--json`)**: Estruturado com metadados e totais, ideal para integrações e APIs.
53
+ * **Markdown (`--markdown / --md`)**: Tabelas prontas para documentação ou Pull Requests.
54
+ * **HTML (`--html`)**: Dashboard visual moderno, responsivo e 100% autossuficiente (sem dependências externas).
55
+ * 🤖 **Pronto para CI/CD (`--fail-on-conflict`)**: Retorna código de saída `2` se detectar arquivos conflitantes/modificados, permitindo travar esteiras de deploy indesejadas.
56
+
57
+ ---
58
+
59
+ ## 📋 Requisitos
60
+
61
+ * **Python 3.8+** (compatível com Linux, macOS e Windows).
62
+ * Nenhuma biblioteca externa necessária (`pip install` desnecessário).
63
+
64
+ ---
65
+
66
+ ## 🛠️ Instalação e Configuração
67
+
68
+ Clone o repositório ou copie os arquivos para sua máquina:
69
+
70
+ ```bash
71
+ git clone https://github.com/matheusbraga-dev/safepatch.git
72
+ cd cli
73
+ ```
74
+
75
+ Para validar a integridade da instalação, execute a suíte de testes:
76
+
77
+ ```bash
78
+ python -m unittest discover tests
79
+ ```
80
+
81
+ ---
82
+
83
+ ## 💻 Guia de Uso
84
+
85
+ ### 1. Comparação Básica
86
+
87
+ Para comparar dois pacotes `.jar` ou `.zip`:
88
+
89
+ ```bash
90
+ python main.py --base "caminho/para/versao_antiga.jar" --alvo "caminho/para/versao_nova.jar"
91
+ ```
92
+
93
+ **Exemplo de saída no terminal:**
94
+ ```text
95
+ Iniciando varredura dos pacotes...
96
+ Lendo pacote base: versao_antiga.jar...
97
+ Lendo pacote alvo: versao_nova.jar...
98
+ Analisando diferenças e detectando conflitos...
99
+
100
+ === RELATÓRIO DE COMPARAÇÃO DE PACOTES ===
101
+ Pacote Base: versao_antiga.jar
102
+ Pacote Alvo: versao_nova.jar
103
+ ==========================================
104
+
105
+ Total Adicionados: 0
106
+ Total Removidos: 0
107
+ Total Modificados: 1
108
+ Total Inalterados: 7
109
+ ------------------------------------------
110
+
111
+ [~] ARQUIVOS MODIFICADOS (Atenção - Possíveis Conflitos):
112
+ br/com/mv/editor/dto/PaguObjetoDTO.class (1.81 KB → 2.39 KB | +602 B)
113
+ ```
114
+
115
+ ---
116
+
117
+ ### 2. Visualizando Diferenças Detalhadas Estilo Git (`--diff / -d`)
118
+
119
+ Para inspecionar o conteúdo exato das alterações (linhas adicionadas `+` e removidas `-`), utilize a flag `-d` ou `--diff`:
120
+
121
+ ```bash
122
+ python main.py --base "original/pacote.jar" \
123
+ --alvo "modificado/pacote.jar" \
124
+ --diff
125
+ ```
126
+
127
+ **Exemplo de saída com diff unificado colorido:**
128
+ ```diff
129
+ [~] ARQUIVOS MODIFICADOS (Atenção - Possíveis Conflitos):
130
+ br/com/mv/editor/dto/PaguObjetoDTO.class (1.81 KB → 2.39 KB | +602 B)
131
+ diff --git a/br/com/mv/editor/dto/PaguObjetoDTO.class b/br/com/mv/editor/dto/PaguObjetoDTO.class
132
+ --- a/br/com/mv/editor/dto/PaguObjetoDTO.class
133
+ +++ b/br/com/mv/editor/dto/PaguObjetoDTO.class
134
+ @@ -94,4 +94,20 @@
135
+ 0: aload_0
136
+ 1: invokevirtual #14 // Method toEntity:()Lbr/com/mv/sma/entidades/PaguObjeto;
137
+ 4: areturn
138
+ +
139
+ + public java.lang.String getCdObjetoENome();
140
+ + Code:
141
+ + 0: new #72 // class java/lang/StringBuilder
142
+ + 3: dup
143
+ + 4: invokespecial #78 // Method java/lang/StringBuilder."<init>":()V
144
+ + 7: aload_0
145
+ + 8: invokevirtual #96 // Method br/com/mv/editor/dto/PaguObjetoDTO.getCdObjeto:()Ljava/lang/Long;
146
+ + 11: invokevirtual #82 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
147
+ + 14: ldc_w #108 // String -
148
+ + 17: invokevirtual #86 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
149
+ + 20: aload_0
150
+ + 21: invokevirtual #102 // Method br/com/mv/editor/dto/PaguObjetoDTO.getNmObjeto:()Ljava/lang/String;
151
+ + 24: invokevirtual #86 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
152
+ + 27: invokevirtual #90 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
153
+ + 30: areturn
154
+ }
155
+ ```
156
+
157
+ > **Dica:** O diff também é automaticamente incorporado aos relatórios exportados em Markdown e HTML quando a flag `--diff` for utilizada junto com `--md` ou `--html`.
158
+ > No PowerShell (Windows), para quebrar linhas em comandos use o caractere de acento grave (`` ` ``) em vez da barra invertida (`\`).
159
+
160
+ ---
161
+
162
+ ### 3. Exportando Relatórios (JSON, Markdown e HTML)
163
+
164
+ Você pode gerar relatórios em um ou mais formatos simultaneamente:
165
+
166
+ ```bash
167
+ python main.py --base "original/pacote.jar" \
168
+ --alvo "modificado/pacote.jar" \
169
+ --diff \
170
+ --json relatorio.json \
171
+ --md relatorio.md \
172
+ --html relatorio.html
173
+ ```
174
+
175
+ ---
176
+
177
+ ### 4. Ignorando Metadados ou Padrões Específicos
178
+
179
+ Para evitar falsos positivos gerados por manifests de build ou documentação:
180
+
181
+ ```bash
182
+ python main.py --base "pacote_v1.jar" \
183
+ --alvo "pacote_v2.jar" \
184
+ -i "META-INF/*" \
185
+ -i "*.properties"
186
+ ```
187
+
188
+ ---
189
+
190
+ ### 5. Modo Verboso e Controle de Limite de Exibição
191
+
192
+ Por padrão, a CLI exibe no máximo 10 arquivos por categoria no console para evitar poluição. Para ver todos os arquivos:
193
+
194
+ ```bash
195
+ # Exibe todos os arquivos no terminal sem paginação
196
+ python main.py --base "base.jar" --alvo "alvo.jar" --verbose
197
+
198
+ # Ou configure um limite personalizado (ex: 25 itens)
199
+ python main.py --base "base.jar" --alvo "alvo.jar" --limite 25
200
+ ```
201
+
202
+ ---
203
+
204
+ ### 6. Integração Contínua (CI/CD)
205
+
206
+ Use a flag `--fail-on-conflict` para interromper scripts de automação se houver alterações inesperadas:
207
+
208
+ ```bash
209
+ python main.py --base "base.jar" --alvo "alvo.jar" --fail-on-conflict
210
+ ```
211
+
212
+ #### Códigos de Saída (Exit Codes):
213
+ | Código | Significado |
214
+ | :---: | :--- |
215
+ | `0` | Sucesso (análise concluída sem conflitos críticos). |
216
+ | `1` | Erro de execução (arquivo não encontrado, ZIP corrompido, argumentos inválidos). |
217
+ | `2` | Conflito detectado (quando executado com a flag `--fail-on-conflict`). |
218
+
219
+ ---
220
+
221
+ ## 📖 Referência de Parâmetros da CLI
222
+
223
+ | Parâmetro | Tipo | Descrição |
224
+ | :--- | :---: | :--- |
225
+ | `--base` | `string` | **Obrigatório.** Caminho para o pacote base de referência. |
226
+ | `--alvo` | `string` | **Obrigatório.** Caminho para o pacote alvo a ser comparado. |
227
+ | `-d`, `--diff` | `flag` | Exibe a diferença detalhada do conteúdo estilo Git (linhas adicionadas e removidas). |
228
+ | `-i`, `--ignorar` | `string` | Padrão glob de arquivos a ignorar (ex: `'META-INF/*'`). Pode ser repetido. |
229
+ | `-v`, `--verbose` | `flag` | Exibe a lista completa de arquivos no terminal sem limites. |
230
+ | `--limite` | `int` | Quantidade máxima de itens por categoria exibidos no terminal (padrão: `10`). |
231
+ | `--no-color` | `flag` | Desativa a coloração ANSI na saída do console. |
232
+ | `--json` | `string` | Caminho do arquivo para salvar o relatório em formato JSON. |
233
+ | `--md`, `--markdown` | `string` | Caminho do arquivo para salvar o relatório em formato Markdown. |
234
+ | `--html` | `string` | Caminho do arquivo para salvar o relatório visual em HTML. |
235
+ | `--fail-on-conflict` | `flag` | Encerra com código `2` caso haja arquivos modificados. |
236
+ | `-h`, `--help` | `flag` | Exibe a mensagem de ajuda com todos os comandos disponíveis. |
237
+
238
+ ---
239
+
240
+ ## 📁 Estrutura do Projeto
241
+
242
+ ```text
243
+ cli/
244
+ ├── analisador/ # Módulo principal da aplicação
245
+ │ ├── __init__.py # Exportação da API pública do módulo
246
+ │ ├── modelos.py # Entidades de dados (ArquivoInfo, ArquivoModificadoInfo, Relatorio)
247
+ │ ├── models.py # Alias de compatibilidade
248
+ │ ├── leitor.py # Leitura streaming de .jar/.zip e cálculo de SHA-256
249
+ │ ├── comparador.py # Motor de comparação de conjuntos e filtros
250
+ │ ├── diferenciador.py # Motor de diff unificado estilo Git e disassembly javap
251
+ │ ├── relatorio.py # Apresentador do relatório para terminal com cores ANSI
252
+ │ └── exportadores.py # Exportadores estruturados (JSON, Markdown, HTML)
253
+ ├── tests/ # Suíte de testes automatizados
254
+ │ ├── __init__.py
255
+ │ └── test_analisador.py # Testes unitários com unittest
256
+ ├── main.py # Ponto de entrada da CLI (CLI Controller)
257
+ ├── .gitignore # Configurações de exclusão do Git
258
+ └── README.md # Documentação do projeto
259
+ ```
260
+
261
+ ---
262
+
263
+ ## 🧪 Executando os Testes
264
+
265
+ Para rodar todos os testes automatizados:
266
+
267
+ ```bash
268
+ python -m unittest discover tests
269
+ ```
270
+
271
+ Para rodar em modo detalhado (verbose):
272
+
273
+ ```bash
274
+ python -m unittest discover tests -v
275
+ ```
276
+
277
+ ---
278
+
279
+ ## 📄 Licença
280
+
281
+ Este projeto é disponibilizado sob a licença [MIT](https://opensource.org/licenses/MIT).
@@ -0,0 +1,250 @@
1
+ # 📦 Analisador de Pacotes (.jar / .zip)
2
+
3
+ Uma ferramenta de linha de comando (CLI) em Python de alta performance para inspeção, auditoria e comparação de pacotes compactados (`.jar`, `.war`, `.zip`). Desenvolvida para detectar conflitos, arquivos alterados, adições e remoções entre versões de artefatos de release, patches e bibliotecas.
4
+
5
+ Zero dependências externas: construída exclusivamente com a **biblioteca padrão do Python**.
6
+
7
+ ---
8
+
9
+ ## 🚀 Funcionalidades
10
+
11
+ * ⚡ **Leitura Otimizada em Streaming**: Processa pacotes lendo blocos de 64KB sob demanda, permitindo analisar arquivos pesados com consumo mínimo de memória RAM.
12
+ * 🔒 **Verificação de Integridade (SHA-256)**: Compara o hash SHA-256 de cada arquivo interno para garantir a detecção exata de modificações lógicas, mesmo quando as datas de modificação ou atributos forem alterados.
13
+ * 📊 **Cálculo de Variação (Delta)**: Exibe a diferença de tamanho (em bytes, KB, MB) para cada arquivo modificado (ex: `1.81 KB → 2.39 KB | +602 B`).
14
+ * 🔍 **Diff no Estilo Git (`-d / --diff`)**:
15
+ * Mostra as linhas adicionadas (`+`) e removidas (`-`) em arquivos modificados, novos e deletados.
16
+ * Suporta arquivos de texto puro (XML, JSON, properties, YAML, SQL, código-fonte, etc.).
17
+ * **Desmontagem de Bytecode Java (.class)**: Se o utilitário `javap` estiver instalado no sistema, desmonta automaticamente os arquivos `.class` e compara as assinaturas de métodos e atributos no estilo Git.
18
+ * 🎯 **Filtro de Exclusão com Padrões Glob (`-i / --ignorar`)**: Permite ignorar metadados voláteis como `META-INF/*`, arquivos de documentação (`*.md`) ou logs.
19
+ * 📄 **Múltiplos Formatos de Relatório**:
20
+ * **Console (Terminal)**: Colorido via ANSI com modo compacto ou verboso (`--verbose`).
21
+ * **JSON (`--json`)**: Estruturado com metadados e totais, ideal para integrações e APIs.
22
+ * **Markdown (`--markdown / --md`)**: Tabelas prontas para documentação ou Pull Requests.
23
+ * **HTML (`--html`)**: Dashboard visual moderno, responsivo e 100% autossuficiente (sem dependências externas).
24
+ * 🤖 **Pronto para CI/CD (`--fail-on-conflict`)**: Retorna código de saída `2` se detectar arquivos conflitantes/modificados, permitindo travar esteiras de deploy indesejadas.
25
+
26
+ ---
27
+
28
+ ## 📋 Requisitos
29
+
30
+ * **Python 3.8+** (compatível com Linux, macOS e Windows).
31
+ * Nenhuma biblioteca externa necessária (`pip install` desnecessário).
32
+
33
+ ---
34
+
35
+ ## 🛠️ Instalação e Configuração
36
+
37
+ Clone o repositório ou copie os arquivos para sua máquina:
38
+
39
+ ```bash
40
+ git clone https://github.com/matheusbraga-dev/safepatch.git
41
+ cd cli
42
+ ```
43
+
44
+ Para validar a integridade da instalação, execute a suíte de testes:
45
+
46
+ ```bash
47
+ python -m unittest discover tests
48
+ ```
49
+
50
+ ---
51
+
52
+ ## 💻 Guia de Uso
53
+
54
+ ### 1. Comparação Básica
55
+
56
+ Para comparar dois pacotes `.jar` ou `.zip`:
57
+
58
+ ```bash
59
+ python main.py --base "caminho/para/versao_antiga.jar" --alvo "caminho/para/versao_nova.jar"
60
+ ```
61
+
62
+ **Exemplo de saída no terminal:**
63
+ ```text
64
+ Iniciando varredura dos pacotes...
65
+ Lendo pacote base: versao_antiga.jar...
66
+ Lendo pacote alvo: versao_nova.jar...
67
+ Analisando diferenças e detectando conflitos...
68
+
69
+ === RELATÓRIO DE COMPARAÇÃO DE PACOTES ===
70
+ Pacote Base: versao_antiga.jar
71
+ Pacote Alvo: versao_nova.jar
72
+ ==========================================
73
+
74
+ Total Adicionados: 0
75
+ Total Removidos: 0
76
+ Total Modificados: 1
77
+ Total Inalterados: 7
78
+ ------------------------------------------
79
+
80
+ [~] ARQUIVOS MODIFICADOS (Atenção - Possíveis Conflitos):
81
+ br/com/mv/editor/dto/PaguObjetoDTO.class (1.81 KB → 2.39 KB | +602 B)
82
+ ```
83
+
84
+ ---
85
+
86
+ ### 2. Visualizando Diferenças Detalhadas Estilo Git (`--diff / -d`)
87
+
88
+ Para inspecionar o conteúdo exato das alterações (linhas adicionadas `+` e removidas `-`), utilize a flag `-d` ou `--diff`:
89
+
90
+ ```bash
91
+ python main.py --base "original/pacote.jar" \
92
+ --alvo "modificado/pacote.jar" \
93
+ --diff
94
+ ```
95
+
96
+ **Exemplo de saída com diff unificado colorido:**
97
+ ```diff
98
+ [~] ARQUIVOS MODIFICADOS (Atenção - Possíveis Conflitos):
99
+ br/com/mv/editor/dto/PaguObjetoDTO.class (1.81 KB → 2.39 KB | +602 B)
100
+ diff --git a/br/com/mv/editor/dto/PaguObjetoDTO.class b/br/com/mv/editor/dto/PaguObjetoDTO.class
101
+ --- a/br/com/mv/editor/dto/PaguObjetoDTO.class
102
+ +++ b/br/com/mv/editor/dto/PaguObjetoDTO.class
103
+ @@ -94,4 +94,20 @@
104
+ 0: aload_0
105
+ 1: invokevirtual #14 // Method toEntity:()Lbr/com/mv/sma/entidades/PaguObjeto;
106
+ 4: areturn
107
+ +
108
+ + public java.lang.String getCdObjetoENome();
109
+ + Code:
110
+ + 0: new #72 // class java/lang/StringBuilder
111
+ + 3: dup
112
+ + 4: invokespecial #78 // Method java/lang/StringBuilder."<init>":()V
113
+ + 7: aload_0
114
+ + 8: invokevirtual #96 // Method br/com/mv/editor/dto/PaguObjetoDTO.getCdObjeto:()Ljava/lang/Long;
115
+ + 11: invokevirtual #82 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
116
+ + 14: ldc_w #108 // String -
117
+ + 17: invokevirtual #86 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
118
+ + 20: aload_0
119
+ + 21: invokevirtual #102 // Method br/com/mv/editor/dto/PaguObjetoDTO.getNmObjeto:()Ljava/lang/String;
120
+ + 24: invokevirtual #86 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
121
+ + 27: invokevirtual #90 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
122
+ + 30: areturn
123
+ }
124
+ ```
125
+
126
+ > **Dica:** O diff também é automaticamente incorporado aos relatórios exportados em Markdown e HTML quando a flag `--diff` for utilizada junto com `--md` ou `--html`.
127
+ > No PowerShell (Windows), para quebrar linhas em comandos use o caractere de acento grave (`` ` ``) em vez da barra invertida (`\`).
128
+
129
+ ---
130
+
131
+ ### 3. Exportando Relatórios (JSON, Markdown e HTML)
132
+
133
+ Você pode gerar relatórios em um ou mais formatos simultaneamente:
134
+
135
+ ```bash
136
+ python main.py --base "original/pacote.jar" \
137
+ --alvo "modificado/pacote.jar" \
138
+ --diff \
139
+ --json relatorio.json \
140
+ --md relatorio.md \
141
+ --html relatorio.html
142
+ ```
143
+
144
+ ---
145
+
146
+ ### 4. Ignorando Metadados ou Padrões Específicos
147
+
148
+ Para evitar falsos positivos gerados por manifests de build ou documentação:
149
+
150
+ ```bash
151
+ python main.py --base "pacote_v1.jar" \
152
+ --alvo "pacote_v2.jar" \
153
+ -i "META-INF/*" \
154
+ -i "*.properties"
155
+ ```
156
+
157
+ ---
158
+
159
+ ### 5. Modo Verboso e Controle de Limite de Exibição
160
+
161
+ Por padrão, a CLI exibe no máximo 10 arquivos por categoria no console para evitar poluição. Para ver todos os arquivos:
162
+
163
+ ```bash
164
+ # Exibe todos os arquivos no terminal sem paginação
165
+ python main.py --base "base.jar" --alvo "alvo.jar" --verbose
166
+
167
+ # Ou configure um limite personalizado (ex: 25 itens)
168
+ python main.py --base "base.jar" --alvo "alvo.jar" --limite 25
169
+ ```
170
+
171
+ ---
172
+
173
+ ### 6. Integração Contínua (CI/CD)
174
+
175
+ Use a flag `--fail-on-conflict` para interromper scripts de automação se houver alterações inesperadas:
176
+
177
+ ```bash
178
+ python main.py --base "base.jar" --alvo "alvo.jar" --fail-on-conflict
179
+ ```
180
+
181
+ #### Códigos de Saída (Exit Codes):
182
+ | Código | Significado |
183
+ | :---: | :--- |
184
+ | `0` | Sucesso (análise concluída sem conflitos críticos). |
185
+ | `1` | Erro de execução (arquivo não encontrado, ZIP corrompido, argumentos inválidos). |
186
+ | `2` | Conflito detectado (quando executado com a flag `--fail-on-conflict`). |
187
+
188
+ ---
189
+
190
+ ## 📖 Referência de Parâmetros da CLI
191
+
192
+ | Parâmetro | Tipo | Descrição |
193
+ | :--- | :---: | :--- |
194
+ | `--base` | `string` | **Obrigatório.** Caminho para o pacote base de referência. |
195
+ | `--alvo` | `string` | **Obrigatório.** Caminho para o pacote alvo a ser comparado. |
196
+ | `-d`, `--diff` | `flag` | Exibe a diferença detalhada do conteúdo estilo Git (linhas adicionadas e removidas). |
197
+ | `-i`, `--ignorar` | `string` | Padrão glob de arquivos a ignorar (ex: `'META-INF/*'`). Pode ser repetido. |
198
+ | `-v`, `--verbose` | `flag` | Exibe a lista completa de arquivos no terminal sem limites. |
199
+ | `--limite` | `int` | Quantidade máxima de itens por categoria exibidos no terminal (padrão: `10`). |
200
+ | `--no-color` | `flag` | Desativa a coloração ANSI na saída do console. |
201
+ | `--json` | `string` | Caminho do arquivo para salvar o relatório em formato JSON. |
202
+ | `--md`, `--markdown` | `string` | Caminho do arquivo para salvar o relatório em formato Markdown. |
203
+ | `--html` | `string` | Caminho do arquivo para salvar o relatório visual em HTML. |
204
+ | `--fail-on-conflict` | `flag` | Encerra com código `2` caso haja arquivos modificados. |
205
+ | `-h`, `--help` | `flag` | Exibe a mensagem de ajuda com todos os comandos disponíveis. |
206
+
207
+ ---
208
+
209
+ ## 📁 Estrutura do Projeto
210
+
211
+ ```text
212
+ cli/
213
+ ├── analisador/ # Módulo principal da aplicação
214
+ │ ├── __init__.py # Exportação da API pública do módulo
215
+ │ ├── modelos.py # Entidades de dados (ArquivoInfo, ArquivoModificadoInfo, Relatorio)
216
+ │ ├── models.py # Alias de compatibilidade
217
+ │ ├── leitor.py # Leitura streaming de .jar/.zip e cálculo de SHA-256
218
+ │ ├── comparador.py # Motor de comparação de conjuntos e filtros
219
+ │ ├── diferenciador.py # Motor de diff unificado estilo Git e disassembly javap
220
+ │ ├── relatorio.py # Apresentador do relatório para terminal com cores ANSI
221
+ │ └── exportadores.py # Exportadores estruturados (JSON, Markdown, HTML)
222
+ ├── tests/ # Suíte de testes automatizados
223
+ │ ├── __init__.py
224
+ │ └── test_analisador.py # Testes unitários com unittest
225
+ ├── main.py # Ponto de entrada da CLI (CLI Controller)
226
+ ├── .gitignore # Configurações de exclusão do Git
227
+ └── README.md # Documentação do projeto
228
+ ```
229
+
230
+ ---
231
+
232
+ ## 🧪 Executando os Testes
233
+
234
+ Para rodar todos os testes automatizados:
235
+
236
+ ```bash
237
+ python -m unittest discover tests
238
+ ```
239
+
240
+ Para rodar em modo detalhado (verbose):
241
+
242
+ ```bash
243
+ python -m unittest discover tests -v
244
+ ```
245
+
246
+ ---
247
+
248
+ ## 📄 Licença
249
+
250
+ Este projeto é disponibilizado sob a licença [MIT](https://opensource.org/licenses/MIT).
@@ -0,0 +1,20 @@
1
+ from .modelos import ArquivoInfo, ArquivoModificadoInfo, RelatorioComparacao, formatar_bytes
2
+ from .leitor import LeitorPacote
3
+ from .comparador import ComparadorPacotes
4
+ from .relatorio import GeradorRelatorioConsole
5
+ from .exportadores import ExportadorJSON, ExportadorMarkdown, ExportadorHTML
6
+ from .diferenciador import DiferenciadorConteudo
7
+
8
+ __all__ = [
9
+ "ArquivoInfo",
10
+ "ArquivoModificadoInfo",
11
+ "RelatorioComparacao",
12
+ "formatar_bytes",
13
+ "LeitorPacote",
14
+ "ComparadorPacotes",
15
+ "GeradorRelatorioConsole",
16
+ "ExportadorJSON",
17
+ "ExportadorMarkdown",
18
+ "ExportadorHTML",
19
+ "DiferenciadorConteudo",
20
+ ]
@@ -0,0 +1,4 @@
1
+ from .cli import main
2
+
3
+ if __name__ == "__main__":
4
+ main()
Binary file