mirror of
https://github.com/typemill/typemill.git
synced 2025-10-14 22:34:38 +02:00
Version 1.1.1 with analytics plugin, theme optimization and plugin-docu
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,6 +5,7 @@ cache/stats.txt
|
||||
settings/settings.yaml
|
||||
plugins/admin
|
||||
plugins/demo
|
||||
plugins/disqus
|
||||
plugins/version
|
||||
tests
|
||||
zips
|
||||
|
2
cache/lastCache.txt
vendored
2
cache/lastCache.txt
vendored
@@ -1 +1 @@
|
||||
1519575954
|
||||
1519593451
|
@@ -23,8 +23,8 @@
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Typemill\\": "system",
|
||||
"Plugins\\": "plugins"
|
||||
"Typemill\\": "system/",
|
||||
"Plugins\\": "plugins/"
|
||||
}
|
||||
}
|
||||
}
|
23
composer.lock
generated
23
composer.lock
generated
@@ -182,21 +182,24 @@
|
||||
},
|
||||
{
|
||||
"name": "nikic/fast-route",
|
||||
"version": "v1.2.0",
|
||||
"version": "v1.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/FastRoute.git",
|
||||
"reference": "b5f95749071c82a8e0f58586987627054400cdf6"
|
||||
"reference": "181d480e08d9476e61381e04a71b34dc0432e812"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/b5f95749071c82a8e0f58586987627054400cdf6",
|
||||
"reference": "b5f95749071c82a8e0f58586987627054400cdf6",
|
||||
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812",
|
||||
"reference": "181d480e08d9476e61381e04a71b34dc0432e812",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.8.35|~5.7"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
@@ -221,7 +224,7 @@
|
||||
"router",
|
||||
"routing"
|
||||
],
|
||||
"time": "2017-01-19T11:35:12+00:00"
|
||||
"time": "2018-02-13T20:26:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "paragonie/random_compat",
|
||||
@@ -822,12 +825,12 @@
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vlucas/valitron.git",
|
||||
"reference": "1712b04f16db5f243ddfa5ce26a9b51eb1948a36"
|
||||
"reference": "4b32e6067a7f611113161b2c6f8258d85c16d0e2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vlucas/valitron/zipball/1712b04f16db5f243ddfa5ce26a9b51eb1948a36",
|
||||
"reference": "1712b04f16db5f243ddfa5ce26a9b51eb1948a36",
|
||||
"url": "https://api.github.com/repos/vlucas/valitron/zipball/4b32e6067a7f611113161b2c6f8258d85c16d0e2",
|
||||
"reference": "4b32e6067a7f611113161b2c6f8258d85c16d0e2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -844,7 +847,7 @@
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD"
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
@@ -860,7 +863,7 @@
|
||||
"validation",
|
||||
"validator"
|
||||
],
|
||||
"time": "2017-12-20T08:03:40+00:00"
|
||||
"time": "2018-02-10T22:02:11+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
|
@@ -2,6 +2,17 @@
|
||||
|
||||
This is the version history with some release notes.
|
||||
|
||||
## Version 1.1.1 (25.02.2018)
|
||||
|
||||
* Added new plugin "analytics" for integration of Matomo/Piwik and Google Analytics.
|
||||
* Theme "TYPEMILL": Design refresh.
|
||||
* Theme "TYPEMILL": Added cannonical url.
|
||||
* Theme "TYPEMILL": Added meta tags for social sharing including image reference.
|
||||
* Increased length of meta-description for google.
|
||||
* Fixed error with field builder (getAttributeValues).
|
||||
* Fixed error with static functions in settings (added declaration as static).
|
||||
* Added documentation for plugin developers.
|
||||
|
||||
## Version 1.1.0 (05.02.2018)
|
||||
|
||||
Version 1.1.0 introduces plugins to typemill. And because of the GDPR, the first plugin is an implementation of the famous cookieconsent. So heads up, you can publish GDPR-compliant websites with typemill now!
|
||||
|
@@ -4,6 +4,4 @@ require __DIR__ . '/system/vendor/autoload.php';
|
||||
|
||||
require __DIR__ . '/system/system.php';
|
||||
|
||||
$app->run();
|
||||
|
||||
?>
|
||||
$app->run();
|
Binary file not shown.
Before Width: | Height: | Size: 78 KiB |
@@ -11,7 +11,7 @@ use Typemill\Models\VersionCheck;
|
||||
use Typemill\Models\Helpers;
|
||||
use Typemill\Events\OnPagetreeLoaded;
|
||||
use Typemill\Events\OnBreadcrumbLoaded;
|
||||
use Typemill\Events\OnItemloaded;
|
||||
use Typemill\Events\OnItemLoaded;
|
||||
use Typemill\Events\OnMarkdownLoaded;
|
||||
use Typemill\Events\OnContentArrayLoaded;
|
||||
use Typemill\Events\OnHtmlLoaded;
|
||||
|
@@ -39,7 +39,7 @@ class Settings
|
||||
'settingsPath' => $rootPath . 'settings',
|
||||
'authorPath' => __DIR__ . DIRECTORY_SEPARATOR . 'author' . DIRECTORY_SEPARATOR,
|
||||
'contentFolder' => 'content',
|
||||
'version' => '1.1.0',
|
||||
'version' => '1.1.1',
|
||||
'setup' => true
|
||||
];
|
||||
}
|
||||
|
@@ -19,7 +19,7 @@ $dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher();
|
||||
* LOAD SETTINGS *
|
||||
************************/
|
||||
|
||||
$settings = Typemill\settings::loadSettings();
|
||||
$settings = Typemill\Settings::loadSettings();
|
||||
|
||||
/************************
|
||||
* INITIATE SLIM *
|
||||
@@ -188,5 +188,5 @@ $app->add($container->get('csrf'));
|
||||
* ADD ROUTES *
|
||||
************************/
|
||||
|
||||
require __DIR__ . '/Routes/api.php';
|
||||
require __DIR__ . '/Routes/web.php';
|
||||
require __DIR__ . '/Routes/Api.php';
|
||||
require __DIR__ . '/Routes/Web.php';
|
189
system/vendor/composer/installed.json
vendored
189
system/vendor/composer/installed.json
vendored
@@ -369,54 +369,6 @@
|
||||
"urlify"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "vlucas/valitron",
|
||||
"version": "dev-master",
|
||||
"version_normalized": "9999999-dev",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vlucas/valitron.git",
|
||||
"reference": "1712b04f16db5f243ddfa5ce26a9b51eb1948a36"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vlucas/valitron/zipball/1712b04f16db5f243ddfa5ce26a9b51eb1948a36",
|
||||
"reference": "1712b04f16db5f243ddfa5ce26a9b51eb1948a36",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.8.35"
|
||||
},
|
||||
"time": "2017-12-20T08:03:40+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "source",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Valitron": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Vance Lucas",
|
||||
"email": "vance@vancelucas.com",
|
||||
"homepage": "http://www.vancelucas.com"
|
||||
}
|
||||
],
|
||||
"description": "Simple, elegant, stand-alone validation library with NO dependencies",
|
||||
"homepage": "http://github.com/vlucas/valitron",
|
||||
"keywords": [
|
||||
"valid",
|
||||
"validation",
|
||||
"validator"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "psr/container",
|
||||
"version": "1.0.0",
|
||||
@@ -501,51 +453,6 @@
|
||||
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
|
||||
"homepage": "https://github.com/container-interop/container-interop"
|
||||
},
|
||||
{
|
||||
"name": "nikic/fast-route",
|
||||
"version": "v1.2.0",
|
||||
"version_normalized": "1.2.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/FastRoute.git",
|
||||
"reference": "b5f95749071c82a8e0f58586987627054400cdf6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/b5f95749071c82a8e0f58586987627054400cdf6",
|
||||
"reference": "b5f95749071c82a8e0f58586987627054400cdf6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"time": "2017-01-19T11:35:12+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"FastRoute\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nikita Popov",
|
||||
"email": "nikic@php.net"
|
||||
}
|
||||
],
|
||||
"description": "Fast request router for PHP",
|
||||
"keywords": [
|
||||
"router",
|
||||
"routing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pimple/pimple",
|
||||
"version": "v3.2.3",
|
||||
@@ -888,5 +795,101 @@
|
||||
],
|
||||
"description": "Symfony EventDispatcher Component",
|
||||
"homepage": "https://symfony.com"
|
||||
},
|
||||
{
|
||||
"name": "nikic/fast-route",
|
||||
"version": "v1.3.0",
|
||||
"version_normalized": "1.3.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/FastRoute.git",
|
||||
"reference": "181d480e08d9476e61381e04a71b34dc0432e812"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812",
|
||||
"reference": "181d480e08d9476e61381e04a71b34dc0432e812",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.8.35|~5.7"
|
||||
},
|
||||
"time": "2018-02-13T20:26:39+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"FastRoute\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nikita Popov",
|
||||
"email": "nikic@php.net"
|
||||
}
|
||||
],
|
||||
"description": "Fast request router for PHP",
|
||||
"keywords": [
|
||||
"router",
|
||||
"routing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "vlucas/valitron",
|
||||
"version": "dev-master",
|
||||
"version_normalized": "9999999-dev",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vlucas/valitron.git",
|
||||
"reference": "4b32e6067a7f611113161b2c6f8258d85c16d0e2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vlucas/valitron/zipball/4b32e6067a7f611113161b2c6f8258d85c16d0e2",
|
||||
"reference": "4b32e6067a7f611113161b2c6f8258d85c16d0e2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.8.35"
|
||||
},
|
||||
"time": "2018-02-10T22:02:11+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Valitron": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Vance Lucas",
|
||||
"email": "vance@vancelucas.com",
|
||||
"homepage": "http://www.vancelucas.com"
|
||||
}
|
||||
],
|
||||
"description": "Simple, elegant, stand-alone validation library with NO dependencies",
|
||||
"homepage": "http://github.com/vlucas/valitron",
|
||||
"keywords": [
|
||||
"valid",
|
||||
"validation",
|
||||
"validator"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
14
system/vendor/nikic/fast-route/.travis.yml
vendored
14
system/vendor/nikic/fast-route/.travis.yml
vendored
@@ -1,3 +1,4 @@
|
||||
sudo: false
|
||||
language: php
|
||||
|
||||
php:
|
||||
@@ -5,8 +6,15 @@ php:
|
||||
- 5.5
|
||||
- 5.6
|
||||
- 7.0
|
||||
- 7.1
|
||||
- 7.2
|
||||
- hhvm
|
||||
|
||||
matrix:
|
||||
allow_failures:
|
||||
- php: 7.0
|
||||
script:
|
||||
- ./vendor/bin/phpunit
|
||||
|
||||
before_install:
|
||||
- travis_retry composer self-update
|
||||
|
||||
install:
|
||||
- composer install
|
||||
|
20
system/vendor/nikic/fast-route/FastRoute.hhi
vendored
20
system/vendor/nikic/fast-route/FastRoute.hhi
vendored
@@ -34,21 +34,21 @@ namespace FastRoute {
|
||||
function simpleDispatcher(
|
||||
(function(RouteCollector): void) $routeDefinitionCallback,
|
||||
shape(
|
||||
'routeParser' => ?classname<RouteParser>,
|
||||
'dataGenerator' => ?classname<DataGenerator>,
|
||||
'dispatcher' => ?classname<Dispatcher>,
|
||||
'routeCollector' => ?classname<RouteCollector>,
|
||||
?'routeParser' => classname<RouteParser>,
|
||||
?'dataGenerator' => classname<DataGenerator>,
|
||||
?'dispatcher' => classname<Dispatcher>,
|
||||
?'routeCollector' => classname<RouteCollector>,
|
||||
) $options = shape()): Dispatcher;
|
||||
|
||||
function cachedDispatcher(
|
||||
(function(RouteCollector): void) $routeDefinitionCallback,
|
||||
shape(
|
||||
'routeParser' => ?classname<RouteParser>,
|
||||
'dataGenerator' => ?classname<DataGenerator>,
|
||||
'dispatcher' => ?classname<Dispatcher>,
|
||||
'routeCollector' => ?classname<RouteCollector>,
|
||||
'cacheDisabled' => ?bool,
|
||||
'cacheFile' => ?string,
|
||||
?'routeParser' => classname<RouteParser>,
|
||||
?'dataGenerator' => classname<DataGenerator>,
|
||||
?'dispatcher' => classname<Dispatcher>,
|
||||
?'routeCollector' => classname<RouteCollector>,
|
||||
?'cacheDisabled' => bool,
|
||||
?'cacheFile' => string,
|
||||
) $options = shape()): Dispatcher;
|
||||
}
|
||||
|
||||
|
9
system/vendor/nikic/fast-route/composer.json
vendored
9
system/vendor/nikic/fast-route/composer.json
vendored
@@ -9,13 +9,16 @@
|
||||
"email": "nikic@php.net"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"FastRoute\\": "src/"
|
||||
},
|
||||
"files": ["src/functions.php"]
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.8.35|~5.7"
|
||||
}
|
||||
}
|
||||
|
28
system/vendor/nikic/fast-route/psalm.xml
vendored
Normal file
28
system/vendor/nikic/fast-route/psalm.xml
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0"?>
|
||||
<psalm
|
||||
name="Example Psalm config with recommended defaults"
|
||||
stopOnFirstError="false"
|
||||
useDocblockTypes="true"
|
||||
totallyTyped="false"
|
||||
requireVoidReturnType="false"
|
||||
>
|
||||
<projectFiles>
|
||||
<directory name="src" />
|
||||
</projectFiles>
|
||||
|
||||
<issueHandlers>
|
||||
<LessSpecificReturnType errorLevel="info" />
|
||||
|
||||
<!-- level 3 issues - slightly lazy code writing, but provably low false-negatives -->
|
||||
<DeprecatedMethod errorLevel="info" />
|
||||
|
||||
<MissingClosureReturnType errorLevel="info" />
|
||||
<MissingReturnType errorLevel="info" />
|
||||
<MissingPropertyType errorLevel="info" />
|
||||
<InvalidDocblock errorLevel="info" />
|
||||
<MisplacedRequiredParam errorLevel="info" />
|
||||
|
||||
<PropertyNotSetInConstructor errorLevel="info" />
|
||||
<MissingConstructor errorLevel="info" />
|
||||
</issueHandlers>
|
||||
</psalm>
|
@@ -2,5 +2,6 @@
|
||||
|
||||
namespace FastRoute;
|
||||
|
||||
class BadRouteException extends \LogicException {
|
||||
class BadRouteException extends \LogicException
|
||||
{
|
||||
}
|
||||
|
@@ -2,7 +2,8 @@
|
||||
|
||||
namespace FastRoute;
|
||||
|
||||
interface DataGenerator {
|
||||
interface DataGenerator
|
||||
{
|
||||
/**
|
||||
* Adds a route to the data generator. The route data uses the
|
||||
* same format that is returned by RouterParser::parser().
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\DataGenerator;
|
||||
|
||||
class CharCountBased extends RegexBasedAbstract {
|
||||
protected function getApproxChunkSize() {
|
||||
class CharCountBased extends RegexBasedAbstract
|
||||
{
|
||||
protected function getApproxChunkSize()
|
||||
{
|
||||
return 30;
|
||||
}
|
||||
|
||||
protected function processChunk($regexToRoutesMap) {
|
||||
protected function processChunk($regexToRoutesMap)
|
||||
{
|
||||
$routeMap = [];
|
||||
$regexes = [];
|
||||
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\DataGenerator;
|
||||
|
||||
class GroupCountBased extends RegexBasedAbstract {
|
||||
protected function getApproxChunkSize() {
|
||||
class GroupCountBased extends RegexBasedAbstract
|
||||
{
|
||||
protected function getApproxChunkSize()
|
||||
{
|
||||
return 10;
|
||||
}
|
||||
|
||||
protected function processChunk($regexToRoutesMap) {
|
||||
protected function processChunk($regexToRoutesMap)
|
||||
{
|
||||
$routeMap = [];
|
||||
$regexes = [];
|
||||
$numGroups = 0;
|
||||
@@ -25,4 +28,3 @@ class GroupCountBased extends RegexBasedAbstract {
|
||||
return ['regex' => $regex, 'routeMap' => $routeMap];
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\DataGenerator;
|
||||
|
||||
class GroupPosBased extends RegexBasedAbstract {
|
||||
protected function getApproxChunkSize() {
|
||||
class GroupPosBased extends RegexBasedAbstract
|
||||
{
|
||||
protected function getApproxChunkSize()
|
||||
{
|
||||
return 10;
|
||||
}
|
||||
|
||||
protected function processChunk($regexToRoutesMap) {
|
||||
protected function processChunk($regexToRoutesMap)
|
||||
{
|
||||
$routeMap = [];
|
||||
$regexes = [];
|
||||
$offset = 1;
|
||||
@@ -22,4 +25,3 @@ class GroupPosBased extends RegexBasedAbstract {
|
||||
return ['regex' => $regex, 'routeMap' => $routeMap];
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\DataGenerator;
|
||||
|
||||
class MarkBased extends RegexBasedAbstract {
|
||||
protected function getApproxChunkSize() {
|
||||
class MarkBased extends RegexBasedAbstract
|
||||
{
|
||||
protected function getApproxChunkSize()
|
||||
{
|
||||
return 30;
|
||||
}
|
||||
|
||||
protected function processChunk($regexToRoutesMap) {
|
||||
protected function processChunk($regexToRoutesMap)
|
||||
{
|
||||
$routeMap = [];
|
||||
$regexes = [];
|
||||
$markName = 'a';
|
||||
@@ -22,4 +25,3 @@ class MarkBased extends RegexBasedAbstract {
|
||||
return ['regex' => $regex, 'routeMap' => $routeMap];
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,18 +2,30 @@
|
||||
|
||||
namespace FastRoute\DataGenerator;
|
||||
|
||||
use FastRoute\DataGenerator;
|
||||
use FastRoute\BadRouteException;
|
||||
use FastRoute\DataGenerator;
|
||||
use FastRoute\Route;
|
||||
|
||||
abstract class RegexBasedAbstract implements DataGenerator {
|
||||
abstract class RegexBasedAbstract implements DataGenerator
|
||||
{
|
||||
/** @var mixed[][] */
|
||||
protected $staticRoutes = [];
|
||||
|
||||
/** @var Route[][] */
|
||||
protected $methodToRegexToRoutesMap = [];
|
||||
|
||||
protected abstract function getApproxChunkSize();
|
||||
protected abstract function processChunk($regexToRoutesMap);
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
abstract protected function getApproxChunkSize();
|
||||
|
||||
public function addRoute($httpMethod, $routeData, $handler) {
|
||||
/**
|
||||
* @return mixed[]
|
||||
*/
|
||||
abstract protected function processChunk($regexToRoutesMap);
|
||||
|
||||
public function addRoute($httpMethod, $routeData, $handler)
|
||||
{
|
||||
if ($this->isStaticRoute($routeData)) {
|
||||
$this->addStaticRoute($httpMethod, $routeData, $handler);
|
||||
} else {
|
||||
@@ -21,7 +33,11 @@ abstract class RegexBasedAbstract implements DataGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
public function getData() {
|
||||
/**
|
||||
* @return mixed[]
|
||||
*/
|
||||
public function getData()
|
||||
{
|
||||
if (empty($this->methodToRegexToRoutesMap)) {
|
||||
return [$this->staticRoutes, []];
|
||||
}
|
||||
@@ -29,26 +45,41 @@ abstract class RegexBasedAbstract implements DataGenerator {
|
||||
return [$this->staticRoutes, $this->generateVariableRouteData()];
|
||||
}
|
||||
|
||||
private function generateVariableRouteData() {
|
||||
/**
|
||||
* @return mixed[]
|
||||
*/
|
||||
private function generateVariableRouteData()
|
||||
{
|
||||
$data = [];
|
||||
foreach ($this->methodToRegexToRoutesMap as $method => $regexToRoutesMap) {
|
||||
$chunkSize = $this->computeChunkSize(count($regexToRoutesMap));
|
||||
$chunks = array_chunk($regexToRoutesMap, $chunkSize, true);
|
||||
$data[$method] = array_map([$this, 'processChunk'], $chunks);
|
||||
$data[$method] = array_map([$this, 'processChunk'], $chunks);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
private function computeChunkSize($count) {
|
||||
/**
|
||||
* @param int
|
||||
* @return int
|
||||
*/
|
||||
private function computeChunkSize($count)
|
||||
{
|
||||
$numParts = max(1, round($count / $this->getApproxChunkSize()));
|
||||
return ceil($count / $numParts);
|
||||
return (int) ceil($count / $numParts);
|
||||
}
|
||||
|
||||
private function isStaticRoute($routeData) {
|
||||
/**
|
||||
* @param mixed[]
|
||||
* @return bool
|
||||
*/
|
||||
private function isStaticRoute($routeData)
|
||||
{
|
||||
return count($routeData) === 1 && is_string($routeData[0]);
|
||||
}
|
||||
|
||||
private function addStaticRoute($httpMethod, $routeData, $handler) {
|
||||
private function addStaticRoute($httpMethod, $routeData, $handler)
|
||||
{
|
||||
$routeStr = $routeData[0];
|
||||
|
||||
if (isset($this->staticRoutes[$httpMethod][$routeStr])) {
|
||||
@@ -72,7 +103,8 @@ abstract class RegexBasedAbstract implements DataGenerator {
|
||||
$this->staticRoutes[$httpMethod][$routeStr] = $handler;
|
||||
}
|
||||
|
||||
private function addVariableRoute($httpMethod, $routeData, $handler) {
|
||||
private function addVariableRoute($httpMethod, $routeData, $handler)
|
||||
{
|
||||
list($regex, $variables) = $this->buildRegexForRoute($routeData);
|
||||
|
||||
if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) {
|
||||
@@ -87,7 +119,12 @@ abstract class RegexBasedAbstract implements DataGenerator {
|
||||
);
|
||||
}
|
||||
|
||||
private function buildRegexForRoute($routeData) {
|
||||
/**
|
||||
* @param mixed[]
|
||||
* @return mixed[]
|
||||
*/
|
||||
private function buildRegexForRoute($routeData)
|
||||
{
|
||||
$regex = '';
|
||||
$variables = [];
|
||||
foreach ($routeData as $part) {
|
||||
@@ -118,14 +155,19 @@ abstract class RegexBasedAbstract implements DataGenerator {
|
||||
return [$regex, $variables];
|
||||
}
|
||||
|
||||
private function regexHasCapturingGroups($regex) {
|
||||
/**
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
private function regexHasCapturingGroups($regex)
|
||||
{
|
||||
if (false === strpos($regex, '(')) {
|
||||
// Needs to have at least a ( to contain a capturing group
|
||||
return false;
|
||||
}
|
||||
|
||||
// Semi-accurate detection for capturing groups
|
||||
return preg_match(
|
||||
return (bool) preg_match(
|
||||
'~
|
||||
(?:
|
||||
\(\?\(
|
||||
|
@@ -2,7 +2,8 @@
|
||||
|
||||
namespace FastRoute;
|
||||
|
||||
interface Dispatcher {
|
||||
interface Dispatcher
|
||||
{
|
||||
const NOT_FOUND = 0;
|
||||
const FOUND = 1;
|
||||
const METHOD_NOT_ALLOWED = 2;
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\Dispatcher;
|
||||
|
||||
class CharCountBased extends RegexBasedAbstract {
|
||||
public function __construct($data) {
|
||||
class CharCountBased extends RegexBasedAbstract
|
||||
{
|
||||
public function __construct($data)
|
||||
{
|
||||
list($this->staticRouteMap, $this->variableRouteData) = $data;
|
||||
}
|
||||
|
||||
protected function dispatchVariableRoute($routeData, $uri) {
|
||||
protected function dispatchVariableRoute($routeData, $uri)
|
||||
{
|
||||
foreach ($routeData as $data) {
|
||||
if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) {
|
||||
continue;
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\Dispatcher;
|
||||
|
||||
class GroupCountBased extends RegexBasedAbstract {
|
||||
public function __construct($data) {
|
||||
class GroupCountBased extends RegexBasedAbstract
|
||||
{
|
||||
public function __construct($data)
|
||||
{
|
||||
list($this->staticRouteMap, $this->variableRouteData) = $data;
|
||||
}
|
||||
|
||||
protected function dispatchVariableRoute($routeData, $uri) {
|
||||
protected function dispatchVariableRoute($routeData, $uri)
|
||||
{
|
||||
foreach ($routeData as $data) {
|
||||
if (!preg_match($data['regex'], $uri, $matches)) {
|
||||
continue;
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\Dispatcher;
|
||||
|
||||
class GroupPosBased extends RegexBasedAbstract {
|
||||
public function __construct($data) {
|
||||
class GroupPosBased extends RegexBasedAbstract
|
||||
{
|
||||
public function __construct($data)
|
||||
{
|
||||
list($this->staticRouteMap, $this->variableRouteData) = $data;
|
||||
}
|
||||
|
||||
protected function dispatchVariableRoute($routeData, $uri) {
|
||||
protected function dispatchVariableRoute($routeData, $uri)
|
||||
{
|
||||
foreach ($routeData as $data) {
|
||||
if (!preg_match($data['regex'], $uri, $matches)) {
|
||||
continue;
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\Dispatcher;
|
||||
|
||||
class MarkBased extends RegexBasedAbstract {
|
||||
public function __construct($data) {
|
||||
class MarkBased extends RegexBasedAbstract
|
||||
{
|
||||
public function __construct($data)
|
||||
{
|
||||
list($this->staticRouteMap, $this->variableRouteData) = $data;
|
||||
}
|
||||
|
||||
protected function dispatchVariableRoute($routeData, $uri) {
|
||||
protected function dispatchVariableRoute($routeData, $uri)
|
||||
{
|
||||
foreach ($routeData as $data) {
|
||||
if (!preg_match($data['regex'], $uri, $matches)) {
|
||||
continue;
|
||||
|
@@ -4,13 +4,21 @@ namespace FastRoute\Dispatcher;
|
||||
|
||||
use FastRoute\Dispatcher;
|
||||
|
||||
abstract class RegexBasedAbstract implements Dispatcher {
|
||||
protected $staticRouteMap;
|
||||
protected $variableRouteData;
|
||||
abstract class RegexBasedAbstract implements Dispatcher
|
||||
{
|
||||
/** @var mixed[][] */
|
||||
protected $staticRouteMap = [];
|
||||
|
||||
protected abstract function dispatchVariableRoute($routeData, $uri);
|
||||
/** @var mixed[] */
|
||||
protected $variableRouteData = [];
|
||||
|
||||
public function dispatch($httpMethod, $uri) {
|
||||
/**
|
||||
* @return mixed[]
|
||||
*/
|
||||
abstract protected function dispatchVariableRoute($routeData, $uri);
|
||||
|
||||
public function dispatch($httpMethod, $uri)
|
||||
{
|
||||
if (isset($this->staticRouteMap[$httpMethod][$uri])) {
|
||||
$handler = $this->staticRouteMap[$httpMethod][$uri];
|
||||
return [self::FOUND, $handler, []];
|
||||
@@ -73,8 +81,8 @@ abstract class RegexBasedAbstract implements Dispatcher {
|
||||
// If there are no allowed methods the route simply does not exist
|
||||
if ($allowedMethods) {
|
||||
return [self::METHOD_NOT_ALLOWED, $allowedMethods];
|
||||
} else {
|
||||
return [self::NOT_FOUND];
|
||||
}
|
||||
|
||||
return [self::NOT_FOUND];
|
||||
}
|
||||
}
|
||||
|
17
system/vendor/nikic/fast-route/src/Route.php
vendored
17
system/vendor/nikic/fast-route/src/Route.php
vendored
@@ -2,10 +2,18 @@
|
||||
|
||||
namespace FastRoute;
|
||||
|
||||
class Route {
|
||||
class Route
|
||||
{
|
||||
/** @var string */
|
||||
public $httpMethod;
|
||||
|
||||
/** @var string */
|
||||
public $regex;
|
||||
|
||||
/** @var array */
|
||||
public $variables;
|
||||
|
||||
/** @var mixed */
|
||||
public $handler;
|
||||
|
||||
/**
|
||||
@@ -16,7 +24,8 @@ class Route {
|
||||
* @param string $regex
|
||||
* @param array $variables
|
||||
*/
|
||||
public function __construct($httpMethod, $handler, $regex, $variables) {
|
||||
public function __construct($httpMethod, $handler, $regex, $variables)
|
||||
{
|
||||
$this->httpMethod = $httpMethod;
|
||||
$this->handler = $handler;
|
||||
$this->regex = $regex;
|
||||
@@ -30,9 +39,9 @@ class Route {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function matches($str) {
|
||||
public function matches($str)
|
||||
{
|
||||
$regex = '~^' . $this->regex . '$~';
|
||||
return (bool) preg_match($regex, $str);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,9 +2,15 @@
|
||||
|
||||
namespace FastRoute;
|
||||
|
||||
class RouteCollector {
|
||||
class RouteCollector
|
||||
{
|
||||
/** @var RouteParser */
|
||||
protected $routeParser;
|
||||
|
||||
/** @var DataGenerator */
|
||||
protected $dataGenerator;
|
||||
|
||||
/** @var string */
|
||||
protected $currentGroupPrefix;
|
||||
|
||||
/**
|
||||
@@ -13,7 +19,8 @@ class RouteCollector {
|
||||
* @param RouteParser $routeParser
|
||||
* @param DataGenerator $dataGenerator
|
||||
*/
|
||||
public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) {
|
||||
public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator)
|
||||
{
|
||||
$this->routeParser = $routeParser;
|
||||
$this->dataGenerator = $dataGenerator;
|
||||
$this->currentGroupPrefix = '';
|
||||
@@ -28,7 +35,8 @@ class RouteCollector {
|
||||
* @param string $route
|
||||
* @param mixed $handler
|
||||
*/
|
||||
public function addRoute($httpMethod, $route, $handler) {
|
||||
public function addRoute($httpMethod, $route, $handler)
|
||||
{
|
||||
$route = $this->currentGroupPrefix . $route;
|
||||
$routeDatas = $this->routeParser->parse($route);
|
||||
foreach ((array) $httpMethod as $method) {
|
||||
@@ -46,13 +54,14 @@ class RouteCollector {
|
||||
* @param string $prefix
|
||||
* @param callable $callback
|
||||
*/
|
||||
public function addGroup($prefix, callable $callback) {
|
||||
public function addGroup($prefix, callable $callback)
|
||||
{
|
||||
$previousGroupPrefix = $this->currentGroupPrefix;
|
||||
$this->currentGroupPrefix = $previousGroupPrefix . $prefix;
|
||||
$callback($this);
|
||||
$this->currentGroupPrefix = $previousGroupPrefix;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a GET route to the collection
|
||||
*
|
||||
@@ -61,10 +70,11 @@ class RouteCollector {
|
||||
* @param string $route
|
||||
* @param mixed $handler
|
||||
*/
|
||||
public function get($route, $handler) {
|
||||
public function get($route, $handler)
|
||||
{
|
||||
$this->addRoute('GET', $route, $handler);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a POST route to the collection
|
||||
*
|
||||
@@ -73,10 +83,11 @@ class RouteCollector {
|
||||
* @param string $route
|
||||
* @param mixed $handler
|
||||
*/
|
||||
public function post($route, $handler) {
|
||||
public function post($route, $handler)
|
||||
{
|
||||
$this->addRoute('POST', $route, $handler);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a PUT route to the collection
|
||||
*
|
||||
@@ -85,10 +96,11 @@ class RouteCollector {
|
||||
* @param string $route
|
||||
* @param mixed $handler
|
||||
*/
|
||||
public function put($route, $handler) {
|
||||
public function put($route, $handler)
|
||||
{
|
||||
$this->addRoute('PUT', $route, $handler);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a DELETE route to the collection
|
||||
*
|
||||
@@ -97,10 +109,11 @@ class RouteCollector {
|
||||
* @param string $route
|
||||
* @param mixed $handler
|
||||
*/
|
||||
public function delete($route, $handler) {
|
||||
public function delete($route, $handler)
|
||||
{
|
||||
$this->addRoute('DELETE', $route, $handler);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a PATCH route to the collection
|
||||
*
|
||||
@@ -109,7 +122,8 @@ class RouteCollector {
|
||||
* @param string $route
|
||||
* @param mixed $handler
|
||||
*/
|
||||
public function patch($route, $handler) {
|
||||
public function patch($route, $handler)
|
||||
{
|
||||
$this->addRoute('PATCH', $route, $handler);
|
||||
}
|
||||
|
||||
@@ -121,7 +135,8 @@ class RouteCollector {
|
||||
* @param string $route
|
||||
* @param mixed $handler
|
||||
*/
|
||||
public function head($route, $handler) {
|
||||
public function head($route, $handler)
|
||||
{
|
||||
$this->addRoute('HEAD', $route, $handler);
|
||||
}
|
||||
|
||||
@@ -130,7 +145,8 @@ class RouteCollector {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getData() {
|
||||
public function getData()
|
||||
{
|
||||
return $this->dataGenerator->getData();
|
||||
}
|
||||
}
|
||||
|
@@ -2,7 +2,8 @@
|
||||
|
||||
namespace FastRoute;
|
||||
|
||||
interface RouteParser {
|
||||
interface RouteParser
|
||||
{
|
||||
/**
|
||||
* Parses a route string into multiple route data arrays.
|
||||
*
|
||||
@@ -29,7 +30,7 @@ interface RouteParser {
|
||||
* Here one route string was converted into two route data arrays.
|
||||
*
|
||||
* @param string $route Route string to parse
|
||||
*
|
||||
*
|
||||
* @return mixed[][] Array of route data arrays
|
||||
*/
|
||||
public function parse($route);
|
||||
|
@@ -10,7 +10,8 @@ use FastRoute\RouteParser;
|
||||
*
|
||||
* "/user/{name}[/{id:[0-9]+}]"
|
||||
*/
|
||||
class Std implements RouteParser {
|
||||
class Std implements RouteParser
|
||||
{
|
||||
const VARIABLE_REGEX = <<<'REGEX'
|
||||
\{
|
||||
\s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s*
|
||||
@@ -21,7 +22,8 @@ class Std implements RouteParser {
|
||||
REGEX;
|
||||
const DEFAULT_DISPATCH_REGEX = '[^/]+';
|
||||
|
||||
public function parse($route) {
|
||||
public function parse($route)
|
||||
{
|
||||
$routeWithoutClosingOptionals = rtrim($route, ']');
|
||||
$numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals);
|
||||
|
||||
@@ -30,7 +32,7 @@ REGEX;
|
||||
if ($numOptionals !== count($segments) - 1) {
|
||||
// If there are any ] in the middle of the route, throw a more specific error message
|
||||
if (preg_match('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \]~x', $routeWithoutClosingOptionals)) {
|
||||
throw new BadRouteException("Optional segments can only occur at the end of a route");
|
||||
throw new BadRouteException('Optional segments can only occur at the end of a route');
|
||||
}
|
||||
throw new BadRouteException("Number of opening '[' and closing ']' does not match");
|
||||
}
|
||||
@@ -39,7 +41,7 @@ REGEX;
|
||||
$routeDatas = [];
|
||||
foreach ($segments as $n => $segment) {
|
||||
if ($segment === '' && $n !== 0) {
|
||||
throw new BadRouteException("Empty optional part");
|
||||
throw new BadRouteException('Empty optional part');
|
||||
}
|
||||
|
||||
$currentRoute .= $segment;
|
||||
@@ -50,8 +52,12 @@ REGEX;
|
||||
|
||||
/**
|
||||
* Parses a route string that does not contain optional segments.
|
||||
*
|
||||
* @param string
|
||||
* @return mixed[]
|
||||
*/
|
||||
private function parsePlaceholders($route) {
|
||||
private function parsePlaceholders($route)
|
||||
{
|
||||
if (!preg_match_all(
|
||||
'~' . self::VARIABLE_REGEX . '~x', $route, $matches,
|
||||
PREG_OFFSET_CAPTURE | PREG_SET_ORDER
|
||||
@@ -72,7 +78,7 @@ REGEX;
|
||||
$offset = $set[0][1] + strlen($set[0][0]);
|
||||
}
|
||||
|
||||
if ($offset != strlen($route)) {
|
||||
if ($offset !== strlen($route)) {
|
||||
$routeData[] = substr($route, $offset);
|
||||
}
|
||||
|
||||
|
@@ -4,7 +4,7 @@ namespace FastRoute;
|
||||
|
||||
require __DIR__ . '/functions.php';
|
||||
|
||||
spl_autoload_register(function($class) {
|
||||
spl_autoload_register(function ($class) {
|
||||
if (strpos($class, 'FastRoute\\') === 0) {
|
||||
$name = substr($class, strlen('FastRoute'));
|
||||
require __DIR__ . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php';
|
||||
|
@@ -9,7 +9,8 @@ if (!function_exists('FastRoute\simpleDispatcher')) {
|
||||
*
|
||||
* @return Dispatcher
|
||||
*/
|
||||
function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) {
|
||||
function simpleDispatcher(callable $routeDefinitionCallback, array $options = [])
|
||||
{
|
||||
$options += [
|
||||
'routeParser' => 'FastRoute\\RouteParser\\Std',
|
||||
'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
|
||||
@@ -32,7 +33,8 @@ if (!function_exists('FastRoute\simpleDispatcher')) {
|
||||
*
|
||||
* @return Dispatcher
|
||||
*/
|
||||
function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) {
|
||||
function cachedDispatcher(callable $routeDefinitionCallback, array $options = [])
|
||||
{
|
||||
$options += [
|
||||
'routeParser' => 'FastRoute\\RouteParser\\Std',
|
||||
'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\Dispatcher;
|
||||
|
||||
class CharCountBasedTest extends DispatcherTest {
|
||||
protected function getDispatcherClass() {
|
||||
class CharCountBasedTest extends DispatcherTest
|
||||
{
|
||||
protected function getDispatcherClass()
|
||||
{
|
||||
return 'FastRoute\\Dispatcher\\CharCountBased';
|
||||
}
|
||||
|
||||
protected function getDataGeneratorClass() {
|
||||
protected function getDataGeneratorClass()
|
||||
{
|
||||
return 'FastRoute\\DataGenerator\\CharCountBased';
|
||||
}
|
||||
}
|
||||
|
@@ -3,9 +3,10 @@
|
||||
namespace FastRoute\Dispatcher;
|
||||
|
||||
use FastRoute\RouteCollector;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
abstract class DispatcherTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* Delegate dispatcher selection to child test classes
|
||||
*/
|
||||
@@ -19,7 +20,8 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
/**
|
||||
* Set appropriate options for the specific Dispatcher class we're testing
|
||||
*/
|
||||
private function generateDispatcherOptions() {
|
||||
private function generateDispatcherOptions()
|
||||
{
|
||||
return [
|
||||
'dataGenerator' => $this->getDataGeneratorClass(),
|
||||
'dispatcher' => $this->getDispatcherClass()
|
||||
@@ -29,7 +31,8 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
/**
|
||||
* @dataProvider provideFoundDispatchCases
|
||||
*/
|
||||
public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) {
|
||||
public function testFoundDispatches($method, $uri, $callback, $handler, $argDict)
|
||||
{
|
||||
$dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
|
||||
$info = $dispatcher->dispatch($method, $uri);
|
||||
$this->assertSame($dispatcher::FOUND, $info[0]);
|
||||
@@ -40,11 +43,12 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
/**
|
||||
* @dataProvider provideNotFoundDispatchCases
|
||||
*/
|
||||
public function testNotFoundDispatches($method, $uri, $callback) {
|
||||
public function testNotFoundDispatches($method, $uri, $callback)
|
||||
{
|
||||
$dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
|
||||
$routeInfo = $dispatcher->dispatch($method, $uri);
|
||||
$this->assertFalse(isset($routeInfo[1]),
|
||||
"NOT_FOUND result must only contain a single element in the returned info array"
|
||||
$this->assertArrayNotHasKey(1, $routeInfo,
|
||||
'NOT_FOUND result must only contain a single element in the returned info array'
|
||||
);
|
||||
$this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]);
|
||||
}
|
||||
@@ -52,11 +56,12 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
/**
|
||||
* @dataProvider provideMethodNotAllowedDispatchCases
|
||||
*/
|
||||
public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) {
|
||||
public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods)
|
||||
{
|
||||
$dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
|
||||
$routeInfo = $dispatcher->dispatch($method, $uri);
|
||||
$this->assertTrue(isset($routeInfo[1]),
|
||||
"METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1"
|
||||
$this->assertArrayHasKey(1, $routeInfo,
|
||||
'METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1'
|
||||
);
|
||||
|
||||
list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri);
|
||||
@@ -68,8 +73,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
* @expectedException \FastRoute\BadRouteException
|
||||
* @expectedExceptionMessage Cannot use the same placeholder "test" twice
|
||||
*/
|
||||
public function testDuplicateVariableNameError() {
|
||||
\FastRoute\simpleDispatcher(function(RouteCollector $r) {
|
||||
public function testDuplicateVariableNameError()
|
||||
{
|
||||
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0');
|
||||
}, $this->generateDispatcherOptions());
|
||||
}
|
||||
@@ -78,8 +84,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
* @expectedException \FastRoute\BadRouteException
|
||||
* @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET"
|
||||
*/
|
||||
public function testDuplicateVariableRoute() {
|
||||
\FastRoute\simpleDispatcher(function(RouteCollector $r) {
|
||||
public function testDuplicateVariableRoute()
|
||||
{
|
||||
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{id}', 'handler0'); // oops, forgot \d+ restriction ;)
|
||||
$r->addRoute('GET', '/user/{name}', 'handler1');
|
||||
}, $this->generateDispatcherOptions());
|
||||
@@ -89,8 +96,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
* @expectedException \FastRoute\BadRouteException
|
||||
* @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET"
|
||||
*/
|
||||
public function testDuplicateStaticRoute() {
|
||||
\FastRoute\simpleDispatcher(function(RouteCollector $r) {
|
||||
public function testDuplicateStaticRoute()
|
||||
{
|
||||
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user', 'handler0');
|
||||
$r->addRoute('GET', '/user', 'handler1');
|
||||
}, $this->generateDispatcherOptions());
|
||||
@@ -100,8 +108,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
* @expectedException \FastRoute\BadRouteException
|
||||
* @expectedExceptionMessage Static route "/user/nikic" is shadowed by previously defined variable route "/user/([^/]+)" for method "GET"
|
||||
*/
|
||||
public function testShadowedStaticRoute() {
|
||||
\FastRoute\simpleDispatcher(function(RouteCollector $r) {
|
||||
public function testShadowedStaticRoute()
|
||||
{
|
||||
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||
$r->addRoute('GET', '/user/nikic', 'handler1');
|
||||
}, $this->generateDispatcherOptions());
|
||||
@@ -111,18 +120,20 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
* @expectedException \FastRoute\BadRouteException
|
||||
* @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group
|
||||
*/
|
||||
public function testCapturing() {
|
||||
\FastRoute\simpleDispatcher(function(RouteCollector $r) {
|
||||
public function testCapturing()
|
||||
{
|
||||
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/{lang:(en|de)}', 'handler0');
|
||||
}, $this->generateDispatcherOptions());
|
||||
}
|
||||
|
||||
public function provideFoundDispatchCases() {
|
||||
public function provideFoundDispatchCases()
|
||||
{
|
||||
$cases = [];
|
||||
|
||||
// 0 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/resource/123/456', 'handler0');
|
||||
};
|
||||
|
||||
@@ -135,7 +146,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 1 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/handler0', 'handler0');
|
||||
$r->addRoute('GET', '/handler1', 'handler1');
|
||||
$r->addRoute('GET', '/handler2', 'handler2');
|
||||
@@ -150,7 +161,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 2 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
|
||||
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
|
||||
$r->addRoute('GET', '/user/{name}', 'handler2');
|
||||
@@ -198,11 +209,10 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 6 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler0');
|
||||
$r->addRoute('GET', '/user/12345/extension', 'handler1');
|
||||
$r->addRoute('GET', '/user/{id:[0-9]+}.{extension}', 'handler2');
|
||||
|
||||
};
|
||||
|
||||
$method = 'GET';
|
||||
@@ -214,7 +224,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 7 ----- Test GET method fallback on HEAD route miss ------------------------------------>
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1');
|
||||
$r->addRoute('GET', '/static0', 'handler2');
|
||||
@@ -264,7 +274,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 11 ---- More specified routes are not shadowed by less specific of another method ------>
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||
$r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1');
|
||||
};
|
||||
@@ -278,7 +288,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 12 ---- Handler of more specific routes is used, if it occurs first -------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||
$r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1');
|
||||
$r->addRoute('POST', '/user/{name}', 'handler2');
|
||||
@@ -293,7 +303,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 13 ---- Route with constant suffix ----------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||
$r->addRoute('GET', '/user/{name}/edit', 'handler1');
|
||||
};
|
||||
@@ -307,7 +317,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 14 ---- Handle multiple methods with the same handler ---------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost');
|
||||
$r->addRoute(['DELETE'], '/user', 'handlerDelete');
|
||||
$r->addRoute([], '/user', 'handlerNone');
|
||||
@@ -318,53 +328,53 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
$cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict];
|
||||
$cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict];
|
||||
|
||||
// 15 ----
|
||||
// 17 ----
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('POST', '/user.json', 'handler0');
|
||||
$r->addRoute('GET', '/{entity}.json', 'handler1');
|
||||
};
|
||||
|
||||
$cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']];
|
||||
|
||||
// 16 ----
|
||||
// 18 ----
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '', 'handler0');
|
||||
};
|
||||
|
||||
$cases[] = ['GET', '', $callback, 'handler0', []];
|
||||
|
||||
// 17 ----
|
||||
// 19 ----
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('HEAD', '/a/{foo}', 'handler0');
|
||||
$r->addRoute('GET', '/b/{foo}', 'handler1');
|
||||
};
|
||||
|
||||
$cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']];
|
||||
|
||||
// 18 ----
|
||||
// 20 ----
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('HEAD', '/a', 'handler0');
|
||||
$r->addRoute('GET', '/b', 'handler1');
|
||||
};
|
||||
|
||||
$cases[] = ['HEAD', '/b', $callback, 'handler1', []];
|
||||
|
||||
// 19 ----
|
||||
// 21 ----
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/foo', 'handler0');
|
||||
$r->addRoute('HEAD', '/{bar}', 'handler1');
|
||||
};
|
||||
|
||||
$cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']];
|
||||
|
||||
// 20 ----
|
||||
// 22 ----
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('*', '/user', 'handler0');
|
||||
$r->addRoute('*', '/{user}', 'handler1');
|
||||
$r->addRoute('GET', '/user', 'handler2');
|
||||
@@ -372,39 +382,49 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
$cases[] = ['GET', '/user', $callback, 'handler2', []];
|
||||
|
||||
// 21 ----
|
||||
// 23 ----
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('*', '/user', 'handler0');
|
||||
$r->addRoute('GET', '/user', 'handler1');
|
||||
};
|
||||
|
||||
$cases[] = ['POST', '/user', $callback, 'handler0', []];
|
||||
|
||||
// 22 ----
|
||||
// 24 ----
|
||||
|
||||
$cases[] = ['HEAD', '/user', $callback, 'handler1', []];
|
||||
|
||||
// 23 ----
|
||||
// 25 ----
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/{bar}', 'handler0');
|
||||
$r->addRoute('*', '/foo', 'handler1');
|
||||
};
|
||||
|
||||
$cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']];
|
||||
|
||||
// 26 ----
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user', 'handler0');
|
||||
$r->addRoute('*', '/{foo:.*}', 'handler1');
|
||||
};
|
||||
|
||||
$cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']];
|
||||
|
||||
// x -------------------------------------------------------------------------------------->
|
||||
|
||||
return $cases;
|
||||
}
|
||||
|
||||
public function provideNotFoundDispatchCases() {
|
||||
public function provideNotFoundDispatchCases()
|
||||
{
|
||||
$cases = [];
|
||||
|
||||
// 0 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/resource/123/456', 'handler0');
|
||||
};
|
||||
|
||||
@@ -431,7 +451,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 3 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/handler0', 'handler0');
|
||||
$r->addRoute('GET', '/handler1', 'handler1');
|
||||
$r->addRoute('GET', '/handler2', 'handler2');
|
||||
@@ -444,7 +464,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 4 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
|
||||
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
|
||||
$r->addRoute('GET', '/user/{name}', 'handler2');
|
||||
@@ -468,19 +488,20 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
// reuse callback from #5
|
||||
$method = 'HEAD';
|
||||
|
||||
$cases[] = array($method, $uri, $callback);
|
||||
$cases[] = [$method, $uri, $callback];
|
||||
|
||||
// x -------------------------------------------------------------------------------------->
|
||||
|
||||
return $cases;
|
||||
}
|
||||
|
||||
public function provideMethodNotAllowedDispatchCases() {
|
||||
public function provideMethodNotAllowedDispatchCases()
|
||||
{
|
||||
$cases = [];
|
||||
|
||||
// 0 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/resource/123/456', 'handler0');
|
||||
};
|
||||
|
||||
@@ -492,7 +513,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 1 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/resource/123/456', 'handler0');
|
||||
$r->addRoute('POST', '/resource/123/456', 'handler1');
|
||||
$r->addRoute('PUT', '/resource/123/456', 'handler2');
|
||||
@@ -507,7 +528,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 2 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
|
||||
$r->addRoute('POST', '/user/{name}/{id:[0-9]+}', 'handler1');
|
||||
$r->addRoute('PUT', '/user/{name}/{id:[0-9]+}', 'handler2');
|
||||
@@ -522,7 +543,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 3 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('POST', '/user/{name}', 'handler1');
|
||||
$r->addRoute('PUT', '/user/{name:[a-z]+}', 'handler2');
|
||||
$r->addRoute('PATCH', '/user/{name:[a-z]+}', 'handler3');
|
||||
@@ -536,7 +557,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 4 -------------------------------------------------------------------------------------->
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost');
|
||||
$r->addRoute(['DELETE'], '/user', 'handlerDelete');
|
||||
$r->addRoute([], '/user', 'handlerNone');
|
||||
@@ -546,7 +567,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// 5
|
||||
|
||||
$callback = function(RouteCollector $r) {
|
||||
$callback = function (RouteCollector $r) {
|
||||
$r->addRoute('POST', '/user.json', 'handler0');
|
||||
$r->addRoute('GET', '/{entity}.json', 'handler1');
|
||||
};
|
||||
@@ -557,5 +578,4 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
return $cases;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\Dispatcher;
|
||||
|
||||
class GroupCountBasedTest extends DispatcherTest {
|
||||
protected function getDispatcherClass() {
|
||||
class GroupCountBasedTest extends DispatcherTest
|
||||
{
|
||||
protected function getDispatcherClass()
|
||||
{
|
||||
return 'FastRoute\\Dispatcher\\GroupCountBased';
|
||||
}
|
||||
|
||||
protected function getDataGeneratorClass() {
|
||||
protected function getDataGeneratorClass()
|
||||
{
|
||||
return 'FastRoute\\DataGenerator\\GroupCountBased';
|
||||
}
|
||||
}
|
||||
|
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace FastRoute\Dispatcher;
|
||||
|
||||
class GroupPosBasedTest extends DispatcherTest {
|
||||
protected function getDispatcherClass() {
|
||||
class GroupPosBasedTest extends DispatcherTest
|
||||
{
|
||||
protected function getDispatcherClass()
|
||||
{
|
||||
return 'FastRoute\\Dispatcher\\GroupPosBased';
|
||||
}
|
||||
|
||||
protected function getDataGeneratorClass() {
|
||||
protected function getDataGeneratorClass()
|
||||
{
|
||||
return 'FastRoute\\DataGenerator\\GroupPosBased';
|
||||
}
|
||||
}
|
||||
|
@@ -2,19 +2,23 @@
|
||||
|
||||
namespace FastRoute\Dispatcher;
|
||||
|
||||
class MarkBasedTest extends DispatcherTest {
|
||||
public function setUp() {
|
||||
class MarkBasedTest extends DispatcherTest
|
||||
{
|
||||
public function setUp()
|
||||
{
|
||||
preg_match('/(*MARK:A)a/', 'a', $matches);
|
||||
if (!isset($matches['MARK'])) {
|
||||
$this->markTestSkipped('PHP 5.6 required for MARK support');
|
||||
}
|
||||
}
|
||||
|
||||
protected function getDispatcherClass() {
|
||||
protected function getDispatcherClass()
|
||||
{
|
||||
return 'FastRoute\\Dispatcher\\MarkBased';
|
||||
}
|
||||
|
||||
protected function getDataGeneratorClass() {
|
||||
protected function getDataGeneratorClass()
|
||||
{
|
||||
return 'FastRoute\\DataGenerator\\MarkBased';
|
||||
}
|
||||
}
|
||||
|
@@ -2,11 +2,16 @@
|
||||
|
||||
namespace FastRoute;
|
||||
|
||||
class HackTypecheckerTest extends \PhpUnit_Framework_TestCase {
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class HackTypecheckerTest extends TestCase
|
||||
{
|
||||
const SERVER_ALREADY_RUNNING_CODE = 77;
|
||||
public function testTypechecks($recurse = true) {
|
||||
|
||||
public function testTypechecks($recurse = true)
|
||||
{
|
||||
if (!defined('HHVM_VERSION')) {
|
||||
$this->markTestSkipped("HHVM only");
|
||||
$this->markTestSkipped('HHVM only');
|
||||
}
|
||||
if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) {
|
||||
$this->markTestSkipped('classname<T> requires HHVM 3.9+');
|
||||
@@ -15,17 +20,17 @@ class HackTypecheckerTest extends \PhpUnit_Framework_TestCase {
|
||||
// The typechecker recurses the whole tree, so it makes sure
|
||||
// that everything in fixtures/ is valid when this runs.
|
||||
|
||||
$output = array();
|
||||
$output = [];
|
||||
$exit_code = null;
|
||||
exec(
|
||||
'hh_server --check '.escapeshellarg(__DIR__.'/../../').' 2>&1',
|
||||
'hh_server --check ' . escapeshellarg(__DIR__ . '/../../') . ' 2>&1',
|
||||
$output,
|
||||
$exit_code
|
||||
);
|
||||
if ($exit_code === self::SERVER_ALREADY_RUNNING_CODE) {
|
||||
$this->assertTrue(
|
||||
$recurse,
|
||||
"Typechecker still running after running hh_client stop"
|
||||
'Typechecker still running after running hh_client stop'
|
||||
);
|
||||
// Server already running - 3.10 => 3.11 regression:
|
||||
// https://github.com/facebook/hhvm/issues/6646
|
||||
|
@@ -2,8 +2,12 @@
|
||||
|
||||
namespace FastRoute;
|
||||
|
||||
class RouteCollectorTest extends \PHPUnit_Framework_TestCase {
|
||||
public function testShortcuts() {
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class RouteCollectorTest extends TestCase
|
||||
{
|
||||
public function testShortcuts()
|
||||
{
|
||||
$r = new DummyRouteCollector();
|
||||
|
||||
$r->delete('/delete', 'delete');
|
||||
@@ -25,7 +29,8 @@ class RouteCollectorTest extends \PHPUnit_Framework_TestCase {
|
||||
$this->assertSame($expected, $r->routes);
|
||||
}
|
||||
|
||||
public function testGroups() {
|
||||
public function testGroups()
|
||||
{
|
||||
$r = new DummyRouteCollector();
|
||||
|
||||
$r->delete('/delete', 'delete');
|
||||
@@ -87,11 +92,17 @@ class RouteCollectorTest extends \PHPUnit_Framework_TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
class DummyRouteCollector extends RouteCollector {
|
||||
class DummyRouteCollector extends RouteCollector
|
||||
{
|
||||
public $routes = [];
|
||||
public function __construct() {}
|
||||
public function addRoute($method, $route, $handler) {
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
public function addRoute($method, $route, $handler)
|
||||
{
|
||||
$route = $this->currentGroupPrefix . $route;
|
||||
$this->routes[] = [$method, $route, $handler];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -2,22 +2,28 @@
|
||||
|
||||
namespace FastRoute\RouteParser;
|
||||
|
||||
class StdTest extends \PhpUnit_Framework_TestCase {
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class StdTest extends TestCase
|
||||
{
|
||||
/** @dataProvider provideTestParse */
|
||||
public function testParse($routeString, $expectedRouteDatas) {
|
||||
public function testParse($routeString, $expectedRouteDatas)
|
||||
{
|
||||
$parser = new Std();
|
||||
$routeDatas = $parser->parse($routeString);
|
||||
$this->assertSame($expectedRouteDatas, $routeDatas);
|
||||
}
|
||||
|
||||
/** @dataProvider provideTestParseError */
|
||||
public function testParseError($routeString, $expectedExceptionMessage) {
|
||||
public function testParseError($routeString, $expectedExceptionMessage)
|
||||
{
|
||||
$parser = new Std();
|
||||
$this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage);
|
||||
$parser->parse($routeString);
|
||||
}
|
||||
|
||||
public function provideTestParse() {
|
||||
public function provideTestParse()
|
||||
{
|
||||
return [
|
||||
[
|
||||
'/test',
|
||||
@@ -112,7 +118,8 @@ class StdTest extends \PhpUnit_Framework_TestCase {
|
||||
];
|
||||
}
|
||||
|
||||
public function provideTestParseError() {
|
||||
public function provideTestParseError()
|
||||
{
|
||||
return [
|
||||
[
|
||||
'/test[opt',
|
||||
@@ -128,19 +135,19 @@ class StdTest extends \PhpUnit_Framework_TestCase {
|
||||
],
|
||||
[
|
||||
'/test[]',
|
||||
"Empty optional part"
|
||||
'Empty optional part'
|
||||
],
|
||||
[
|
||||
'/test[[opt]]',
|
||||
"Empty optional part"
|
||||
'Empty optional part'
|
||||
],
|
||||
[
|
||||
'[[test]]',
|
||||
"Empty optional part"
|
||||
'Empty optional part'
|
||||
],
|
||||
[
|
||||
'/test[/opt]/required',
|
||||
"Optional segments can only occur at the end of a route"
|
||||
'Optional segments can only occur at the end of a route'
|
||||
],
|
||||
];
|
||||
}
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
require_once __DIR__ . '/../src/functions.php';
|
||||
|
||||
spl_autoload_register(function($class) {
|
||||
spl_autoload_register(function ($class) {
|
||||
if (strpos($class, 'FastRoute\\') === 0) {
|
||||
$dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/';
|
||||
$name = substr($class, strlen('FastRoute'));
|
||||
|
Reference in New Issue
Block a user