Preparar ambiente para contribuir para o Core do WordPress
Pedro Carvalho� @oak43 @pcarvalho
Sobre estes slides
Com sorte, chegaremos ao fim dos slides prontos para criar um patch.
// isto é uma nota
$ isto é um comando
Isto é código(){� return gato(‘sucesso’);�}
// -ish
Virtual Machines
Virtual Machines
VVV, VCCW
Outras soluções:
M: Mac, L : Linux�A: Apache, E: nginx ( Engine X )�M: mysql, mariadb�P: PHP
Virtualbox e Vagrant
Instalar Virtualbox e Vagrant, os primeiros V
Usar package manager.
// updates /etc/hosts�vagrant plugin install vagrant-hostsupdater
// run scripts �vagrant plugin install vagrant-triggers
VVV
Instalar VVV : Varying Vagrant Vagrants
$ git clone https://github.com/Varying-Vagrant-Vagrants/VVV.git wpcontrib
$ cd wpcontrib
// desligar opcache:�$ cd config/php-config
$ nano opcache.ini�// trocar: opcache.enable=1 -> opcache.enable=0
// iniciar a virtual machine�$ vagrant up
Este processo demora!
Instalar VVV : Varying Vagrant Vagrants
Para refazer este processo podemos fazer:
$ vagrant provision
Para fazer update da "box":
$ vagrant box update�$ vagrant provision
O que contém a box?
VVV
VVV - Extras
VVV
Comandos VVV
Os mais comuns:
up: ligar
halt: desligar
ssh: entrar
provision: re-instalar programas, sites, etc
reload: reiniciar
Credenciais
WordPress
user: admin�pass: password
mysql
user: wp�pass: wp
user: root�pass: root
VVV - Opcional
Instalar Variable VVV, porque 3V é pouco.
VV permite criar facilmente novos sites dentro da box.
$ git clone https://github.com/bradp/vv.git�$ cp vv/vv /usr/local/bin/
$ cd path/to/wpcontrib
// Exemplo:�$ vv create
Instalar VVV Dashboard
$ vagrant ssh�$ cd /srv/www/default
// vvv-dashboard�$ git clone https://github.com/leogopal/VVV-Dashboard.git�$ cp VVV-Dashboard/dashboard .�$ cp VVV-Dashboard/dashboard-custom.php .��// ou ��$ git clone https://github.com/topdown/VVV-Dashboard.git dashboard�$ cp dashboard/dashboard-custom.php .
VVV - Opções
Mudar ip
Para permitir várias máquinas ao mesmo tempo é necessário mudar o ip default: 192.168.50.4
config.vm.network :private_network, id: "vvv_primary", ip: "192.168.50.10"
Mapeamento de directorias
A directoria `www` liga com a directoria dentro da box em `/srv/www/`
É possível criar novos mapeamentos no ficheiro Vagrantfile
config.vm.synced_folder "/path/wp/themes/wpcontrib/", "/srv/www/wordpress-develop/public_html/src/wp-content/themes/wpcontrib", :owner => "www-data", :mount_options => [ "dmode=775", "fmode=774" ]
VVV - Opções
Não apagar os hosts
Sempre que a máquina é desligada, ela apaga os hosts do ficheiro /etc/hosts. Para evitar que esteja sempre a criar e apagar, podemos desligar esta funcionalidade:
config.hostsupdater.remove_on_suspend = true => false
Mudar capacidade da máquina:
defaults['memory'] = 1024 �defaults['cores'] = 1
Adicionar em vvv-custom.yml:
vm_config:� memory: 2048� cores: 2
Este passo é necessário para correr PHPUnit
VVV - Opções
Ficheiros de configuração
Vagrantfile�vvv-custom.yml
Outros VVVs
Theme review:�> https://github.com/aubreypwd/wordpress-themereview-vvv
WP Reference Code�> https://github.com/keesiemeijer/wp-reference
WP Meta�> https://github.com/WordPress/meta-environment
VCCW�> usa apache, muito estável, criado por Takayuki Miyauchi. �> http://vccw.cc/
Seravo�> integration, rspec and regression tools�> https://github.com/Seravo/wordpress
Visitar http://vvv.dev
Sucesso!
Próximos passos
Bugs: usar trac
Code standards: Wordpress-Core
Testes: PHPUnit
Comunidade: �* wordpress.org ( necessário para propor patches )�* wp-portugal.slack.com ( dúvidas com a comunidade portuguesa )�* wordpress.slack.com ( comunidade internacional )�
Contribuir para o Core do WordPress
Pedro Carvalho� @oak43 @pcarvalho
Resolver Bugs
Bugs & Code
Trac & SVN
Trac, um exemplo:
A pesquisa nos good-first-bugs demora alguns minutos a ler e fazer triagem, mas traz resultados:
"Add progress indicator to "Upgrade Network" page"�https://core.trac.wordpress.org/ticket/37799�Perfeito! Parece simples. Mas precisamos dum multisite:
1. Criar multisite com VV:�// tem uma opção para multisite, aceitar com Y.�// vamos apenas aproveitar a criação do host na box e o ficheiro wp-config.php�$ vv create��// na dir do novo site, apagar tudo menos o wp-config.php
// fazer download do código fonte�$ svn co https://develop.svn.wordpress.org/trunk htdocs�
Trac, um exemplo:
Esta parte é específica para multisite:
// copiar o wp-config.php para htdocs�$ svn ~/wp-config.php /srv/www/wpcontrib/htdocs/
// é necessário alterar o path do site para incluir a dir src/�$ nano /etc/nginx/custom-sites/wpcontrib.conf�// alterar: root /srv/www/testsrc/htdocs/; >> root /srv/www/testsrc/htdocs/src/;
// reiniciar nginx�$ nginx -t && nginx -s reload
Trac
2. Copiar e Configurar wp-tests-config.php
// Como alternativa, usar the tests/phpunit/multisite.xml�define( 'WP_TESTS_MULTISITE', true );
Trac
3. Actualizar código
Para ter a certeza que temos um ambiente actualizado:
$ svn up�$ svn st
// Instalar as dependências:�$ npm install�// nota: foi preciso correr como root��$ grunt
// correr os testes antes de qualquer modificação�$ phpunit
Trac
4. Correr todos os testes em multisite
$ phpunit -c tests/phpunit/multisite.xml
OK, but incomplete, skipped, or risky tests!�Tests: 8353, Assertions: 29667, Skipped: 13, Risky: 24.
// ou�$ grunt phpunit:multisite
767 000 linhas de código,�uma voz
Coding Standards
Coding Standards
Existem 4 tipos de Coding Standards:
Para além de:
Coding Standards
Para garantir estes requisitos, é necessário instalar
WordPress-Coding-Standards�https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards
1. Instalar PHPCS ( Code Sniffer )�$ pear install PHP_CodeSniffer
2. Download dos standards�$ git clone -b master https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards.git wpcs
3. Instalar standard�$ phpcs --config-set installed_paths /path/to/wpcs
Escolher Coding Standards
WordPress-Core: para o código Core
WordPress-Extra: Best Practices e inclui Core
WordPress-VIP: para o código VIP e inclui Core
WordPress-Docs: para documentação
$ phpcs --standard=ruleset.xml -vvv /path/to/wpcs/WordPress-Extra
Patch
Patch, um exemplo:
Para corrigir um bug, é necessário criar um patch. Inicialmente, o bug tinha já um patch:
// Aplicar um patch na raiz do projecto:�$ patch -p0 < 37799.1.diff��// Após algumas alterações, para criar o patch�// deve-se correr na raiz do projecto:�$ svn diff > 37799.diff
Nota: O Trac adiciona as versões ( p.ex: 37799.5.diff )
Alterar as etiquetas permite aos Committers lidar facilmente com os bugs.��
�Propor um patch implica algumas iterações consoante o feedback.
Patch
Dicas: ( do handbook )
�* Brevidade ( patches, comentários, discussões )�* Maturidade�* Fazer trabalho de casa�* Pragmatismo�* Críticas constructivas�* Humildade�
Testar limita os nossos�Erros
PHPUnit
PHPUnit, um exemplo
Para criar unit tests, é preciso usar uma das classes já existentes, ou no caso extremo, criar uma classe que extenda WP_UnitTestCase.
Para ilustrar estes exemplos, encontrei o 39643�WP_User_Query does not allow search_fields to use display_name�Este bug já tinha patch e tinha a etiqueta “needs-unit-tests”
Para validar que o patch corrigia o bug, usei a classe Tests_User_Query em tests/phpunit/tests/user/query.php
// correr apenas um tipo de teste:�$ phpunit tests_phpunit_tests_user_query
NOTA: A regra é o caminho para a classe, em minúsculas, neste caso: tests/phpunit/tests/user/query.php
Símbolos dos Resultados
. Printed when the test succeeds.
F Printed when an assertion fails while running the test method.
E Printed when an error occurs while running the test method.
R Printed when the test has been marked as risky
S Printed when the test has been skipped
I Printed when the test is marked as being incomplete or not yet implemented
PHPUnit - Exemplo
/**� * @ticket 39643� */�public function test_search_by_display_name_only() {� $new_user1 = $this->factory->user->create( array(� 'user_login' => 'name1',� 'display_name' => 'Sophia Andresen',� ) );� self::$author_ids[] = $new_user1;� $q = new WP_User_Query( array(� 'search' => '*Sophia*',� 'fields' => '',� 'search_columns' => array( 'display_name' ),� 'Include' => self::$author_ids,� ) );� $ids = $q->get_results();� /* must include user that has same string in display_name */� $this->assertEquals( array( $new_user1 ), $ids );�}
Explicação:�<< DocBlock sempre com o número do bug���<< existem várias factories�<< criar um user para testar que a query funciona
�<< query a testar
<< o bug não permitia procurar por apenas no campo “display_name”�
<< comparar o resultado da query com o que se esperava obter.�Usei assertEquals() para comparar os arrays.
PHPUnit - Exemplo - oposto
/**� * @ticket 39643� */�public function test_search_by_display_name_only_ignore_others() {� $new_user1 = $this->factory->user->create( array(� 'user_login' => 'Sophia Andresen',� 'display_name' => 'name1',� ) );� self::$author_ids[] = $new_user1;� $q = new WP_User_Query( array(� 'search' => '*Sophia*',� 'fields' => '',� 'search_columns' => array( 'display_name' ),� 'include' => self::$author_ids,� ) );� $ids = $q->get_results();� /* must include user that has same string in display_name */� $this->assertEquals( array(), $ids );�}
����<< Testar de modo a não devolver resultados com a string noutros campos������������<< comparar com o array vazio
Sucesso!
PHPUnit - Alguns asserts mais usados
assertEquals
assertContains
assertEmpty / assertNotEmpty
assertTrue
assertSame : same type and value
assertInstanceOf
Próximos passos
Procurar um bug e propor um patch ou unit-test�
Obrigado!
Pedro Carvalho� @studio43lc @pcarvalho