Metadata-Version: 2.4
Name: wally-dev
Version: 0.5.0
Summary: CLI para desenvolvimento local de casos de teste de acessibilidade da plataforma Wally
Author-email: Equallyze <contato@equallyze.com>
Maintainer-email: Equallyze <contato@equallyze.com>
License-Expression: LicenseRef-Proprietary
Project-URL: Homepage, https://acessibilidade.global
Project-URL: Documentation, https://docs.acessibilidade.global
Project-URL: Repository, https://gitlab.com/AcessibilidadeParaTodos/wally/wally-dev
Project-URL: Issues, https://gitlab.com/AcessibilidadeParaTodos/wally/wally-dev/-/issues
Project-URL: Changelog, https://gitlab.com/AcessibilidadeParaTodos/wally/wally-dev/-/blob/main/CHANGELOG.md
Keywords: accessibility,a11y,testing,cli,wally,equallyze,acessibilidade,nbr17225
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
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: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Testing
Classifier: Topic :: Software Development :: Quality Assurance
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
Classifier: Typing :: Typed
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: requests<3.0.0,>=2.31.0
Requires-Dist: pydantic<3.0.0,>=2.5.0
Requires-Dist: pydantic-settings<3.0.0,>=2.1.0
Requires-Dist: python-dotenv<2.0.0,>=1.0.0
Requires-Dist: click<9.0.0,>=8.1.0
Requires-Dist: rich<14.0.0,>=13.0.0
Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0
Provides-Extra: ai
Requires-Dist: openai<2.0.0,>=1.0.0; extra == "ai"
Provides-Extra: dev
Requires-Dist: pytest>=7.4.0; extra == "dev"
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
Requires-Dist: pytest-mock>=3.12.0; extra == "dev"
Requires-Dist: responses>=0.24.0; extra == "dev"
Requires-Dist: black>=23.0.0; extra == "dev"
Requires-Dist: isort>=5.12.0; extra == "dev"
Requires-Dist: mypy>=1.7.0; extra == "dev"
Requires-Dist: ruff>=0.1.0; extra == "dev"
Requires-Dist: types-requests>=2.31.0; extra == "dev"
Requires-Dist: types-beautifulsoup4>=4.12.0; extra == "dev"
Requires-Dist: pre-commit>=3.5.0; extra == "dev"
Requires-Dist: openai<2.0.0,>=1.0.0; extra == "dev"
Dynamic: license-file

# Wally Dev CLI

[![PyPI version](https://img.shields.io/pypi/v/wally-dev.svg)](https://pypi.org/project/wally-dev/)
[![Python versions](https://img.shields.io/pypi/pyversions/wally-dev.svg)](https://pypi.org/project/wally-dev/)
[![Pipeline](https://gitlab.com/AcessibilidadeParaTodos/wally/wally-dev/badges/main/pipeline.svg)](https://gitlab.com/AcessibilidadeParaTodos/wally/wally-dev/-/pipelines)

**Wally Dev** é uma ferramenta de linha de comando (CLI) para execução local de casos de teste de acessibilidade da plataforma [Wally](https://acessibilidade.global).

Trabalha diretamente com o repositório `wally-norms` sem necessidade de autenticação ou conexão com backend.

## 🚀 Instalação

### Opção 1: pipx (Recomendado)

```bash
# Instalar pipx (se necessário)
sudo apt install pipx
pipx ensurepath

# Instalar wally-dev
pipx install wally-dev
```

### Opção 2: pip com virtual environment

```bash
# Criar e ativar virtual environment
python3 -m venv ~/.venvs/wally-dev
source ~/.venvs/wally-dev/bin/activate

# Instalar
pip install wally-dev
```

### Opção 3: pip direto (sistemas sem proteção PEP 668)

```bash
pip install wally-dev
```

### Requisitos

- Python 3.9 ou superior
- Repositório `wally-norms` clonado localmente

## 📋 Comandos Disponíveis

| Comando | Descrição |
|---------|-----------|
| `wally-dev list` | Listar testcases disponíveis no repositório |
| `wally-dev run` | Executar testcases localmente |
| `wally-dev upgrade` | Verificar e instalar atualizações |

## ⚙️ Configuração

A única configuração necessária é o caminho para o repositório `wally-norms`:

```bash
# Via variável de ambiente
export WALLY_NORMS_PATH=~/repos/equallyze/wally/wally-norms

# Ou via parâmetro
wally-dev list --norms-path ~/repos/equallyze/wally/wally-norms
```

**Default**: `~/repos/equallyze/wally/wally-norms`

## 📦 Estrutura do Repositório wally-norms

```
wally-norms/
  {NormName}/                    # Ex: "NBR 17225"
    {RuleName}/                  # Ex: "1.1.1 Non-text Content"
      {technology}/              # Ex: "html", "react", "angular"
        code/
          finder.py              # Função que encontra elementos
          validator.py           # Função que valida elementos
        examples/
          compliant/
            example.html         # HTML que deve passar
          non-compliant/
            example.html         # HTML que deve falhar
```

## 📋 Listar Testcases

```bash
# Listar todos os testcases
wally-dev list

# Listar em formato de árvore
wally-dev list --tree

# Mostrar resumo
wally-dev list --summary

# Filtrar por norma
wally-dev list --norm "NBR 17225"

# Filtrar por regra
wally-dev list --rule "1.1.1"

# Filtrar por tecnologia
wally-dev list --tech html
```

Saída exemplo:
```
╭────────────────── 📋 Testcases (42) ──────────────────╮
│ ┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━┓ │
│ ┃ Norm           ┃ Rule              ┃ Tech   ┃ ✓   ┃ │
│ ┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━┩ │
│ │ NBR 17225      │ 1.1.1 Non-text    │ html   │ ✓ ✓ │ │
│ │ NBR 17225      │ 1.2.1 Audio-only  │ html   │ ✓ ✓ │ │
│ │ NBR 17225      │ 5.2.1 Keyboard    │ html   │ ✓ ✓ │ │
│ └────────────────┴───────────────────┴────────┴─────┘ │
╰───────────────────────────────────────────────────────╯
```

## 🧪 Executar Testcases

```bash
# Executar todos os testcases
wally-dev run

# Executar testcase específico
wally-dev run "1.1.1/html"
wally-dev run "NBR 17225/1.1.1 Non-text Content/html"

# Filtrar por norma
wally-dev run --norm "NBR 17225"

# Filtrar por regra
wally-dev run --rule "5.2.1"

# Filtrar por tecnologia
wally-dev run --tech html

# Modo verbose (mais detalhes)
wally-dev run --verbose

# Modo debug (mostra elementos encontrados)
wally-dev run --debug
```

Saída exemplo:
```
╭────────────────────── 🔍 Caso de Teste ──────────────────────╮
│ 1.1.1 Non-text Content                                       │
│ Tecnologia: html                                             │
│ Exemplos: 4                                                  │
╰──────────────────────────────────────────────────────────────╯

┏━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┓
┃ Exemplo                  ┃ Esperado  ┃ Resultado ┃ Status  ┃ Tempo  ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━┩
│ compliant/example.html   │ compliant │ compliant │ ✓ PASS  │ 1.2ms  │
│ compliant/decorative.html│ compliant │ compliant │ ✓ PASS  │ 0.8ms  │
│ non-compliant/no-alt.html│ non-comp. │ non-comp. │ ✓ PASS  │ 0.9ms  │
│ non-compliant/empty.html │ non-comp. │ non-comp. │ ✓ PASS  │ 1.1ms  │
└──────────────────────────┴───────────┴───────────┴─────────┴────────┘

✓ Todos os 4 exemplos passaram
```

## 🔄 Atualizações

```bash
# Verificar e instalar atualizações
wally-dev upgrade

# Verificar sem instalar (exit code 1 = upgrade disponível)
wally-dev upgrade --check

# Atualizar sem confirmação (ideal para CI/CD)
wally-dev upgrade --yes
```

**Detecção automática**: O comando detecta se você instalou via `pipx` ou `pip` e usa o método correto.

## 📝 Desenvolvendo Testcases

### finder.py

```python
from bs4 import BeautifulSoup

def find(source: str):
    """
    Encontra elementos HTML para validação.
    
    Args:
        html_content: String com o HTML a ser analisado
        
    Yields:
        Elementos encontrados para validação
    """
    soup = BeautifulSoup(source, "html.parser")
    for img in soup.find_all("img"):
        yield img
```

### validator.py

```python
def validate(element) -> bool:
    """
    Valida se um elemento está em conformidade.
    
    Args:
        element: Elemento HTML encontrado pelo finder
        
    Returns:
        True se o elemento está em conformidade, False caso contrário
    """
    alt = element.get("alt", "")
    return bool(alt and alt.strip())
```

## 🧪 Lógica de Validação

Os casos de teste seguem a convenção:

- **Exemplos `compliant/`**: Todos os elementos encontrados pelo `finder` devem retornar `True` no `validator`
- **Exemplos `non-compliant/`**: Pelo menos um elemento deve retornar `False` no `validator`

## 🛠️ Desenvolvimento

### Instalação para Desenvolvimento

```bash
git clone https://gitlab.com/AcessibilidadeParaTodos/wally/wally-dev.git
cd wally-dev

# Criar virtual environment
python3 -m venv .venv
source .venv/bin/activate

# Instalar em modo editável com dependências de dev
pip install -e ".[dev]"
```

### Executar Testes

```bash
# Testes com cobertura
pytest --cov=wally_dev --cov-report=term-missing

# Testes rápidos
pytest -x -v
```

### Formatação e Linting

```bash
black wally_dev tests
isort wally_dev tests
ruff check wally_dev tests
mypy wally_dev
```

## 📊 Exit Codes

| Código | Significado |
|--------|-------------|
| 0 | Sucesso |
| 1 | Erro de configuração |
| 4 | Testcase não encontrado |
| 5 | Erro de execução do testcase |
| 6 | Falha nos testes (exemplos não passaram) |

## 📄 Licença

Este software é propriedade da [Equallyze Tecnologia LTDA](https://equallyze.com). 
Todos os direitos reservados. Consulte o arquivo [LICENSE](LICENSE) para mais detalhes.

## 🔗 Links

- [Plataforma Wally](https://acessibilidade.global)
- [Documentação](https://acessibilidade.global/documentacao)
- [Equallyze](https://equallyze.com)
- [Repositório](https://gitlab.com/AcessibilidadeParaTodos/wally/wally-dev)

## 🤝 Suporte

Para suporte, abra uma issue no [GitLab](https://gitlab.com/AcessibilidadeParaTodos/wally/wally-dev/-/issues) ou entre em contato através de [contato@equallyze.com](mailto:contato@equallyze.com).
