Metadata-Version: 2.4
Name: devicefarm-app-manager-library
Version: 1.2.0
Summary: Biblioteca Robot Framework para Device Farm Keeggo
Author: Caio Torres Rocha, Paulo Rogerio Moreira Rocha
Project-URL: Repository, https://github.com/Sinognator/Devicefarm_app_manager_library
Project-URL: Issues, https://github.com/Sinognator/Devicefarm_app_manager_library/issues
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: robotframework
Requires-Dist: requests
Requires-Dist: python-dotenv
Requires-Dist: androguard
Requires-Dist: google-auth
Provides-Extra: test
Requires-Dist: pytest>=8; extra == "test"
Requires-Dist: pytest-mock>=3; extra == "test"
Requires-Dist: build>=1; extra == "test"
Requires-Dist: twine>=5; extra == "test"

# DeviceFarm App Manager Library

Biblioteca Robot Framework para reservar dispositivos, baixar aplicativos do
Firebase, realizar upload e garantir a instalação no DeviceFarm.

## Instalação

```bash
python -m pip install --upgrade devicefarm-app-manager-library
```

## Import único

```robot
*** Settings ***
Library    devicefarm_app_manager_library
```

O import unificado disponibiliza, entre outras, as seguintes keywords:

- `Seleciona Dispositivo Pronto Para Uso`
- `Download APK Firebase`
- `Upload Aplicativo para o devicefarm`
- `Instalar Aplicativo em dispositivo reservado`
- `Consultar Aplicativo Instalado`
- `Garantir Aplicativo Instalado`
- `Retorna counter do aplicativo no devicefarm`

## Exemplo

```robot
*** Settings ***
Library    devicefarm_app_manager_library

*** Variables ***
@{APP_VERSAO}    1.8.4    201    ANDROID
${PACKAGE}       br.gov.caixa.fies

*** Test Cases ***
Reservar e instalar
    ${device_id}=    Seleciona Dispositivo Pronto Para Uso
    ...    platform=ANDROID
    ...    preferred_devices=${DEVICES}

    ${resultado}=    Garantir Aplicativo Instalado
    ...    device_id=${device_id}
    ...    app_identifier=${PACKAGE}
    ...    version=${APP_VERSAO}[0]
    ...    build=${APP_VERSAO}[1]
    ...    platform=${APP_VERSAO}[2]
```

## Configuração

Defina `ENV_FILE` com o caminho do `.env` do projeto consumidor ou disponibilize
as variáveis diretamente no ambiente:

```env
DEVICEFARM_BASE_URL=https://seu-devicefarm/rest
DEVICEFARM_TENANT_ID=tenant-id
DEVICEFARM_WORKSPACE_ID=workspace-id
DEVICEFARM_CLIENT_ID=client-id
DEVICEFARM_CLIENT_SECRET=client-secret

DEVICEFARM_APP_FOLDER=./resources/apks
DEVICEFARM_STATE_FILE=./resources/apks/install_state.json
DEVICEFARM_UPLOAD_CACHE_FILE=./resources/apks/cache/upload_cache.json

FIREBASE_TYPE=service_account
FIREBASE_PROJECT_ID=<PROJECT_ID>
FIREBASE_PRIVATE_KEY_ID=<PRIVATE_KEY_ID>
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n<PRIVATE_KEY>\n-----END PRIVATE KEY-----\n"
FIREBASE_CLIENT_EMAIL=<CLIENT_EMAIL>
FIREBASE_CLIENT_ID=<CLIENT_ID>
FIREBASE_AUTH_URI=https://accounts.google.com/o/oauth2/auth
FIREBASE_TOKEN_URI=https://oauth2.googleapis.com/token
FIREBASE_AUTH_PROVIDER_X509_CERT_URL=https://www.googleapis.com/oauth2/v1/certs
FIREBASE_CLIENT_X509_CERT_URL=<CLIENT_X509_CERT_URL>
FIREBASE_UNIVERSE_DOMAIN=googleapis.com
FIREBASE_PROJECT_NUMBER=project-number
FIREBASE_APP_ID=app-id

DEVICEFARM_REQUEST_TIMEOUT=30
DEVICEFARM_UPLOAD_TIMEOUT=300
LOG_DIR=output
```

A partir da versão 1.2.0, copie os campos do `firebase-automation.json` para
as variáveis `FIREBASE_` correspondentes no `.env` (por exemplo, `client_email`
para `FIREBASE_CLIENT_EMAIL`). `FIREBASE_SERVICE_ACCOUNT_FILE` não é mais usado
para autenticação. A biblioteca monta as credenciais em memória.

`FIREBASE_CLIENT_EMAIL` e `FIREBASE_PRIVATE_KEY` são obrigatórios. Os endpoints,
`type` e `universe_domain` têm os padrões mostrados acima; os demais metadados da
conta são opcionais. `FIREBASE_PROJECT_NUMBER` e `FIREBASE_APP_ID` continuam
obrigatórios para consultar as releases; o número do projeto não é o `project_id`.
Use aspas duplas na chave privada com `\n` entre as linhas, ou uma chave com
quebras de linha reais. Não versione o `.env`. Variáveis já definidas no ambiente
têm precedência sobre o arquivo indicado por `ENV_FILE`.

`DEVICEFARM_REQUEST_TIMEOUT` controla as chamadas comuns à API. O upload do
APK usa `DEVICEFARM_UPLOAD_TIMEOUT` separadamente e aceita valores maiores para
redes lentas ou arquivos grandes. Os valores são expressos em segundos.

Também é possível sobrescrever o valor em uma chamada específica:

```robot
Garantir Aplicativo Instalado
...    device_id=${device_id}
...    app_identifier=${PACKAGE}
...    version=1.8.4
...    build=201
...    platform=ANDROID
...    upload_timeout=900
```

Os nomes antigos `oauthClientId` e `oauthClientSecret` ainda são aceitos na
versão 1.2.0, mas estão depreciados.

## Estrutura interna

- `devicefarm_app_manager_library.py`: fachada pública do Robot Framework.
- `device_farm_library.py`: seleção e reserva de dispositivos.
- `upload_app_library.py`: consulta, upload e instalação de aplicativos.
- `config.py`: leitura e validação centralizada das configurações.
- `client.py`: autenticação e sessão HTTP compartilhada.
- `*_service.py`: operações HTTP específicas.
- `exceptions.py`: erros de domínio apresentados ao consumidor.

Os módulos antigos permanecem disponíveis como adaptadores de compatibilidade,
mas não devem ser utilizados por projetos novos.

## Compatibilidade

Os imports antigos continuam disponíveis durante a migração:

```robot
Library    device_farm_library
Library    upload_app_library
Library    devicefarm_app_manager
```

Novos projetos devem utilizar apenas `devicefarm_app_manager_library`.

## Desenvolvimento

```bash
python -m pip install -e .
python -m pytest -q
python -m build
python -m twine check dist/*
```

A publicação no PyPI é executada pelo workflow de release quando uma tag
`v*` é enviada ao GitHub. O workflow valida se a tag corresponde à versão do
`pyproject.toml` antes da publicação.
