Metadata-Version: 2.4
Name: GenPyEXE
Version: 1.0.1
Summary: Transforma uma pasta de projeto Python em executavel Windows portatil e instalador 64-bit.
Author: Davi Kasmirski dos Santos
Maintainer: Davi Kasmirski dos Santos
License-Expression: MIT
Project-URL: Homepage, https://github.com/DaviKdS/GenPyEXE
Project-URL: Repository, https://github.com/DaviKdS/GenPyEXE
Project-URL: Issues, https://github.com/DaviKdS/GenPyEXE/issues
Project-URL: Changelog, https://github.com/DaviKdS/GenPyEXE/blob/main/CHANGELOG.md
Keywords: pyinstaller,exe,installer,inno-setup,windows,packaging,build,portable
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Win32 (MS Windows)
Classifier: Intended Audience :: Developers
Classifier: Operating System :: Microsoft :: Windows
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Build Tools
Classifier: Topic :: System :: Software Distribution
Classifier: Natural Language :: Portuguese (Brazilian)
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pyinstaller>=5.13
Requires-Dist: pillow>=9.0
Requires-Dist: jinja2>=3.0
Requires-Dist: typer>=0.9
Requires-Dist: rich>=12.0
Requires-Dist: packaging>=21.0
Requires-Dist: tomli>=2.0; python_version < "3.11"
Provides-Extra: gui
Requires-Dist: PySide6>=6.4; extra == "gui"
Provides-Extra: dev
Requires-Dist: pytest>=7.0; extra == "dev"
Requires-Dist: pytest-cov>=4.0; extra == "dev"
Requires-Dist: ruff>=0.1; extra == "dev"
Requires-Dist: build>=1.0; extra == "dev"
Dynamic: license-file

# GenPyEXE

**Transforme uma pasta de projeto Python num executável Windows com instalador.**

Você aponta para a pasta. O GenPyEXE descobre o arquivo inicial, as dependências e os recursos,
converte a sua imagem em ícone, grava os metadados do Windows, compila num ambiente isolado e
entrega dois artefatos: um **`.exe` portátil** e um **instalador 64 bits** que registra o
aplicativo no Windows.

```python
import genpyexeks

resultado = genpyexeks.build(
    "C:/projetos/MeuApp",
    app_name="Meu App",
    version="1.0.0",
    publisher="Seu Nome",
    icon="assets/logo.png",
    installer=True,
)

print(resultado.exe_path)        # dist/Meu App.exe
print(resultado.installer_path)  # dist/meu-app-1.0.0-setup-x64.exe
```

---

## Índice

- [Por que existe](#por-que-existe)
- [Instalação](#instalação)
- [Três formas de usar](#três-formas-de-usar)
- [O que o instalador faz](#o-que-o-instalador-faz)
- [Suporte a bibliotecas](#suporte-a-bibliotecas)
- [Ambiente isolado](#ambiente-isolado)
- [Perfil do projeto](#perfil-do-projeto)
- [Referência da API](#referência-da-api)
- [Referência da CLI](#referência-da-cli)
- [Documentação completa](#documentação-completa)
- [Requisitos](#requisitos)
- [Segurança e privacidade](#segurança-e-privacidade)
- [Licença e autoria](#licença-e-autoria)

---

## Por que existe

Empacotar um projeto Python para Windows costuma virar um ritual manual: descobrir os
`--hidden-import`, lembrar de copiar a pasta `assets/`, gerar o `.ico` em sete resoluções,
escrever o `VERSIONINFO` na mão e — se quiser que o aplicativo apareça em *Aplicativos e
Recursos* — aprender a sintaxe do Inno Setup.

O GenPyEXE faz esse caminho inteiro uma vez e o deixa repetível.

---

## Instalação

```bash
pip install genpyexe          # núcleo: API + CLI
pip install "genpyexe[gui]"   # com o assistente gráfico
```

Ou baixe os binários prontos em [Releases](https://github.com/DaviKdS/GenPyEXE/releases): um
executável portátil e um instalador 64 bits, sem precisar de Python instalado.

> **Instala como `genpyexe`, importa como `genpyexeks`.** Nome de distribuição diferente do nome de
> importação é comum em Python (`pillow` → `PIL`, `beautifulsoup4` → `bs4`). O nome de instalação
> acompanha o produto; o pacote importável mantém `genpyexeks`.
>
> O pip normaliza o nome antes de procurá-lo (PEP 503), então `genpyexe` e `GenPyEXE` levam ao
> mesmo pacote.

Para a versão em desenvolvimento, direto do repositório:

```bash
pip install "git+https://github.com/DaviKdS/GenPyEXE.git"
```

Confira o ambiente antes do primeiro build:

```bash
genpyexe doctor
```

---

## Três formas de usar

### 1. Assistente gráfico

```bash
genpyexe gui
```

Quatro etapas: arraste a pasta, confira o que foi detectado, marque as integrações desejadas e
acompanhe o log ao vivo.

```
┌─ GenPyEXE ─────────────────────────────────────────┐
│ 1. Projeto  2. Aplicativo  3. Instalador  4. Build │
├────────────────────────────────────────────────────┤
│   ╔══════════════════════════════════════════╗     │
│   ║     Arraste a pasta do projeto aqui      ║     │
│   ║        ou use o botão Procurar           ║     │
│   ╚══════════════════════════════════════════╝     │
│                                                    │
│   Detectado automaticamente                        │
│     Arquivo inicial: main.py                       │
│     Dependências:    3 - PySide6, pandas, requests │
│     Recursos:        assets/, templates/           │
│     Tipo de app:     gráfico (sem console)         │
└────────────────────────────────────────────────────┘
```

### 2. Linha de comando

```bash
genpyexe build ./MeuProjeto \
    --name "Meu App" \
    --version 1.0.0 \
    --publisher "Seu Nome" \
    --icon assets/logo.png \
    --onefile --windowed \
    --installer --desktop-shortcut --start-menu
```

### 3. Biblioteca Python

```python
import genpyexeks
from genpyexeks import InstallerOptions

genpyexeks.build(
    "./MeuApp",
    app_name="Meu App",
    installer=InstallerOptions(
        desktop_shortcut=True,
        start_menu=True,
        add_to_path=False,
        file_associations=[".meuext"],
        run_at_startup=False,
        per_user_install=True,
    ),
)
```

---

## O que o instalador faz

Cada item é **opcional** e independente — marque só o que o seu aplicativo precisa.

| Opção | Efeito no Windows |
|---|---|
| *(sempre)* | Entrada em **Aplicativos e Recursos**, com desinstalador |
| `desktop_shortcut` | Oferece atalho na Área de Trabalho |
| `start_menu` | Entrada no Menu Iniciar + atalho de desinstalação |
| `per_user_install` | Instala sem pedir senha de administrador (sem UAC) |
| `add_to_path` | Acrescenta a pasta ao `PATH` — e a remove ao desinstalar |
| `file_associations` | Duplo clique em `.suaext` abre o seu aplicativo |
| `run_at_startup` | Inicia junto com o Windows |
| `launch_after_install` | Executa ao terminar a instalação |
| `keep_data_on_uninstall` | Preserva logs e configurações na desinstalação |

O instalador usa um **`AppId` determinístico** derivado de publicador + nome do app. Na prática:
instalar a versão 2.0 **substitui** a 1.0 em *Aplicativos e Recursos*, em vez de criar uma segunda
entrada duplicada.

---

## Suporte a bibliotecas

O PyInstaller já cobre a maior parte do ecossistema através dos seus *hooks* e do
`pyinstaller-hooks-contrib`. O GenPyEXE acrescenta uma camada de receitas para os casos em que a
coleta automática costuma deixar arquivos para trás:

- **Interfaces gráficas** — PySide6, PyQt5/6, CustomTkinter, tkinterdnd2, ttkbootstrap, Kivy, pygame, Flet
- **Documentos** — python-docx, reportlab, fpdf2, pdfplumber, PyMuPDF, openpyxl
- **Dados e IA** — pandas, numpy, scipy, scikit-learn, PyTorch, transformers, EasyOCR
- **Web** — Flask, FastAPI, Uvicorn, Selenium, Playwright
- **Sistema** — pywin32, comtypes, pyautogui, SQLAlchemy

Bibliotecas fora dessa lista seguem o comportamento padrão do PyInstaller — **a ausência de receita
nunca quebra um build**.

Quando um pacote depende de algo que nenhuma opção de empacotamento resolve — o binário do
Tesseract, os navegadores do Playwright, modelos baixados na primeira execução — o GenPyEXE emite
um aviso explícito em vez de gerar um executável que falharia na máquina do usuário final.

---

## Ambiente isolado

Por padrão, o GenPyEXE cria uma venv contendo **apenas** as dependências declaradas do projeto e
roda o PyInstaller lá dentro.

O motivo é concreto: um ambiente Python de uso geral acumula bibliotecas pesadas. Numa máquina com
`torch`, `opencv` e `easyocr` instalados, o `site-packages` passa de 1,6 GB — e qualquer erro para
mais na análise estática custa centenas de megabytes no executável final.

O ambiente é cacheado pelo hash das dependências, então o segundo build é rápido.

```bash
genpyexe build ./MeuApp                   # isolado (padrão)
genpyexe build ./MeuApp --no-isolation    # interpretador atual: rápido, offline, exe maior
genpyexe clean                            # remove as venvs em cache
```

Use `--no-isolation` quando estiver sem internet ou quando o projeto usar bibliotecas que só
existem localmente.

---

## Perfil do projeto

Grave as escolhas em `genpyexe.toml` e reconstrua com um comando:

```bash
genpyexe init ./MeuApp     # cria o perfil interativamente
genpyexe build ./MeuApp    # lê o perfil automaticamente
```

```toml
[app]
name = "Meu App"
version = "1.0.0"
publisher = "Seu Nome"
icon = "assets/logo.png"
entrypoint = "main.py"

[build]
mode = "onefile"       # onefile | onedir
console = "windowed"   # windowed | console
isolated = true

[installer]
enabled = true
desktop_shortcut = true
start_menu = true
per_user_install = true
add_to_path = false
file_associations = [".meuext"]
```

---

## Referência da API

```python
genpyexeks.build(
    project_dir,              # pasta do projeto
    app_name=None,            # padrão: nome da pasta
    version="1.0.0",
    publisher="",
    description="",
    copyright="",             # derivado do publisher, se vazio
    url="",
    icon=None,                # .ico, .png, .jpg, .bmp, .webp
    auto_icon=False,          # gera ícone com as iniciais
    entrypoint=None,          # detectado se omitido
    onefile=True,
    windowed=True,
    isolated=True,
    base_python=None,
    installer=False,          # True ou InstallerOptions(...)
    output_dir=None,
    hidden_imports=None,
    extra_data=None,          # [(origem, destino), ...]
    collect_all=None,
    excludes=None,
    uac_admin=False,
    clean=False,
    on_progress=None,         # callback(etapa, mensagem, percentual)
    on_output=None,           # callback(linha)
) -> BuildResult
```

`BuildResult` traz `exe_path`, `installer_path`, `iss_path`, `spec_path`, `icon_path`,
`notices_path`, `exe_size_mb`, `duration_seconds`, `warnings` e `messages`.

Analisar sem construir:

```python
info = genpyexeks.analyze("./MeuApp")
print(info.entrypoint_rel, info.requirements, info.suggests_windowed)
```

---

## Referência da CLI

```
genpyexe doctor                 Diagnostica Python, PyInstaller e Inno Setup
genpyexe init <pasta>           Cria o perfil genpyexe.toml interativamente
genpyexe build <pasta>          Gera o executável (e o instalador)
genpyexe icon <imagem>          Converte uma imagem em .ico multi-resolução
genpyexe icon -g "Meu App"      Gera um ícone com as iniciais
genpyexe clean                  Remove as venvs de build em cache
genpyexe gui                    Abre o assistente gráfico
```

`genpyexe build --help` lista todas as opções.

---

## Documentação completa

| Documento | Conteúdo |
|---|---|
| [docs/instalacao.md](docs/instalacao.md) | Instalação, Inno Setup, requisitos |
| [docs/uso-gui.md](docs/uso-gui.md) | Assistente gráfico, etapa por etapa |
| [docs/uso-cli.md](docs/uso-cli.md) | Todos os comandos e opções |
| [docs/api.md](docs/api.md) | Referência da biblioteca |
| [docs/instalador-windows.md](docs/instalador-windows.md) | Como cada opção age no Windows |
| [docs/receitas-bibliotecas.md](docs/receitas-bibliotecas.md) | Bibliotecas cobertas e limitações |
| [docs/solucao-de-problemas.md](docs/solucao-de-problemas.md) | Erros comuns e como resolver |

---

## Requisitos

- **Windows** de 64 bits (o alvo dos artefatos é o Windows)
- **Python 3.9 ou superior**, 64 bits
- **Inno Setup 6** — apenas para compilar o instalador. Sem ele, o `.exe` portátil é gerado
  normalmente e o script `.iss` fica pronto, junto de um guia de compilação.

O GenPyEXE **nunca instala nada automaticamente**. Quando falta uma ferramenta, ele informa o
comando exato e a decisão fica com você.

---

## Segurança e privacidade

- Nenhuma credencial, token ou dado pessoal no código. Variáveis opcionais documentadas em
  [.env.example](.env.example).
- Todo subprocesso é executado com lista de argumentos e `shell=False` — sem interpolação de
  string em linha de comando.
- A análise do projeto usa apenas a AST: **o seu código nunca é importado nem executado** durante
  a detecção.
- Os logs registram caminhos e versões, nunca conteúdo de arquivos ou variáveis de ambiente.

**Sobre o SmartScreen:** executáveis não assinados disparam um aviso do Windows na primeira
execução. Isso é comportamento normal do sistema, não um defeito do GenPyEXE, e só desaparece com
um certificado de assinatura de código. O GenPyEXE suporta `signtool` opcionalmente, mas o
certificado é seu e nunca deve ir para o repositório.

---

## Licença e autoria

**MIT** — veja [LICENSE](LICENSE).

Copyright © 2026 **Davi Kasmirski dos Santos** — autor e único detentor dos direitos autorais
deste projeto.

O GenPyEXE gera automaticamente um arquivo `THIRD_PARTY_NOTICES.txt` ao lado do executável, com as
licenças das bibliotecas empacotadas. Isso cumpre as cláusulas de atribuição dessas licenças e
**não divide a autoria** do seu aplicativo nem deste projeto.

Ferramentas de terceiros utilizadas — nenhuma redistribuída aqui:

- **PyInstaller** (GPLv2 *com exceção de bootloader*) — invocado como programa externo. A exceção
  autoriza expressamente distribuir sob qualquer licença os executáveis gerados por ele.
- **Inno Setup** (JR Software) — gratuito inclusive para uso comercial. O GenPyEXE gera o script
  `.iss` e chama o compilador `ISCC.exe`.
- **Pillow**, **Jinja2**, **Typer**, **Rich**, **PySide6** — dependências declaradas em
  [pyproject.toml](pyproject.toml), cada uma sob a própria licença.
