Pular para o conteúdo
Development

Ensinando um gerenciador de projetos a reconhecer uma sessão do Logic Pro

Por Victor Da Luz•
rusttaurimacosdev-loggreenhouse

O Greenhouse não sabe nada sobre software de produção musical. Ele só gerencia pastas: capturar uma ideia, deixar ela amadurecer, mover pelos estágios, guardar no vault se ela travar. Mas boa parte do que de fato vive nessas pastas são arquivos de projeto de DAW, e até essa issue, o app tratava uma sessão do Logic Pro do mesmo jeito que tratava um .DS_Store perdido: invisível.

O problema

Arquivos .logicx e .band não são arquivos. São diretórios que o Finder do macOS apresenta como ícones únicos, um truque de empacotamento chamado bundle. A listagem de arquivos do Greenhouse tinha um filtro de uma linha: pular qualquer coisa que não seja um arquivo simples. Esse filtro fazia dupla função. Escondia corretamente lixo como .DS_Store, e também, como efeito colateral, escondia todo bundle de projeto de DAW que um usuário pudesse realmente querer ver.

A correção parece pequena: reconhecer o bundle, dar um badge a ele, adicionar um botão “Open in DAW”. A parte interessante foi provar que de fato funcionava.

Por que “Open in DAW” foi fácil

O app já tinha exatamente a infraestrutura necessária para isso. “Show in Finder” abre uma pasta via o mecanismo de handler padrão do sistema operacional: entregar um caminho para o SO e deixar ele descobrir qual app é dono daquilo. Um bundle de DAW é só mais um caminho. Mesma chamada, nenhuma capacidade nova, nenhuma permissão nova. Adicionei um comando novo, open_item_file, que resolve um nome de arquivo de volta para um caminho real no lado do servidor (nunca confiando no que o frontend alega que um caminho é) e reutiliza exatamente a mesma chamada de abertura que “Show in Finder” já usa.

Provando, não assumindo

Eu poderia ter parado em testes unitários e um teste de componente mockado, e honestamente esses cobriam a maior parte da lógica real: detecção de bundle contra um sistema de arquivos temporário real, checagens de contenção contra uma tentativa real de path-traversal, uma renderização Svelte real com um clique de botão real. Mas existe uma lacuna que esses testes não fecham: será que a fiação real do #[tauri::command] funciona, de ponta a ponta, contra um app de verdade em execução?

Então construí uma sessão de harness com WebDriver contra um vault pré-semeado (o SQLite não deixa você adiantar um timer de maturidade, então escrevi a linha do “projeto ativo” diretamente em state.db em vez de esperar uma semana) e conduzi a UI de verdade: encontrar o card do projeto, clicar nele, confirmar que os badges de DAW renderizam, clicar em “Open in DAW” de verdade, confirmar que não dá erro.

A primeira tentativa falhou. O clique não fez nada, sem erro, sem navegação, só silêncio. Esse silêncio acabou sendo o bug interessante, e ele não estava, de jeito nenhum, no meu código novo.

O clique que não fez nada

Eu tinha dito ao script WebDriver para encontrar o card inteiro, o <li>, e clicar nele. O nome do card é um botão. O card em si não é. Clicar no <li> clicou… em nada, porque nada estava escutando. Sem erro, porque não havia nada para dar erro, o clique caiu num elemento sem handler nenhum e a página simplesmente ficou parada.

Esse é um modo de falha mais traiçoeiro do que um crash. Um crash diz para você onde olhar. Um no-op silencioso parece exatamente com “a página ainda não terminou de carregar”, que é precisamente o que meu loop de retry foi construído para tolerar, então ele tentou pacientemente de novo por vinte segundos antes de desistir com um erro que apontava para a coisa completamente errada. A correção foi uma linha: mirar em button.name-btn, o elemento clicável de fato, em vez da linha ao redor dele.

Resultados

Bundles .logicx/.band e arquivos .als/.flp/.rpp/.cpr/.bwproject agora aparecem no painel Files com um rótulo amigável e um botão “Open in DAW”. Existe um aviso na tela de confirmação de avanço se você estiver prestes a mover uma pasta que contém um bundle de DAW, o único risco real que o spike de pesquisa original tinha sinalizado (mover um projeto enquanto ele está aberto na DAW). E tudo isso é sustentado por 222 testes em Rust, 135 testes de frontend, e uma passada real de WebDriver, com screenshot incluído, confirmando de ponta a ponta.

Reflexão

A feature em si aqui era pequena e de baixo risco, ela reutiliza um mecanismo que já funciona há meses. O valor de conduzi-la de verdade não foi provar que a feature funcionava; os testes unitários já me davam bastante confiança nisso. Foi pegar um bug no meu teste, não no meu código, e esse bug teria sido invisível se eu tivesse confiado num checkmark verde em vez de observar o que o clique realmente fazia. Um teste que passa porque está testando a coisa errada é pior do que nenhum teste, porque parece exatamente com cobertura.

Leitura relacionada

Você também pode achar útil

RackNerd

RackNerd VPS

Hospedagem VPS econômica para serviços leves que funcionam continuamente.

Como afiliado da RackNerd, ganho com compras qualificadas.

Saiba mais
Proton

Proton Mail

E-mail criptografado de ponta a ponta, com arquitetura de acesso zero.

Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).

Saiba mais
Proton

Proton Drive

Armazenamento em nuvem criptografado, da equipe por trás do Proton Mail.

Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).

Saiba mais