From b00f247633182e82985daed5849137b53a83f82b Mon Sep 17 00:00:00 2001 From: ThierryA Date: Tue, 23 Jan 2018 10:35:38 +0100 Subject: [PATCH 1/6] Add starter child theme WPCS compliant --- .dev-lib | 4 ++++ .editorconfig | 21 +++++++++++++++++++++ .gitignore | 4 ++++ .travis.yml | 22 ++++++++++++++++++++++ composer.json | 43 +++++++++++++++++++++++++++++++++++++++++++ functions.php | 28 ++++++++++++++++++++++++++++ phpcs.xml.dist | 36 ++++++++++++++++++++++++++++++++++++ phpunit.xml.dist | 27 +++++++++++++++++++++++++++ screenshot.jpg | Bin 0 -> 43143 bytes style.css | 11 +++++++++++ style.less | 4 ++++ 11 files changed, 200 insertions(+) create mode 100644 .dev-lib create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 composer.json create mode 100644 functions.php create mode 100644 phpcs.xml.dist create mode 100644 phpunit.xml.dist create mode 100644 screenshot.jpg create mode 100644 style.css create mode 100644 style.less diff --git a/.dev-lib b/.dev-lib new file mode 100644 index 0000000..b23aa6d --- /dev/null +++ b/.dev-lib @@ -0,0 +1,4 @@ +PROJECT_TYPE=theme +WPCS_STANDARD=phpcs.xml.dist +PATH_EXCLUDES_PATTERN='^(.*/)?(vendor|node_modules)/.*' +DEV_LIB_SKIP=yuicompressor,codeception,grunt,jshint,phpunit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c951f00 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +# WordPress Coding Standards +# https://make.wordpress.org/core/handbook/coding-standards/ + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = tab + +[{.jshintrc,*.json,*.yml}] +indent_style = space +indent_size = 2 + +[{*.txt,wp-config-sample.php}] +end_of_line = crlf \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb6572b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.DS_Store +composer.lock +/node_modules/ +/vendor/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..007c95c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,22 @@ +language: php +sudo: false + +cache: + directories: + node_modules + vendor + +matrix: + include: + - php: '5.6' + - php: '7.0' + - php: '7.1' + - php: '7.2' + +install: + - composer install + - export DEV_LIB_PATH=vendor/xwp/wp-dev-lib + - source $DEV_LIB_PATH/travis.install.sh + +script: + - source $DEV_LIB_PATH/travis.script.sh diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..4b6de4c --- /dev/null +++ b/composer.json @@ -0,0 +1,43 @@ +{ + "name": "beans/beans-child", + "description": "Beans theme starter child theme.", + "type": "wordpress-theme", + "license": "GPL-2.0+", + "homepage": "http://www.getbeans.io/", + "support": { + "issues": "https://github.com/Getbeans/Beans-Starter-Child-Theme/issues", + "source": "https://github.com/Getbeans/Beans-Starter-Child-Theme" + }, + "prefer-stable": true, + "repositories": [ + { + "type": "package", + "package": { + "name": "xwp/wp-dev-lib", + "version": "1.0.1", + "source": { + "url": "https://github.com/xwp/wp-dev-lib.git", + "type": "git", + "reference": "master" + } + } + } + ], + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", + "sirbrillig/phpcs-variable-analysis": "^2.0", + "wp-coding-standards/wpcs": "^0.14.0", + "xwp/wp-dev-lib": "^1.0.1" + }, + "scripts": { + "install-codestandards": [ + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run" + ], + "phpcs-src": "\"vendor/bin/phpcs\"", + "phpcs-tests": "\"vendor/bin/phpcs\" --runtime-set testVersion 5.6 tests/phpunit/", + "phpcs": [ + "@phpcs-src", + "@phpcs-tests" + ] + } +} diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..9fcbb29 --- /dev/null +++ b/functions.php @@ -0,0 +1,28 @@ +Appearance->Settings option. + */ +add_action( 'beans_uikit_enqueue_scripts', function() { + // To remove if you are using style.css only. + beans_compiler_add_fragment( 'uikit', get_stylesheet_directory_uri() . '/style.less', 'less' ); + + // To remove if you are using style.less only. + beans_compiler_add_fragment( 'uikit', get_stylesheet_directory_uri() . '/style.css', 'less' ); +} ); diff --git a/phpcs.xml.dist b/phpcs.xml.dist new file mode 100644 index 0000000..46ba05e --- /dev/null +++ b/phpcs.xml.dist @@ -0,0 +1,36 @@ + + + The code standard for Beans Child. + + . + + + node_modules/* + */vendor/* + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..30a69a2 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,27 @@ + + + + + + ./tests/phpunit/unit/ + + + + + + . + + + diff --git a/screenshot.jpg b/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15a5f61a92fc2350b4499dc6790d4b0bebc3dfe7 GIT binary patch literal 43143 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 literal 0 HcmV?d00001 diff --git a/style.css b/style.css new file mode 100644 index 0000000..ff74e4e --- /dev/null +++ b/style.css @@ -0,0 +1,11 @@ +/* +Theme Name: Beans child +Description: Starter Child Theme for the Beans Theme. +Author: Beans +Author URI: http://www.getbeans.io +Template: tm-beans +Version: 1.0.0 +Text Domain: beans-child +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +*/ diff --git a/style.less b/style.less new file mode 100644 index 0000000..d4a71e7 --- /dev/null +++ b/style.less @@ -0,0 +1,4 @@ +/* + * In this file, you may style your site using CSS or LESS as well as overwrite UIkit LESS variables. + * Make sure to enable development mode via the Admin->Appearance->Settings option while working on your website. LESS will then be processed on the fly. + */ From c341ce5f7dcca6573737f757bae943a77c7a495e Mon Sep 17 00:00:00 2001 From: ThierryA Date: Tue, 23 Jan 2018 10:39:26 +0100 Subject: [PATCH 2/6] Fix Travis xmllint error --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index 007c95c..7a14892 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,11 @@ cache: node_modules vendor +addons: + apt: + packages: + - libxml2-utils + matrix: include: - php: '5.6' From 957d522875194f0c5ae43810b95247ced6e2ecf7 Mon Sep 17 00:00:00 2001 From: ThierryA Date: Tue, 23 Jan 2018 10:46:02 +0100 Subject: [PATCH 3/6] Improve namespace and package name --- functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions.php b/functions.php index 9fcbb29..7f46561 100644 --- a/functions.php +++ b/functions.php @@ -2,10 +2,10 @@ /** * Beans Child * - * @package BeansChild + * @package Beans\StarterChildTheme */ -namespace BeansChild; +namespace Beans\StarterChildTheme; // Include Beans. Do not remove the line below. require_once get_template_directory() . '/lib/init.php'; From 14361c227e75d525854c907077b6ec88799e1206 Mon Sep 17 00:00:00 2001 From: ThierryA Date: Wed, 24 Jan 2018 11:45:53 +0100 Subject: [PATCH 4/6] Change add_action to beans_add_action to make it extendable and renamed namespace --- functions.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functions.php b/functions.php index 7f46561..1c58472 100644 --- a/functions.php +++ b/functions.php @@ -2,10 +2,10 @@ /** * Beans Child * - * @package Beans\StarterChildTheme + * @package Beans\Child */ -namespace Beans\StarterChildTheme; +namespace Beans\Child; // Include Beans. Do not remove the line below. require_once get_template_directory() . '/lib/init.php'; @@ -19,7 +19,7 @@ * To make sure the compiler re-compile your LESS or CSS on the fly (on page reload), make sure to enable development * mode via the Admin->Appearance->Settings option. */ -add_action( 'beans_uikit_enqueue_scripts', function() { +beans_add_action( __NAMESPACE__ . '\enqueue_uikit_assets', 'beans_uikit_enqueue_scripts', function() { // To remove if you are using style.css only. beans_compiler_add_fragment( 'uikit', get_stylesheet_directory_uri() . '/style.less', 'less' ); From ca749084c3e3bd467fa87952a0bb7c622a51424f Mon Sep 17 00:00:00 2001 From: ThierryA Date: Wed, 24 Jan 2018 11:46:51 +0100 Subject: [PATCH 5/6] Added tests logic to build and sample tests --- .dev-lib | 8 ++- .travis.yml | 5 +- bin/install-pre-commit-hook.sh | 46 ++++++++++++++++ bin/pre-commit | 17 ++++++ bin/travis.sh | 27 ++++++++++ composer.json | 27 +++++++++- phpcs.xml.dist | 4 -- tests/phpunit/integration/bootstrap.php | 52 ++++++++++++++++++ tests/phpunit/integration/phpunit.xml.dist | 21 ++++++++ .../integration/sample/integrationSample.php | 30 +++++++++++ tests/phpunit/unit/bootstrap.php | 33 ++++++++++++ tests/phpunit/unit/class-test-case.php | 54 +++++++++++++++++++ tests/phpunit/unit/sample/unitSample.php | 31 +++++++++++ 13 files changed, 348 insertions(+), 7 deletions(-) create mode 100755 bin/install-pre-commit-hook.sh create mode 100755 bin/pre-commit create mode 100644 bin/travis.sh create mode 100644 tests/phpunit/integration/bootstrap.php create mode 100644 tests/phpunit/integration/phpunit.xml.dist create mode 100644 tests/phpunit/integration/sample/integrationSample.php create mode 100644 tests/phpunit/unit/bootstrap.php create mode 100644 tests/phpunit/unit/class-test-case.php create mode 100644 tests/phpunit/unit/sample/unitSample.php diff --git a/.dev-lib b/.dev-lib index b23aa6d..80b05c2 100644 --- a/.dev-lib +++ b/.dev-lib @@ -1,4 +1,10 @@ PROJECT_TYPE=theme WPCS_STANDARD=phpcs.xml.dist PATH_EXCLUDES_PATTERN='^(.*/)?(vendor|node_modules)/.*' -DEV_LIB_SKIP=yuicompressor,codeception,grunt,jshint,phpunit +DEV_LIB_SKIP=yuicompressor,codeception,grunt,jshint + +# Run integration tests when the DEV_LIB_ONLY is set to phpunit +# This is the only flag we can use to change the config file +if [ 'phpunit' == "$DEV_LIB_ONLY" ]; then + PHPUNIT_CONFIG=tests/phpunit/integration/phpunit.xml.dist +fi diff --git a/.travis.yml b/.travis.yml index 7a14892..9c4c2a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,4 +24,7 @@ install: - source $DEV_LIB_PATH/travis.install.sh script: - - source $DEV_LIB_PATH/travis.script.sh + - source bin/travis.sh + +after_script: + - source $DEV_LIB_PATH/travis.after_script.sh diff --git a/bin/install-pre-commit-hook.sh b/bin/install-pre-commit-hook.sh new file mode 100755 index 0000000..d517cb3 --- /dev/null +++ b/bin/install-pre-commit-hook.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Link pre-commit hook for a repo in the directory supplied as an argument, or the parent repo of this file. +# +# USAGES: +# $ /path/to/install-pre-commit-hook.sh +# $ /path/to/install-pre-commit-hook.sh wp-content/themes/my-theme + +set -e + +# Check if Perl is installed +command -v perl >/dev/null 2>&1 || { echo >&2 "Perl is not installed, and is required by this script. See how to install it on http://learn.perl.org/installing"; exit 1; } + +# Store the initial directory to return back to it later +OLDPWD=$(pwd) + +# Navigate to the script directory +cd "$(dirname $0)" + +# Get full path of the script directory +BINDIR=$(pwd) + +# Get back to the calling directory +cd - &> /dev/null + +# If passed a destination, switch to it to get the full path and then .git/hooks directory +if [ ! -z "$1" ]; then + cd $1 + DEST=$(pwd) +fi + +# Get the hooks directory of the current git repo +cd "$(git rev-parse --git-dir)/hooks" + +# Get relative path to the original file from within the hooks directory +RELPATH=$( perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV)' "$BINDIR/pre-commit" "$(pwd)" ) + +if [ -z "$RELPATH" ]; then + echo 'Could not determine the relative path, Sorry. Try symlinking the file manually.' + exit 1 +fi + +echo "## Placing pre-commit file in $(pwd) from $RELPATH" +ln -s "$RELPATH" . + +# Return back to the calling directory +cd "$OLDPWD" &> /dev/null diff --git a/bin/pre-commit b/bin/pre-commit new file mode 100755 index 0000000..0c7be46 --- /dev/null +++ b/bin/pre-commit @@ -0,0 +1,17 @@ +#!/bin/bash +DEV_LIB_HOOK_PATH='./vendor/xwp/wp-dev-lib/pre-commit' + +# Exit if the dev lib isn't installed +if [ ! -f $DEV_LIB_HOOK_PATH ]; then + echo "Oops, the Dev Library is not install, please run composer install!" +else + # Run sniffers and unit tests. + export PATH="./vendor/bin:$PATH" + export WP_TESTS_DIR='exclude' + $DEV_LIB_HOOK_PATH + + # Run integration tests. + export WP_TESTS_DIR='' + export DEV_LIB_ONLY=phpunit + $DEV_LIB_HOOK_PATH +fi diff --git a/bin/travis.sh b/bin/travis.sh new file mode 100644 index 0000000..b7346ad --- /dev/null +++ b/bin/travis.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -e + +export PATH="./vendor/bin:$PATH" + +# Exit if the dev lib isn't installed +if [ ! -f $DEV_LIB_TRAVIS_PATH ]; then + echo "Oops, the Dev Library is not install, please run composer install!" +else + echo "## Checking files, scope $CHECK_SCOPE:" + if [[ $CHECK_SCOPE != "all" ]]; then + cat "$TEMP_DIRECTORY/paths-scope" + fi + + # Run sniffers. + lint_js_files + lint_php_files + + # Run unit tests. + echo '## Running unit tests:' + phpunit --testsuite unit + + # Run integration tests. + echo '## Running integration tests:' + export PHPUNIT_CONFIG=tests/phpunit/integration/phpunit.xml.dist + run_phpunit_travisci +fi diff --git a/composer.json b/composer.json index 4b6de4c..b454a0d 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,18 @@ "issues": "https://github.com/Getbeans/Beans-Starter-Child-Theme/issues", "source": "https://github.com/Getbeans/Beans-Starter-Child-Theme" }, + "minimum-stability": "dev", "prefer-stable": true, + "autoload": { + "exclude-from-classmap": [ + "/tests/" + ] + }, + "autoload-dev": { + "psr-4": { + "Beans\\Child\\Tests\\": "tests/" + } + }, "repositories": [ { "type": "package", @@ -23,12 +34,24 @@ } } ], + "require": { + "php": "^7", + "composer/installers": "^1.4", + "roave/security-advisories": "dev-master" + }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", "sirbrillig/phpcs-variable-analysis": "^2.0", + "wimg/php-compatibility": "^8.0", "wp-coding-standards/wpcs": "^0.14.0", + "phpunit/phpunit": "~4.8 || ~5.7.9", + "brain/monkey": "^2.0", + "mikey179/vfsStream": "^1.6", "xwp/wp-dev-lib": "^1.0.1" }, + "config": { + "sort-order": true + }, "scripts": { "install-codestandards": [ "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run" @@ -38,6 +61,8 @@ "phpcs": [ "@phpcs-src", "@phpcs-tests" - ] + ], + "test-unit": "\"vendor/bin/phpunit\" --testsuite unit", + "test-integration": "\"vendor/bin/phpunit\" --testsuite integration --configuration tests/phpunit/integration/phpunit.xml.dist" } } diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 46ba05e..1a5238b 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -14,10 +14,6 @@ - - - - diff --git a/tests/phpunit/integration/bootstrap.php b/tests/phpunit/integration/bootstrap.php new file mode 100644 index 0000000..ef9a8eb --- /dev/null +++ b/tests/phpunit/integration/bootstrap.php @@ -0,0 +1,52 @@ + + + + + + . + + + diff --git a/tests/phpunit/integration/sample/integrationSample.php b/tests/phpunit/integration/sample/integrationSample.php new file mode 100644 index 0000000..b76b535 --- /dev/null +++ b/tests/phpunit/integration/sample/integrationSample.php @@ -0,0 +1,30 @@ +assertTrue( true ); + } +} diff --git a/tests/phpunit/unit/bootstrap.php b/tests/phpunit/unit/bootstrap.php new file mode 100644 index 0000000..7e1f3a3 --- /dev/null +++ b/tests/phpunit/unit/bootstrap.php @@ -0,0 +1,33 @@ +alias( function ( $path ) { + $path = str_replace( '\\', '/', $path ); + $path = preg_replace( '|(?<=.)/+|', '/', $path ); + + if ( ':' === substr( $path, 1, 1 ) ) { + $path = ucfirst( $path ); + } + + return $path; + } ); + + Functions\when( 'wp_json_encode' )->alias( function ( $array ) { + // @codingStandardsIgnoreLine - WordPress.WP.AlternativeFunctions.json_encode_json_encode - we are mocking the function here. + return json_encode( $array ); + } ); + } + + /** + * Cleans up the test environment after each test. + */ + protected function tearDown() { + Monkey\tearDown(); + parent::tearDown(); + } +} diff --git a/tests/phpunit/unit/sample/unitSample.php b/tests/phpunit/unit/sample/unitSample.php new file mode 100644 index 0000000..042d253 --- /dev/null +++ b/tests/phpunit/unit/sample/unitSample.php @@ -0,0 +1,31 @@ +assertTrue( true ); + } +} From 00b1d1f8f769b6c866145555dc6e1f549e83e2da Mon Sep 17 00:00:00 2001 From: ThierryA Date: Wed, 24 Jan 2018 11:52:45 +0100 Subject: [PATCH 6/6] Fix composer PHP requirement --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index b454a0d..acc06c4 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ } ], "require": { - "php": "^7", + "php": "^5.6|^7", "composer/installers": "^1.4", "roave/security-advisories": "dev-master" },