Projeto da matéria de Engenharia de Software
Project description
Downloader Multithread com GUI
Projeto desenvolvido para a disciplina de Engenharia de Software. A aplicação foi construída em Python com interface em Tkinter e realiza downloads em múltiplas threads, dividindo o arquivo em partes e montando o arquivo final ao término da transferência.
Integrantes
- Guilherme
- Luan Robert
Funcionalidades
- Download de arquivos em múltiplas threads
- Interface gráfica com Tkinter
- Montagem automática do arquivo final
- Geração de logs do processo de download
- Pipeline CI/CD com testes, build, cobertura, deploy e notificação
Estrutura do Projeto
src/app.py: ponto de entrada da aplicaçãosrc/downloader/: lógica principal de download, segmentação, rede e IOsrc/gui/: interface gráficatests/: testes unitáriosscripts/send_notification.py: script de envio de e-mail ao final do pipeline.github/workflows/cicd.yml: pipeline CI/CDpyproject.toml: configuração do pacote Python
Requisitos
- Python 3.9 ou superior
tkinterdisponível no ambiente para execução da interface- Dependências listadas em
requirements.txt
Instalação das dependências:
pip install -r requirements.txt
Instalação do projeto em modo local:
pip install -e .
Como Executar
Depois de instalar o projeto:
c14-np1
Alternativamente, a partir da raiz do projeto:
PYTHONPATH=src python -m app
Como Rodar os Testes
Execução dos testes unitários:
python -m pytest
Execução com geração de relatório JUnit:
python -m pytest --junitxml=report.xml
Cobertura de Testes
O projeto utiliza pytest-cov para gerar relatório de cobertura em HTML.
python -m pytest --cov=downloader --cov=gui --cov=app --cov-report=html
O relatório gerado fica na pasta htmlcov/.
Pipeline CI/CD
O projeto possui um pipeline configurado no GitHub Actions com as seguintes etapas:
-
testsExecuta os testes unitários e salva o relatórioreport.xmlcomo artifact. -
buildGera a distribuição do pacote Python compython -m builde publica o conteúdo dedist/como artifact. -
coverageExecuta os testes com cobertura e publica o relatório HTML como artifact. -
pypi-publishPublica o pacote no PyPI após o sucesso das etapas de build e cobertura. -
notificationExecuta um script Python externo para enviar um e-mail com o resumo final do pipeline.
Paralelismo do Pipeline
Após a etapa tests, os jobs build e coverage podem prosseguir de forma independente. Isso atende ao requisito de possuir jobs em paralelo dentro do pipeline.
Artifacts Gerados
test-report: relatório dos testes unitáriosrelease-dists: arquivos gerados emdist/coverage-report: relatório HTML de cobertura
Deploy
O deploy adotado neste projeto é a publicação do pacote Python no PyPI, caracterizando deploy de artefato de build.
Projeto no PyPI:
https://pypi.org/project/c14-np1/
Para a publicação automática funcionar, o repositório precisa estar configurado no PyPI como Trusted Publisher ou usar autenticação por token de API.
Observação sobre versionamento
O PyPI não permite sobrescrever versões já publicadas.
Portanto, é necessário incrementar manualmente a versão no arquivo pyproject.toml a cada novo deploy.
Notificação por E-mail
A etapa de notificação utiliza o script send_notification.py e depende dos seguintes secrets no GitHub Actions:
EMAIL_USEREMAIL_PASSNOTIFICATION_EMAIL
Opcionalmente, também podem ser definidos:
SMTP_SERVERSMTP_PORT
O script envia um resumo com o status de:
- testes
- build
- cobertura
- deploy
Testes Implementados
O projeto possui mais de 20 cenários de testes unitários cobrindo:
- fluxo principal de segmentação e montagem de arquivos
- formatação e conversão de taxas e tamanhos
- casos de erro e entradas inválidas
- cenários de borda, como valores vazios, zero e ordenação de partes
Arquivos de teste:
Links de Teste
Alguns arquivos públicos que podem ser usados para validar a aplicação:
Uso de IA
Ferramentas de IA foram utilizadas como apoio em diferentes etapas do desenvolvimento do projeto. Abaixo estão os usos reais de prompts e respostas:
1. Configuração da Build (pyproject.toml)
Prompt:
Gere um pyproject.toml para build, com campos detalhando oq devo preencher. Apenas envie o arquivo.
Resposta:
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "seu_pacote" # Nome do pacote
version = "0.1.0" # Versão
description = "Descrição curta"
authors = [
{ name = "Seu Nome", email = "seu@email.com" }
]
readme = "README.md"
requires-python = ">=3.8"
dependencies = [
# "numpy>=2.0"
]
Aplicação no projeto: Esse modelo foi utilizado como base para a
criação do arquivo pyproject.toml, sendo necessário pesquisa adicional para
incluir dependências reais, configuração de pacotes e scripts de
execução.
2. Erro de Deploy no PyPI
Prompt:
Como resolver este problema de deploy do PyPI, responda objetivamente o motivo e resolução:
Uploading c14_np1-0.1.2-py3-none-any.whl
INFO Response from https://upload.pypi.org/legacy/: 400 Bad Request
File already exists ('c14_np1-0.1.2-py3-none-any.whl')
Resposta:
Motivo: O erro ocorre porque você está tentando enviar um arquivo com o mesmo nome e versão que já existe no PyPI. O PyPI não permite sobrescrever artefatos (mesmo que o conteúdo seja idêntico).
Resolução: Você tem 2 opções válidas:
- Incrementar a versão (recomendado)
Atualize a versão no projeto (por exemplo,pyproject.toml):
<!-- -->
0.1.2 → 0.1.3
Depois gere e faça o upload novamente.
- Remover a versão existente (não recomendado)
Acessar o projeto no PyPI e deletar a release correspondente.
Aplicação no projeto: Essa explicação foi utilizada para definir a estratégia de incremento manual de versão a cada novo deploy para evitar falhas no pipeline CI/CD.
3. Uso do GitHub Copilot no VS Code
Ferramenta: GitHub Copilot integrado ao Visual Studio Code.
Uso realizado: Sugestões automáticas de código durante o desenvolvimento, incluindo:
- autocompletar de funções e estruturas básicas
- sugestões de testes unitários com
pytest
Aplicação no projeto: As sugestões foram utilizadas para acelerar o desenvolvimento, sendo revisadas e ajustadas antes de serem incorporadas ao código final.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file c14_np1-0.1.6.tar.gz.
File metadata
- Download URL: c14_np1-0.1.6.tar.gz
- Upload date:
- Size: 13.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65e79d9dd6b7e521eaf136ba0e226da2984656b86843fc1e9b3fe912123c9efa
|
|
| MD5 |
dea4d09fb71f16ea9d6e78f2eac6dd6a
|
|
| BLAKE2b-256 |
187d2b5c5e8e7f064ea2dd70856ad500ebd37882a137df09d1daec376f79c364
|
Provenance
The following attestation bundles were made for c14_np1-0.1.6.tar.gz:
Publisher:
cicd.yml on guilhermecmr/C14-NP1
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
c14_np1-0.1.6.tar.gz -
Subject digest:
65e79d9dd6b7e521eaf136ba0e226da2984656b86843fc1e9b3fe912123c9efa - Sigstore transparency entry: 1274884647
- Sigstore integration time:
-
Permalink:
guilhermecmr/C14-NP1@0ec7be7cc8c0f61a018342fbfd7065440cc6dff5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/guilhermecmr
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
cicd.yml@0ec7be7cc8c0f61a018342fbfd7065440cc6dff5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file c14_np1-0.1.6-py3-none-any.whl.
File metadata
- Download URL: c14_np1-0.1.6-py3-none-any.whl
- Upload date:
- Size: 14.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc6ec446d69bef6068c6f0910e6989f7d172c8fa713f14e895465a8384490bb3
|
|
| MD5 |
15b7473feaa79a6f26a85771cdbb3c74
|
|
| BLAKE2b-256 |
96868f0c349bafcd5aae4a75da6f8dc4ab2e7d619b6299d5a7669f1571491fcc
|
Provenance
The following attestation bundles were made for c14_np1-0.1.6-py3-none-any.whl:
Publisher:
cicd.yml on guilhermecmr/C14-NP1
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
c14_np1-0.1.6-py3-none-any.whl -
Subject digest:
fc6ec446d69bef6068c6f0910e6989f7d172c8fa713f14e895465a8384490bb3 - Sigstore transparency entry: 1274884673
- Sigstore integration time:
-
Permalink:
guilhermecmr/C14-NP1@0ec7be7cc8c0f61a018342fbfd7065440cc6dff5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/guilhermecmr
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
cicd.yml@0ec7be7cc8c0f61a018342fbfd7065440cc6dff5 -
Trigger Event:
push
-
Statement type: