Relato do WordCamp San Francisco 2013

Na última semana de julho, eu, Leo e Catia fomos, representando o Hacklab, para San Francisco para participar do WordCamp San Francisco 2013, o maior evento da comunidade do WordPress. Foi uma ótima oportunidade para conhecer alguns dos desenvolvedores da Automatic e saber quais são os planos para o futuro do projeto e da comunidade.

Os dois primeiros dias do evento foram dedicados a palestras dividas em duas trilhas. A primeira tinha como público alvo desenvolvedores e designers e a segunda usuários e empreendedores. O terceiro e último dia foi reservado para o Contributor Day, onde os interessados tem a oportunidade de contribuir diretamente com o WordPress.

Saguão de entrada do WordCamp San Francisco 2013
Saguão de entrada do WordCamp San Francisco 2013

Do primeiro dia destaco as palestras Confident Commits, Delightful Deploys do Mark Jaquith (slides) e a Writing Code as User Experience Design do Nikolay Bachiyski.

A palestra do Mark Jaquith tratou de boas práticas para todos os desenvolvedores e sysadmins que trabalham com WordPress, em especial na hora de publicar uma nova versão do código. Ele reforçou algumas coisas que já deveriam ser senso comum (e que infelizmente ainda não são), como o uso de um sistema de controle de versão. Também citou algumas ferramentas que facilitam bastante o fluxo de trabalho como o WP Stack ou o Capistrano-WP para fazer deploys, Puppet ou Chef que são ferramentas para o gerenciamento das configurações dos servidores e, por fim, o Vagrant para criar um ambiente de desenvolvimento semelhante ao servidor onde o site está publicado.

Na palestra do  Nikolay Bachiyski, ele explorou o que os desenvolvedores podem aprender da experiência de quem estuda user experience designConsiderando que um desenvolvedor passa mais de 70% do seu tempo de trabalho lendo código e não escrevendo, quando criamos código temos que nos preocupar com a experiência do usuário, que neste caso serão os outros desenvolvedores que terão contato com ele. Além de sugerir algumas boas práticas para criação de código, ele mostrou alguns vídeos da tela e cara de alguns desenvolvedores enquanto estes criavam uma página usando a Settings API do WP.

Já do segundo dia destaco as palestras Three Security Issues You Thought You’d Fixed do Mike Adams e a Magical WordPress Management using WP-CLI do Mike Schroder (slides).

No último dia teve ainda o State of the Word 2013 do Matt Mullenweg. Nele o fundador do WordPress falou do crescimento do software que agora representa 18,9% de todo o conteúdo da web (ano passado era 16,7%), do uso crescente a partir de plataformas móveis e de um novo modelo de desenvolvimento para o core. A ideia é implementar ciclos mais curtos de release com o lançamento das versões 3.7 e 3.8 ainda esse ano e organizar os desenvolvedores do core em pequenos times que trabalhem em plugins. Quando um plugin estiver pronto ele é incorporado ao código principal. Este novo modelo já está sendo testado com o desenvolvimento da nova interface para o admin.

No Contributor Day trabalhei na automatização dos testes unitários do core do WordPress utilizando o Travis CI junto com o Bryan Petty e com a ajuda do Nikolai Bachiyski. Criamos um fork do repositório do WordPress no github e nele configuramos o serviço de integração continua que pode ser visto neste link. Nas próximas semanas o Andrew Nacin deve integrar o que fizemos no repositório do WordPress.

Contributor Day no novo escritório da Automattic
Contributor Day no novo escritório da Automattic

O arquivo de configuração que criamos para o Travis CI pode ser visto neste link. Ele roda os testes do WP usando PHP 5.2, 5.3 e 5.4 e para cada uma dessas versões com o modo multisite habilitado ou desabilitado. Por enquanto, o Travis só é chamado quando há um commit no core e não quando há um commit no repositório de testes. O próprio Nacin disse que a intenção é juntar os dois num único repositório.

Uma vez com a integração dos testes do WordPress com o Travis CI funcionando partimos para resolver os testes que estavam falhando. Conseguimos resolver cerca de dez testes, não deu tempo de resolver apenas um que foi resolvido uns dias depois. Após o WordCamp descobrimos mais três testes que falham quando executados com o PHP 5.2. Estes ainda estão pendentes e podem ser vistos na página do repositório no Travis CI.

Como testar código que depende do sistema de arquivos com PHPUnit e vfsStream

Já faz um tempo que me interesso por testes unitários e em especial por TDD. Utilizo o PHPUnit, o principal framework da família xUnit para PHP. Neste post vou fazer uma rápida apresentação do vfsStream, um stream wrapper que permite simular um sistema de arquivos no PHP, facilitando muito a escrita de testes para código que manipula ou depende do sistema de arquivos.

Abaixo segue uma classe que utilizaremos como exemplo (para simplificar ela somente apresenta os elementos que interessam para este post):

Se formos testar essa classe somente com os recursos oferecidos pelo PHPUnit, teríamos que criar e destruir os arquivos utilizando os métodos setUp() e tearDown() respectivamente. Isso funciona porém tem algumas complicações. Por exemplo, se por algum motivo a execução do teste for abortada, os arquivos criados não serão removidos do sistema de arquivos. Outro problema dessa abordagem é a manutenção dos testes quando o código a ser testado trabalha com múltiplos arquivos e/ou diretórios.

Utilizando o vfsStream não é necessário utilizar o tearDown() já que tudo é criado na memória e você tem mais controle e garantias sobre o ambiente de teste já que este é completamente virtual e não está sujeito a influência de outras operações que podem ocorrer enquanto os testes são executados.

Veja abaixo uma classe de testes que utiliza o vfsStream para testar os métodos descritos acima:

No método FileTest::setUp(), a chamada ao vfsStream::setup() cria o diretório raiz do sistema de arquivos virtual e retorna um objeto do tipo vfsStreamDirectory. Na sequência, nas linhas 20 e 21, é criado um novo objeto do tipo vfsStreamFile e definido seu conteúdo inicial. Por fim na linha 22 o novo arquivo é adicionado a raiz do sistema de arquivos virtual e na linha 24 uma instância da classe que vamos testar é gerada recebendo como argumento o caminho para o arquivo.

O restante do código é auto explicativo para quem está acostumado com o PHPUnit, com exceção da linha 34 onde para verificar se o arquivo foi mesmo modificado é utilizado o método vfsStreamFile::getContent().

Para mais informações veja sobre o vfsStream sugiro:

Como ajudar a traduzir o Tiki

Nesse post vou descrever como contribuir com a tradução do Tiki para o português. “O Tiki é um software livre (LGPL) para gerenciamento de conteúdo através da Web, possibilitando a criação de websites e portais na Internet e também em intranets.” (Wikipédia).

Contribuir com a tradução de um projeto de código aberto é uma das maneiras mais simples de ajudar a comunidade. No caso do Tiki existem duas formas, ambas são descritas abaixo.

A primeira consiste em editar um arquivo PHP com todas as strings. Requer na maioria dos casos um pouco mais de conhecimento técnico, mas é a mais completa. A outra opção é utilizar o sistema de tradução interativa, onde o usuário traduz o software enquanto navega pelo mesmo no browser. É a opção mais simples porém tem algumas limitações.

Nesse post vou detalhar a tradução utilizando a interface do Tiki. Vou apenas comentar brevemente os passos necessários para traduzir editando o arquivo PHP porém estou a disposição para dar mais esclarecimentos caso alguém, como eu, prefira esse caminho.

Usando a interface de tradução interativa

O recurso de tradução interativa existe a algum tempo no Tiki, porém na versão 5.0 ele foi reformulado e melhorado. Esse recurso permite que o usuário faça tradução enquanto navega por um site rodando o software. Com ele habilitado, quando você clica em algum campo de texto uma caixa aparece para que a tradução seja feita.

As traduções feitas com a tradução interativa são guardadas na base de dados e não no arquivo language.php que é o arquivo distribuído junto com o pacote de instalação do Tiki (existe um arquivo desse para cada idioma). Recentemente (para a versão 6.0 que deve sair mês que vem) adicionei um novo recurso ao software para exportar as traduções guardadas na base de dados para o arquivo language.php correspondente. Com isso, a comunidade criou o site http://i18n.tiki.org que é basicamente uma instalação do Tiki com o recurso tradução interativa habilitado para qualquer pessoa que quiser ajudar na tradução possa fazê-lo sem se preocupar em ter que instalar uma versão local do software.

De tempos em tempos alguém da comunidade verifica o que foi traduzido no site, exporta para o arquivo language.php corresponde e envia para o repositório SVN para que as traduções sejam incorporadas na próxima versão do software.

Segue abaixo o passo a passo para usar a tradução interativa dentro do i18n.tiki.org. Se você quiser usar o recurso na sua própria instalação do Tiki veja como habilitá-lo no seguinte link http://doc.tiki.org/Interactive+translation (em inglês).

  1. Crie um usuário no site i18n.tiki.org: http://i18n.tikiwiki.org/tiki-register.php
  2. Entre em contato diretamente comigo ou com algum outro administrador do site pela lista de desenvolvimento, informe o usuário e peça para ganhar permissão para usar o recurso de tradução interativa.
  3. Entre com seu usuário no site http://i18n.tiki.org
  4. Use o módulo “Site language” (“Idioma do site”) para selecionar o idioma para o qual deseja traduzir. O módulo é o segundo na coluna da direita.
  5. Entre na página “Editar idiomas”: no menu da esquerda, selecione a opção “Editar idiomas” da seção “Administrar” ou diretamente http://i18n.tikiwiki.org/tiki-edit_languages.php) e clique no botão “Ligar modo de tradução interativa” (“Toggle interactive translation on”). Atenção: Não confudir a página “Editar idiomas” com a página “Idiomas” (tiki-admin.php?page=i18n) que pode ser acessada através do painel de administração.
  6. Uma barra azul será exibida no topo do site. Essa barra é utilizada para habilitar e desabilitar o uso da tradução interativa.
  7. Navegue até a página que deseja traduzir algum conteúdo e clique no checkbox “Tradução interativa” (para poder navegar novamente pelo site você precisa deselecionar esse checkbox).
  8. Clique na frase que deseja traduzir. Uma janela será exibida com as frases relacionadas (veja a imagem).
  9. Modifique a frase e clique em “Salvar tradução”. As mudanças que você fez somente aparecerão depois que você recarregar a página. É comum aparecer na tela algumas frases não relacionadas diretamente com a clicada, em geral os resultados mais significativos estão no topo.

Editando diretamente o arquivo language.php

Conforme comentei anteriormente editar diretamente o language.php demanda um pouco mais de conhecimento técnico. É necessário baixar uma cópia do Tiki para sua máquina e instalá-lo. Visite os dois links abaixo para saber como fazer isso.

http://dev.tiki.org/Get+code

http://doc.tiki.org/Installation

Com o Tiki instalado, edite o arquivo corresponde ao idioma que deseja traduzir. No caso do português o arquivo é o lang/pt-br/language.php. Esse arquivo nada mais é que um grande array PHP. A chave do array é a frase em inglês e o valor é a tradução.

Frases que ainda não foram traduzidas possuem um comentário de código no começo da linha (//). Para que a tradução seja reconhecida pelo Tiki é necessário remover o comentário (as duas barras).

Se busca alguma frase que não aparece no arquivo é porque ele está desatualizado. Para atualizá-lo é necessário rodar o script get_strings.php com o idioma em questão como parâmetro. Como exemplo, segue a página que preciso abrir no browser:

http://localhost/tiki/get_strings.php?lang=pt-br

Após realizar as traduções você pode enviar-las para o repositório central usando o SVN. Para isso é necessário solicitar uma conta de desenvolvedor (qualquer um que pede ganha). Veja http://dev.tiki.org/DevTips (em inglês).

Para mais informações sobre como traduzir através do arquivo language.php veja http://doc.tiki.org/Interface+translation#General_process