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):

<?php

class File
{
	/**
	 * Path to the file
	 * @var string
	 */
	protected $path;

	/**
	 * 
	 * @param string $path
	 * @return null
	 */
	public function __construct($path)
	{
		$this->path = $path;
	}
	
	/**
	 * Add a string to the end of the file
	 * @param string $string
	 * @return null
	 */
	public function append($string)
	{
		file_put_contents($this->path, $string, FILE_APPEND);
	}
	
	/**
	 * Return file contents as a string
	 * @return string
	 */
	public function get()
	{
		return file_get_contents($this->path);
	}
}

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:

<?php

require_once('File.php');
require_once('vfsStream/vfsStream.php');

class FileTest extends PHPUnit_Framework_TestCase
{
	protected $obj;
	
	protected $file;
	
	protected $string;
	
	protected function setUp()
	{
		$this->string = "first line\n";
		
		$root = vfsStream::setup();
		
		$this->file = new vfsStreamFile('file.txt');
		$this->file->setContent($this->string);
		$root->addChild($this->file);
		
		$this->obj = new File(vfsStream::url('file.txt'));
	}
	
	public function testAppend()
	{
		$string = "second line\n";
		$expectedResult = "first line\n" . $string;
		 
		$this->obj->append($string);
		
		$this->assertEquals($expectedResult, $this->file->getContent());
	}
	
	public function testGet()
	{
		$this->assertEquals($this->string, $this->obj->get());
	}
}

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:

GSOC TikiFest in London

In the first week of July I was in London for the GSOC (Google Summer of Code) TikiFest. TikiFests are a tradition in the Tikiwiki community. It is when two or more Tiki contributors get together to code, discuss about free software etc.

This time the main reason for the TikiFest was to gather together all the students from GSOC who are working in the Tikiwiki projects. This is the first year Tikiwiki is participating in GSOC and there are four students involved, including myself.

dsc01365-copy

Two students from Spain, Aldo and Ben, are working together to create the new workspaces feature (the ability to have collections of items/objects that allow different set of users to have different kinds of access in a single Tikiwiki installation). For more information on their project see the wiki page http://dev.tikiwiki.org/workspaces. At the TikiFest they presented their work done until that moment and we discussed some tricky aspects of the implementation. The development of the workspaces is of great interest for the Tikiwiki community and there are more people working on it at present besides the two GSOC students. On the first week of August there will be another TikiFest in Barcelona just to discuss and develop some parts of the workspaces.

Another student from India, Nagendra, was there to present his project which will allow online video edition in Tikiwiki using the Kaltura API. Maybe in the future we will be able to edit video the wiki way using this.

dsc01357-copy

And finally I presented my project to create a migration script from Mediawiki to Tikiwiki. As my mentor on this project, Nelson Ko, was at the TikiFest I had a great opportunity to make some crucial decisions for the project. Mainly to leave phpBB for another project and focus only on the migration from Mediawiki to Tikiwiki.

Beside the presentation of the projects, we also discussed some interesting aspects of the free software world. Aldo and Amette showed some of the great features Git has over SVN and we discussed how the Tikiwiki community could benifit from moving to Git (for example merging branches is much easier with Git). It was agreed that as an expemeriment the workspaces development would be done using Git.

dsc01360-copy

Jonny talked about the recent development of the Tikiwiki profiles and Jean-Marc showed some inconsistencies between the administration page of different Tikiwiki features and we discussed possible interface standards for those pages.

Olaf-Michael brought the discussion about Tiki as an open translation tool. He told us about http://translatewiki.com/, a place to centralize and make the translation of different open source wiki softwares as easy as possible. They are interested in putting Tikiwiki in the pool of softwares they translate and Olaf is in contact with them to make this happen. Although the way Tikiwiki handles with translations at present (a PHP array for each language with key/value pairs) is accepted by TranslateWiki I mentioned at the TikiFest that it would be a good idea for the Tikiwiki community to switch to a standard open source tool for translation like gettext.

dsc01358-copy

At present it is hard for a non-technical person to start helping with Tikiwiki translation. As I host several sites using Tikiwiki for different Brazilian social movements I am very interested in making it easier to translate. I think that using a standard tool for that purpose is a great first step. We can take advantage of all the tools built around gettext that already exist. I plan to look at this question in the next weeks, so if anyone else is also interested please do let me know. Apparently it is not that hard to convert to gettext. PHP has gettext built-in support and there is already a script to convert from Tikiwiki language.php files to gettext. Before moving, as mentioned by Jean-Marc, it is a good idea to talk with people from other projects that already use gettext to learn from their experience.

On the last day of the meeting, Aldo, Ben and I (unfortunately Nagendra had to leave the day before) talked about the difficulties we had with Tikiwiki when we started our projects. We agreed that the lack of technical documentation and tests were the two most difficult aspects.

Without technical documentation we had to read the code to understand what a function does and without tests it is much harder to know if the change you are making will break something elsewhere in the code. With this in mind we are using in our projects phpDocumentor and PHPUnit. By using phpDocumentor we can have some day, as proposed by Aldo in the devel list, api.tikiwiki.org. Very similar to http://api.joomla.org/ or http://api.cakephp.org/. Which can help to atract more contributors. PHPUnit is already used in a few parts of Tikiwiki. Louis-Phillipe created on trunk the directory lib/core. All the code there have tests. Alain Desilets and Marta Stojanovic are using PHPUnit with Selenium to write acceptance tests for Tikiwiki.

dsc013611

This is what I remember from the discussions we had during the five days of GSOC TikiFest. If I forgot to mention something please leave a comment.

How to run phpt tests with PHPUnit

In this post I will explain how to run phpt tests with PHPUnit.

For my GSOC project I will use (and contribute to) the PEAR package Text_Wiki (more about my contributions on this package on another post). This package use phpt tests for unit testing. I’m not familiar with phpt tests as I’m with PHPUnit and phpt tests didn’t give me a good impression (its difficult to understand feedback and its syntax mixing PHP code and plain text statements lead to improper syntax highlighting in Emacs :-D).

So I proposed the main developer of Text_Wiki to switch to PHPUnit. He had no objections if I were able to provide a solution that made possible to run the old phpt tests with the new PHPUnit tests at the same time.

I found that there is a PHPUnit extension that does exactly what I was looking for. As I wasn’t able to find a tutorial explaining how to use it, I decided to write this post to share the way I used that extension.

I’m using version 3.3.17 of PHPUnit and it came with two phpt related extensions located in the directory PHPUnit/Extensions (if you use Ubuntu as I do the full path will probably be /usr/share/php/PHPUnit/Extensions): PhptTestCase.php and PhptTestSuite.php

The first one implements the class PHPUnit_Extensions_PhptTestCase. The constructor of this class receive as a parameter the path to a single phpt file. I did not use this one.

The other file implements the class PHPUnit_Extensions_PhptTestSuite. You can instantiate this class in your test script passing as the first parameter the root directory where your phpt files are located. The constructor of the class will recursively look for all files with the extension .phpt.

On the link below you can view the code I used to integrate the old Text_Wiki phpt tests with the new PHPUnit classes I’m writing:

http://cvs.php.net/viewvc.cgi/pear/Text_Wiki/tests/tests.php?revision=1.2&view=markup