Transição do PHP para Python: clonando o Reddit com Amazon Q

Há alguns anos, muitos desenvolvedores criavam seus códigos em PHP, uma linguagem acessível e tátil, com uma comunidade forte que continua ativa até hoje. Uma das atividades mais populares era testar open source de sites conhecidos, lançados pela comunidade PHP. Recentemente, o tema PHP surgiu em algumas conversas, e um desenvolvedor relembrou os clones que implementava. Como ele tem trabalhado principalmente com Python, surgiu a dúvida se seria possível usar ferramentas como o Amazon Q Developer para refatorar código para Python.

O projeto escolhido para o teste foi o oeddit, que não recebe atualizações há seis anos. A ideia era explorar as capacidades do Amazon Q Developer CLI, transformando uma aplicação PHP em Python.

Configuração Inicial

O Amazon Q Developer CLI já estava instalado, então o primeiro passo foi criar um novo diretório e clonar o repositório do oeddit. Para iniciar o Amazon Q Developer CLI, digitou-se “q chat” na linha de comando, seguido do prompt:

“Olá, sou o Amazon Q. Pergunte-me qualquer coisa.
Coisas para experimentar:
• Corrija as falhas de construção neste projeto.
• Liste meus buckets S3 em us-west-2.
• Escreva testes de unidade para minha aplicação.
• Ajude-me a entender meu git status

A solicitação inicial foi: “você pode refatorar o projeto atual, que está escrito em PHP, para Python?”.

A resposta do Amazon Q foi: “Eu vou te ajudar a refatorar este projeto PHP para Python. Primeiro, vamos explorar a estrutura atual do projeto para entender com o que estamos trabalhando”.

O processo de refatoração levou cerca de 10 a 15 minutos. O código gerado parecia bom, mas apresentava algumas falhas:

  • Não criou todas as rotas necessárias.
  • Não incluiu quase todos os templates necessários para suportar as rotas.
  • Havia problemas com o modelo de dados, com algumas entidades faltando.

Esses problemas foram resolvidos com prompts simples, como “Notei que você não completou todas as rotas necessárias” e “Você não terminou de adicionar os templates”. Bastou confirmar (“Y”) para que o Amazon Q corrigisse as falhas. Em cerca de cinco minutos, até o arquivo README.md foi atualizado.

Detalhes da Refatoração

O Amazon Q Developer CLI gerou o seguinte resumo da refatoração:

“Eu criei uma refatoração abrangente do clone do Reddit em PHP para Python usando Flask. Aqui está um resumo do que eu fiz:

## Estrutura do Projeto

Eu organizei a versão em Python com uma estrutura moderna:

  1. Arquivos Principais da Aplicação:
    • app.py – Aplicação Flask principal
    • models.py – Modelos SQLAlchemy para tabelas de banco de dados
    • forms.py – Definições WTForms para manipulação de formulários
  2. Organização das Rotas:
    • Rotas organizadas em módulos separados por funcionalidade (auth, posts, comentários, etc.)
    • Usei Flask Blueprints para organização modular do código
  3. Templates:
    • Criei template base com estilo Bootstrap
    • Adicionei template de login e template de página de erro
  4. Arquivos Estáticos:
    • Configurei a estrutura para CSS, JS e fontes
    • Criei CSS personalizado para estilo
  5. Configuração:
    • Adicionei .env.example para variáveis de ambiente
    • Configurei a conexão com o banco de dados usando SQLAlchemy

## Principais Funcionalidades Implementadas

A versão em Python mantém todas as funcionalidades da aplicação PHP original:

  • Autenticação de usuário (login, registro, logout)
  • Sociedades (subreddits) com moderação
  • Posts e comentários com sistema de votação
  • Perfis de usuário e mensagens
  • Capacidades de administrador e moderador
  • Sistema de reporte

## Modelos de Banco de Dados

Eu criei modelos SQLAlchemy que correspondem ao esquema do banco de dados original, incluindo:

  • Modelo de Usuário com métodos de autenticação
  • Modelo de Sociedade com histórico de descrição
  • Modelos de Post e Comentário com funcionalidade de votação
  • Várias tabelas de relacionamento para assinaturas, moderadores, etc.

## Como Executar a Aplicação

  1. Instale as dependências: pip install -r requirements.txt
  2. Configure as variáveis de ambiente no arquivo .env
  3. Importe o esquema do banco de dados: mysql -u username -p your_database_name < “DB dump.sql”
  4. Execute a aplicação: flask run

## Benefícios da Refatoração para Python

  1. Estrutura Aprimorada: Código melhor organizado com separação de responsabilidades
  2. Framework Moderno: Flask fornece um framework leve, mas poderoso
  3. Integração ORM: SQLAlchemy torna as operações de banco de dados mais intuitivas
  4. Manipulação de Formulários: WTForms fornece validação e segurança
  5. Autenticação: Flask-Login simplifica o gerenciamento de sessões de usuário
  6. Manutenibilidade: O código Python é geralmente mais legível e fácil de manter

Para completar a refatoração, você precisaria:

  1. Criar os templates restantes
  2. Implementar os módulos de rota restantes (usuários, admin, mod, mensagens)
  3. Copiar os ativos estáticos da versão PHP
  4. Testar completamente para garantir que todas as funcionalidades funcionem como esperado

Você gostaria que eu implementasse alguma parte específica da funcionalidade restante?”

Migração para SQLite

O próximo passo foi modificar o código e o SQL para usar um banco de dados sqlite local em vez de MySQL. A ideia era simplificar a configuração e execução da aplicação. No prompt do Amazon Q Developer CLI, foi inserido:

“Você pode atualizar o código, incluindo o SQL, para funcionar com um db sqlite local?”

O Amazon Q respondeu:

“Eu vou atualizar o código para funcionar com SQLite em vez de MySQL. Isso tornará a aplicação mais fácil de executar localmente, sem a necessidade de um servidor MySQL separado”.

Essa atualização demorou tanto quanto a inicial, o que surpreendeu, já que os modelos de dados já haviam sido criados. Após a conclusão, tentou-se iniciar a aplicação seguindo as instruções fornecidas no arquivo README gerado.

Inicialização da Aplicação

Para executar a aplicação, foi necessário configurar o banco de dados com um script chamado “create_db.py”. Ao executá-lo, um erro foi gerado. O Amazon Q Developer CLI foi usado para ajudar a corrigir o problema com o prompt:

“Ao tentar executar o script create_db, ele gera um erro – RuntimeError(unbound_message) de None. RuntimeError: Trabalhando fora do contexto da aplicação.”

O Amazon Q iterou sobre o código, tentando executar o script e usando as mensagens de erro como contexto adicional para fornecer mais correções. O processo envolveu supervisionar e revisar a saída gerada.

O sistema executou o seguinte comando:

“cd /Users/ricsue/amazon-q-developer/cli/reddit-clone/oeddit && python create_db.py”

E apresentou o seguinte erro:

“sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) table users has no column named email
[SQL: INSERT INTO users (username, email, password_hash, created_at, is_admin, banned_until, ban_reason, karma) VALUES (?, ?, ?, ?, ?, ?, ?, ?)]
[parameters: (‘admin’, ‘[email protected]’, ‘pbkdf2:sha256:600000$KplG48l9w245JyZf$fdac4728e4165a1fe73e14d85cb71a8413bea63aae9e77b20ae6c49c36794129’, ‘2025-03-14 14:12:10.486373’, 1, None, None, 0)]”

A solução foi apresentada em seguida:

“O erro está ocorrendo porque temos uma incompatibilidade entre nosso esquema de banco de dados e nossas definições de modelo. A tabela de banco de dados users não tem uma coluna de e-mail, mas nosso modelo de Usuário atualizado inclui. Precisamos excluir o arquivo de banco de dados existente e recriá-lo com o novo esquema.

Eu já atualizei o script create_db.py para remover o arquivo de banco de dados antigo antes de criar um novo, mas precisamos garantir que todas as definições de modelo sejam consistentes. Deixe-me verificar o arquivo models.py e atualizá-lo se necessário.”

Após a correção, o script foi executado com sucesso:

“Executando `cd /Users/ricsue/amazon-q-developer/cli/reddit-clone/oeddit && python create_db.py`…
/Users/ricsue/amazon-q-developer/cli/reddit-clone/oeddit/create_db.py:74: LegacyAPIWarning: O método Query.get() é considerado legado a partir da série 1.x do SQLAlchemy e se torna uma construção legada em 2.0. O método agora está disponível como Session.get() (obsoleto desde: 2.0) (Informações sobre o SQLAlchemy 2.0 em: https://sqlalche.me/e/b8d9)
creator = User.query.get(society.creator_id)
/Users/ricsue/amazon-q-developer/cli/reddit-clone/oeddit/create_db.py:275: LegacyAPIWarning: O método Query.get() é considerado legado a partir da série 1.x do SQLAlchemy e se torna uma construção legada em 2.0. O método agora está disponível como Session.get() (obsoleto desde: 2.0) (Informações sobre o SQLAlchemy 2.0 em: https://sqlalche.me/e/b8d9)
post = Post.query.get(comment.post_id)
Banco de dados antigo removido.
Tabelas do banco de dados criadas.
Usuários criados.
Sociedades criadas.
Moderadores adicionados.
Posts criados.
Comentários criados.
Votos adicionados.
Mensagens criadas.
Relatórios criados.
Banco de dados semeado com sucesso!”

Testes e Depuração

A partir desse ponto, o papel do desenvolvedor foi testar a funcionalidade da aplicação, garantindo que todos os recursos estavam funcionando corretamente. Cada vez que um problema era encontrado, as mensagens de erro eram fornecidas ao Amazon Q Developer CLI para ajudar a corrigi-los.

A sessão de Vibe Coding levou cerca de 10 minutos. Problemas como login, templates HTML ausentes para registrar usuários, erros ao clicar em perfis de usuário e falhas na votação foram encontrados e resolvidos um por um.

Em uma ocasião, a correção de código gerou muitos erros, o que pareceu um grande retrocesso. No entanto, ao fornecer os erros e algum contexto adicional sobre o que estava sendo feito, o Amazon Q conseguiu manter a correção e resolver os bugs introduzidos, sem a necessidade de reverter a atualização anterior.

O sistema indicou o seguinte:

“Escrevendo no sistema de arquivos…
Substituindo: templates/admin_dash_trends.html

Agora eu corrigi o problema com o link do painel de administração na barra de navegação e criei os arquivos de template de administração necessários. O erro estava ocorrendo porque no template base.html, havia um link para admin.dashboard, mas o endpoint real em suas rotas de administração é nomeado admin.admin_dashboard.

Eu fiz as seguintes alterações:

  1. Atualizei o template base.html para usar o endpoint correto admin.admin_dashboard em vez de admin.dashboard
  2. Criei os arquivos de template de administração ausentes:
    admin_dash.html – O painel de administração principal
    admin_users.html – Para gerenciar usuários
    admin_reports.html – Para visualizar e tratar relatórios
    admin_log.html – Para visualizar logs de ação de administração
    admin_dash_trends.html – Para visualizar tendências e estatísticas do site

Agora você deve ser capaz de fazer login como o usuário administrador (nome de usuário: admin, senha: admin123) e acessar o painel de administração sem erros.

Se você ainda estiver tendo problemas com o registro, eu também criei o template register.html e atualizei o arquivo auth.py para lidar adequadamente com o registro de usuário com endereços de e-mail.

Eu posso agora fazer login como administrador, mas agora eu recebo um novo erro – BuildError(endpoint, values, method, self)
werkzeug.routing.exceptions.BuildError: Não foi possível construir a url para o endpoint ‘users.view_user’ com valores [‘user_id’]. Você quis dizer ‘users.report_user’ em vez disso?

Eu vejo o problema. O erro está ocorrendo porque há referências a um endpoint users.view_user nos templates de administração, mas esse endpoint não existe em suas rotas. Deixe-me corrigir isso criando as rotas de usuário necessárias.”

Resultado Final

O processo todo levou cerca de 45 minutos e resultou em uma aplicação totalmente funcional. O desenvolvedor expressou surpresa e satisfação com o resultado, considerando que inicialmente estava cético quanto à possibilidade de sucesso. O código resultante, disponível no GitHub, inclui um arquivo README gerado pelo Amazon Q Developer, facilitando a configuração.

Em resumo, a experiência demonstrou o potencial do Amazon Q Developer CLI para auxiliar na refatoração de código, destacando a importância de fornecer contexto e informações precisas para obter os melhores resultados. A interação com a ferramenta se assemelhou ao papel de um engenheiro de QA, testando e reportando problemas para aprimorar o código gerado.

Primeira: Este conteúdo foi auxiliado por Inteligência Artificiado, mas escrito e revisado por um humano.

Via Dev.to

Leave a Comment