Skeleton
This commit is contained in:
commit
19becfe248
15 changed files with 4584 additions and 0 deletions
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
*.dat -text diff
|
||||
*.test -text diff
|
71
.gitignore
vendored
Normal file
71
.gitignore
vendored
Normal file
|
@ -0,0 +1,71 @@
|
|||
/vendor/
|
||||
/vendor-bin/*/vendor
|
||||
/tests/.phpunit.result.cache
|
||||
/tests/coverage
|
||||
cachegrind.out.*
|
||||
|
||||
|
||||
# General
|
||||
*.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
3
AUTHORS
Normal file
3
AUTHORS
Normal file
|
@ -0,0 +1,3 @@
|
|||
Project leads
|
||||
-------------
|
||||
J. King https://jkingweb.ca/
|
22
LICENSE
Normal file
22
LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
|||
Copyright (c) 2021 J. King
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
158
RoboFile.php
Normal file
158
RoboFile.php
Normal file
|
@ -0,0 +1,158 @@
|
|||
<?php
|
||||
/** @license MIT
|
||||
* Copyright 2021, J. King
|
||||
* See LICENSE and AUTHORS files for details */
|
||||
|
||||
|
||||
use Robo\Result;
|
||||
|
||||
const BASE = __DIR__.\DIRECTORY_SEPARATOR;
|
||||
const BASE_TEST = BASE."tests".\DIRECTORY_SEPARATOR;
|
||||
define("IS_WIN", defined("PHP_WINDOWS_VERSION_MAJOR"));
|
||||
define("IS_MAC", php_uname("s") === "Darwin");
|
||||
error_reporting(0);
|
||||
|
||||
function norm(string $path): string {
|
||||
$out = realpath($path);
|
||||
if (!$out) {
|
||||
$out = str_replace(["/", "\\"], \DIRECTORY_SEPARATOR, $path);
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
class RoboFile extends \Robo\Tasks {
|
||||
/** Runs the typical test suite
|
||||
*
|
||||
* Arguments passed to the task are passed on to PHPUnit. Thus one may, for
|
||||
* example, run the following command and get the expected results:
|
||||
*
|
||||
* ./robo test --testsuite Tokenizer --exclude-group slow --testdox
|
||||
*
|
||||
* Please see the PHPUnit documentation for available options.
|
||||
*/
|
||||
public function test(array $args): Result {
|
||||
return $this->runTests(escapeshellarg(\PHP_BINARY), "typical", $args);
|
||||
}
|
||||
|
||||
/** Runs the full test suite
|
||||
*
|
||||
* This includes pedantic tests which may help to identify problems.
|
||||
* See help for the "test" task for more details.
|
||||
*/
|
||||
public function testFull(array $args): Result {
|
||||
return $this->runTests(escapeshellarg(\PHP_BINARY), "full", $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a quick subset of the test suite
|
||||
*
|
||||
* See help for the "test" task for more details.
|
||||
*/
|
||||
public function testQuick(array $args): Result {
|
||||
return $this->runTests(escapeshellarg(\PHP_BINARY), "quick", $args);
|
||||
}
|
||||
|
||||
/** Manually updates the imported html5lib test suite */
|
||||
public function testUpdate(): Result {
|
||||
$repos = [
|
||||
'html5lib-tests' => "https://github.com/html5lib/html5lib-tests",
|
||||
'platform-tests' => "https://github.com/web-platform-tests/wpt",
|
||||
];
|
||||
$c = $this->collectionBuilder();
|
||||
foreach ($repos as $dir => $url) {
|
||||
$dir = BASE_TEST.$dir;
|
||||
if (is_dir($dir)) {
|
||||
$c->addTask($this->taskGitStack()->dir($dir)->pull());
|
||||
} else {
|
||||
$c->addTask($this->taskGitStack()->cloneRepo($url, $dir));
|
||||
}
|
||||
}
|
||||
return $c->run();
|
||||
}
|
||||
|
||||
/** Produces a code coverage report
|
||||
*
|
||||
* By default this task produces an HTML-format coverage report in
|
||||
* tests/coverage/. Additional reports may be produced by passing
|
||||
* arguments to this task as one would to PHPUnit.
|
||||
*/
|
||||
public function coverage(array $args): Result {
|
||||
// run tests with code coverage reporting enabled
|
||||
$exec = $this->findCoverageEngine();
|
||||
return $this->runTests($exec, "coverage", array_merge(["--coverage-html", BASE_TEST."coverage"], $args));
|
||||
}
|
||||
|
||||
/** Produces a code coverage report, with redundant tests
|
||||
*
|
||||
* Depending on the environment, some tests that normally provide
|
||||
* coverage may be skipped, while working alternatives are normally
|
||||
* suppressed for reasons of time. This coverage report will try to
|
||||
* run all tests which may cover code.
|
||||
*
|
||||
* See also help for the "coverage" task for more details.
|
||||
*/
|
||||
public function coverageFull(array $args): Result {
|
||||
// run tests with code coverage reporting enabled
|
||||
$exec = $this->findCoverageEngine();
|
||||
return $this->runTests($exec, "typical", array_merge(["--coverage-html", BASE_TEST."coverage"], $args));
|
||||
}
|
||||
|
||||
protected function findCoverageEngine(): string {
|
||||
$dir = rtrim(ini_get("extension_dir"), "/").\DIRECTORY_SEPARATOR;
|
||||
$ext = IS_WIN ? "dll" : "so";
|
||||
$php = escapeshellarg(\PHP_BINARY);
|
||||
$code = escapeshellarg(BASE."lib");
|
||||
if (extension_loaded("pcov")) {
|
||||
return "$php -d opcache.enable_cli=0 -d pcov.enabled=1 -d pcov.directory=$code";
|
||||
} elseif (extension_loaded("xdebug")) {
|
||||
return "$php -d opcache.enable_cli=0 -d xdebug.mode=coverage";
|
||||
} elseif (file_exists($dir."pcov.$ext")) {
|
||||
return "$php -d opcache.enable_cli=0 -d extension=pcov.$ext -d pcov.enabled=1 -d pcov.directory=$code";
|
||||
} elseif (file_exists($dir."xdebug.$ext")) {
|
||||
return "$php -d opcache.enable_cli=0 -d zend_extension=xdebug.$ext -d xdebug.mode=coverage";
|
||||
} else {
|
||||
if (IS_WIN) {
|
||||
$dbg = dirname(\PHP_BINARY)."\\phpdbg.exe";
|
||||
$dbg = file_exists($dbg) ? $dbg : "";
|
||||
} else {
|
||||
$dbg = trim(`which phpdbg 2>/dev/null`);
|
||||
}
|
||||
if ($dbg) {
|
||||
return escapeshellarg($dbg)." -qrr";
|
||||
} else {
|
||||
return $php;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function blackhole(bool $all = false): string {
|
||||
$hole = IS_WIN ? "nul" : "/dev/null";
|
||||
return $all ? ">$hole 2>&1" : "2>$hole";
|
||||
}
|
||||
|
||||
protected function runTests(string $executor, string $set, array $args) : Result {
|
||||
switch ($set) {
|
||||
case "typical":
|
||||
$set = ["--exclude-group", "optional"];
|
||||
break;
|
||||
case "quick":
|
||||
$set = ["--exclude-group", "optional,slow"];
|
||||
break;
|
||||
case "coverage":
|
||||
$set = ["--exclude-group", "optional,coverageOptional"];
|
||||
break;
|
||||
case "full":
|
||||
$set = [];
|
||||
break;
|
||||
default:
|
||||
throw new \Exception;
|
||||
}
|
||||
$execpath = norm(BASE."vendor-bin/phpunit/vendor/phpunit/phpunit/phpunit");
|
||||
$confpath = realpath(BASE_TEST."phpunit.dist.xml") ?: norm(BASE_TEST."phpunit.xml");
|
||||
// clone the html5lib test suite if it's not already present
|
||||
if (!is_dir(BASE_TEST."html5lib-tests")) {
|
||||
$this->testUpdate();
|
||||
}
|
||||
return $this->taskExec($executor)->option("-d", "zend.assertions=1")->arg($execpath)->option("-c", $confpath)->args(array_merge($set, $args))->run();
|
||||
}
|
||||
}
|
37
composer.json
Normal file
37
composer.json
Normal file
|
@ -0,0 +1,37 @@
|
|||
{
|
||||
"name": "mensbeam/site-patterns",
|
||||
"description": "Parser and processor for FiveFilters site patterns",
|
||||
"keywords": [],
|
||||
"type": "library",
|
||||
"require": {
|
||||
"php": ">=7.1"
|
||||
},
|
||||
"scripts": {
|
||||
"post-install-cmd": ["@composer bin all install"],
|
||||
"post-update-cmd": ["@composer bin all update"]
|
||||
},
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "J. King",
|
||||
"email": "jking@jkingweb.ca",
|
||||
"homepage": "https://jkingweb.ca/"
|
||||
}
|
||||
],
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"MensBeam\\FullText\\": [
|
||||
"lib/"
|
||||
]
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"MensBeam\\FullText\\Test\\": "tests/lib/",
|
||||
"MensBeam\\FullText\\TestCase\\": "tests/cases/"
|
||||
}
|
||||
},
|
||||
"require-dev": {
|
||||
"bamarni/composer-bin-plugin": "^1.3"
|
||||
}
|
||||
}
|
71
composer.lock
generated
Normal file
71
composer.lock
generated
Normal file
|
@ -0,0 +1,71 @@
|
|||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "27fe283be46a6e50ab9d34b64acafb06",
|
||||
"packages": [],
|
||||
"packages-dev": [
|
||||
{
|
||||
"name": "bamarni/composer-bin-plugin",
|
||||
"version": "1.4.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/bamarni/composer-bin-plugin.git",
|
||||
"reference": "9329fb0fbe29e0e1b2db8f4639a193e4f5406225"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/9329fb0fbe29e0e1b2db8f4639a193e4f5406225",
|
||||
"reference": "9329fb0fbe29e0e1b2db8f4639a193e4f5406225",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"composer-plugin-api": "^1.0 || ^2.0",
|
||||
"php": "^5.5.9 || ^7.0 || ^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"composer/composer": "^1.0 || ^2.0",
|
||||
"symfony/console": "^2.5 || ^3.0 || ^4.0"
|
||||
},
|
||||
"type": "composer-plugin",
|
||||
"extra": {
|
||||
"class": "Bamarni\\Composer\\Bin\\Plugin"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Bamarni\\Composer\\Bin\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"description": "No conflicts for your bin dependencies",
|
||||
"keywords": [
|
||||
"composer",
|
||||
"conflict",
|
||||
"dependency",
|
||||
"executable",
|
||||
"isolation",
|
||||
"tool"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/bamarni/composer-bin-plugin/issues",
|
||||
"source": "https://github.com/bamarni/composer-bin-plugin/tree/master"
|
||||
},
|
||||
"time": "2020-05-03T08:27:20+00:00"
|
||||
}
|
||||
],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": [],
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
"php": ">=7.1"
|
||||
},
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.1.0"
|
||||
}
|
14
robo
Executable file
14
robo
Executable file
|
@ -0,0 +1,14 @@
|
|||
#! /bin/sh
|
||||
base=`dirname "$0"`
|
||||
roboCommand="$1"
|
||||
if [ $# -eq 0 ]; then
|
||||
"$base/vendor/bin/robo"
|
||||
else
|
||||
shift
|
||||
ulimit -n 2048
|
||||
if [ "$1" = "clean" ]; then
|
||||
"$base/vendor/bin/robo" "$roboCommand" "$@"
|
||||
else
|
||||
"$base/vendor/bin/robo" "$roboCommand" -- "$@"
|
||||
fi
|
||||
fi
|
21
robo.bat
Normal file
21
robo.bat
Normal file
|
@ -0,0 +1,21 @@
|
|||
@echo off
|
||||
setlocal
|
||||
set base=%~dp0
|
||||
set roboCommand=%1
|
||||
|
||||
rem get all arguments except the first
|
||||
shift
|
||||
set "args="
|
||||
:parse
|
||||
if "%~1" neq "" (
|
||||
set args=%args% %1
|
||||
shift
|
||||
goto :parse
|
||||
)
|
||||
if defined args set args=%args:~1%
|
||||
|
||||
if "%1"=="clean" (
|
||||
call "%base%vendor\bin\robo" "%roboCommand%" %args%
|
||||
) else (
|
||||
call "%base%vendor\bin\robo" "%roboCommand%" -- %args%
|
||||
)
|
24
tests/bootstrap.php
Normal file
24
tests/bootstrap.php
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
/** @license MIT
|
||||
* Copyright 2021, J. King
|
||||
* See LICENSE and AUTHORS files for details */
|
||||
|
||||
declare(strict_types=1);
|
||||
namespace MensBeam\FullText;
|
||||
|
||||
const NS_BASE = __NAMESPACE__."\\";
|
||||
define(NS_BASE."BASE", dirname(__DIR__).DIRECTORY_SEPARATOR);
|
||||
const DOCROOT = BASE."tests".DIRECTORY_SEPARATOR."docroot".DIRECTORY_SEPARATOR;
|
||||
ini_set("memory_limit", "-1");
|
||||
ini_set("zend.assertions", "1");
|
||||
ini_set("assert.exception", "true");
|
||||
error_reporting(\E_ALL);
|
||||
require_once BASE."vendor".DIRECTORY_SEPARATOR."autoload.php";
|
||||
|
||||
if (function_exists("xdebug_set_filter")) {
|
||||
if (defined("XDEBUG_PATH_INCLUDE")) {
|
||||
xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, XDEBUG_PATH_INCLUDE, [BASE."lib/"]);
|
||||
} else {
|
||||
xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, XDEBUG_PATH_WHITELIST, [BASE."lib/"]);
|
||||
}
|
||||
}
|
23
tests/phpunit.dist.xml
Normal file
23
tests/phpunit.dist.xml
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0"?>
|
||||
<phpunit
|
||||
colors="true"
|
||||
bootstrap="bootstrap.php"
|
||||
convertErrorsToExceptions="false"
|
||||
convertNoticesToExceptions="false"
|
||||
convertWarningsToExceptions="false"
|
||||
beStrictAboutTestsThatDoNotTestAnything="true"
|
||||
forceCoversAnnotation="true"
|
||||
>
|
||||
|
||||
<filter>
|
||||
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||
<directory suffix=".php">../lib</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
|
||||
<testsuites>
|
||||
<testsuite name="Parser">
|
||||
<!--<file>cases/TestParser.php</file>-->
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
5
vendor-bin/phpunit/composer.json
Normal file
5
vendor-bin/phpunit/composer.json
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"require": {
|
||||
"phpunit/phpunit": "^8.5 | ^9.0"
|
||||
}
|
||||
}
|
2112
vendor-bin/phpunit/composer.lock
generated
Normal file
2112
vendor-bin/phpunit/composer.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
5
vendor-bin/robo/composer.json
Normal file
5
vendor-bin/robo/composer.json
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"require": {
|
||||
"consolidation/robo": "^2.0"
|
||||
}
|
||||
}
|
2016
vendor-bin/robo/composer.lock
generated
Normal file
2016
vendor-bin/robo/composer.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue