1 of 44

Preparar ambiente para contribuir para o Core do WordPress

Pedro Carvalho� @oak43 @pcarvalho

2 of 44

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

3 of 44

Virtual Machines

4 of 44

Virtual Machines

VVV, VCCW

Outras soluções:

  • Docker
  • Self hosted: MAMP / LEMP

M: Mac, L : Linux�A: Apache, E: nginx ( Engine X )�M: mysql, mariadb�P: PHP

5 of 44

Virtualbox e Vagrant

6 of 44

Instalar Virtualbox e Vagrant, os primeiros V

  1. Instalar Virtualbox e Vagrant

Usar package manager.

  • Instalar Vagrant plugins

// updates /etc/hostsvagrant plugin install vagrant-hostsupdater

// run scripts vagrant plugin install vagrant-triggers

7 of 44

VVV

8 of 44

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!

9 of 44

Instalar VVV : Varying Vagrant Vagrants

Para refazer este processo podemos fazer:

$ vagrant provision

Para fazer update da "box":

$ vagrant box update�$ vagrant provision

10 of 44

O que contém a box?

11 of 44

VVV

  • Ubuntu 14.04 LTS (Trusty Tahr)
  • WordPress Develop
  • WordPress Stable
  • WP-CLI (master branch)
  • nginx (mainline version)
  • MariaDB 10.1
  • php-fpm 7.0.x
  • memcached
  • PHP memcache extension
  • PHP xdebug extension
  • PHP imagick extension
  • PHPUnit
  • ack-grep
  • git
  • subversion
  • ngrep
  • dos2unix
  • Composer
  • phpMemcachedAdmin
  • phpMyAdmin (multi-language)
  • Opcache Status
  • Webgrind
  • NodeJs
  • grunt-cli
  • Mailcatcher

12 of 44

VVV - Extras

13 of 44

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

14 of 44

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 .

15 of 44

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" ]

16 of 44

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

17 of 44

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

18 of 44

Visitar http://vvv.dev

Sucesso!

19 of 44

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

20 of 44

Contribuir para o Core do WordPress

Pedro Carvalho� @oak43 @pcarvalho

21 of 44

Resolver Bugs

22 of 44

Bugs & Code

Trac & SVN

Trac

Sistema de etiquetas:

SVN

Core

23 of 44

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

24 of 44

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

25 of 44

Trac

2. Copiar e Configurar wp-tests-config.php

// Como alternativa, usar the tests/phpunit/multisite.xmldefine( 'WP_TESTS_MULTISITE', true );

26 of 44

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

27 of 44

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

28 of 44

767 000 linhas de código,�uma voz

29 of 44

Coding Standards

30 of 44

Coding Standards

Existem 4 tipos de Coding Standards:

Para além de:

31 of 44

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

32 of 44

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

33 of 44

Patch

34 of 44

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.

35 of 44

Patch

Dicas: ( do handbook )

�* Brevidade ( patches, comentários, discussões )�* Maturidade�* Fazer trabalho de casa�* Pragmatismo�* Críticas constructivas�* Humildade�

36 of 44

Testar limita os nossos�Erros

37 of 44

PHPUnit

38 of 44

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 39643WP_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

39 of 44

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.

40 of 44

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

41 of 44

Sucesso!

42 of 44

PHPUnit - Alguns asserts mais usados

assertEquals

assertContains

assertEmpty / assertNotEmpty

assertTrue

assertSame : same type and value

assertInstanceOf

43 of 44

Próximos passos

Procurar um bug e propor um patch ou unit-test�

44 of 44

Obrigado!

Pedro Carvalho� @studio43lc @pcarvalho