Compare commits
No commits in common. "master" and "v2.2.0" have entirely different histories.
1
.gitignore
vendored
1
.gitignore
vendored
@ -30,4 +30,3 @@ build/humbuglog.txt
|
|||||||
phpdoc/
|
phpdoc/
|
||||||
tests/test_data/json_write.json
|
tests/test_data/json_write.json
|
||||||
tests/test_data/sessions/
|
tests/test_data/sessions/
|
||||||
.phpunit.result.cache
|
|
19
.gitlab-ci.yml
Normal file
19
.gitlab-ci.yml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
test:7:
|
||||||
|
before_script:
|
||||||
|
- sh build/docker_install.sh > /dev/null
|
||||||
|
- apk add --no-cache php7-phpdbg
|
||||||
|
- curl -sS https://getcomposer.org/installer | php
|
||||||
|
- php composer.phar install --ignore-platform-reqs
|
||||||
|
image: php:7-alpine
|
||||||
|
script:
|
||||||
|
- phpdbg -qrr -- vendor/bin/phpunit --coverage-text --colors=never
|
||||||
|
|
||||||
|
test:7.1:
|
||||||
|
before_script:
|
||||||
|
- sh build/docker_install.sh > /dev/null
|
||||||
|
- apk add --no-cache php7-phpdbg
|
||||||
|
- curl -sS https://getcomposer.org/installer | php
|
||||||
|
- php composer.phar install --ignore-platform-reqs
|
||||||
|
image: php:7.1-alpine
|
||||||
|
script:
|
||||||
|
- phpdbg -qrr -- vendor/bin/phpunit --coverage-text --colors=never
|
@ -4,9 +4,8 @@ install:
|
|||||||
- composer install
|
- composer install
|
||||||
|
|
||||||
php:
|
php:
|
||||||
- 7.2
|
- 7
|
||||||
- 7.3
|
- hhvm
|
||||||
- 7.4
|
|
||||||
- nightly
|
- nightly
|
||||||
|
|
||||||
script:
|
script:
|
||||||
@ -14,7 +13,7 @@ script:
|
|||||||
- vendor/bin/phpunit -c build
|
- vendor/bin/phpunit -c build
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- redis-server
|
- redis
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
allow_failures:
|
allow_failures:
|
||||||
|
50
Jenkinsfile
vendored
50
Jenkinsfile
vendored
@ -1,50 +0,0 @@
|
|||||||
pipeline {
|
|
||||||
agent none
|
|
||||||
stages {
|
|
||||||
stage('PHP 7.2') {
|
|
||||||
agent {
|
|
||||||
docker {
|
|
||||||
image 'php:7.2-alpine'
|
|
||||||
args '-u root --privileged'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
sh 'apk add --no-cache php7-phpdbg'
|
|
||||||
sh 'curl -sS https://getcomposer.org/installer | php'
|
|
||||||
sh 'rm -f composer.lock'
|
|
||||||
sh 'php composer.phar install --ignore-platform-reqs'
|
|
||||||
sh 'php composer.phar run-script coverage -- --coverage-text --colors=never'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('PHP 7.3') {
|
|
||||||
agent {
|
|
||||||
docker {
|
|
||||||
image 'php:7.3-alpine'
|
|
||||||
args '-u root --privileged'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
sh 'apk add --no-cache php7-phpdbg'
|
|
||||||
sh 'curl -sS https://getcomposer.org/installer | php'
|
|
||||||
sh 'rm -f composer.lock'
|
|
||||||
sh 'php composer.phar install --ignore-platform-reqs'
|
|
||||||
sh 'php composer.phar run-script coverage -- --coverage-text --colors=never'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('PHP 7.4') {
|
|
||||||
agent {
|
|
||||||
docker {
|
|
||||||
image 'php:7.4-alpine'
|
|
||||||
args '-u root --privileged'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
sh 'apk add --no-cache php7-phpdbg'
|
|
||||||
sh 'curl -sS https://getcomposer.org/installer | php'
|
|
||||||
sh 'rm -f composer.lock'
|
|
||||||
sh 'php composer.phar install --ignore-platform-reqs'
|
|
||||||
sh 'php composer.phar run-script coverage -- --coverage-text --colors=never'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,7 @@
|
|||||||
# Ion
|
# Ion
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/timw4mail/ion.svg?branch=master)](https://travis-ci.org/timw4mail/ion)
|
[![build status](https://git.timshomepage.net/aviat/ion/badges/master/build.svg)](https://git.timshomepage.net/aviat/ion/commits/master)
|
||||||
[![Build Status](https://jenkins.timshomepage.net/buildStatus/icon?job=Gitea%20-%20aviat/ion/master)](https://jenkins.timshomepage.net/job/Gitea%20-%20aviat/ion/master)
|
[![coverage report](https://git.timshomepage.net/aviat/ion/badges/master/coverage.svg)](https://git.timshomepage.net/aviat/ion/commits/master)
|
||||||
|
|
||||||
|
|
||||||
Ion is a set of helpful PHP libraries for general web development
|
Ion is a set of helpful PHP libraries for general web development
|
@ -204,7 +204,7 @@ class RoboFile extends \Robo\Tasks {
|
|||||||
'tests'
|
'tests'
|
||||||
];
|
];
|
||||||
|
|
||||||
$cmd_parts = $report ? $report_cmd_parts : $normal_cmd_parts;
|
$cmd_parts = ($report) ? $report_cmd_parts : $normal_cmd_parts;
|
||||||
|
|
||||||
$this->_run($cmd_parts);
|
$this->_run($cmd_parts);
|
||||||
}
|
}
|
||||||
@ -224,7 +224,7 @@ class RoboFile extends \Robo\Tasks {
|
|||||||
{
|
{
|
||||||
$this->lint();
|
$this->lint();
|
||||||
$this->taskPHPUnit()
|
$this->taskPHPUnit()
|
||||||
->configFile('build/phpunit.xml')
|
->configFile('phpunit.xml')
|
||||||
->printed(true)
|
->printed(true)
|
||||||
->run();
|
->run();
|
||||||
}
|
}
|
||||||
|
@ -93,12 +93,12 @@ class InlineCommentSniff implements Sniff
|
|||||||
private function _checkCommentStyle(File $phpcsFile, $stackPtr)
|
private function _checkCommentStyle(File $phpcsFile, $stackPtr)
|
||||||
{
|
{
|
||||||
$tokens = $phpcsFile->getTokens();
|
$tokens = $phpcsFile->getTokens();
|
||||||
if ($tokens[$stackPtr]['content'][0] === '#') {
|
if ($tokens[$stackPtr]['content']{0} === '#') {
|
||||||
$error = 'Perl-style comments are not allowed; use "// Comment" or DocBlock comments instead';
|
$error = 'Perl-style comments are not allowed; use "// Comment" or DocBlock comments instead';
|
||||||
$phpcsFile->addError($error, $stackPtr, 'WrongStyle');
|
$phpcsFile->addError($error, $stackPtr, 'WrongStyle');
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else if (substr($tokens[$stackPtr]['content'], 0, 2) === '/*'
|
} else if (substr($tokens[$stackPtr]['content'], 0, 2) === '/*'
|
||||||
|| $tokens[$stackPtr]['content'][0] === '*'
|
|| $tokens[$stackPtr]['content']{0} === '*'
|
||||||
) {
|
) {
|
||||||
$error = 'Multi lines comments are not allowed; use "// Comment" DocBlock comments instead';
|
$error = 'Multi lines comments are not allowed; use "// Comment" DocBlock comments instead';
|
||||||
$phpcsFile->addError($error, $stackPtr, 'WrongStyle');
|
$phpcsFile->addError($error, $stackPtr, 'WrongStyle');
|
||||||
|
@ -90,7 +90,7 @@ class ByteOrderMarkSniff implements Sniff
|
|||||||
$fileStartHex = bin2hex(substr($fileStartString, 0, $bomByteLength));
|
$fileStartHex = bin2hex(substr($fileStartString, 0, $bomByteLength));
|
||||||
if ($fileStartHex === $expectedBomHex) {
|
if ($fileStartHex === $expectedBomHex) {
|
||||||
$error = "File contains a $bomName byte order mark (BOM).";
|
$error = "File contains a $bomName byte order mark (BOM).";
|
||||||
$phpcsFile->addError($error, $stackPtr, 'no byte order mark');
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,15 +70,15 @@ class Utf8EncodingSniff implements Sniff
|
|||||||
$file_content = file_get_contents($file_path);
|
$file_content = file_get_contents($file_path);
|
||||||
if (false === mb_check_encoding($file_content, 'UTF-8')) {
|
if (false === mb_check_encoding($file_content, 'UTF-8')) {
|
||||||
$error = 'File "' . $file_name . '" should be saved with Unicode (UTF-8) encoding.';
|
$error = 'File "' . $file_name . '" should be saved with Unicode (UTF-8) encoding.';
|
||||||
$phpcsFile->addError($error, 0, 'utf8OrDie');
|
$phpcsFile->addError($error, 0);
|
||||||
}
|
}
|
||||||
if ( ! self::_checkUtf8W3c($file_content)) {
|
if ( ! self::_checkUtf8W3c($file_content)) {
|
||||||
$error = 'File "' . $file_name . '" should be saved with Unicode (UTF-8) encoding, but it did not successfully pass the W3C test.';
|
$error = 'File "' . $file_name . '" should be saved with Unicode (UTF-8) encoding, but it did not successfully pass the W3C test.';
|
||||||
$phpcsFile->addError($error, 0, 'utf8OrDie1');
|
$phpcsFile->addError($error, 0);
|
||||||
}
|
}
|
||||||
if ( ! self::_checkUtf8Rfc3629($file_content)) {
|
if ( ! self::_checkUtf8Rfc3629($file_content)) {
|
||||||
$error = 'File "' . $file_name . '" should be saved with Unicode (UTF-8) encoding, but it did not meet RFC3629 requirements.';
|
$error = 'File "' . $file_name . '" should be saved with Unicode (UTF-8) encoding, but it did not meet RFC3629 requirements.';
|
||||||
$phpcsFile->addError($error, 0, 'utf8OrDie2');
|
$phpcsFile->addError($error, 0);
|
||||||
}
|
}
|
||||||
}//end process()
|
}//end process()
|
||||||
|
|
||||||
|
@ -67,11 +67,11 @@ class LogicalOperatorAndSniff implements Sniff
|
|||||||
$error_message = 'Logical operator should be in upper case;'
|
$error_message = 'Logical operator should be in upper case;'
|
||||||
. ' use "' . strtoupper($operator_string)
|
. ' use "' . strtoupper($operator_string)
|
||||||
. '" instead of "' . $operator_string . '"';
|
. '" instead of "' . $operator_string . '"';
|
||||||
$phpcsFile->addError($error_message, $stackPtr, 'uppercase operator');
|
$phpcsFile->addError($error_message, $stackPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
$warning_message = 'The symbolic form "&&" is preferred over the literal form "AND"';
|
$warning_message = 'The symbolic form "&&" is preferred over the literal form "AND"';
|
||||||
$phpcsFile->addWarning($warning_message, $stackPtr, '&& over AND');
|
$phpcsFile->addWarning($warning_message, $stackPtr);
|
||||||
|
|
||||||
}//end process()
|
}//end process()
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ class StrictComparisonOperatorSniff implements Sniff
|
|||||||
$error_message = '"==" and "!=" are prohibited; use "'
|
$error_message = '"==" and "!=" are prohibited; use "'
|
||||||
. self::$_replacements[$operator_code] . '" instead of "'
|
. self::$_replacements[$operator_code] . '" instead of "'
|
||||||
. $operator_string . '".';
|
. $operator_string . '".';
|
||||||
$phpcsFile->addError($error_message, $stackPtr, 'strict type comparison');
|
$phpcsFile->addError($error_message, $stackPtr);
|
||||||
}//end process()
|
}//end process()
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_Operators_UppercaseLogicalOperatorOrSniff.
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2006 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_Operators_UppercaseLogicalOperatorOrSniff.
|
||||||
|
*
|
||||||
|
* Ensures that the logical operator 'OR' is in upper cases and its symbolic equivalent.
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2006 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace CodeIgniter\Sniffs\Operators;
|
||||||
|
|
||||||
|
use PHP_CodeSniffer\Sniffs\Sniff;
|
||||||
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
|
||||||
|
class UppercaseLogicalOperatorOrSniff implements Sniff
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns an array of tokens this test wants to listen for: literal and symbolic operators or.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
T_BOOLEAN_OR,
|
||||||
|
T_LOGICAL_OR,
|
||||||
|
);
|
||||||
|
|
||||||
|
}//end register()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes this test, when one of its tokens is encountered.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being scanned.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function process(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
|
||||||
|
$operator_token = $tokens[$stackPtr];
|
||||||
|
$operator_string = $operator_token['content'];
|
||||||
|
$operator_code = $operator_token['code'];
|
||||||
|
|
||||||
|
if ($operator_code == T_BOOLEAN_OR) {
|
||||||
|
$error_message = 'Logical operator "' . $operator_string
|
||||||
|
. '" is prohibited; use "OR" instead';
|
||||||
|
$phpcsFile->addError($error_message, $stackPtr, 'UseOf||InsteadOfOR');
|
||||||
|
}
|
||||||
|
// it is literal, if it is not symbolic
|
||||||
|
else if ($operator_string !== strtoupper($operator_string)) {
|
||||||
|
$error_message = 'Logical operator should be in upper case;'
|
||||||
|
. ' use "' . strtoupper($operator_string)
|
||||||
|
. '" instead of "' . $operator_string . '"';
|
||||||
|
$phpcsFile->addError($error_message, $stackPtr, 'UseOfLowercaseOr');
|
||||||
|
}
|
||||||
|
}//end process()
|
||||||
|
|
||||||
|
|
||||||
|
}//end class
|
||||||
|
|
||||||
|
?>
|
@ -18,8 +18,6 @@ namespace CodeIgniter\Sniffs\Strings;
|
|||||||
use PHP_CodeSniffer\Sniffs\Sniff;
|
use PHP_CodeSniffer\Sniffs\Sniff;
|
||||||
use PHP_CodeSniffer\Files\File;
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
|
||||||
use Exception;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CodeIgniter_Sniffs_Strings_DoubleQuoteUsageSniff.
|
* CodeIgniter_Sniffs_Strings_DoubleQuoteUsageSniff.
|
||||||
*
|
*
|
||||||
@ -106,19 +104,19 @@ class VariableUsageSniff implements Sniff
|
|||||||
$this->_parseVariable($strTokens, $strPtr);
|
$this->_parseVariable($strTokens, $strPtr);
|
||||||
} catch (Exception $err) {
|
} catch (Exception $err) {
|
||||||
$error = 'There is no variable, object nor array between curly braces. Please use the escape char for $ or {.';
|
$error = 'There is no variable, object nor array between curly braces. Please use the escape char for $ or {.';
|
||||||
$phpcsFile->addError($error, $stackPtr, 1987234);
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
}
|
}
|
||||||
$variableFound = TRUE;
|
$variableFound = TRUE;
|
||||||
if ('}' !== $strTokens[$strPtr]) {
|
if ('}' !== $strTokens[$strPtr]) {
|
||||||
$error = 'There is no matching closing curly brace.';
|
$error = 'There is no matching closing curly brace.';
|
||||||
$phpcsFile->addError($error, $stackPtr, 987234);
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
}
|
}
|
||||||
// don't move forward, since it will be done in the main loop
|
// don't move forward, since it will be done in the main loop
|
||||||
// $strPtr++;
|
// $strPtr++;
|
||||||
} else if (T_VARIABLE === $strToken[0]) {
|
} else if (T_VARIABLE === $strToken[0]) {
|
||||||
$variableFound = TRUE;
|
$variableFound = TRUE;
|
||||||
$error = "Variable {$strToken[1]} in double-quoted strings should be enclosed with curly braces. Please consider {{$strToken[1]}}";
|
$error = "Variable {$strToken[1]} in double-quoted strings should be enclosed with curly braces. Please consider {{$strToken[1]}}";
|
||||||
$phpcsFile->addError($error, $stackPtr, 29087234);
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$strPtr++;
|
$strPtr++;
|
||||||
@ -148,7 +146,7 @@ class VariableUsageSniff implements Sniff
|
|||||||
if (is_array($strToken)) {
|
if (is_array($strToken)) {
|
||||||
if (T_VARIABLE === $strToken[0]) {
|
if (T_VARIABLE === $strToken[0]) {
|
||||||
$error = "Variables like {$strToken[1]} should be in double-quoted strings only.";
|
$error = "Variables like {$strToken[1]} should be in double-quoted strings only.";
|
||||||
$phpcsFile->addError($error, $stackPtr, 12343);
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$strPtr++;
|
$strPtr++;
|
||||||
@ -394,12 +392,12 @@ class DoubleQuoteUsageSniff extends VariableUsageSniff
|
|||||||
&& false === $smpl_qt_at
|
&& false === $smpl_qt_at
|
||||||
) {
|
) {
|
||||||
$error = 'Single-quoted strings should be used unless it contains variables, special chars like \n or single quotes.';
|
$error = 'Single-quoted strings should be used unless it contains variables, special chars like \n or single quotes.';
|
||||||
$phpcsFile->addError($error, $stackPtr, 1982);
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
} else if (false !== $smpl_qt_at && false !== $dbl_qt_at
|
} else if (false !== $smpl_qt_at && false !== $dbl_qt_at
|
||||||
&& false === $has_variable && false === $has_specific_sequence
|
&& false === $has_variable && false === $has_specific_sequence
|
||||||
) {
|
) {
|
||||||
$warning = 'It is encouraged to use a single-quoted string, since it doesn\'t contain any variable nor special char though it mixes single and double quotes.';
|
$warning = 'It is encouraged to use a single-quoted string, since it doesn\'t contain any variable nor special char though it mixes single and double quotes.';
|
||||||
$phpcsFile->addWarning($warning, $stackPtr, 1982734);
|
$phpcsFile->addWarning($warning, $stackPtr);
|
||||||
}
|
}
|
||||||
}//end processDoubleQuotedString()
|
}//end processDoubleQuotedString()
|
||||||
|
|
||||||
@ -427,7 +425,7 @@ class DoubleQuoteUsageSniff extends VariableUsageSniff
|
|||||||
$smpl_qt_at = strpos($qtString, "'");
|
$smpl_qt_at = strpos($qtString, "'");
|
||||||
if (false === $has_variable && false !== $smpl_qt_at && false === $dbl_qt_at) {
|
if (false === $has_variable && false !== $smpl_qt_at && false === $dbl_qt_at) {
|
||||||
$warning = 'You may also use double-quoted strings if the string contains single quotes, so you do not have to use escape characters.';
|
$warning = 'You may also use double-quoted strings if the string contains single quotes, so you do not have to use escape characters.';
|
||||||
$phpcsFile->addWarning($warning, $stackPtr, 98723);
|
$phpcsFile->addWarning($warning, $stackPtr);
|
||||||
}
|
}
|
||||||
}//end processSingleQuotedString()
|
}//end processSingleQuotedString()
|
||||||
|
|
||||||
@ -462,3 +460,5 @@ class DoubleQuoteUsageSniff extends VariableUsageSniff
|
|||||||
}//end _hasSpecificSequence()
|
}//end _hasSpecificSequence()
|
||||||
|
|
||||||
}//end class
|
}//end class
|
||||||
|
|
||||||
|
?>
|
||||||
|
@ -77,7 +77,7 @@ class DisallowSpaceIndentSniff implements Sniff
|
|||||||
|
|
||||||
if (strpos($tokens[$stackPtr]['content'], " ") !== false) {
|
if (strpos($tokens[$stackPtr]['content'], " ") !== false) {
|
||||||
$error = 'Tabs must be used to indent lines; spaces are not allowed for code indentation';
|
$error = 'Tabs must be used to indent lines; spaces are not allowed for code indentation';
|
||||||
$phpcsFile->addError($error, $stackPtr, 'indent with tabs!');
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
}
|
}
|
||||||
}//end process()
|
}//end process()
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ class DisallowWitheSpaceAroundPhpTagsSniff implements Sniff
|
|||||||
$isFirst = 0 === $stackPtr;
|
$isFirst = 0 === $stackPtr;
|
||||||
if ( ! $isFirst) {
|
if ( ! $isFirst) {
|
||||||
$error = 'Any char before the opening PHP tag is prohibited. Please remove newline or indentation before the opening PHP tag.';
|
$error = 'Any char before the opening PHP tag is prohibited. Please remove newline or indentation before the opening PHP tag.';
|
||||||
$phpcsFile->addError($error, $stackPtr, 'nothing before opening tag');
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if (T_CLOSE_TAG === $php_tag_code)
|
// if (T_CLOSE_TAG === $php_tag_code)
|
||||||
@ -84,7 +84,7 @@ class DisallowWitheSpaceAroundPhpTagsSniff implements Sniff
|
|||||||
$containsEndTagOnly = strlen($php_tag_string) > 2;
|
$containsEndTagOnly = strlen($php_tag_string) > 2;
|
||||||
if ( ! $isLast || ! $containsEndTagOnly ) {
|
if ( ! $isLast || ! $containsEndTagOnly ) {
|
||||||
$error = 'Any char after the closing PHP tag is prohibited. Please removes newline or spaces after the closing PHP tag.';
|
$error = 'Any char after the closing PHP tag is prohibited. Please removes newline or spaces after the closing PHP tag.';
|
||||||
$phpcsFile->addError($error, $stackPtr, 'nothing after closing tag');
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}//end process()
|
}//end process()
|
||||||
|
@ -71,10 +71,12 @@ class ElseOnNewLineSniff implements Sniff
|
|||||||
$previous_non_blank_token = $tokens[$previous_non_blank_token_ptr];
|
$previous_non_blank_token = $tokens[$previous_non_blank_token_ptr];
|
||||||
if ($previous_non_blank_token['line'] === $else_token['line']) {
|
if ($previous_non_blank_token['line'] === $else_token['line']) {
|
||||||
$error = '"' . $else_token['content'] . '" should be on a new line.';
|
$error = '"' . $else_token['content'] . '" should be on a new line.';
|
||||||
$phpcsFile->addError($error, $stackPtr, 'else on new line');
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
}//end process()
|
}//end process()
|
||||||
|
|
||||||
|
|
||||||
}//end class
|
}//end class
|
||||||
|
|
||||||
|
?>
|
@ -65,7 +65,7 @@ class LogicalNotSpacingSniff implements Sniff
|
|||||||
$next_token = $tokens[$stackPtr + 1];
|
$next_token = $tokens[$stackPtr + 1];
|
||||||
if (T_WHITESPACE !== $previous_token['code'] || T_WHITESPACE !== $next_token['code']) {
|
if (T_WHITESPACE !== $previous_token['code'] || T_WHITESPACE !== $next_token['code']) {
|
||||||
$error = 'Logical operator ! should always be preceded and followed with a whitespace.';
|
$error = 'Logical operator ! should always be preceded and followed with a whitespace.';
|
||||||
$phpcsFile->addError($error, $stackPtr, 'Logical Not operator');
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
}
|
}
|
||||||
}//end process()
|
}//end process()
|
||||||
|
|
||||||
|
@ -0,0 +1,104 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_Files_AbstractClosingCommentSniff.
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2006 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_Files_AbstractClosingCommentSniff.
|
||||||
|
*
|
||||||
|
* Defines some methods used by
|
||||||
|
* CodeIgniter_Sniffs_Files_ClosingFileCommentSniff
|
||||||
|
* and CodeIgniter_Sniffs_Files_ClosingLocationCommentSniff.
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2006 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace CodeIgniter\Sniffs\Files;
|
||||||
|
|
||||||
|
use PHP_CodeSniffer\Sniffs\Sniff;
|
||||||
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
|
||||||
|
class AbstractClosingCommentSniff implements Sniff
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* As an abstract class, this sniff is not associated to any token.
|
||||||
|
*/
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* As an abstract class, this sniff is not dedicated to process a token.
|
||||||
|
*/
|
||||||
|
public function process(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
$error = __CLASS__.'::'.__METHOD__.' is abstract. Please develop this method in a child class.';
|
||||||
|
throw new PHP_CodeSniffer_Exception($error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the comment without its delimiter(s) as well as leading
|
||||||
|
* and traling whitespaces.
|
||||||
|
*
|
||||||
|
* It removes the first #, the two first / (i.e. //) or the first /*
|
||||||
|
* and last \*\/. If a comment starts with /**, then the last * will remain
|
||||||
|
* as well as whitespaces between this star and the comment content.
|
||||||
|
*
|
||||||
|
* @param string $comment Comment containing either comment delimiter(s) and
|
||||||
|
* trailing or leading whitspaces to clean.
|
||||||
|
*
|
||||||
|
* @return string Comment without comment delimiter(s) and whitespaces.
|
||||||
|
*/
|
||||||
|
protected static function _getCommentContent ($comment)
|
||||||
|
{
|
||||||
|
if (self::_stringStartsWith($comment, '#')) {
|
||||||
|
$comment = substr($comment, 1);
|
||||||
|
} else if (self::_stringStartsWith($comment, '//')) {
|
||||||
|
$comment = substr($comment, 2);
|
||||||
|
} else if (self::_stringStartsWith($comment, '/*')) {
|
||||||
|
$comment = substr($comment, 2, strlen($comment) - 2 - 2);
|
||||||
|
}
|
||||||
|
$comment = trim($comment);
|
||||||
|
return $comment;
|
||||||
|
}//_getCommentContent()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binary safe string comparison between $needle and
|
||||||
|
* the beginning of $haystack. Returns true if $haystack starts with
|
||||||
|
* $needle, false otherwise.
|
||||||
|
*
|
||||||
|
* @param string $haystack The string to search in.
|
||||||
|
* @param string $needle The string to search for.
|
||||||
|
*
|
||||||
|
* @return bool true if $haystack starts with $needle, false otherwise.
|
||||||
|
*/
|
||||||
|
protected static function _stringStartsWith ($haystack, $needle)
|
||||||
|
{
|
||||||
|
$startsWith = false;
|
||||||
|
if (strlen($needle) <= strlen($haystack)) {
|
||||||
|
$haystackBeginning = substr($haystack, 0, strlen($needle));
|
||||||
|
if (0 === strcmp($haystackBeginning, $needle)) {
|
||||||
|
$startsWith = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $startsWith;
|
||||||
|
}//_stringStartsWith()
|
||||||
|
}//end class
|
||||||
|
|
||||||
|
?>
|
109
build/CodeIgniter/UnusedSniffs/Files/ClosingFileCommentSniff.php
Executable file
109
build/CodeIgniter/UnusedSniffs/Files/ClosingFileCommentSniff.php
Executable file
@ -0,0 +1,109 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_Files_ClosingFileCommentSniff.
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2006 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_Files_ClosingFileCommentSniff.
|
||||||
|
*
|
||||||
|
* Ensures that a comment containing the file name is available at the end of file.
|
||||||
|
* Only other comments and whitespaces are allowed to follow this specific comment.
|
||||||
|
*
|
||||||
|
* It may be all kind of comment like multi-line and inline C-style comments as
|
||||||
|
* well as PERL-style comments. Any number of white may separate comment delimiters
|
||||||
|
* from comment content. However, content has to be equal to template
|
||||||
|
* "End of file <file_name>". Comparison between content and template is
|
||||||
|
* case-sensitive.
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2006 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace CodeIgniter\Sniffs\Files;
|
||||||
|
|
||||||
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
|
||||||
|
class ClosingFileCommentSniff extends AbstractClosingCommentSniff
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of tokens this test wants to listen for.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
T_OPEN_TAG,
|
||||||
|
);
|
||||||
|
|
||||||
|
}//end register()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes this test, when one of its tokens is encountered.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being scanned.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function process(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
// We are only interested if this is the first open tag.
|
||||||
|
if ($stackPtr !== 0) {
|
||||||
|
if ($phpcsFile->findPrevious(T_OPEN_TAG, ($stackPtr - 1)) !== false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$fullFilename = $phpcsFile->getFilename();
|
||||||
|
$filename = basename($fullFilename);
|
||||||
|
$commentTemplate = "End of file $filename";
|
||||||
|
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
$currentToken = count($tokens) - 1;
|
||||||
|
$hasClosingFileComment = false;
|
||||||
|
$isNotAWhitespaceOrAComment = false;
|
||||||
|
while ($currentToken >= 0
|
||||||
|
&& ! $isNotAWhitespaceOrAComment
|
||||||
|
&& ! $hasClosingFileComment
|
||||||
|
) {
|
||||||
|
$token = $tokens[$currentToken];
|
||||||
|
$tokenCode = $token['code'];
|
||||||
|
if (T_COMMENT === $tokenCode) {
|
||||||
|
$commentString = self::_getCommentContent($token['content']);
|
||||||
|
if (0 === strcmp($commentString, $commentTemplate)) {
|
||||||
|
$hasClosingFileComment = true;
|
||||||
|
}
|
||||||
|
} else if (T_WHITESPACE === $tokenCode) {
|
||||||
|
// Whitespaces are allowed between the closing file comment,
|
||||||
|
// other comments and end of file
|
||||||
|
} else {
|
||||||
|
$isNotAWhitespaceOrAComment = true;
|
||||||
|
}
|
||||||
|
$currentToken--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $hasClosingFileComment) {
|
||||||
|
$error = 'No comment block marks the end of file instead of the closing PHP tag. Please add a comment block containing only "' . $commentTemplate . '".';
|
||||||
|
$phpcsFile->addError($error, $currentToken);
|
||||||
|
}
|
||||||
|
}//end process()
|
||||||
|
}//end class
|
||||||
|
|
||||||
|
?>
|
182
build/CodeIgniter/UnusedSniffs/Files/ClosingLocationCommentSniff.php
Executable file
182
build/CodeIgniter/UnusedSniffs/Files/ClosingLocationCommentSniff.php
Executable file
@ -0,0 +1,182 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_Files_ClosingLocationCommentSniff.
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2006 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_Files_ClosingLocationCommentSniff.
|
||||||
|
*
|
||||||
|
* Ensures that a comment containing the file location exists at the end of file.
|
||||||
|
* Only other comments and whitespaces are allowed between this comment and
|
||||||
|
* the end of file.
|
||||||
|
*
|
||||||
|
* It may be all kind of comment like multi-line and inline C-style comments as
|
||||||
|
* well as PERL-style comments. Any number of white may separate comment delimiters
|
||||||
|
* from comment content. However, content has to be equal to template
|
||||||
|
* "Location: <file_path_relative_to_application_root>".
|
||||||
|
* Comparison between content and template is case-sensitive.
|
||||||
|
*
|
||||||
|
* There are several ways to configure the application root. In order of priority :
|
||||||
|
* - Configuration variable ci_application_root.
|
||||||
|
* - Rule property applicationRoot.
|
||||||
|
* - Default value '/application/'
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2006 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace CodeIgniter\Sniffs\Files;
|
||||||
|
|
||||||
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
use PHP_CodeSniffer\Util\Common;
|
||||||
|
|
||||||
|
class ClosingLocationCommentSniff extends AbstractClosingCommentSniff
|
||||||
|
{
|
||||||
|
public $applicationRoot = '/application/';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of tokens this test wants to listen for.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
T_OPEN_TAG
|
||||||
|
);
|
||||||
|
|
||||||
|
}//end register()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes this test, when one of its tokens is encountered.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being scanned.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function process(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
// We are only interested if this is the first open tag.
|
||||||
|
if ($stackPtr !== 0) {
|
||||||
|
if ($phpcsFile->findPrevious(T_OPEN_TAG, ($stackPtr - 1)) !== false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$filePath = $phpcsFile->getFilename();
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
// removes the application root from the beginning of the file path
|
||||||
|
$locationPath = self::_getLocationPath($filePath, $this->_getAppRoot());
|
||||||
|
// add an error, if application root doesn't exist in current file path
|
||||||
|
if (false === $locationPath) {
|
||||||
|
$error = 'Unable to find "' . $this->_getAppRoot() . '" in file path "' . $filePath . '". Please set your project\'s application root.';
|
||||||
|
$phpcsFile->addError($error, count($tokens) - 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// generates the expected comment
|
||||||
|
$commentTemplate = "Location: $locationPath";
|
||||||
|
|
||||||
|
$currentToken = count($tokens) - 1;
|
||||||
|
$hasClosingLocationComment = false;
|
||||||
|
$isNotAWhitespaceOrAComment = false;
|
||||||
|
while ($currentToken >= 0
|
||||||
|
&& ! $isNotAWhitespaceOrAComment
|
||||||
|
&& ! $hasClosingLocationComment
|
||||||
|
) {
|
||||||
|
$token = $tokens[$currentToken];
|
||||||
|
$tokenCode = $token['code'];
|
||||||
|
if (T_COMMENT === $tokenCode) {
|
||||||
|
$commentString = self::_getCommentContent($token['content']);
|
||||||
|
if (0 === strcmp($commentString, $commentTemplate)) {
|
||||||
|
$hasClosingLocationComment = true;
|
||||||
|
}
|
||||||
|
} else if (T_WHITESPACE === $tokenCode) {
|
||||||
|
// Whitespaces are allowed between the closing file comment,
|
||||||
|
//other comments and end of file
|
||||||
|
} else {
|
||||||
|
$isNotAWhitespaceOrAComment = true;
|
||||||
|
}
|
||||||
|
$currentToken--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $hasClosingLocationComment) {
|
||||||
|
$error = 'No comment block marks the end of file instead of the closing PHP tag. Please add a comment block containing only "' . $commentTemplate . '".';
|
||||||
|
$phpcsFile->addError($error, $currentToken);
|
||||||
|
}
|
||||||
|
}//end process()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the relative path from $appRoot to $filePath, or false if
|
||||||
|
* $appRoot cannot be found in $filePath, because $appRoot is not a parent
|
||||||
|
* of $filePath.
|
||||||
|
*
|
||||||
|
* @param string $filePath Full path to the file being proceed.
|
||||||
|
* @param string $appRoot Partial or full path to the CodeIgniter
|
||||||
|
* application root of the file being proceed. It must not contain the
|
||||||
|
* full path to the application root, but at least the name of the
|
||||||
|
* application root. Parent directory of the application root are allowed
|
||||||
|
* but not mandatory.
|
||||||
|
*
|
||||||
|
* @return string|bool The relative path from $appRoot to $filePath, or
|
||||||
|
* false if $appRoot cannot be found in $filePath.
|
||||||
|
*/
|
||||||
|
private static function _getLocationPath ($filePath, $appRoot)
|
||||||
|
{
|
||||||
|
// removes the path to application root
|
||||||
|
// from the beginning of the file path
|
||||||
|
$appRootAt = strpos($filePath, $appRoot);
|
||||||
|
if (false === $appRootAt) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$localPath = substr($filePath, $appRootAt + strlen($appRoot));
|
||||||
|
// ensures the location path to be a relative path starting with "./".
|
||||||
|
if ( ! self::_stringStartsWith($localPath, './')) {
|
||||||
|
$localPath = './' . $localPath;
|
||||||
|
} else if ( ! self::_stringStartsWith($localPath, '.')
|
||||||
|
&& self::_stringStartsWith($localPath, '/')
|
||||||
|
) {
|
||||||
|
$localPath = '.' . $localPath;
|
||||||
|
}
|
||||||
|
return $localPath;
|
||||||
|
}//end _getLocationPath()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the application root that should be used first.
|
||||||
|
*
|
||||||
|
* There are several ways to configure the application root.
|
||||||
|
* In order of priority :
|
||||||
|
* - Configuration variable ci_application_root.
|
||||||
|
* - Rule property applicationRoot.
|
||||||
|
* - Default value '/application/'
|
||||||
|
*
|
||||||
|
* @return string Path to your project application root.
|
||||||
|
*/
|
||||||
|
private function _getAppRoot()
|
||||||
|
{
|
||||||
|
$appRoot = Common::getConfigData('ci_application_root');
|
||||||
|
if (null === $appRoot) {
|
||||||
|
$appRoot = $this->applicationRoot;
|
||||||
|
}
|
||||||
|
return $appRoot;
|
||||||
|
}//end _getAppRoot()
|
||||||
|
}//end class
|
||||||
|
|
||||||
|
?>
|
142
build/CodeIgniter/UnusedSniffs/NamingConventions/ConstructorNameSniff.php
Executable file
142
build/CodeIgniter/UnusedSniffs/NamingConventions/ConstructorNameSniff.php
Executable file
@ -0,0 +1,142 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ConstructorNameSniff.
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@gmail.com>
|
||||||
|
* @copyright 2011 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace CodeIgniter\Sniffs\NamingConventions;
|
||||||
|
|
||||||
|
use PHP_CodeSniffer\Sniffs\AbstractScopeSniff;
|
||||||
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ConstructorNameSniff.
|
||||||
|
*
|
||||||
|
* Favor PHP 4 constructor syntax, which uses "function ClassName()".
|
||||||
|
* Avoid PHP 5 constructor syntax, which uses "function __construct()".
|
||||||
|
*
|
||||||
|
* @todo Try to avoid overly long and verbose names.
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@gmail.com>
|
||||||
|
* @copyright 2010 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
class ConstructorNameSniff extends AbstractScopeSniff
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public $php5Constructors = '1';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the test with the tokens it wishes to listen for.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct(array(T_CLASS, T_INTERFACE), array(T_FUNCTION), true);
|
||||||
|
|
||||||
|
}//end __construct()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes this test when one of its tokens is encountered.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being scanned.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
* @param int $currScope A pointer to the start of the scope.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function processTokenWithinScope(
|
||||||
|
File $phpcsFile,
|
||||||
|
$stackPtr,
|
||||||
|
$currScope
|
||||||
|
) {
|
||||||
|
$methodName = $phpcsFile->getDeclarationName($stackPtr);
|
||||||
|
$className = $phpcsFile->getDeclarationName($currScope);
|
||||||
|
|
||||||
|
$isPhp4Constructor = strcasecmp($methodName, $className) === 0;
|
||||||
|
$isPhp5Constructor = strcasecmp($methodName, '__construct') === 0;
|
||||||
|
if ($this->php5Constructors != '0') {
|
||||||
|
if ($isPhp4Constructor) {
|
||||||
|
$error = "PHP4 style constructors are not allowed; use \"__construct\" instead";
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($isPhp5Constructor) {
|
||||||
|
$error = "PHP5 style constructors are not allowed; use \"$className\" instead";
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( ! $isPhp4Constructor && ! $isPhp5Constructor ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
|
||||||
|
$parentClassName = $phpcsFile->findExtendedClassName($currScope);
|
||||||
|
$wrongConstructor = '';
|
||||||
|
// prepares the error message and wrong constructor
|
||||||
|
if ($this->php5Constructors != '0') {
|
||||||
|
$error = 'PHP4 style calls to parent constructors are not allowed.';
|
||||||
|
$error = "$error Please use \"parent::__construct\" instead.";
|
||||||
|
if (false !== $parentClassName) {
|
||||||
|
$wrongConstructor = $parentClassName;
|
||||||
|
}
|
||||||
|
// Else $wrongConstructor will be empty
|
||||||
|
// and the test expression will always be false.
|
||||||
|
// It doesn't check that no parent method should be called
|
||||||
|
// when no parent class is defined.
|
||||||
|
} else {
|
||||||
|
$error = 'PHP5 style calls to parent constructors are not allowed.';
|
||||||
|
if (false !== $parentClassName) {
|
||||||
|
$error = "$error Please use \"parent::$parentClassName\" instead.";
|
||||||
|
}
|
||||||
|
$wrongConstructor = '__construct';
|
||||||
|
}
|
||||||
|
|
||||||
|
// looks for the use of a wrong constructor.
|
||||||
|
$endFunctionIndex = $tokens[$stackPtr]['scope_closer'];
|
||||||
|
$doubleColonIndex = $phpcsFile->findNext(
|
||||||
|
array(T_DOUBLE_COLON),
|
||||||
|
$stackPtr,
|
||||||
|
$endFunctionIndex
|
||||||
|
);
|
||||||
|
while ($doubleColonIndex) {
|
||||||
|
if ($tokens[($doubleColonIndex + 1)]['code'] === T_STRING
|
||||||
|
&& $tokens[($doubleColonIndex + 1)]['content'] === $wrongConstructor
|
||||||
|
) {
|
||||||
|
$phpcsFile->addError($error, ($doubleColonIndex + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
$doubleColonIndex = $phpcsFile->findNext(
|
||||||
|
array(T_DOUBLE_COLON),
|
||||||
|
$doubleColonIndex + 1,
|
||||||
|
$endFunctionIndex
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}//end processTokenWithinScope()
|
||||||
|
|
||||||
|
protected function processTokenOutsideScope(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
// TODO: Implement processTokenOutsideScope() method.
|
||||||
|
}
|
||||||
|
|
||||||
|
}//end class
|
||||||
|
|
||||||
|
?>
|
84
build/CodeIgniter/UnusedSniffs/NamingConventions/ValidClassNameSniff.php
Executable file
84
build/CodeIgniter/UnusedSniffs/NamingConventions/ValidClassNameSniff.php
Executable file
@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidClassNameSniff.
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baoabz.com>
|
||||||
|
* @copyright 2010 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidClassNameSniff.
|
||||||
|
*
|
||||||
|
* Ensures that class and interface names have their first letter uppercase
|
||||||
|
* and that words are separated with an underscore, and not CamelCased.
|
||||||
|
*
|
||||||
|
* @todo Try to avoid overly long and verbose names in using property rule and
|
||||||
|
* configuration variable to set limits. Have a look at
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidMethodNameSniff.
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baoabz.com>
|
||||||
|
* @copyright 2010 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace CodeIgniter\Sniffs\NamingConventions;
|
||||||
|
|
||||||
|
use PHP_CodeSniffer\Sniffs\Sniff;
|
||||||
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
|
||||||
|
class ValidClassNameSniff implements Sniff
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of tokens this test wants to listen for.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
T_CLASS,
|
||||||
|
T_INTERFACE,
|
||||||
|
);
|
||||||
|
|
||||||
|
}//end register()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes this test, when one of its tokens is encountered.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being processed.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function process(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
// get the class name
|
||||||
|
$className = trim($phpcsFile->getDeclarationName($stackPtr));
|
||||||
|
// compute the expected class name
|
||||||
|
// [^_] means "something different from _", but not "nothing or something different from _"
|
||||||
|
$lcClassNameChunk = preg_replace('/([^_])([A-Z])/', '${1}_${2}', $className);
|
||||||
|
$expectedClassName
|
||||||
|
= strtoupper($className[0]) . strtolower(substr($lcClassNameChunk,1));
|
||||||
|
// ensures that the current class name
|
||||||
|
// and the expected class name are identical
|
||||||
|
if (0 !== strcmp($className, $expectedClassName)) {
|
||||||
|
$error = 'Class names should always have their first letter uppercase. Multiple words should be separated with an underscore, and not CamelCased. Please consider ' . $expectedClassName . ' instead of ' . $className . '.';
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
}
|
||||||
|
}//end process()
|
||||||
|
|
||||||
|
}//end class
|
||||||
|
|
||||||
|
?>
|
@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidFileNameSniff.
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2011 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidFileNameSniff.
|
||||||
|
*
|
||||||
|
* Tests that the file name matchs the name of the class that it contains in lower case.
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baobaz.com>
|
||||||
|
* @copyright 2011 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace CodeIgniter\Sniffs\NamingConventions;
|
||||||
|
|
||||||
|
use PHP_CodeSniffer\Sniffs\Sniff;
|
||||||
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
|
||||||
|
class ValidFileNameSniff implements Sniff
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns an array of tokens this test wants to listen for.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
T_CLASS,
|
||||||
|
T_INTERFACE,
|
||||||
|
);
|
||||||
|
}//end register()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes this test, when one of its tokens is encountered.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The file being scanned.
|
||||||
|
* @param int $stackPtr The position of the current token in the
|
||||||
|
* stack passed in $tokens.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function process(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
// computes the expected filename based on the name of the class or interface that it contains.
|
||||||
|
$decNamePtr = $phpcsFile->findNext(T_STRING, $stackPtr);
|
||||||
|
$decName = $tokens[$decNamePtr]['content'];
|
||||||
|
$expectedFileName = strtolower($decName);
|
||||||
|
// extracts filename without extension from its path.
|
||||||
|
$fullPath = $phpcsFile->getFilename();
|
||||||
|
$fileNameAndExt = basename($fullPath);
|
||||||
|
$fileName = substr($fileNameAndExt, 0, strrpos($fileNameAndExt, '.'));
|
||||||
|
|
||||||
|
if ($expectedFileName !== $fileName) {
|
||||||
|
$errorTemplate = 'Filename "%s" doesn\'t match the name of the %s that it contains "%s" in lower case. "%s" was expected.';
|
||||||
|
$errorMessage = sprintf(
|
||||||
|
$errorTemplate,
|
||||||
|
$fileName,
|
||||||
|
strtolower($tokens[$stackPtr]['content']), // class or interface
|
||||||
|
$decName,
|
||||||
|
$expectedFileName
|
||||||
|
);
|
||||||
|
$phpcsFile->addError($errorMessage, 0);
|
||||||
|
}
|
||||||
|
}//end process()
|
||||||
|
}//end class
|
||||||
|
|
||||||
|
?>
|
161
build/CodeIgniter/UnusedSniffs/NamingConventions/ValidMethodNameSniff.php
Executable file
161
build/CodeIgniter/UnusedSniffs/NamingConventions/ValidMethodNameSniff.php
Executable file
@ -0,0 +1,161 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidMethodNameSniff.
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baoabz.com>
|
||||||
|
* @copyright 2010 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidMethodNameSniff.
|
||||||
|
*
|
||||||
|
* Ensures that class methods and functions areentirely lowercased and that
|
||||||
|
* words are separated with an underscore, and not CamelCased.
|
||||||
|
* Ensures that private class methods are prefixed with an underscore and that
|
||||||
|
* all other methods are not prefixed with an underscored.
|
||||||
|
* Ensures that names longer than 50 chars are prohibited. Likewise names longer
|
||||||
|
* than 35 chars raise a warning.
|
||||||
|
*
|
||||||
|
* @todo Use a rule property or a configuration variable to allow users to set
|
||||||
|
* their own maximum lengths for function and method names. Have a look at
|
||||||
|
* CodeIgniter_Sniffs_Files_ClosingLocationCommentSniff and application root.
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baoabz.com>
|
||||||
|
* @copyright 2010 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace CodeIgniter\Sniffs\NamingConventions;
|
||||||
|
|
||||||
|
use PHP_CodeSniffer\Sniffs\AbstactScopeSniff;
|
||||||
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
|
||||||
|
class ValidMethodNameSniff extends AbstractScopeSniff
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* A list of all PHP magic methods.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected static $magicMethods = array(
|
||||||
|
'construct',
|
||||||
|
'destruct',
|
||||||
|
'call',
|
||||||
|
'callStatic',
|
||||||
|
'get',
|
||||||
|
'set',
|
||||||
|
'isset',
|
||||||
|
'unset',
|
||||||
|
'sleep',
|
||||||
|
'wakeup',
|
||||||
|
'toString',
|
||||||
|
'set_state',
|
||||||
|
'clone',
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines which token(s) in which scope(s) will be proceed.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct(array(T_CLASS, T_INTERFACE), array(T_FUNCTION), true);
|
||||||
|
|
||||||
|
}//end __construct()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes the tokens within the scope.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The file being processed.
|
||||||
|
* @param int $stackPtr The position where this token was
|
||||||
|
* found.
|
||||||
|
* @param int $currScope The position of the current scope.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function processTokenWithinScope(File $phpcsFile, $stackPtr, $currScope)
|
||||||
|
{
|
||||||
|
$methodName = $phpcsFile->getDeclarationName($stackPtr);
|
||||||
|
if ($methodName === null) {
|
||||||
|
// Ignore closures.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$className = $phpcsFile->getDeclarationName($currScope);
|
||||||
|
|
||||||
|
// Is this a magic method i.e. is prefixed with "__".
|
||||||
|
if (0 === strcmp(substr($methodName, 0, 2), '__')) {
|
||||||
|
$magicPart = substr($methodName, 2);
|
||||||
|
if (in_array($magicPart, self::$magicMethods) === false) {
|
||||||
|
$error = "Method name \"$className::$methodName\" is invalid; only PHP magic methods should be prefixed with a double underscore";
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PHP4 constructors are allowed to break our rules.
|
||||||
|
if ($methodName === $className) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PHP4 destructors are allowed to break our rules.
|
||||||
|
if ($methodName === '_'.$className) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 !== strcmp($methodName, strtolower($methodName))) {
|
||||||
|
$uscrdMethodName = preg_replace('/([A-Z])/', '_${1}', $methodName);
|
||||||
|
$expectedMethodName = strtolower($uscrdMethodName);
|
||||||
|
$error = "Class methods should be entirely lowercased. Please consider \"$expectedMethodName\" instead of \"$methodName\".";
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$methodProps = $phpcsFile->getMethodProperties($stackPtr);
|
||||||
|
$scope = $methodProps['scope'];
|
||||||
|
$scopeSpecified = $methodProps['scope_specified'];
|
||||||
|
|
||||||
|
// If it's a private method, it must have an underscore on the front.
|
||||||
|
if ($scope === 'private' && $methodName{0} !== '_') {
|
||||||
|
$error = "Private method name \"$className::$methodName\" must be prefixed with an underscore";
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it's not a private method, it must not have an underscore on the front.
|
||||||
|
if ($scope !== 'private' && $methodName{0} === '_') {
|
||||||
|
if (true === $scopeSpecified) {
|
||||||
|
$error = "Public method name \"$className::$methodName\" must not be prefixed with an underscore";
|
||||||
|
} else {
|
||||||
|
$error = ucfirst($scope)." method name \"$className::$methodName\" must not be prefixed with an underscore";
|
||||||
|
}
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If name is too verbose,
|
||||||
|
// then either an error or a warning is displayed.
|
||||||
|
$error_limit = 50;
|
||||||
|
$warning_limit = 35;
|
||||||
|
if (strlen($methodName) > $error_limit) {
|
||||||
|
$error = "Overly long and verbose names are prohibited. Please find a name shorter than $error_limit chars.";
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
return;
|
||||||
|
} else if (strlen($methodName) > $warning_limit) {
|
||||||
|
$warning = "Try to avoid overly long and verbose names in finding a name shorter than $warning_limit chars.";
|
||||||
|
$phpcsFile->addWarning($warning, $stackPtr);
|
||||||
|
}
|
||||||
|
}//end processTokenWithinScope()
|
||||||
|
|
||||||
|
}//end class
|
||||||
|
|
||||||
|
?>
|
562
build/CodeIgniter/UnusedSniffs/NamingConventions/ValidVariableNameSniff.php
Executable file
562
build/CodeIgniter/UnusedSniffs/NamingConventions/ValidVariableNameSniff.php
Executable file
@ -0,0 +1,562 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidVariableNameSniff.
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baoabz.com>
|
||||||
|
* @copyright 2010 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidVariableNameSniff.
|
||||||
|
*
|
||||||
|
* Ensures that variable names contain only lowercase letters,
|
||||||
|
* use underscore separators.
|
||||||
|
* Ensures that class attribute names are prefixed with an underscore,
|
||||||
|
* only when they are private.
|
||||||
|
* Ensure that variable names are longer than 3 chars except those declared
|
||||||
|
* in for loops.
|
||||||
|
*
|
||||||
|
* @todo Try to avoid overly long and verbose names in using property rule and
|
||||||
|
* configuration variable to set limits. Have a look at
|
||||||
|
* CodeIgniter_Sniffs_NamingConventions_ValidMethodNameSniff.
|
||||||
|
* @todo Use a property rule or a configuration variable to allow users to set
|
||||||
|
* minimum variable name length. Have a look at
|
||||||
|
* CodeIgniter_Sniffs_Files_ClosingLocationCommentSniff and application root.
|
||||||
|
*
|
||||||
|
* @category PHP
|
||||||
|
* @package PHP_CodeSniffer
|
||||||
|
* @author Thomas Ernest <thomas.ernest@baoabz.com>
|
||||||
|
* @copyright 2010 Thomas Ernest
|
||||||
|
* @license http://thomas.ernest.fr/developement/php_cs/licence GNU General Public License
|
||||||
|
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||||
|
*/
|
||||||
|
namespace CodeIgniter\Sniffs\NamingConventions;
|
||||||
|
|
||||||
|
use PHP_CodeSniffer\Sniffs\AbstractVariableSniff;
|
||||||
|
use PHP_CodeSniffer\Files\File;
|
||||||
|
|
||||||
|
class ValidVariableNameSniff extends AbstractVariableSniff
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes class member variables.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The file being scanned.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function processMemberVar(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
// get variable name and properties
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
$varTk = $tokens[$stackPtr];
|
||||||
|
$varName = substr($varTk['content'], 1);
|
||||||
|
$varProps = $phpcsFile->getMemberProperties($stackPtr);
|
||||||
|
// check(s)
|
||||||
|
if ( ! $this->checkLowerCase($phpcsFile, $stackPtr, $varName) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( ! $this->checkVisibilityPrefix($phpcsFile, $stackPtr, $varName, $varProps)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( ! $this->checkLength($phpcsFile, $stackPtr, $varName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}//end processMemberVar()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes normal variables.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The file where this token was found.
|
||||||
|
* @param int $stackPtr The position where the token was found.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function processVariable(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
// get variable name
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
$varTk = $tokens[$stackPtr];
|
||||||
|
$varName = substr($varTk['content'], 1);
|
||||||
|
// skip the current object variable, i.e. $this
|
||||||
|
if (0 === strcmp($varName, 'this')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// check(s)
|
||||||
|
if ( ! $this->checkLowerCase($phpcsFile, $stackPtr, $varName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( ! $this->checkLength($phpcsFile, $stackPtr, $varName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}//end processVariable()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes variables in double quoted strings.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The file where this token was found.
|
||||||
|
* @param int $stackPtr The position where the token was found.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function processVariableInString(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
$stringTk = $tokens[$stackPtr];
|
||||||
|
$stringString = $stringTk['content'];
|
||||||
|
$varAt = self::_getVariablePosition($stringString, 0);
|
||||||
|
while (false !== $varAt) {
|
||||||
|
// get variable name
|
||||||
|
$matches = array();
|
||||||
|
preg_match('/^\$\{?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}?/', substr($stringString, $varAt), $matches);
|
||||||
|
$varName = $matches[1];
|
||||||
|
// check(s)
|
||||||
|
if ( ! $this->checkLowerCase($phpcsFile, $stackPtr, $varName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( ! $this->checkLength($phpcsFile, $stackPtr, $varName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// prepare checking next variable
|
||||||
|
$varAt = self::_getVariablePosition($stringString, $varAt + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}//end processVariableInString()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that the variable name is all in lower case, else it add an error
|
||||||
|
* to $phpcsFile. Returns true if variable name is all in lower case, false
|
||||||
|
* otherwise.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being processed.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
* @param string $varName The name of the variable to
|
||||||
|
* procced without $, { nor }.
|
||||||
|
*
|
||||||
|
* @return bool true if variable name is all in lower case, false otherwise.
|
||||||
|
*/
|
||||||
|
protected function checkLowerCase(File $phpcsFile, $stackPtr, $varName)
|
||||||
|
{
|
||||||
|
$isInLowerCase = true;
|
||||||
|
if (0 !== strcmp($varName, strtolower($varName))) {
|
||||||
|
// get the expected variable name
|
||||||
|
$varNameWithUnderscores = preg_replace('/([A-Z])/', '_${1}', $varName);
|
||||||
|
$expectedVarName = strtolower(ltrim($varNameWithUnderscores, '_'));
|
||||||
|
// adapts the error message to the error case
|
||||||
|
if (strlen($varNameWithUnderscores) > strlen($varName)) {
|
||||||
|
$error = 'Variables should not use CamelCasing or start with a Capital.';
|
||||||
|
} else {
|
||||||
|
$error = 'Variables should be entirely lowercased.';
|
||||||
|
}
|
||||||
|
$error = $error . 'Please consider "' . $expectedVarName
|
||||||
|
. '" instead of "' . $varName . '".';
|
||||||
|
// adds the error and changes return value
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
$isInLowerCase = false;
|
||||||
|
}
|
||||||
|
return $isInLowerCase;
|
||||||
|
}//end checkLowerCase()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that an underscore is used at the beginning of a variable only if
|
||||||
|
* it is about a private variable. If it isn't a private variable, then it
|
||||||
|
* must not be prefixed with an underscore. Returns true if $varName is
|
||||||
|
* properly prefixed according to the variable visibility provided in
|
||||||
|
* $varProps, false otherwise.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being processed.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
* @param string $varName The name of the variable to
|
||||||
|
* procced without $, { nor }.
|
||||||
|
* @param array $varProps Member variable properties like
|
||||||
|
* its visibility.
|
||||||
|
*
|
||||||
|
* @return bool true if variable name is prefixed with an underscore only
|
||||||
|
* when it is about a private variable, false otherwise.
|
||||||
|
*/
|
||||||
|
protected function checkVisibilityPrefix(File $phpcsFile, $stackPtr, $varName, $varProps)
|
||||||
|
{
|
||||||
|
$isVisibilityPrefixRight = true;
|
||||||
|
$scope = $varProps['scope'];
|
||||||
|
// If it's a private variable, it must have an underscore on the front.
|
||||||
|
if ($scope === 'private' && $varName{0} !== '_') {
|
||||||
|
$error = "Private variable name \"$varName\" must be prefixed with an underscore";
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
$isVisibilityPrefixRight = false;
|
||||||
|
} else if ($scope !== 'private' && $varName{0} === '_') {
|
||||||
|
// If it's not a private variable,
|
||||||
|
// then it must not start with an underscore.
|
||||||
|
if (isset ($scopeSpecified) && true === $scopeSpecified) {
|
||||||
|
$error = "Public variable name \"$varName\" must not be prefixed with an underscore";
|
||||||
|
} else {
|
||||||
|
$error = ucfirst($scope) . " variable name \"$varName\" must not be prefixed with an underscore";
|
||||||
|
}
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
$isVisibilityPrefixRight = false;
|
||||||
|
}
|
||||||
|
return $isVisibilityPrefixRight;
|
||||||
|
}//end checkVisibilityPrefix()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that variable name length is not too short. Returns true, if it
|
||||||
|
* meets minimum length requirement, false otherwise.
|
||||||
|
*
|
||||||
|
* A variable name is too short if it is shorter than the minimal
|
||||||
|
* length and it isn't in the list of allowed short names nor declared in a
|
||||||
|
* for loop (in which it would be nested).
|
||||||
|
* The minimal length is defined in the function. It is 3 chars now.
|
||||||
|
* The list of allowed short names is defined in the function.
|
||||||
|
* It is case-sensitive. It contains only 'ci' now.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being processed.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
* @param string $varName The name of the variable to
|
||||||
|
* procced without $, { nor }.
|
||||||
|
*
|
||||||
|
* @return bool false if variable name $varName is shorter than the minimal
|
||||||
|
* length and it isn't in the list of allowed short names nor declared in a
|
||||||
|
* for loop (in which it would be nested), otherwise true.
|
||||||
|
*/
|
||||||
|
protected function checkLength(File $phpcsFile, $stackPtr, $varName)
|
||||||
|
{
|
||||||
|
$minLength = 3;
|
||||||
|
$allowedShortName = array('ci');
|
||||||
|
|
||||||
|
$isLengthRight = true;
|
||||||
|
// cleans variable name
|
||||||
|
$varName = ltrim($varName, '_');
|
||||||
|
if (strlen($varName) <= $minLength) {
|
||||||
|
// skips adding an error, if it is a specific variable name
|
||||||
|
if (in_array($varName, $allowedShortName)) {
|
||||||
|
return $isLengthRight;
|
||||||
|
}
|
||||||
|
// skips adding an error, if the variable is in a for loop
|
||||||
|
if (false !== self::_isInForLoop($phpcsFile, $stackPtr, $varName)) {
|
||||||
|
return $isLengthRight;
|
||||||
|
}
|
||||||
|
// adds the error message finally
|
||||||
|
$error = 'Very short'
|
||||||
|
. (
|
||||||
|
$minLength > 0 ?
|
||||||
|
' (i.e. less than ' . ($minLength + 1) . ' chars)'
|
||||||
|
: ''
|
||||||
|
)
|
||||||
|
. ', non-word variables like "' . $varName
|
||||||
|
. '" should only be used as iterators in for() loops.';
|
||||||
|
$phpcsFile->addError($error, $stackPtr);
|
||||||
|
$isLengthRight = false;
|
||||||
|
}
|
||||||
|
return $isLengthRight;
|
||||||
|
}//end checkLength()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the position of closest previous T_FOR, if token associated with
|
||||||
|
* $stackPtr in $phpcsFile is in a for loop, otherwise false.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being processed.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
* @param string $varName The name of the variable to
|
||||||
|
* procced without $, { nor }.
|
||||||
|
*
|
||||||
|
* @return int|bool Position of T_FOR if token associated with $stackPtr in
|
||||||
|
* $phpcsFile is in the head of a for loop, otherwise false.
|
||||||
|
*/
|
||||||
|
private static function _isInForLoop(File $phpcsFile, $stackPtr, $varName)
|
||||||
|
{
|
||||||
|
$keepLookingFromPtr = $stackPtr;
|
||||||
|
while (false !== $keepLookingFromPtr) {
|
||||||
|
// looks if it is in (head or body) of a for loop
|
||||||
|
$forPtr = self::_isInForLoopHead($phpcsFile, $keepLookingFromPtr);
|
||||||
|
if (false === $forPtr) {
|
||||||
|
$forPtr = self::_isInForLoopBody($phpcsFile, $keepLookingFromPtr);
|
||||||
|
}
|
||||||
|
// checks if it is declared in here and prepares next step
|
||||||
|
if (false !== $forPtr) {
|
||||||
|
if (false !== self::_isDeclaredInForLoop($phpcsFile, $forPtr, $varName)) {
|
||||||
|
return $forPtr;
|
||||||
|
}
|
||||||
|
$keepLookingFromPtr = $forPtr;
|
||||||
|
} else {
|
||||||
|
$keepLookingFromPtr = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}//end _isInForLoop()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the position of closest previous T_FOR, if token associated with
|
||||||
|
* $stackPtr in $phpcsFile is in the head of a for loop, otherwise false.
|
||||||
|
* The head is the code placed between parenthesis next to the key word
|
||||||
|
* 'for' : for (<loop_head>) {<loop_body>}.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being processed.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
*
|
||||||
|
* @return int|bool Position of T_FOR if token associated with $stackPtr in
|
||||||
|
* $phpcsFile is in the head of a for loop, otherwise false.
|
||||||
|
*/
|
||||||
|
private static function _isInForLoopHead(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
$isInForLoop = false;
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
$currentTk = $tokens[$stackPtr];
|
||||||
|
if (array_key_exists('nested_parenthesis', $currentTk)) {
|
||||||
|
$nestedParenthesis = $currentTk['nested_parenthesis'];
|
||||||
|
foreach ( $nestedParenthesis as $openParPtr => $closeParPtr) {
|
||||||
|
$nonWhitspacePtr = $phpcsFile->findPrevious(
|
||||||
|
array(T_WHITESPACE),
|
||||||
|
$openParPtr - 1,
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
if (false !== $nonWhitspacePtr) {
|
||||||
|
$isFor = T_FOR === $tokens[$nonWhitspacePtr]['code'];
|
||||||
|
if ($isFor) {
|
||||||
|
$isInForLoop = $nonWhitspacePtr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $isInForLoop;
|
||||||
|
}//end _isInForLoopHead()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the position of closest previous T_FOR, if token associated with
|
||||||
|
* $stackPtr in $phpcsFile is in the body of a for loop, otherwise false.
|
||||||
|
* The body are the instructions placed after parenthesis of a 'for'
|
||||||
|
* declaration, enclosed with curly brackets usually.
|
||||||
|
* 'for' : for (<loop_head>) {<loop_body>}.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being processed.
|
||||||
|
* @param int $stackPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
*
|
||||||
|
* @return int|bool Position of T_FOR if token associated with $stackPtr in
|
||||||
|
* $phpcsFile is in the body of a for loop, otherwise false.
|
||||||
|
*/
|
||||||
|
private static function _isInForLoopBody(File $phpcsFile, $stackPtr)
|
||||||
|
{
|
||||||
|
$isInForLoop = false;
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
// get englobing hierarchy
|
||||||
|
$parentPtrAndCode = $tokens[$stackPtr]['conditions'];
|
||||||
|
krsort($parentPtrAndCode);
|
||||||
|
|
||||||
|
// looks for a for loop having a body not enclosed with curly brackets,
|
||||||
|
// which involves that its body contains only one instruction.
|
||||||
|
if (is_array($parentPtrAndCode) && ! empty($parentPtrAndCode)) {
|
||||||
|
$parentCode = reset($parentPtrAndCode);
|
||||||
|
$parentPtr = key($parentPtrAndCode);
|
||||||
|
$openBracketPtr = $tokens[$parentPtr]['scope_opener'];
|
||||||
|
} else {
|
||||||
|
$parentCode = 0;
|
||||||
|
$parentPtr = 0;
|
||||||
|
$openBracketPtr = 0;
|
||||||
|
}
|
||||||
|
$openResearchScopePtr = $stackPtr;
|
||||||
|
// recursive search, since a for statement may englobe other inline
|
||||||
|
// control statement or may be near to function calls, etc...
|
||||||
|
while (false !== $openResearchScopePtr) {
|
||||||
|
$closeParPtr = $phpcsFile->findPrevious(
|
||||||
|
array(T_CLOSE_PARENTHESIS),
|
||||||
|
$openResearchScopePtr,
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
// is there a closing parenthesis with a control statement before
|
||||||
|
// the previous instruction ?
|
||||||
|
if (false !== $closeParPtr) {
|
||||||
|
// is there no opening curly bracket specific to
|
||||||
|
// set of instructions, between the closing parenthesis
|
||||||
|
// and the current token ?
|
||||||
|
if ($openBracketPtr < $closeParPtr) {
|
||||||
|
// starts the search from the token before the closing
|
||||||
|
// parenthesis, if it isn't a for statement
|
||||||
|
$openResearchScopePtr = $closeParPtr - 1;
|
||||||
|
// is this parenthesis associated with a for statement ?
|
||||||
|
$closeParenthesisTk = $tokens[$closeParPtr];
|
||||||
|
if (array_key_exists('parenthesis_owner', $closeParenthesisTk)) {
|
||||||
|
$mayBeForPtr = $closeParenthesisTk['parenthesis_owner'];
|
||||||
|
$mayBeForTk = $tokens[$mayBeForPtr];
|
||||||
|
if (T_FOR === $mayBeForTk['code']) {
|
||||||
|
return $mayBeForPtr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// if it is about a for loop, don't go further
|
||||||
|
// and detect it after one more loop execution, do it now
|
||||||
|
if (T_FOR === $parentCode) {
|
||||||
|
return $parentPtr;
|
||||||
|
}
|
||||||
|
// starts the search from the token before the one
|
||||||
|
// englobing the current statement
|
||||||
|
$openResearchScopePtr = $parentPtr - 1;
|
||||||
|
// re-initialize variables about the englobing structure
|
||||||
|
if (is_array($parentPtrAndCode)) {
|
||||||
|
$parentCode = next($parentPtrAndCode);
|
||||||
|
$parentPtr = key($parentPtrAndCode);
|
||||||
|
$openBracketPtr = $tokens[$parentPtr]['scope_opener'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$openResearchScopePtr = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// looks for a for loop having a body enclosed with curly brackets
|
||||||
|
foreach ($parentPtrAndCode as $parentPtr => $parentCode) {
|
||||||
|
if (T_FOR === $parentCode) {
|
||||||
|
return $parentPtr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}//end _isInForLoopBody()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if a variable declared in the head of the for loop pointed
|
||||||
|
* by $forPtr in file $phpcsFile has the name $varName.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being processed.
|
||||||
|
* @param int $forPtr The position of the 'for' token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
* @param string $varName The name of the variable to
|
||||||
|
* procced without $, { nor }.
|
||||||
|
*
|
||||||
|
* @return int|bool true if a variable declared in the head of the for loop
|
||||||
|
* pointed by $forPtr in file $phpcsFile has the name $varName.
|
||||||
|
*/
|
||||||
|
private static function _isDeclaredInForLoop(File $phpcsFile, $forPtr, $varName)
|
||||||
|
{
|
||||||
|
$isDeclaredInFor = false;
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
$forVarPtrs = self::_getVarDeclaredInFor($phpcsFile, $forPtr);
|
||||||
|
foreach ($forVarPtrs as $forVarPtr) {
|
||||||
|
$forVarTk = $tokens[$forVarPtr];
|
||||||
|
// get variable name
|
||||||
|
$matches = array();
|
||||||
|
preg_match('/^\$\{?([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}?/', $forVarTk['content'], $matches);
|
||||||
|
$forVarName = $matches[1];
|
||||||
|
if (0 === strcmp($forVarName, $varName)) {
|
||||||
|
$isDeclaredInFor = $forVarPtr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $isDeclaredInFor;
|
||||||
|
}//end _isDeclaredInForLoop()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns list of pointers to variables declared in for loop associated to
|
||||||
|
* $forPtr in file $phpcsFile.
|
||||||
|
*
|
||||||
|
* All pointers in the result list are pointing to token with code
|
||||||
|
* T_VARIABLE. An exception is raised, if $forPtr doesn't point a token with
|
||||||
|
* code T_FOR.
|
||||||
|
*
|
||||||
|
* @param File $phpcsFile The current file being processed.
|
||||||
|
* @param int $forPtr The position of the current token
|
||||||
|
* in the stack passed in $tokens.
|
||||||
|
*
|
||||||
|
* @return array List of pointers to variables declared in for loop $forPtr.
|
||||||
|
*/
|
||||||
|
private static function _getVarDeclaredInFor(File $phpcsFile, $forPtr)
|
||||||
|
{
|
||||||
|
$tokens = $phpcsFile->getTokens();
|
||||||
|
$forTk = $tokens[$forPtr];
|
||||||
|
if (T_FOR !== $forTk['code']) {
|
||||||
|
throw new PHP_CodeSniffer_Exception('$forPtr must be of type T_FOR');
|
||||||
|
}
|
||||||
|
$openParPtr = $forTk['parenthesis_opener'];
|
||||||
|
$openParenthesisTk = $tokens[$openParPtr];
|
||||||
|
$endOfDeclPtr = $phpcsFile->findNext(array(T_SEMICOLON), $openParPtr);
|
||||||
|
$forVarPtrs = array();
|
||||||
|
$varPtr = $phpcsFile->findNext(
|
||||||
|
array(T_VARIABLE),
|
||||||
|
$openParPtr + 1,
|
||||||
|
$endOfDeclPtr
|
||||||
|
);
|
||||||
|
while (false !== $varPtr) {
|
||||||
|
$forVarPtrs [] = $varPtr;
|
||||||
|
$varPtr = $phpcsFile->findNext(
|
||||||
|
array(T_VARIABLE),
|
||||||
|
$varPtr + 1,
|
||||||
|
$endOfDeclPtr
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $forVarPtrs;
|
||||||
|
}//end _getVarDeclaredInFor()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the position of first occurrence of a PHP variable starting with
|
||||||
|
* $ in $haystack from $offset.
|
||||||
|
*
|
||||||
|
* @param string $haystack The string to search in.
|
||||||
|
* @param int $offset The optional offset parameter allows you to
|
||||||
|
* specify which character in haystack to start
|
||||||
|
* searching. The returned position is still
|
||||||
|
* relative to the beginning of haystack.
|
||||||
|
*
|
||||||
|
* @return mixed The position as an integer
|
||||||
|
* or the boolean false, if no variable is found.
|
||||||
|
*/
|
||||||
|
private static function _getVariablePosition($haystack, $offset = 0)
|
||||||
|
{
|
||||||
|
$var_starts_at = strpos($haystack, '$', $offset);
|
||||||
|
$is_a_var = false;
|
||||||
|
while (false !== $var_starts_at && ! $is_a_var) {
|
||||||
|
// makes sure that $ is used for a variable and not as a symbol,
|
||||||
|
// if $ is protected with the escape char, then it is a symbol.
|
||||||
|
if (0 !== strcmp($haystack[$var_starts_at - 1], '\\')) {
|
||||||
|
if (0 === strcmp($haystack[$var_starts_at + 1], '{')) {
|
||||||
|
// there is an opening brace in the right place
|
||||||
|
// so it looks for the closing brace in the right place
|
||||||
|
$hsChunk2 = substr($haystack, $var_starts_at + 2);
|
||||||
|
if (1 === preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\}/', $hsChunk2)) {
|
||||||
|
$is_a_var = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$hsChunk1 = substr($haystack, $var_starts_at + 1);
|
||||||
|
if (1 === preg_match('/^[a-zA-Z_\x7f-\xff]/', $hsChunk1)) {
|
||||||
|
// $ is used for a variable and not as a symbol,
|
||||||
|
// since what follows $ matchs the definition of
|
||||||
|
// a variable label for PHP.
|
||||||
|
$is_a_var = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// update $var_starts_at for the next variable
|
||||||
|
// only if no variable was found, since it is returned otherwise.
|
||||||
|
if ( ! $is_a_var) {
|
||||||
|
$var_starts_at = strpos($haystack, '$', $var_starts_at + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($is_a_var) {
|
||||||
|
return $var_starts_at;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}//end _getVariablePosition()
|
||||||
|
}//end class
|
||||||
|
|
||||||
|
?>
|
12
build/docker_install.sh
Normal file
12
build/docker_install.sh
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# We need to install dependencies only for Docker
|
||||||
|
[[ ! -e /.dockerenv ]] && [[ ! -e /.dockerinit ]] && exit 0
|
||||||
|
|
||||||
|
set -xe
|
||||||
|
|
||||||
|
# Install git (the php image doesn't have it) which is required by composer
|
||||||
|
echo -e 'http://dl-cdn.alpinelinux.org/alpine/edge/main\nhttp://dl-cdn.alpinelinux.org/alpine/edge/community\nhttp://dl-cdn.alpinelinux.org/alpine/edge/testing' > /etc/apk/repositories
|
||||||
|
apk upgrade --update && apk add --no-cache \
|
||||||
|
curl \
|
||||||
|
git
|
@ -3,13 +3,13 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
215
build/phpdox.xml
215
build/phpdox.xml
@ -1,134 +1,129 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<!-- This is a skeleton phpDox config file - Check http://phpDox.de for latest version and more info -->
|
<!-- This is a skeleton phpDox config file - Check http://phpDox.de for latest version and more info -->
|
||||||
<phpdox xmlns="http://xml.phpdox.net/config" silent="false">
|
<phpdox xmlns="http://xml.phpdox.net/config" silent="false">
|
||||||
|
<!-- @silent: true | false to enable or disable visual output of progress -->
|
||||||
|
|
||||||
<!-- A phpDox project to process, you can have multiple projects in one config file -->
|
<!-- Additional bootstrap files to load for additional parsers, enrichers and/or engines -->
|
||||||
<project name="Ion Framework" source="../src" workdir="${basedir}/phpdox/xml">
|
<!-- Place as many require nodes as you feel like in this container -->
|
||||||
<!-- @name - The name of the project -->
|
<!-- syntax: <require file="/path/to/file.php" /> -->
|
||||||
<!-- @source - The source directory of the application to process -->
|
<bootstrap />
|
||||||
<!-- @workdir - The directory to store the xml data files in -->
|
|
||||||
|
|
||||||
<!-- A phpDox config file can define additional variables (properties) per project -->
|
<!-- A phpDox project to process, you can have multiple projects in one config file -->
|
||||||
<!-- <property name="some.name" value="the.value" /> -->
|
<project name="Ion Framework" source="../src" workdir="phpdox/xml">
|
||||||
|
<!-- @name - The name of the project -->
|
||||||
|
<!-- @source - The source directory of the application to process -->
|
||||||
|
<!-- @workdir - The directory to store the xml data files in -->
|
||||||
|
|
||||||
<!-- Values can make use of previously defined properties -->
|
<!-- A phpDox config file can define additional variables (properties) per project -->
|
||||||
<!-- The following are defined by default:
|
<!-- <property name="some.name" value="the.value" /> -->
|
||||||
|
|
||||||
${basedir} Directory the loaded config file is in
|
<!-- Values can make use of previously defined properties -->
|
||||||
|
<!-- The following are defined by default:
|
||||||
|
|
||||||
${phpDox.home} Directory of the phpDox installation
|
${basedir} Directory the loaded config file is in
|
||||||
${phpDox.file} The current config file
|
|
||||||
${phpDox.version} phpDox' version number
|
|
||||||
|
|
||||||
${phpDox.project.name} The value of project/@name if set, otherwise 'unnamed'
|
${phpDox.home} Directory of the phpDox installation
|
||||||
${phpDox.project.source} The value of project/@source if set, otherwise '${basedir}/src'
|
${phpDox.file} The current config file
|
||||||
${phpDox.project.workdir} The value of project/@workdir if set, otherwise '${basedir}/build/phpdox/xml'
|
${phpDox.version} phpDox' version number
|
||||||
|
|
||||||
${phpDox.php.version} The PHP Version of the interpreter in use
|
${phpDox.project.name} The value of project/@name if set, otherwise 'unnamed'
|
||||||
|
${phpDox.project.source} The value of project/@source if set, otherwise '${basedir}/src'
|
||||||
|
${phpDox.project.workdir} The value of project/@workdir if set, otherwise '${basedir}/build/phpdox/xml'
|
||||||
|
|
||||||
-->
|
${phpDox.php.version} The PHP Version of the interpreter in use
|
||||||
|
|
||||||
<!-- Additional configuration for the collecting process (parsing of php code, generation of xml data) -->
|
-->
|
||||||
<collector publiconly="false" backend="parser" encoding="auto">
|
|
||||||
<!-- @publiconly - Flag to disable/enable processing of non public methods and members -->
|
|
||||||
<!-- @backend - The collector backend to use, currently only shipping with 'parser' -->
|
|
||||||
<!-- @encoding - Charset encoding of source files (overwrite default 'auto' if detection fails) -->
|
|
||||||
|
|
||||||
<!-- <include / exclude filter for filelist generator, mask must follow fnmatch() requirements -->
|
<!-- Additional configuration for the collecting process (parsing of php code, generation of xml data) -->
|
||||||
<!-- Multiple elements can be added to define more than one mask per filter -->
|
<collector publiconly="false" backend="parser" encoding="auto">
|
||||||
<include mask="*.php" />
|
<!-- @publiconly - Flag to disable/enable processing of non public methods and members -->
|
||||||
<exclude mask="" />
|
<!-- @backend - The collector backend to use, currently only shipping with 'parser' -->
|
||||||
|
<!-- @encoding - Charset encoding of source files (overwrite default 'auto' if detection fails) -->
|
||||||
|
|
||||||
<!-- How to handle inheritance -->
|
<!-- <include / exclude filter for filelist generator, mask must follow fnmatch() requirements -->
|
||||||
<inheritance resolve="true">
|
<include mask="*.php" />
|
||||||
<!-- @resolve - Flag to enable/disable resolving of inheritance -->
|
<exclude mask="" />
|
||||||
|
|
||||||
<!-- You can define multiple (external) dependencies to be included -->
|
<!-- How to handle inheritance -->
|
||||||
<!-- <dependency path="" -->
|
<inheritance resolve="true">
|
||||||
<!-- @path - path to a directory containing an index.xml for a dependency project -->
|
<!-- @resolve - Flag to enable/disable resolving of inheritance -->
|
||||||
</inheritance>
|
|
||||||
|
|
||||||
</collector>
|
|
||||||
|
|
||||||
<!-- Configuration of generation process -->
|
|
||||||
<generator output="../docs">
|
|
||||||
<!-- @output - (Base-)Directory to store output data in -->
|
|
||||||
|
|
||||||
<!-- A generation process consists of one or more build tasks and of (optional) enrich sources -->
|
|
||||||
|
|
||||||
<enrich base="${basedir}/logs">
|
|
||||||
<!-- @base - (Base-)Directory of datafiles used for enrich process -->
|
|
||||||
|
|
||||||
<!--<source type="...">-->
|
|
||||||
<!-- @type - the handler for the enrichment -->
|
|
||||||
<!-- known types by default are: build, checkstyle, git, phpcs, phploc, phpunit, pmd -->
|
|
||||||
|
|
||||||
<!-- every enrichment source can have additional configuration nodes, most probably need a logfile -->
|
|
||||||
<!-- <file name="path/to/log.xml" /> -->
|
|
||||||
<!--</source> -->
|
|
||||||
|
|
||||||
<!-- add phploc output -->
|
|
||||||
<source type="phploc">
|
|
||||||
<file name="phploc.xml" />
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<!-- git vcs information -->
|
|
||||||
<source type="git">
|
|
||||||
<git binary="/usr/bin/git" />
|
|
||||||
<history enabled="true" limit="15" cache="${phpDox.project.workdir}/gitlog.xml" />
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<!-- PHP Code Sniffer findings -->
|
|
||||||
<!-- <source type="checkstyle">
|
|
||||||
<file name="phpcs.xml" />
|
|
||||||
</source> -->
|
|
||||||
|
|
||||||
<!-- PHPMessDetector -->
|
|
||||||
<!--
|
|
||||||
<source type="pmd">
|
|
||||||
<file name="pmd.xml" />
|
|
||||||
</source>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- PHPUnit Coverage XML -->
|
|
||||||
<!-- <source type="phpunit"> -->
|
|
||||||
<!-- <coverage path="" /> -->
|
|
||||||
<!-- @path - the directory where the xml code coverage report can be found -->
|
|
||||||
<!--</source>-->
|
|
||||||
<!--
|
|
||||||
<source type="phpunit">
|
|
||||||
<filter directory="${phpDox.project.source}" />
|
|
||||||
</source>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- PHPUnit Coverage XML -->
|
|
||||||
<source type="phpunit">
|
|
||||||
<coverage path="${basedir}/logs/coverage" />
|
|
||||||
<!-- <coverage path="" /> -->
|
|
||||||
<!-- @path - the directory where the xml code coverage report can be found -->
|
|
||||||
<!--<filter directory="${phpDox.project.source}" />-->
|
|
||||||
<!-- @directory - path of the phpunit config whitelist filter directory -->
|
|
||||||
<filter directory="${phpDox.project.source}" />
|
|
||||||
</source>
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- You can define multiple (external) dependencies to be included -->
|
||||||
|
<!-- <dependency path="" -->
|
||||||
|
<!-- @path - path to a directory containing an index.xml for a dependency project -->
|
||||||
|
</inheritance>
|
||||||
|
|
||||||
</enrich>
|
</collector>
|
||||||
|
|
||||||
<!-- <build engine="..." enabled="true" output="..." /> -->
|
<!-- Configuration of generation process -->
|
||||||
<!-- @engine - The name of the engine this build task uses, use ./phpDox - -engines to get a list of available engines -->
|
<generator output="../docs">
|
||||||
<!-- @enabled - Flag to enable/disable this engine, default: enabled=true -->
|
<!-- @output - (Base-)Directory to store output data in -->
|
||||||
<!-- @output - (optional) Output directory; if relative (no / as first char) it is interpreted as relative to generator/@output -->
|
|
||||||
|
|
||||||
<!-- An engine and thus build node can have additional configuration child nodes, please check the documentation for the engine to find out more -->
|
<!-- A generation process consists of one or more build tasks and of (optional) enrich sources -->
|
||||||
|
|
||||||
<!-- default engine "html" -->
|
<enrich base="logs">
|
||||||
<build engine="html" enabled="true">
|
<!-- @base - (Base-)Directory of datafiles used for enrich process -->
|
||||||
<template dir="${phpDox.home}/templates/html" />
|
|
||||||
<file extension="html" />
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</generator>
|
<!--<source type="...">-->
|
||||||
</project>
|
<!-- @type - the handler for the enrichment -->
|
||||||
|
<!-- known types by default are: build, checkstyle, git, phpcs, phploc, phpunit, pmd -->
|
||||||
|
|
||||||
|
<!-- every enrichment source can have additional configuration nodes, most probably need a logfile -->
|
||||||
|
<!-- <file name="path/to/log.xml" /> -->
|
||||||
|
<!--</source> -->
|
||||||
|
|
||||||
|
<!-- add phploc output -->
|
||||||
|
<source type="phploc">
|
||||||
|
<file name="phploc.xml" />
|
||||||
|
</source>
|
||||||
|
|
||||||
|
<!-- git vcs information -->
|
||||||
|
<source type="git">
|
||||||
|
<git binary="/usr/bin/git" />
|
||||||
|
<history enabled="true" limit="15" cache="${phpDox.project.workdir}/gitlog.xml" />
|
||||||
|
</source>
|
||||||
|
|
||||||
|
<!-- PHP Code Sniffer findings -->
|
||||||
|
<source type="checkstyle">
|
||||||
|
<file name="phpcs.xml" />
|
||||||
|
</source>
|
||||||
|
|
||||||
|
<!-- PHPMessDetector -->
|
||||||
|
<!--
|
||||||
|
<source type="pmd">
|
||||||
|
<file name="pmd.xml" />
|
||||||
|
</source>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- PHPUnit Coverage XML -->
|
||||||
|
<source type="phpunit">
|
||||||
|
<coverage path="coverage/clover.xml" />
|
||||||
|
<!-- <coverage path="clover.xml" />-->
|
||||||
|
<!-- @path - the directory where the xml code coverage report can be found -->
|
||||||
|
<!--<filter directory="${phpDox.project.source}" />-->
|
||||||
|
<!-- @directory - path of the phpunit config whitelist filter directory -->
|
||||||
|
</source>
|
||||||
|
<source type="phpunit">
|
||||||
|
<filter directory="${phpDox.project.source}" />
|
||||||
|
</source>
|
||||||
|
|
||||||
|
</enrich>
|
||||||
|
|
||||||
|
<!-- <build engine="..." enabled="true" output="..." /> -->
|
||||||
|
<!-- @engine - The name of the engine this build task uses, use ./phpDox - -engines to get a list of available engines -->
|
||||||
|
<!-- @enabled - Flag to enable/disable this engine, default: enabled=true -->
|
||||||
|
<!-- @output - (optional) Output directory; if relative (no / as first char) it is interpreted as relative to generator/@output -->
|
||||||
|
|
||||||
|
<!-- An engine and thus build node can have additional configuration child nodes, please check the documentation for the engine to find out more -->
|
||||||
|
|
||||||
|
<!-- default engine "html" -->
|
||||||
|
<build engine="html" enabled="true">
|
||||||
|
<template dir="${phpDox.home}/templates/html" />
|
||||||
|
<file extension="html" />
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</generator>
|
||||||
|
</project>
|
||||||
|
|
||||||
</phpdox>
|
</phpdox>
|
@ -17,10 +17,10 @@
|
|||||||
</testsuites>
|
</testsuites>
|
||||||
<logging>
|
<logging>
|
||||||
<log type="coverage-html" target="../coverage"/>
|
<log type="coverage-html" target="../coverage"/>
|
||||||
<!-- <log type="coverage-clover" target="logs/clover.xml"/>
|
<log type="coverage-clover" target="logs/clover.xml"/>
|
||||||
<log type="coverage-crap4j" target="logs/crap4j.xml"/> -->
|
<log type="coverage-crap4j" target="logs/crap4j.xml"/>
|
||||||
<log type="coverage-xml" target="logs/coverage" />
|
<log type="coverage-xml" target="logs/coverage" />
|
||||||
<log type="junit" target="logs/junit.xml" />
|
<log type="junit" target="logs/junit.xml" logIncompleteSkipped="false"/>
|
||||||
</logging>
|
</logging>
|
||||||
<php>
|
<php>
|
||||||
<server name="HTTP_USER_AGENT" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393" />
|
<server name="HTTP_USER_AGENT" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393" />
|
||||||
|
100
composer.json
100
composer.json
@ -1,55 +1,51 @@
|
|||||||
{
|
{
|
||||||
"name": "aviat/ion",
|
"name": "aviat/ion",
|
||||||
"description": "Basic PHP Framework",
|
"description": "Basic PHP Framework",
|
||||||
"license": "MIT",
|
"license":"MIT",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"files": [
|
"files": [
|
||||||
"src/functions.php"
|
"src/functions.php"
|
||||||
],
|
],
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Aviat\\Ion\\": "src/"
|
"Aviat\\Ion\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"Aviat\\Ion\\Tests\\": "tests/",
|
||||||
|
"CodeIgniter\\": "build/CodeIgniter/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"aviat/query": "^2.5",
|
||||||
|
"aura/html": "2.*",
|
||||||
|
"container-interop/container-interop": "1.*",
|
||||||
|
"danielstjules/stringy": "^3.0.0",
|
||||||
|
"psr/http-message": "~1.0",
|
||||||
|
"psr/log": "~1.0",
|
||||||
|
"zendframework/zend-diactoros": "^1.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"pdepend/pdepend": "^2.2",
|
||||||
|
"sebastian/phpcpd": "^3.0",
|
||||||
|
"theseer/phpdox": "dev-master",
|
||||||
|
"phploc/phploc": "^3.0",
|
||||||
|
"phpmd/phpmd": "^2.4",
|
||||||
|
"phpunit/phpunit": "^6.0",
|
||||||
|
"robmorgan/phinx": "^0.8.0",
|
||||||
|
"consolidation/robo": "~1.0@RC",
|
||||||
|
"monolog/monolog": "1.*",
|
||||||
|
"squizlabs/php_codesniffer": "^3.0.0@RC",
|
||||||
|
"phpstan/phpstan": "^0.6.4"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"coverage": "phpdbg -qrr -- vendor/bin/phpunit -c build",
|
||||||
|
"build": "vendor/bin/robo build",
|
||||||
|
"docs": "cd build && ../vendor/bin/phpdox && cd ..",
|
||||||
|
"phpstan": "phpstan analyse src tests",
|
||||||
|
"test": "vendor/bin/phpunit"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"monolog/monolog": "Provides implementation of psr/log"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"autoload-dev": {
|
|
||||||
"psr-4": {
|
|
||||||
"Aviat\\Ion\\Tests\\": "tests/",
|
|
||||||
"CodeIgniter\\": "build/CodeIgniter/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"aura/html": "^2.5.0",
|
|
||||||
"aviat/query": "^2.5.1",
|
|
||||||
"danielstjules/stringy": "^3.1.0",
|
|
||||||
"ext-dom": "*",
|
|
||||||
"ext-json": "*",
|
|
||||||
"php": "^7.2",
|
|
||||||
"psr/http-message": "~1.0",
|
|
||||||
"psr/log": "~1.0",
|
|
||||||
"zendframework/zend-diactoros": "^2.0.0",
|
|
||||||
"zendframework/zend-httphandlerrunner": "^1.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"aura/session": "^2.1.0",
|
|
||||||
"consolidation/robo": "^2.0.0",
|
|
||||||
"monolog/monolog": "^2.0.1",
|
|
||||||
"pdepend/pdepend": "^2.2",
|
|
||||||
"phploc/phploc": "^5.0",
|
|
||||||
"phpmd/phpmd": "^2.4",
|
|
||||||
"phpstan/phpstan": "^0.12.0",
|
|
||||||
"phpunit/phpunit": "^8.4.3",
|
|
||||||
"roave/security-advisories": "dev-master",
|
|
||||||
"sebastian/phpcpd": "^4.1.0",
|
|
||||||
"squizlabs/php_codesniffer": "^3.0.0",
|
|
||||||
"theseer/phpdox": "^0.12.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"coverage": "phpdbg -qrr -- vendor/bin/phpunit -c build",
|
|
||||||
"build": "robo build",
|
|
||||||
"docs": "cd build && ../vendor/bin/phpdox && cd ..",
|
|
||||||
"phpstan": "phpstan analyse -l 7 -c phpstan.neon src tests",
|
|
||||||
"test": "phpunit -c phpunit.dist.xml"
|
|
||||||
},
|
|
||||||
"suggest": {
|
|
||||||
"monolog/monolog": "Provides implementation of psr/log"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
12
phpstan.neon
12
phpstan.neon
@ -1,12 +0,0 @@
|
|||||||
parameters:
|
|
||||||
autoload_files:
|
|
||||||
- %rootDir%/../../../tests/mocks.php
|
|
||||||
- %rootDir%/../../../tests/Di/ContainerTest.php
|
|
||||||
- %rootDir%/../../../tests/Di/ContainerAwareTest.php
|
|
||||||
ignoreErrors:
|
|
||||||
- '#Access to an undefined property Aviat\\Ion\\Tests\\[a-zA-Z0-9_]+Test::\$[a-zA-Z0-9_]+#'
|
|
||||||
- '#Call to an undefined method Aviat\\Ion\\Type\\ArrayType::[a-zA-Z0-9_]+\(\)#'
|
|
||||||
- '#Call to an undefined method Aura\\Html\\HelperLocator::[a-zA-Z0-9_]+\(\)#'
|
|
||||||
- '#Undefined variable: \$var#'
|
|
||||||
excludes_analyse:
|
|
||||||
- %rootDir%/tests/Di/*
|
|
@ -1,19 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<phpunit
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.3/phpunit.xsd"
|
|
||||||
colors="true"
|
|
||||||
stopOnFailure="false"
|
|
||||||
bootstrap="tests/bootstrap.php"
|
|
||||||
beStrictAboutTestsThatDoNotTestAnything="true">
|
|
||||||
<filter>
|
|
||||||
<whitelist>
|
|
||||||
<directory suffix=".php">src</directory>
|
|
||||||
</whitelist>
|
|
||||||
</filter>
|
|
||||||
<testsuites>
|
|
||||||
<testsuite name="Ion">
|
|
||||||
<directory>tests</directory>
|
|
||||||
</testsuite>
|
|
||||||
</testsuites>
|
|
||||||
</phpunit>
|
|
17
phpunit.xml
Normal file
17
phpunit.xml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit
|
||||||
|
colors="true"
|
||||||
|
stopOnFailure="false"
|
||||||
|
bootstrap="tests/bootstrap.php"
|
||||||
|
beStrictAboutTestsThatDoNotTestAnything="true">
|
||||||
|
<filter>
|
||||||
|
<whitelist>
|
||||||
|
<directory suffix=".php">src</directory>
|
||||||
|
</whitelist>
|
||||||
|
</filter>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="Ion">
|
||||||
|
<directory>tests</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
</phpunit>
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
@ -32,7 +32,7 @@ class Config implements ConfigInterface {
|
|||||||
*
|
*
|
||||||
* @var ArrayType
|
* @var ArrayType
|
||||||
*/
|
*/
|
||||||
protected $map;
|
protected $map = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@ -44,27 +44,16 @@ class Config implements ConfigInterface {
|
|||||||
$this->map = $this->arr($configArray);
|
$this->map = $this->arr($configArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Does the config item exist?
|
|
||||||
*
|
|
||||||
* @param string|int|array $key
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function has($key): bool
|
|
||||||
{
|
|
||||||
return $this->map->hasKey($key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a config value
|
* Get a config value
|
||||||
*
|
*
|
||||||
* @param array|string|null $key
|
* @param array|string $key
|
||||||
* @return mixed
|
* @return mixed
|
||||||
* @throws ConfigException
|
* @throws ConfigException
|
||||||
*/
|
*/
|
||||||
public function get($key = NULL)
|
public function get($key)
|
||||||
{
|
{
|
||||||
if (\is_array($key))
|
if (is_array($key))
|
||||||
{
|
{
|
||||||
return $this->map->getDeepKey($key);
|
return $this->map->getDeepKey($key);
|
||||||
}
|
}
|
||||||
@ -78,9 +67,9 @@ class Config implements ConfigInterface {
|
|||||||
* @param string|array $key
|
* @param string|array $key
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function delete($key): void
|
public function delete($key)
|
||||||
{
|
{
|
||||||
if (\is_array($key))
|
if (is_array($key))
|
||||||
{
|
{
|
||||||
$this->map->setDeepKey($key, NULL);
|
$this->map->setDeepKey($key, NULL);
|
||||||
}
|
}
|
||||||
@ -101,7 +90,7 @@ class Config implements ConfigInterface {
|
|||||||
*/
|
*/
|
||||||
public function set($key, $value): ConfigInterface
|
public function set($key, $value): ConfigInterface
|
||||||
{
|
{
|
||||||
if (\is_array($key))
|
if (is_array($key))
|
||||||
{
|
{
|
||||||
$this->map->setDeepKey($key, $value);
|
$this->map->setDeepKey($key, $value);
|
||||||
}
|
}
|
||||||
@ -111,7 +100,7 @@ class Config implements ConfigInterface {
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new InvalidArgumentException('Key must be integer, string, or array, and cannot be empty');
|
throw new InvalidArgumentException("Key must be integer, string, or array, and cannot be empty");
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
@ -20,21 +20,13 @@ namespace Aviat\Ion;
|
|||||||
* Standard interface for retrieving/setting configuration values
|
* Standard interface for retrieving/setting configuration values
|
||||||
*/
|
*/
|
||||||
interface ConfigInterface {
|
interface ConfigInterface {
|
||||||
/**
|
|
||||||
* Does the config item exist?
|
|
||||||
*
|
|
||||||
* @param string|int|array $key
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function has($key): bool;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a config value
|
* Get a config value
|
||||||
*
|
*
|
||||||
* @param array|string|null $key
|
* @param array|string $key
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function get($key = NULL);
|
public function get($key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a config value
|
* Set a config value
|
||||||
@ -44,7 +36,7 @@ interface ConfigInterface {
|
|||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException
|
||||||
* @return ConfigInterface
|
* @return ConfigInterface
|
||||||
*/
|
*/
|
||||||
public function set($key, $value): self;
|
public function set($key, $value): ConfigInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a config value
|
* Remove a config value
|
||||||
@ -52,5 +44,5 @@ interface ConfigInterface {
|
|||||||
* @param string|array $key
|
* @param string|array $key
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function delete($key): void;
|
public function delete($key);
|
||||||
}
|
}
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Di;
|
namespace Aviat\Ion\Di;
|
||||||
@ -68,9 +68,9 @@ class Container implements ContainerInterface {
|
|||||||
*/
|
*/
|
||||||
public function get($id)
|
public function get($id)
|
||||||
{
|
{
|
||||||
if ( ! \is_string($id))
|
if ( ! is_string($id))
|
||||||
{
|
{
|
||||||
throw new ContainerException('Id must be a string');
|
throw new ContainerException("Id must be a string");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->has($id))
|
if ($this->has($id))
|
||||||
@ -101,7 +101,7 @@ class Container implements ContainerInterface {
|
|||||||
*/
|
*/
|
||||||
public function getNew($id, array $args = NULL)
|
public function getNew($id, array $args = NULL)
|
||||||
{
|
{
|
||||||
if ( ! \is_string($id))
|
if ( ! is_string($id))
|
||||||
{
|
{
|
||||||
throw new ContainerException('Id must be a string');
|
throw new ContainerException('Id must be a string');
|
||||||
}
|
}
|
||||||
@ -109,8 +109,8 @@ class Container implements ContainerInterface {
|
|||||||
if ($this->has($id))
|
if ($this->has($id))
|
||||||
{
|
{
|
||||||
// By default, call a factory with the Container
|
// By default, call a factory with the Container
|
||||||
$args = \is_array($args) ? $args : [$this];
|
$args = is_array($args) ? $args : [$this];
|
||||||
$obj = \call_user_func_array($this->container[$id], $args);
|
$obj = call_user_func_array($this->container[$id], $args);
|
||||||
|
|
||||||
// Check for container interface, and apply the container to the object
|
// Check for container interface, and apply the container to the object
|
||||||
// if applicable
|
// if applicable
|
||||||
@ -194,7 +194,7 @@ class Container implements ContainerInterface {
|
|||||||
* @param string $id The logger to retrieve
|
* @param string $id The logger to retrieve
|
||||||
* @return LoggerInterface|null
|
* @return LoggerInterface|null
|
||||||
*/
|
*/
|
||||||
public function getLogger(string $id = 'default'): ?LoggerInterface
|
public function getLogger(string $id = 'default')
|
||||||
{
|
{
|
||||||
return $this->hasLogger($id)
|
return $this->hasLogger($id)
|
||||||
? $this->loggers[$id]
|
? $this->loggers[$id]
|
||||||
@ -211,13 +211,13 @@ class Container implements ContainerInterface {
|
|||||||
*/
|
*/
|
||||||
private function applyContainer($obj)
|
private function applyContainer($obj)
|
||||||
{
|
{
|
||||||
$trait_name = ContainerAware::class;
|
$trait_name = __NAMESPACE__ . '\\ContainerAware';
|
||||||
$interface_name = ContainerAwareInterface::class;
|
$interface_name = __NAMESPACE__ . '\\ContainerAwareInterface';
|
||||||
|
|
||||||
$uses_trait = \in_array($trait_name, class_uses($obj), TRUE);
|
$uses_trait = in_array($trait_name, class_uses($obj), TRUE);
|
||||||
$implements_interface = \in_array($interface_name, class_implements($obj), TRUE);
|
$implements_interface = in_array($interface_name, class_implements($obj), TRUE);
|
||||||
|
|
||||||
if ($uses_trait || $implements_interface)
|
if ($uses_trait OR $implements_interface)
|
||||||
{
|
{
|
||||||
$obj->setContainer($this);
|
$obj->setContainer($this);
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Di;
|
namespace Aviat\Ion\Di;
|
||||||
@ -32,9 +32,9 @@ trait ContainerAware {
|
|||||||
* Set the container for the current object
|
* Set the container for the current object
|
||||||
*
|
*
|
||||||
* @param ContainerInterface $container
|
* @param ContainerInterface $container
|
||||||
* @return self
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function setContainer(ContainerInterface $container): self
|
public function setContainer(ContainerInterface $container)
|
||||||
{
|
{
|
||||||
$this->container = $container;
|
$this->container = $container;
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Di;
|
namespace Aviat\Ion\Di;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Di;
|
namespace Aviat\Ion\Di;
|
||||||
@ -32,8 +32,8 @@ interface ContainerInterface {
|
|||||||
* Finds an entry of the container by its identifier and returns it.
|
* Finds an entry of the container by its identifier and returns it.
|
||||||
*
|
*
|
||||||
* @param string $id Identifier of the entry to look for.
|
* @param string $id Identifier of the entry to look for.
|
||||||
* @throws Exception\NotFoundException No entry was found for this identifier.
|
* @throws NotFoundException No entry was found for this identifier.
|
||||||
* @throws Exception\ContainerException Error while retrieving the entry.
|
* @throws ContainerException Error while retrieving the entry.
|
||||||
* @return mixed Entry.
|
* @return mixed Entry.
|
||||||
*/
|
*/
|
||||||
public function get($id);
|
public function get($id);
|
||||||
@ -75,7 +75,6 @@ interface ContainerInterface {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine whether a logger channel is registered
|
* Determine whether a logger channel is registered
|
||||||
*
|
|
||||||
* @param string $id The logger channel
|
* @param string $id The logger channel
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
@ -96,5 +95,5 @@ interface ContainerInterface {
|
|||||||
* @param string $id The logger to retrieve
|
* @param string $id The logger to retrieve
|
||||||
* @return LoggerInterface|null
|
* @return LoggerInterface|null
|
||||||
*/
|
*/
|
||||||
public function getLogger(string $id = 'default'): ?LoggerInterface;
|
public function getLogger(string $id = 'default');
|
||||||
}
|
}
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Di\Exception;
|
namespace Aviat\Ion\Di\Exception;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Di\Exception;
|
namespace Aviat\Ion\Di\Exception;
|
||||||
|
19
src/Enum.php
19
src/Enum.php
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
@ -20,6 +20,9 @@ use ReflectionClass;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class emulating an enumeration type
|
* Class emulating an enumeration type
|
||||||
|
*
|
||||||
|
* @method bool isValid(mixed $key)
|
||||||
|
* @method array getConstList()
|
||||||
*/
|
*/
|
||||||
abstract class Enum {
|
abstract class Enum {
|
||||||
|
|
||||||
@ -27,15 +30,14 @@ abstract class Enum {
|
|||||||
* Return the list of constant values for the Enum
|
* Return the list of constant values for the Enum
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
* @throws \ReflectionException
|
|
||||||
*/
|
*/
|
||||||
public static function getConstList(): array
|
public static function getConstList(): array
|
||||||
{
|
{
|
||||||
static $self;
|
static $self;
|
||||||
|
|
||||||
if ($self === NULL)
|
if (is_null($self))
|
||||||
{
|
{
|
||||||
$class = static::class;
|
$class = \get_called_class();
|
||||||
$self = new $class;
|
$self = new $class;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,12 +50,11 @@ abstract class Enum {
|
|||||||
*
|
*
|
||||||
* @param mixed $key
|
* @param mixed $key
|
||||||
* @return boolean
|
* @return boolean
|
||||||
* @throws \ReflectionException
|
|
||||||
*/
|
*/
|
||||||
public static function isValid($key): bool
|
public static function isValid($key): bool
|
||||||
{
|
{
|
||||||
$values = array_values(static::getConstList());
|
$values = array_values(static::getConstList());
|
||||||
return \in_array($key, $values, TRUE);
|
return in_array($key, $values);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// End of Enum.php
|
// End of Enum.php
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Exception;
|
namespace Aviat\Ion\Exception;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Exception;
|
namespace Aviat\Ion\Exception;
|
||||||
@ -29,7 +29,7 @@ class DoubleRenderException extends LogicException {
|
|||||||
*
|
*
|
||||||
* @param string $message
|
* @param string $message
|
||||||
* @param int $code
|
* @param int $code
|
||||||
* @param Exception|null $previous
|
* @param null $previous
|
||||||
*/
|
*/
|
||||||
public function __construct(string $message = 'A view can only be rendered once, because headers can only be sent once.', int $code = 0, Exception $previous = NULL)
|
public function __construct(string $message = 'A view can only be rendered once, because headers can only be sent once.', int $code = 0, Exception $previous = NULL)
|
||||||
{
|
{
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
@ -29,28 +29,27 @@ class Friend {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Object to create a friend of
|
* Object to create a friend of
|
||||||
* @var mixed
|
* @var object
|
||||||
*/
|
*/
|
||||||
private $_friend_;
|
private $_friend_;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reflection class of the object
|
* Reflection class of the object
|
||||||
* @var ReflectionClass
|
* @var object
|
||||||
*/
|
*/
|
||||||
private $_reflect_;
|
private $_reflect_;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a friend object
|
* Create a friend object
|
||||||
*
|
*
|
||||||
* @param mixed $obj
|
* @param object $obj
|
||||||
* @throws InvalidArgumentException
|
* @throws InvalidArgumentException
|
||||||
* @throws \ReflectionException
|
|
||||||
*/
|
*/
|
||||||
public function __construct($obj)
|
public function __construct($obj)
|
||||||
{
|
{
|
||||||
if ( ! \is_object($obj))
|
if ( ! is_object($obj))
|
||||||
{
|
{
|
||||||
throw new InvalidArgumentException('Friend must be an object');
|
throw new InvalidArgumentException("Friend must be an object");
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->_friend_ = $obj;
|
$this->_friend_ = $obj;
|
||||||
@ -65,30 +64,15 @@ class Friend {
|
|||||||
*/
|
*/
|
||||||
public function __get(string $key)
|
public function __get(string $key)
|
||||||
{
|
{
|
||||||
if ($this->__isset($key))
|
if ($this->_reflect_->hasProperty($key))
|
||||||
{
|
{
|
||||||
$property = $this->_get_property($key);
|
$property = $this->_get_property($key);
|
||||||
|
return $property->getValue($this->_friend_);
|
||||||
if ($property !== NULL)
|
|
||||||
{
|
|
||||||
return $property->getValue($this->_friend_);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* See if a property exists on the friend
|
|
||||||
*
|
|
||||||
* @param string $name
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function __isset(string $name): bool
|
|
||||||
{
|
|
||||||
return $this->_reflect_->hasProperty($name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a friend's property
|
* Set a friend's property
|
||||||
*
|
*
|
||||||
@ -98,14 +82,10 @@ class Friend {
|
|||||||
*/
|
*/
|
||||||
public function __set(string $key, $value)
|
public function __set(string $key, $value)
|
||||||
{
|
{
|
||||||
if ($this->__isset($key))
|
if ($this->_reflect_->hasProperty($key))
|
||||||
{
|
{
|
||||||
$property = $this->_get_property($key);
|
$property = $this->_get_property($key);
|
||||||
|
$property->setValue($this->_friend_, $value);
|
||||||
if ($property !== NULL)
|
|
||||||
{
|
|
||||||
$property->setValue($this->_friend_, $value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,7 +96,6 @@ class Friend {
|
|||||||
* @param array $args
|
* @param array $args
|
||||||
* @return mixed
|
* @return mixed
|
||||||
* @throws BadMethodCallException
|
* @throws BadMethodCallException
|
||||||
* @throws \ReflectionException
|
|
||||||
*/
|
*/
|
||||||
public function __call(string $method, array $args)
|
public function __call(string $method, array $args)
|
||||||
{
|
{
|
||||||
@ -136,7 +115,7 @@ class Friend {
|
|||||||
* @param string $name
|
* @param string $name
|
||||||
* @return ReflectionProperty|null
|
* @return ReflectionProperty|null
|
||||||
*/
|
*/
|
||||||
private function _get_property(string $name): ?ReflectionProperty
|
private function _get_property(string $name)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
22
src/Json.php
22
src/Json.php
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
@ -29,7 +29,6 @@ class Json {
|
|||||||
* @param mixed $data
|
* @param mixed $data
|
||||||
* @param int $options
|
* @param int $options
|
||||||
* @param int $depth
|
* @param int $depth
|
||||||
* @throws JsonException
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function encode($data, $options = 0, $depth = 512): string
|
public static function encode($data, $options = 0, $depth = 512): string
|
||||||
@ -46,7 +45,6 @@ class Json {
|
|||||||
* @param mixed $data
|
* @param mixed $data
|
||||||
* @param int $jsonOptions - Options to pass to json_encode
|
* @param int $jsonOptions - Options to pass to json_encode
|
||||||
* @param int $fileOptions - Options to pass to file_get_contents
|
* @param int $fileOptions - Options to pass to file_get_contents
|
||||||
* @throws JsonException
|
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public static function encodeFile(string $filename, $data, int $jsonOptions = 0, int $fileOptions = 0): int
|
public static function encodeFile(string $filename, $data, int $jsonOptions = 0, int $fileOptions = 0): int
|
||||||
@ -62,18 +60,18 @@ class Json {
|
|||||||
* @param bool $assoc
|
* @param bool $assoc
|
||||||
* @param int $depth
|
* @param int $depth
|
||||||
* @param int $options
|
* @param int $options
|
||||||
* @throws JsonException
|
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function decode($json, bool $assoc = TRUE, int $depth = 512, int $options = 0)
|
public static function decode($json, bool $assoc = TRUE, int $depth = 512, int $options = 0)
|
||||||
{
|
{
|
||||||
// Don't try to decode null
|
// Don't try to decode null
|
||||||
if ($json === NULL)
|
if (empty($json))
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = json_decode($json, $assoc, $depth, $options);
|
// cast json to string so that streams from guzzle are correctly decoded
|
||||||
|
$data = json_decode((string) $json, $assoc, $depth, $options);
|
||||||
|
|
||||||
self::check_json_error();
|
self::check_json_error();
|
||||||
return $data;
|
return $data;
|
||||||
@ -86,7 +84,6 @@ class Json {
|
|||||||
* @param bool $assoc
|
* @param bool $assoc
|
||||||
* @param int $depth
|
* @param int $depth
|
||||||
* @param int $options
|
* @param int $options
|
||||||
* @throws JsonException
|
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function decodeFile(string $filename, bool $assoc = TRUE, int $depth = 512, int $options = 0)
|
public static function decodeFile(string $filename, bool $assoc = TRUE, int $depth = 512, int $options = 0)
|
||||||
@ -99,7 +96,6 @@ class Json {
|
|||||||
* Determines whether a string is valid json
|
* Determines whether a string is valid json
|
||||||
*
|
*
|
||||||
* @param string $string
|
* @param string $string
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
public static function isJson(string $string): bool
|
public static function isJson(string $string): bool
|
||||||
@ -113,7 +109,7 @@ class Json {
|
|||||||
* @throws JsonException
|
* @throws JsonException
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
protected static function check_json_error(): void
|
protected static function check_json_error()
|
||||||
{
|
{
|
||||||
$constant_map = [
|
$constant_map = [
|
||||||
JSON_ERROR_NONE => 'JSON_ERROR_NONE',
|
JSON_ERROR_NONE => 'JSON_ERROR_NONE',
|
||||||
@ -130,7 +126,7 @@ class Json {
|
|||||||
$error = json_last_error();
|
$error = json_last_error();
|
||||||
$message = json_last_error_msg();
|
$message = json_last_error_msg();
|
||||||
|
|
||||||
if (JSON_ERROR_NONE !== $error)
|
if (\JSON_ERROR_NONE !== $error)
|
||||||
{
|
{
|
||||||
throw new JsonException("{$constant_map[$error]} - {$message}", $error);
|
throw new JsonException("{$constant_map[$error]} - {$message}", $error);
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Model;
|
namespace Aviat\Ion\Model;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
@ -27,7 +27,6 @@ trait StringWrapper {
|
|||||||
* Wrap the String in the Stringy class
|
* Wrap the String in the Stringy class
|
||||||
*
|
*
|
||||||
* @param string $str
|
* @param string $str
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @return StringType
|
* @return StringType
|
||||||
*/
|
*/
|
||||||
public function string($str): StringType
|
public function string($str): StringType
|
||||||
|
@ -4,24 +4,22 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Transformer;
|
namespace Aviat\Ion\Transformer;
|
||||||
|
|
||||||
use Aviat\Ion\StringWrapper;
|
use Aviat\Ion\StringWrapper;
|
||||||
|
|
||||||
use BadMethodCallException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for data transformation
|
* Base class for data trasformation
|
||||||
*/
|
*/
|
||||||
abstract class AbstractTransformer implements TransformerInterface {
|
abstract class AbstractTransformer implements TransformerInterface {
|
||||||
|
|
||||||
@ -38,32 +36,13 @@ abstract class AbstractTransformer implements TransformerInterface {
|
|||||||
/**
|
/**
|
||||||
* Transform a set of structures
|
* Transform a set of structures
|
||||||
*
|
*
|
||||||
* @param iterable $collection
|
* @param array|object $collection
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function transformCollection(iterable $collection): array
|
public function transformCollection($collection): array
|
||||||
{
|
{
|
||||||
$list = (array)$collection;
|
$list = (array)$collection;
|
||||||
return array_map([$this, 'transform'], $list);
|
return array_map([$this, 'transform'], $list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Untransform a set of structures
|
|
||||||
*
|
|
||||||
* Requires an 'untransform' method in the extending class
|
|
||||||
*
|
|
||||||
* @param iterable $collection
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function untransformCollection(iterable $collection): array
|
|
||||||
{
|
|
||||||
if ( ! method_exists($this, 'untransform'))
|
|
||||||
{
|
|
||||||
throw new BadMethodCallException('untransform() method does not exist.');
|
|
||||||
}
|
|
||||||
|
|
||||||
$list = (array)$collection;
|
|
||||||
return array_map([$this, 'untransform'], $list);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// End of AbstractTransformer.php
|
// End of AbstractTransformer.php
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Transformer;
|
namespace Aviat\Ion\Transformer;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Type;
|
namespace Aviat\Ion\Type;
|
||||||
@ -41,15 +41,15 @@ class ArrayType {
|
|||||||
*/
|
*/
|
||||||
protected $nativeMethods = [
|
protected $nativeMethods = [
|
||||||
'chunk' => 'array_chunk',
|
'chunk' => 'array_chunk',
|
||||||
|
'pluck' => 'array_column',
|
||||||
|
'key_diff' => 'array_diff_key',
|
||||||
'diff' => 'array_diff',
|
'diff' => 'array_diff',
|
||||||
'filter' => 'array_filter',
|
'filter' => 'array_filter',
|
||||||
'flip' => 'array_flip',
|
'flip' => 'array_flip',
|
||||||
'intersect' => 'array_intersect',
|
'intersect' => 'array_intersect',
|
||||||
'key_diff' => 'array_diff_key',
|
|
||||||
'keys' => 'array_keys',
|
'keys' => 'array_keys',
|
||||||
'merge' => 'array_merge',
|
'merge' => 'array_merge',
|
||||||
'pad' => 'array_pad',
|
'pad' => 'array_pad',
|
||||||
'pluck' => 'array_column',
|
|
||||||
'product' => 'array_product',
|
'product' => 'array_product',
|
||||||
'random' => 'array_rand',
|
'random' => 'array_rand',
|
||||||
'reduce' => 'array_reduce',
|
'reduce' => 'array_reduce',
|
||||||
@ -97,7 +97,7 @@ class ArrayType {
|
|||||||
{
|
{
|
||||||
$func = $this->nativeMethods[$method];
|
$func = $this->nativeMethods[$method];
|
||||||
// Set the current array as the first argument of the method
|
// Set the current array as the first argument of the method
|
||||||
return $func($this->arr, ...$args);
|
return call_user_func($func, $this->arr, ...$args);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mapping for in-place methods
|
// Mapping for in-place methods
|
||||||
@ -114,28 +114,11 @@ class ArrayType {
|
|||||||
/**
|
/**
|
||||||
* Does the passed key exist in the current array?
|
* Does the passed key exist in the current array?
|
||||||
*
|
*
|
||||||
* @param int|string|array $key
|
* @param int|string $key
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function hasKey($key): bool
|
public function hasKey($key): bool
|
||||||
{
|
{
|
||||||
if (\is_array($key))
|
|
||||||
{
|
|
||||||
$pos =& $this->arr;
|
|
||||||
|
|
||||||
foreach($key as $level)
|
|
||||||
{
|
|
||||||
if ( ! array_key_exists($level, $pos))
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$pos =& $pos[$level];
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return array_key_exists($key, $this->arr);
|
return array_key_exists($key, $this->arr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,7 +167,7 @@ class ArrayType {
|
|||||||
*/
|
*/
|
||||||
public function has($value, bool $strict = TRUE): bool
|
public function has($value, bool $strict = TRUE): bool
|
||||||
{
|
{
|
||||||
return \in_array($value, $this->arr, $strict);
|
return in_array($value, $this->arr, $strict);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -196,7 +179,7 @@ class ArrayType {
|
|||||||
public function &get($key = NULL)
|
public function &get($key = NULL)
|
||||||
{
|
{
|
||||||
$value = NULL;
|
$value = NULL;
|
||||||
if ($key === NULL)
|
if (is_null($key))
|
||||||
{
|
{
|
||||||
$value =& $this->arr;
|
$value =& $this->arr;
|
||||||
}
|
}
|
||||||
@ -239,7 +222,7 @@ class ArrayType {
|
|||||||
|
|
||||||
foreach ($key as $level)
|
foreach ($key as $level)
|
||||||
{
|
{
|
||||||
if (empty($pos) || ! is_array($pos))
|
if (empty($pos) OR ! is_array($pos))
|
||||||
{
|
{
|
||||||
// Directly returning a NULL value here will
|
// Directly returning a NULL value here will
|
||||||
// result in a reference error. This isn't
|
// result in a reference error. This isn't
|
||||||
@ -270,7 +253,7 @@ class ArrayType {
|
|||||||
// create the levels if they don't exist
|
// create the levels if they don't exist
|
||||||
foreach ($key as $level)
|
foreach ($key as $level)
|
||||||
{
|
{
|
||||||
if ( ! \is_array($pos) && empty($pos))
|
if ( ! is_array($pos) && empty($pos))
|
||||||
{
|
{
|
||||||
$pos = [];
|
$pos = [];
|
||||||
$pos[$level] = [];
|
$pos[$level] = [];
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Type;
|
namespace Aviat\Ion\Type;
|
||||||
@ -24,17 +24,16 @@ use Stringy\Stringy;
|
|||||||
class StringType extends Stringy {
|
class StringType extends Stringy {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See if two strings match, despite being delimited differently,
|
* See if two strings match, despite being delemeted differently,
|
||||||
* such as camelCase, PascalCase, kebab-case, or snake_case.
|
* such as camelCase, PascalCase, kebab-case, or snake_case.
|
||||||
*
|
*
|
||||||
* @param string $strToMatch
|
* @param string $strToMatch
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
public function fuzzyCaseMatch(string $strToMatch): bool
|
public function fuzzyCaseMatch(string $strToMatch): bool
|
||||||
{
|
{
|
||||||
$firstStr = (string)self::create($this->str)->dasherize();
|
$firstStr = StringType::create($this->str)->dasherize($this->str)->__toString();
|
||||||
$secondStr = (string)self::create($strToMatch)->dasherize();
|
$secondStr = StringType::create($strToMatch)->dasherize()->__toString();
|
||||||
|
|
||||||
return $firstStr === $secondStr;
|
return $firstStr === $secondStr;
|
||||||
}
|
}
|
||||||
|
17
src/View.php
17
src/View.php
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
@ -50,8 +50,6 @@ abstract class View
|
|||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param ContainerInterface $container
|
* @param ContainerInterface $container
|
||||||
* @throws Di\Exception\ContainerException
|
|
||||||
* @throws Di\Exception\NotFoundException
|
|
||||||
*/
|
*/
|
||||||
public function __construct(ContainerInterface $container)
|
public function __construct(ContainerInterface $container)
|
||||||
{
|
{
|
||||||
@ -92,7 +90,6 @@ abstract class View
|
|||||||
*
|
*
|
||||||
* @param string $name
|
* @param string $name
|
||||||
* @param string|string[] $value
|
* @param string|string[] $value
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @return ViewInterface
|
* @return ViewInterface
|
||||||
*/
|
*/
|
||||||
public function addHeader(string $name, $value): ViewInterface
|
public function addHeader(string $name, $value): ViewInterface
|
||||||
@ -105,8 +102,6 @@ abstract class View
|
|||||||
* Set the output string
|
* Set the output string
|
||||||
*
|
*
|
||||||
* @param mixed $string
|
* @param mixed $string
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @throws \RuntimeException
|
|
||||||
* @return ViewInterface
|
* @return ViewInterface
|
||||||
*/
|
*/
|
||||||
public function setOutput($string): ViewInterface
|
public function setOutput($string): ViewInterface
|
||||||
@ -120,8 +115,6 @@ abstract class View
|
|||||||
* Append additional output.
|
* Append additional output.
|
||||||
*
|
*
|
||||||
* @param string $string
|
* @param string $string
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @throws \RuntimeException
|
|
||||||
* @return ViewInterface
|
* @return ViewInterface
|
||||||
*/
|
*/
|
||||||
public function appendOutput(string $string): ViewInterface
|
public function appendOutput(string $string): ViewInterface
|
||||||
@ -137,7 +130,7 @@ abstract class View
|
|||||||
*/
|
*/
|
||||||
public function getOutput(): string
|
public function getOutput(): string
|
||||||
{
|
{
|
||||||
return (string)$this->response->getBody();
|
return $this->response->getBody()->__toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// End of View.php
|
// End of View.php
|
@ -4,22 +4,19 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\View;
|
namespace Aviat\Ion\View;
|
||||||
|
|
||||||
use Aura\Html\HelperLocator;
|
|
||||||
use Aviat\Ion\Di\ContainerInterface;
|
use Aviat\Ion\Di\ContainerInterface;
|
||||||
use Aviat\Ion\Di\Exception\ContainerException;
|
|
||||||
use Aviat\Ion\Di\Exception\NotFoundException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* View class for outputting HTML
|
* View class for outputting HTML
|
||||||
@ -29,7 +26,7 @@ class HtmlView extends HttpView {
|
|||||||
/**
|
/**
|
||||||
* HTML generator/escaper helper
|
* HTML generator/escaper helper
|
||||||
*
|
*
|
||||||
* @var HelperLocator
|
* @var Aura\Html\HelperLocator
|
||||||
*/
|
*/
|
||||||
protected $helper;
|
protected $helper;
|
||||||
|
|
||||||
@ -44,8 +41,6 @@ class HtmlView extends HttpView {
|
|||||||
* Create the Html View
|
* Create the Html View
|
||||||
*
|
*
|
||||||
* @param ContainerInterface $container
|
* @param ContainerInterface $container
|
||||||
* @throws ContainerException
|
|
||||||
* @throws NotFoundException
|
|
||||||
*/
|
*/
|
||||||
public function __construct(ContainerInterface $container)
|
public function __construct(ContainerInterface $container)
|
||||||
{
|
{
|
||||||
@ -67,9 +62,10 @@ class HtmlView extends HttpView {
|
|||||||
$data['container'] = $this->container;
|
$data['container'] = $this->container;
|
||||||
|
|
||||||
ob_start();
|
ob_start();
|
||||||
extract($data, \EXTR_OVERWRITE);
|
extract($data);
|
||||||
include_once $path;
|
include_once $path;
|
||||||
$buffer = ob_get_clean();
|
$buffer = ob_get_contents();
|
||||||
|
ob_end_clean();
|
||||||
|
|
||||||
|
|
||||||
// Very basic html minify, that won't affect content between html tags
|
// Very basic html minify, that won't affect content between html tags
|
||||||
|
@ -4,20 +4,19 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\View;
|
namespace Aviat\Ion\View;
|
||||||
|
|
||||||
use Zend\Diactoros\Response;
|
use Zend\Diactoros\Response\SapiEmitter;
|
||||||
use Zend\HttpHandlerRunner\Emitter\SapiEmitter;
|
|
||||||
|
|
||||||
use Aviat\Ion\Exception\DoubleRenderException;
|
use Aviat\Ion\Exception\DoubleRenderException;
|
||||||
use Aviat\Ion\View as BaseView;
|
use Aviat\Ion\View as BaseView;
|
||||||
@ -39,20 +38,29 @@ class HttpView extends BaseView {
|
|||||||
*
|
*
|
||||||
* @param string $url
|
* @param string $url
|
||||||
* @param int $code
|
* @param int $code
|
||||||
* @param array $headers
|
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function redirect(string $url, int $code = 302, array $headers = []): void
|
public function redirect(string $url, int $code)
|
||||||
{
|
{
|
||||||
$this->response = new Response\RedirectResponse($url, $code, $headers);
|
ob_start();
|
||||||
|
$message = $this->response->getReasonPhrase($code);
|
||||||
|
$this->setStatusCode($code);
|
||||||
|
$this->response->withHeader('Location', $url);
|
||||||
|
|
||||||
|
if (PHP_SAPI !== 'cli')
|
||||||
|
{
|
||||||
|
header("HTTP/1.1 ${code} ${message}");
|
||||||
|
header("Location: {$url}");
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->hasRendered = TRUE;
|
||||||
|
ob_end_clean();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the status code of the request
|
* Set the status code of the request
|
||||||
*
|
*
|
||||||
* @param int $code
|
* @param int $code
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @return HttpView
|
* @return HttpView
|
||||||
*/
|
*/
|
||||||
public function setStatusCode(int $code): HttpView
|
public function setStatusCode(int $code): HttpView
|
||||||
@ -67,10 +75,9 @@ class HttpView extends BaseView {
|
|||||||
* any attempt to call again will result in a DoubleRenderException.
|
* any attempt to call again will result in a DoubleRenderException.
|
||||||
*
|
*
|
||||||
* @throws DoubleRenderException
|
* @throws DoubleRenderException
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function send(): void
|
public function send()
|
||||||
{
|
{
|
||||||
$this->output();
|
$this->output();
|
||||||
}
|
}
|
||||||
@ -79,23 +86,22 @@ class HttpView extends BaseView {
|
|||||||
* Send the appropriate response
|
* Send the appropriate response
|
||||||
*
|
*
|
||||||
* @throws DoubleRenderException
|
* @throws DoubleRenderException
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
protected function output(): void
|
protected function output()
|
||||||
{
|
{
|
||||||
if ($this->hasRendered)
|
if ($this->hasRendered)
|
||||||
{
|
{
|
||||||
throw new DoubleRenderException();
|
throw new DoubleRenderException();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->response = $this->response
|
$this->response = $this->response->withHeader('Content-type', "{$this->contentType};charset=utf-8")
|
||||||
->withHeader('Content-type', "{$this->contentType};charset=utf-8")
|
|
||||||
->withHeader('X-Content-Type-Options', 'nosniff')
|
->withHeader('X-Content-Type-Options', 'nosniff')
|
||||||
->withHeader('X-XSS-Protection', '1;mode=block')
|
->withHeader('X-XSS-Protection', '1;mode=block')
|
||||||
->withHeader('X-Frame-Options', 'SAMEORIGIN');
|
->withHeader('X-Frame-Options', 'SAMEORIGIN');
|
||||||
|
|
||||||
(new SapiEmitter())->emit($this->response);
|
$sender = new SapiEmitter($this->response);
|
||||||
|
$sender->emit($this->response);
|
||||||
|
|
||||||
$this->hasRendered = TRUE;
|
$this->hasRendered = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -4,20 +4,19 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\View;
|
namespace Aviat\Ion\View;
|
||||||
|
|
||||||
use Aviat\Ion\Json;
|
use Aviat\Ion\Json;
|
||||||
use Aviat\Ion\JsonException;
|
|
||||||
use Aviat\Ion\ViewInterface;
|
use Aviat\Ion\ViewInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -36,14 +35,11 @@ class JsonView extends HttpView {
|
|||||||
* Set the output string
|
* Set the output string
|
||||||
*
|
*
|
||||||
* @param mixed $string
|
* @param mixed $string
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
* @throws \RuntimeException
|
|
||||||
* @throws JsonException
|
|
||||||
* @return ViewInterface
|
* @return ViewInterface
|
||||||
*/
|
*/
|
||||||
public function setOutput($string): ViewInterface
|
public function setOutput($string): ViewInterface
|
||||||
{
|
{
|
||||||
if ( ! \is_string($string))
|
if ( ! is_string($string))
|
||||||
{
|
{
|
||||||
$string = Json::encode($string);
|
$string = Json::encode($string);
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
@ -71,5 +71,5 @@ interface ViewInterface {
|
|||||||
* @throws DoubleRenderException
|
* @throws DoubleRenderException
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function send(): void;
|
public function send();
|
||||||
}
|
}
|
279
src/XML.php
279
src/XML.php
@ -1,279 +0,0 @@
|
|||||||
<?php declare(strict_types=1);
|
|
||||||
/**
|
|
||||||
* Ion
|
|
||||||
*
|
|
||||||
* Building blocks for web development
|
|
||||||
*
|
|
||||||
* PHP version 7.2
|
|
||||||
*
|
|
||||||
* @package Ion
|
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
|
||||||
* @version 3.0.0
|
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
|
||||||
|
|
||||||
use DOMDocument, DOMNode, DOMNodeList, InvalidArgumentException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* XML <=> PHP Array codec
|
|
||||||
*/
|
|
||||||
final class XML {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* XML representation of the data
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $xml;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PHP array version of the data
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $data;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* XML constructor
|
|
||||||
*
|
|
||||||
* @param string $xml
|
|
||||||
* @param array $data
|
|
||||||
*/
|
|
||||||
public function __construct(string $xml = '', array $data = [])
|
|
||||||
{
|
|
||||||
$this->setXML($xml)->setData($data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serialize the data to an xml string
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString(): string
|
|
||||||
{
|
|
||||||
return static::toXML($this->getData());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the data parsed from the XML
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getData(): array
|
|
||||||
{
|
|
||||||
return $this->data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the data to create xml from
|
|
||||||
*
|
|
||||||
* @param array $data
|
|
||||||
* @return self
|
|
||||||
*/
|
|
||||||
public function setData(array $data): self
|
|
||||||
{
|
|
||||||
$this->data = $data;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the xml created from the data
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getXML(): string
|
|
||||||
{
|
|
||||||
return $this->xml;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the xml to parse the data from
|
|
||||||
*
|
|
||||||
* @param string $xml
|
|
||||||
* @return self
|
|
||||||
*/
|
|
||||||
public function setXML(string $xml): self
|
|
||||||
{
|
|
||||||
$this->xml = $xml;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse an xml document string to a php array
|
|
||||||
*
|
|
||||||
* @param string $xml
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public static function toArray(string $xml): array
|
|
||||||
{
|
|
||||||
$data = [];
|
|
||||||
|
|
||||||
$xml = static::stripXMLWhitespace($xml);
|
|
||||||
|
|
||||||
$dom = new DOMDocument();
|
|
||||||
$hasLoaded = @$dom->loadXML($xml);
|
|
||||||
|
|
||||||
if ( ! $hasLoaded)
|
|
||||||
{
|
|
||||||
throw new InvalidArgumentException('Failed to load XML');
|
|
||||||
}
|
|
||||||
|
|
||||||
$root = $dom->documentElement;
|
|
||||||
|
|
||||||
$data[$root->tagName] = [];
|
|
||||||
|
|
||||||
if ($root->hasChildNodes())
|
|
||||||
{
|
|
||||||
static::childNodesToArray($data[$root->tagName], $root->childNodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transform the array into XML
|
|
||||||
*
|
|
||||||
* @param array $data
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function toXML(array $data): string
|
|
||||||
{
|
|
||||||
$dom = new DOMDocument();
|
|
||||||
$dom->encoding = 'UTF-8';
|
|
||||||
|
|
||||||
static::arrayPropertiesToXmlNodes($dom, $dom, $data);
|
|
||||||
|
|
||||||
return $dom->saveXML();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the xml document string to a php array
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function parse(): array
|
|
||||||
{
|
|
||||||
$xml = $this->getXML();
|
|
||||||
$data = static::toArray($xml);
|
|
||||||
return $this->setData($data)->getData();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transform the array into XML
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function createXML(): string
|
|
||||||
{
|
|
||||||
return static::toXML($this->getData());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Strip whitespace from raw xml to remove irrelevant text nodes
|
|
||||||
*
|
|
||||||
* @param string $xml
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
private static function stripXMLWhitespace(string $xml): string
|
|
||||||
{
|
|
||||||
// Get rid of unimportant text nodes by removing
|
|
||||||
// whitespace characters from between xml tags,
|
|
||||||
// except for the xml declaration tag, Which looks
|
|
||||||
// something like:
|
|
||||||
/* <?xml version="1.0" encoding="UTF-8"?> */
|
|
||||||
return preg_replace('/([^?])>\s+</', '$1><', $xml);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursively create array structure based on xml structure
|
|
||||||
*
|
|
||||||
* @param array $root A reference to the current array location
|
|
||||||
* @param DOMNodeList $nodeList The current NodeList object
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private static function childNodesToArray(array &$root, DOMNodelist $nodeList): void
|
|
||||||
{
|
|
||||||
$length = $nodeList->length;
|
|
||||||
for ($i = 0; $i < $length; $i++)
|
|
||||||
{
|
|
||||||
$el = $nodeList->item($i);
|
|
||||||
$current =& $root[$el->nodeName];
|
|
||||||
|
|
||||||
// It's a top level element!
|
|
||||||
if (( ! $el->hasChildNodes()) || ($el->childNodes->item(0) instanceof \DomText))
|
|
||||||
{
|
|
||||||
$current = $el->textContent;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// An empty value at the current root
|
|
||||||
if ($current === NULL)
|
|
||||||
{
|
|
||||||
$current = [];
|
|
||||||
static::childNodesToArray($current, $el->childNodes);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$keys = array_keys($current);
|
|
||||||
|
|
||||||
// Wrap the array in a containing array
|
|
||||||
// if there are only string keys
|
|
||||||
if ( ! is_numeric($keys[0]))
|
|
||||||
{
|
|
||||||
// But if there is only one key, don't wrap it in
|
|
||||||
// an array, just recurse to parse the child nodes
|
|
||||||
if (count($current) === 1)
|
|
||||||
{
|
|
||||||
static::childNodesToArray($current, $el->childNodes);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$current = [$current];
|
|
||||||
}
|
|
||||||
|
|
||||||
$current[] = [];
|
|
||||||
$index = count($current) - 1;
|
|
||||||
|
|
||||||
static::childNodesToArray($current[$index], $el->childNodes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursively create xml nodes from array properties
|
|
||||||
*
|
|
||||||
* @param DOMDocument $dom The current DOM object
|
|
||||||
* @param DOMNode $parent The parent element to append children to
|
|
||||||
* @param array $data The data for the current node
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private static function arrayPropertiesToXmlNodes(DOMDocument $dom, DOMNode $parent, array $data): void
|
|
||||||
{
|
|
||||||
foreach ($data as $key => $props)
|
|
||||||
{
|
|
||||||
// 'Flatten' the array as you create the xml
|
|
||||||
if (is_numeric($key))
|
|
||||||
{
|
|
||||||
foreach ($props as $k => $p)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$node = $dom->createElement($key);
|
|
||||||
|
|
||||||
if (\is_array($props))
|
|
||||||
{
|
|
||||||
static::arrayPropertiesToXmlNodes($dom, $node, $props);
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
$tNode = $dom->createTextNode((string)$props);
|
|
||||||
$node->appendChild($tNode);
|
|
||||||
}
|
|
||||||
|
|
||||||
$parent->appendChild($node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion;
|
namespace Aviat\Ion;
|
||||||
@ -20,7 +20,7 @@ namespace Aviat\Ion;
|
|||||||
* Joins paths together. Variadic to take an
|
* Joins paths together. Variadic to take an
|
||||||
* arbitrary number of arguments
|
* arbitrary number of arguments
|
||||||
*
|
*
|
||||||
* @param string ...$args
|
* @param string[] ...$args
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function _dir(string ...$args): string
|
function _dir(string ...$args): string
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
@ -20,32 +20,16 @@ use Aviat\Ion\Config;
|
|||||||
|
|
||||||
class ConfigTest extends Ion_TestCase {
|
class ConfigTest extends Ion_TestCase {
|
||||||
|
|
||||||
protected $config;
|
public function setUp()
|
||||||
|
|
||||||
public function setUp(): void
|
|
||||||
{
|
{
|
||||||
$this->config = new Config([
|
$this->config = new Config([
|
||||||
'foo' => 'bar',
|
'foo' => 'bar',
|
||||||
'asset_path' => '/assets',
|
'asset_path' => '/assets',
|
||||||
'bar' => 'baz',
|
'bar' => 'baz'
|
||||||
'a' => [
|
|
||||||
'b' => [
|
|
||||||
'c' => TRUE,
|
|
||||||
],
|
|
||||||
],
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testConfigHas(): void
|
public function testConfigGet()
|
||||||
{
|
|
||||||
$this->assertTrue($this->config->has('foo'));
|
|
||||||
$this->assertTrue($this->config->has(['a', 'b', 'c']));
|
|
||||||
|
|
||||||
$this->assertFalse($this->config->has('baz'));
|
|
||||||
$this->assertFalse($this->config->has(['c', 'b', 'a']));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testConfigGet(): void
|
|
||||||
{
|
{
|
||||||
$this->assertEquals('bar', $this->config->get('foo'));
|
$this->assertEquals('bar', $this->config->get('foo'));
|
||||||
$this->assertEquals('baz', $this->config->get('bar'));
|
$this->assertEquals('baz', $this->config->get('bar'));
|
||||||
@ -53,26 +37,27 @@ class ConfigTest extends Ion_TestCase {
|
|||||||
$this->assertNull($this->config->get(['apple', 'sauce', 'is']));
|
$this->assertNull($this->config->get(['apple', 'sauce', 'is']));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testConfigSet(): void
|
public function testConfigSet()
|
||||||
{
|
{
|
||||||
$ret = $this->config->set('foo', 'foobar');
|
$ret = $this->config->set('foo', 'foobar');
|
||||||
$this->assertInstanceOf(Config::class, $ret);
|
$this->assertInstanceOf('Aviat\Ion\Config', $ret);
|
||||||
$this->assertEquals('foobar', $this->config->get('foo'));
|
$this->assertEquals('foobar', $this->config->get('foo'));
|
||||||
|
|
||||||
$this->config->set(['apple', 'sauce', 'is'], 'great');
|
$this->config->set(['apple', 'sauce', 'is'], 'great');
|
||||||
$apple = $this->config->get('apple');
|
$apple = $this->config->get('apple');
|
||||||
$this->assertEquals('great', $apple['sauce']['is'], 'Config value not set correctly');
|
$this->assertEquals('great', $apple['sauce']['is'], "Config value not set correctly");
|
||||||
|
|
||||||
$this->assertEquals('great', $this->config->get(['apple', 'sauce', 'is']), "Array argument get for config failed.");
|
$this->assertEquals('great', $this->config->get(['apple', 'sauce', 'is']), "Array argument get for config failed.");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testConfigBadSet(): void
|
public function testConfigBadSet()
|
||||||
{
|
{
|
||||||
$this->expectException('InvalidArgumentException');
|
$this->expectException('InvalidArgumentException');
|
||||||
$this->config->set(NULL, FALSE);
|
$this->config->set(NULL, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function dataConfigDelete(): array
|
public function dataConfigDelete()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'top level delete' => [
|
'top level delete' => [
|
||||||
@ -132,7 +117,7 @@ class ConfigTest extends Ion_TestCase {
|
|||||||
/**
|
/**
|
||||||
* @dataProvider dataConfigDelete
|
* @dataProvider dataConfigDelete
|
||||||
*/
|
*/
|
||||||
public function testConfigDelete($key, array $assertKeys): void
|
public function testConfigDelete($key, $assertKeys)
|
||||||
{
|
{
|
||||||
$config = new Config([]);
|
$config = new Config([]);
|
||||||
$config->set(['apple', 'sauce', 'is'], 'great');
|
$config->set(['apple', 'sauce', 'is'], 'great');
|
||||||
@ -144,7 +129,7 @@ class ConfigTest extends Ion_TestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetNonExistentConfigItem(): void
|
public function testGetNonExistentConfigItem()
|
||||||
{
|
{
|
||||||
$this->assertNull($this->config->get('foobar'));
|
$this->assertNull($this->config->get('foobar'));
|
||||||
}
|
}
|
||||||
|
@ -4,19 +4,20 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\Di;
|
namespace Aviat\Ion\Tests\Di;
|
||||||
|
|
||||||
use Aviat\Ion\Di\{Container, ContainerAware, ContainerInterface};
|
use Aviat\Ion\Di\{Container, ContainerAware, ContainerInterface};
|
||||||
|
use Aviat\Ion\Di\Exception\ContainerException;
|
||||||
use Aviat\Ion\Tests\Ion_TestCase;
|
use Aviat\Ion\Tests\Ion_TestCase;
|
||||||
|
|
||||||
class Aware {
|
class Aware {
|
||||||
@ -31,15 +32,13 @@ class Aware {
|
|||||||
|
|
||||||
class ContainerAwareTest extends Ion_TestCase {
|
class ContainerAwareTest extends Ion_TestCase {
|
||||||
|
|
||||||
protected $aware;
|
public function setUp()
|
||||||
|
|
||||||
public function setUp(): void
|
|
||||||
{
|
{
|
||||||
$this->container = new Container();
|
$this->container = new Container();
|
||||||
$this->aware = new Aware($this->container);
|
$this->aware = new Aware($this->container);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testContainerAwareTrait(): void
|
public function testContainerAwareTrait()
|
||||||
{
|
{
|
||||||
// The container was set in setup
|
// The container was set in setup
|
||||||
// check that the get method returns the same
|
// check that the get method returns the same
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\Di;
|
namespace Aviat\Ion\Tests\Di;
|
||||||
@ -21,8 +21,6 @@ use Aviat\Ion\Di\Exception\ContainerException;
|
|||||||
use Aviat\Ion\Tests\Ion_TestCase;
|
use Aviat\Ion\Tests\Ion_TestCase;
|
||||||
use Monolog\Logger;
|
use Monolog\Logger;
|
||||||
use Monolog\Handler\{TestHandler, NullHandler};
|
use Monolog\Handler\{TestHandler, NullHandler};
|
||||||
use Aviat\Ion\Di\ContainerInterface;
|
|
||||||
use Aviat\Ion\Di\Exception\NotFoundException;
|
|
||||||
|
|
||||||
class FooTest {
|
class FooTest {
|
||||||
|
|
||||||
@ -39,27 +37,27 @@ class FooTest2 {
|
|||||||
|
|
||||||
class ContainerTest extends Ion_TestCase {
|
class ContainerTest extends Ion_TestCase {
|
||||||
|
|
||||||
public function setUp(): void
|
public function setUp()
|
||||||
{
|
{
|
||||||
$this->container = new Container();
|
$this->container = new Container();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function dataGetWithException(): array
|
public function dataGetWithException()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'Bad index type: number' => [
|
'Bad index type: number' => [
|
||||||
'id' => 42,
|
'id' => 42,
|
||||||
'exception' => ContainerException::class,
|
'exception' => 'Aviat\Ion\Di\Exception\ContainerException',
|
||||||
'message' => 'Id must be a string'
|
'message' => 'Id must be a string'
|
||||||
],
|
],
|
||||||
'Bad index type: array' => [
|
'Bad index type: array' => [
|
||||||
'id' => [],
|
'id' => [],
|
||||||
'exception' => ContainerException::class,
|
'exception' => 'Aviat\Ion\Di\Exception\ContainerException',
|
||||||
'message' => 'Id must be a string'
|
'message' => 'Id must be a string'
|
||||||
],
|
],
|
||||||
'Non-existent id' => [
|
'Non-existent id' => [
|
||||||
'id' => 'foo',
|
'id' => 'foo',
|
||||||
'exception' => NotFoundException::class,
|
'exception' => 'Aviat\Ion\Di\Exception\NotFoundException',
|
||||||
'message' => "Item 'foo' does not exist in container."
|
'message' => "Item 'foo' does not exist in container."
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
@ -68,7 +66,7 @@ class ContainerTest extends Ion_TestCase {
|
|||||||
/**
|
/**
|
||||||
* @dataProvider dataGetWithException
|
* @dataProvider dataGetWithException
|
||||||
*/
|
*/
|
||||||
public function testGetWithException($id, $exception, $message): void
|
public function testGetWithException($id, $exception, $message)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -84,24 +82,24 @@ class ContainerTest extends Ion_TestCase {
|
|||||||
/**
|
/**
|
||||||
* @dataProvider dataGetWithException
|
* @dataProvider dataGetWithException
|
||||||
*/
|
*/
|
||||||
public function testGetNewWithException($id, $exception, $message): void
|
public function testGetNewWithException($id, $exception, $message)
|
||||||
{
|
{
|
||||||
$this->expectException($exception);
|
$this->expectException($exception);
|
||||||
$this->expectExceptionMessage($message);
|
$this->expectExceptionMessage($message);
|
||||||
$this->container->getNew($id);
|
$this->container->getNew($id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function dataSetInstanceWithException(): array
|
public function dataSetInstanceWithException()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'Non-existent id' => [
|
'Non-existent id' => [
|
||||||
'id' => 'foo',
|
'id' => 'foo',
|
||||||
'exception' => NotFoundException::class,
|
'exception' => 'Aviat\Ion\Di\Exception\NotFoundException',
|
||||||
'message' => "Factory 'foo' does not exist in container. Set that first.",
|
'message' => "Factory 'foo' does not exist in container. Set that first.",
|
||||||
],
|
],
|
||||||
'Non-existent id 2' => [
|
'Non-existent id 2' => [
|
||||||
'id' => 'foobarbaz',
|
'id' => 'foobarbaz',
|
||||||
'exception' => NotFoundException::class,
|
'exception' => 'Aviat\Ion\Di\Exception\NotFoundException',
|
||||||
'message' => "Factory 'foobarbaz' does not exist in container. Set that first.",
|
'message' => "Factory 'foobarbaz' does not exist in container. Set that first.",
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
@ -110,7 +108,7 @@ class ContainerTest extends Ion_TestCase {
|
|||||||
/**
|
/**
|
||||||
* @dataProvider dataSetInstanceWithException
|
* @dataProvider dataSetInstanceWithException
|
||||||
*/
|
*/
|
||||||
public function testSetInstanceWithException($id, $exception, $message): void
|
public function testSetInstanceWithException($id, $exception, $message)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -123,21 +121,21 @@ class ContainerTest extends Ion_TestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetNew(): void
|
public function testGetNew()
|
||||||
{
|
{
|
||||||
$this->container->set('footest', static function($item) {
|
$this->container->set('footest', function($item) {
|
||||||
return new FooTest($item);
|
return new FooTest($item);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check that the item is the container, if called without arguments
|
// Check that the item is the container, if called without arguments
|
||||||
$footest1 = $this->container->getNew('footest');
|
$footest1 = $this->container->getNew('footest');
|
||||||
$this->assertInstanceOf(ContainerInterface::class, $footest1->item);
|
$this->assertInstanceOf('Aviat\Ion\Di\ContainerInterface', $footest1->item);
|
||||||
|
|
||||||
$footest2 = $this->container->getNew('footest', ['Test String']);
|
$footest2 = $this->container->getNew('footest', ['Test String']);
|
||||||
$this->assertEquals('Test String', $footest2->item);
|
$this->assertEquals('Test String', $footest2->item);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetContainerInInstance(): void
|
public function testSetContainerInInstance()
|
||||||
{
|
{
|
||||||
$this->container->set('footest2', function() {
|
$this->container->set('footest2', function() {
|
||||||
return new FooTest2();
|
return new FooTest2();
|
||||||
@ -147,36 +145,36 @@ class ContainerTest extends Ion_TestCase {
|
|||||||
$this->assertEquals($this->container, $footest2->getContainer());
|
$this->assertEquals($this->container, $footest2->getContainer());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetNewReturnCallable(): void
|
public function testGetNewReturnCallable()
|
||||||
{
|
{
|
||||||
$this->container->set('footest', static function($item) {
|
$this->container->set('footest', function($item) {
|
||||||
return static function() use ($item) {
|
return function() use ($item) {
|
||||||
return $item;
|
return $item;
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check that the item is the container, if called without arguments
|
// Check that the item is the container, if called without arguments
|
||||||
$footest1 = $this->container->getNew('footest');
|
$footest1 = $this->container->getNew('footest');
|
||||||
$this->assertInstanceOf(ContainerInterface::class, $footest1());
|
$this->assertInstanceOf('Aviat\Ion\Di\ContainerInterface', $footest1());
|
||||||
|
|
||||||
$footest2 = $this->container->getNew('footest', ['Test String']);
|
$footest2 = $this->container->getNew('footest', ['Test String']);
|
||||||
$this->assertEquals('Test String', $footest2());
|
$this->assertEquals('Test String', $footest2());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetSet(): void
|
public function testGetSet()
|
||||||
{
|
{
|
||||||
$container = $this->container->set('foo', static function() {
|
$container = $this->container->set('foo', function() {
|
||||||
return static function() {};
|
return function() {};
|
||||||
});
|
});
|
||||||
|
|
||||||
$this->assertInstanceOf(Container::class, $container);
|
$this->assertInstanceOf('Aviat\Ion\Di\Container', $container);
|
||||||
$this->assertInstanceOf(ContainerInterface::class, $container);
|
$this->assertInstanceOf('Aviat\Ion\Di\ContainerInterface', $container);
|
||||||
|
|
||||||
// The factory returns a callable
|
// The factory returns a callable
|
||||||
$this->assertTrue(is_callable($container->get('foo')));
|
$this->assertTrue(is_callable($container->get('foo')));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testLoggerMethods(): void
|
public function testLoggerMethods()
|
||||||
{
|
{
|
||||||
// Does the container have the default logger?
|
// Does the container have the default logger?
|
||||||
$this->assertFalse($this->container->hasLogger());
|
$this->assertFalse($this->container->hasLogger());
|
||||||
@ -191,8 +189,8 @@ class ContainerTest extends Ion_TestCase {
|
|||||||
$container = $this->container->setLogger($logger1);
|
$container = $this->container->setLogger($logger1);
|
||||||
$container2 = $this->container->setLogger($logger2, 'test');
|
$container2 = $this->container->setLogger($logger2, 'test');
|
||||||
|
|
||||||
$this->assertInstanceOf(ContainerInterface::class, $container);
|
$this->assertInstanceOf('Aviat\Ion\Di\ContainerInterface', $container);
|
||||||
$this->assertInstanceOf(Container::class, $container2);
|
$this->assertInstanceOf('Aviat\Ion\Di\Container', $container2);
|
||||||
|
|
||||||
$this->assertEquals($logger1, $this->container->getLogger('default'));
|
$this->assertEquals($logger1, $this->container->getLogger('default'));
|
||||||
$this->assertEquals($logger2, $this->container->getLogger('test'));
|
$this->assertEquals($logger2, $this->container->getLogger('test'));
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
@ -26,7 +26,8 @@ class EnumTest extends Ion_TestCase {
|
|||||||
'FOOBAR' => 'baz'
|
'FOOBAR' => 'baz'
|
||||||
];
|
];
|
||||||
|
|
||||||
public function setUp(): void {
|
public function setUp()
|
||||||
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
$this->enum = new TestEnum();
|
$this->enum = new TestEnum();
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\Exception;
|
namespace Aviat\Ion\Tests\Exception;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
@ -21,7 +21,8 @@ use Aviat\Ion\Tests\FriendTestClass;
|
|||||||
|
|
||||||
class FriendTest extends Ion_TestCase {
|
class FriendTest extends Ion_TestCase {
|
||||||
|
|
||||||
public function setUp(): void {
|
public function setUp()
|
||||||
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
$obj = new FriendTestClass();
|
$obj = new FriendTestClass();
|
||||||
$this->friend = new Friend($obj);
|
$this->friend = new Friend($obj);
|
||||||
|
@ -4,22 +4,25 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
|
|
||||||
use function Aviat\Ion\_dir;
|
use function Aviat\Ion\_dir;
|
||||||
|
|
||||||
|
use Aura\Web\WebFactory;
|
||||||
|
use Aviat\Ion\Json;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Zend\Diactoros\ServerRequestFactory;
|
use Zend\Diactoros\ServerRequestFactory;
|
||||||
|
use Zend\Diactoros\Response as HttpResponse;
|
||||||
|
|
||||||
define('ROOT_DIR', realpath(__DIR__ . '/../') . '/');
|
define('ROOT_DIR', realpath(__DIR__ . '/../') . '/');
|
||||||
define('SRC_DIR', ROOT_DIR . 'src/');
|
define('SRC_DIR', ROOT_DIR . 'src/');
|
||||||
@ -31,10 +34,10 @@ define('TEST_VIEW_DIR', __DIR__ . '/test_views');
|
|||||||
*/
|
*/
|
||||||
class Ion_TestCase extends TestCase {
|
class Ion_TestCase extends TestCase {
|
||||||
// Test directory constants
|
// Test directory constants
|
||||||
public const ROOT_DIR = ROOT_DIR;
|
const ROOT_DIR = ROOT_DIR;
|
||||||
public const SRC_DIR = SRC_DIR;
|
const SRC_DIR = SRC_DIR;
|
||||||
public const TEST_DATA_DIR = TEST_DATA_DIR;
|
const TEST_DATA_DIR = TEST_DATA_DIR;
|
||||||
public const TEST_VIEW_DIR = TEST_VIEW_DIR;
|
const TEST_VIEW_DIR = TEST_VIEW_DIR;
|
||||||
|
|
||||||
protected $container;
|
protected $container;
|
||||||
protected static $staticContainer;
|
protected static $staticContainer;
|
||||||
@ -48,7 +51,7 @@ class Ion_TestCase extends TestCase {
|
|||||||
self::$session_handler = $session_handler;
|
self::$session_handler = $session_handler;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
public function setUp(): void
|
public function setUp()
|
||||||
{
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
|
||||||
@ -97,7 +100,7 @@ class Ion_TestCase extends TestCase {
|
|||||||
// Set up DI container
|
// Set up DI container
|
||||||
$di = require('di.php');
|
$di = require('di.php');
|
||||||
$container = $di($config_array);
|
$container = $di($config_array);
|
||||||
$container->set('session-handler', static function() {
|
$container->set('session-handler', function() {
|
||||||
// Use mock session handler
|
// Use mock session handler
|
||||||
$session_handler = new TestSessionHandler();
|
$session_handler = new TestSessionHandler();
|
||||||
session_set_save_handler($session_handler, TRUE);
|
session_set_save_handler($session_handler, TRUE);
|
||||||
@ -113,7 +116,7 @@ class Ion_TestCase extends TestCase {
|
|||||||
* @param array $supers
|
* @param array $supers
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setSuperGlobals(array $supers = []): void
|
public function setSuperGlobals(array $supers = [])
|
||||||
{
|
{
|
||||||
$default = [
|
$default = [
|
||||||
'_SERVER' => $_SERVER,
|
'_SERVER' => $_SERVER,
|
||||||
@ -124,7 +127,7 @@ class Ion_TestCase extends TestCase {
|
|||||||
];
|
];
|
||||||
|
|
||||||
$request = call_user_func_array(
|
$request = call_user_func_array(
|
||||||
[ServerRequestFactory::class, 'fromGlobals'],
|
['Zend\Diactoros\ServerRequestFactory', 'fromGlobals'],
|
||||||
array_merge($default, $supers)
|
array_merge($default, $supers)
|
||||||
);
|
);
|
||||||
$this->container->setInstance('request', $request);
|
$this->container->setInstance('request', $request);
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\Model;
|
namespace Aviat\Ion\Tests\Model;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
@ -24,7 +24,8 @@ class StringWrapperTest extends TestCase {
|
|||||||
|
|
||||||
protected $wrapper;
|
protected $wrapper;
|
||||||
|
|
||||||
public function setUp(): void {
|
public function setUp()
|
||||||
|
{
|
||||||
$this->wrapper = new class {
|
$this->wrapper = new class {
|
||||||
use StringWrapper;
|
use StringWrapper;
|
||||||
};
|
};
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
|
@ -4,30 +4,29 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\Transformer;
|
namespace Aviat\Ion\Tests\Transformer;
|
||||||
|
|
||||||
use Aviat\Ion\Tests\Ion_TestCase;
|
use Aviat\Ion\Tests\Ion_TestCase;
|
||||||
use Aviat\Ion\Tests\{TestTransformer, TestTransformerUntransform};
|
use Aviat\Ion\Tests\TestTransformer;
|
||||||
|
|
||||||
class AbstractTransformerTest extends Ion_TestCase {
|
class AbstractTransformerTest extends Ion_TestCase {
|
||||||
|
|
||||||
protected $transformer;
|
protected $transformer;
|
||||||
protected $untransformer;
|
|
||||||
|
|
||||||
|
|
||||||
public function setUp(): void {
|
public function setUp()
|
||||||
|
{
|
||||||
$this->transformer = new TestTransformer();
|
$this->transformer = new TestTransformer();
|
||||||
$this->untransformer = new TestTransformerUntransform();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function dataTransformCollection()
|
public function dataTransformCollection()
|
||||||
@ -88,36 +87,6 @@ class AbstractTransformerTest extends Ion_TestCase {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function dataUnTransformCollection()
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'object' => [
|
|
||||||
'original' => [
|
|
||||||
(object)['Comedy', 'Romance', 'School', 'Harem'],
|
|
||||||
(object)['Action', 'Comedy', 'Magic', 'Fantasy', 'Mahou Shoujo'],
|
|
||||||
(object)['Comedy', 'Sci-Fi']
|
|
||||||
],
|
|
||||||
'expected' => [
|
|
||||||
['Comedy', 'Romance', 'School', 'Harem'],
|
|
||||||
['Action', 'Comedy', 'Magic', 'Fantasy', 'Mahou Shoujo'],
|
|
||||||
['Comedy', 'Sci-Fi']
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'array' => [
|
|
||||||
'original' => [
|
|
||||||
['Comedy', 'Romance', 'School', 'Harem'],
|
|
||||||
['Action', 'Comedy', 'Magic', 'Fantasy', 'Mahou Shoujo'],
|
|
||||||
['Comedy', 'Sci-Fi']
|
|
||||||
],
|
|
||||||
'expected' => [
|
|
||||||
['Comedy', 'Romance', 'School', 'Harem'],
|
|
||||||
['Action', 'Comedy', 'Magic', 'Fantasy', 'Mahou Shoujo'],
|
|
||||||
['Comedy', 'Sci-Fi']
|
|
||||||
]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testTransform()
|
public function testTransform()
|
||||||
{
|
{
|
||||||
$data = $this->dataTransformCollection();
|
$data = $this->dataTransformCollection();
|
||||||
@ -136,22 +105,4 @@ class AbstractTransformerTest extends Ion_TestCase {
|
|||||||
$actual = $this->transformer->transformCollection($original);
|
$actual = $this->transformer->transformCollection($original);
|
||||||
$this->assertEquals($expected, $actual);
|
$this->assertEquals($expected, $actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider dataUnTransformCollection
|
|
||||||
*/
|
|
||||||
public function testUntransformCollection($original, $expected)
|
|
||||||
{
|
|
||||||
$actual = $this->untransformer->untransformCollection($original);
|
|
||||||
$this->assertEquals($expected, $actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider dataUnTransformCollection
|
|
||||||
*/
|
|
||||||
public function testUntransformCollectionWithException($original, $expected)
|
|
||||||
{
|
|
||||||
$this->expectException(\BadMethodCallException::class);
|
|
||||||
$this->transformer->untransformCollection($original);
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\Type;
|
namespace Aviat\Ion\Tests\Type;
|
||||||
@ -22,7 +22,8 @@ use Aviat\Ion\Tests\Ion_TestCase;
|
|||||||
class ArrayTypeTest extends Ion_TestCase {
|
class ArrayTypeTest extends Ion_TestCase {
|
||||||
use ArrayWrapper;
|
use ArrayWrapper;
|
||||||
|
|
||||||
public function setUp(): void {
|
public function setUp()
|
||||||
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,29 +169,6 @@ class ArrayTypeTest extends Ion_TestCase {
|
|||||||
$this->assertFalse($obj->hasKey('b'));
|
$this->assertFalse($obj->hasKey('b'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testHasKeyArray()
|
|
||||||
{
|
|
||||||
$obj = $this->arr([
|
|
||||||
'foo' => [
|
|
||||||
'bar' => [
|
|
||||||
'baz' => [
|
|
||||||
'foobar' => NULL,
|
|
||||||
'one' => 1,
|
|
||||||
],
|
|
||||||
],
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->assertTrue($obj->hasKey(['foo']));
|
|
||||||
$this->assertTrue($obj->hasKey(['foo', 'bar']));
|
|
||||||
$this->assertTrue($obj->hasKey(['foo', 'bar', 'baz']));
|
|
||||||
$this->assertTrue($obj->hasKey(['foo', 'bar', 'baz', 'one']));
|
|
||||||
$this->assertTrue($obj->hasKey(['foo', 'bar', 'baz', 'foobar']));
|
|
||||||
|
|
||||||
$this->assertFalse($obj->hasKey(['foo', 'baz']));
|
|
||||||
$this->assertFalse($obj->hasKey(['bar', 'baz']));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testHas()
|
public function testHas()
|
||||||
{
|
{
|
||||||
$obj = $this->arr([1, 2, 6, 8, 11]);
|
$obj = $this->arr([1, 2, 6, 8, 11]);
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\Type;
|
namespace Aviat\Ion\Tests\Type;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\View;
|
namespace Aviat\Ion\Tests\View;
|
||||||
@ -24,7 +24,8 @@ class HtmlViewTest extends HttpViewTest {
|
|||||||
|
|
||||||
protected $template_path;
|
protected $template_path;
|
||||||
|
|
||||||
public function setUp(): void {
|
public function setUp()
|
||||||
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
$this->view = new TestHtmlView($this->container);
|
$this->view = new TestHtmlView($this->container);
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\View;
|
namespace Aviat\Ion\Tests\View;
|
||||||
@ -26,7 +26,8 @@ class HttpViewTest extends Ion_TestCase {
|
|||||||
protected $view;
|
protected $view;
|
||||||
protected $friend;
|
protected $friend;
|
||||||
|
|
||||||
public function setUp(): void {
|
public function setUp()
|
||||||
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
$this->view = new TestHttpView($this->container);
|
$this->view = new TestHttpView($this->container);
|
||||||
$this->friend = new Friend($this->view);
|
$this->friend = new Friend($this->view);
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests\View;
|
namespace Aviat\Ion\Tests\View;
|
||||||
@ -21,7 +21,8 @@ use Aviat\Ion\Tests\TestJsonView;
|
|||||||
|
|
||||||
class JsonViewTest extends HttpViewTest {
|
class JsonViewTest extends HttpViewTest {
|
||||||
|
|
||||||
public function setUp(): void {
|
public function setUp()
|
||||||
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
|
||||||
$this->view = new TestJsonView($this->container);
|
$this->view = new TestJsonView($this->container);
|
||||||
|
@ -1,88 +0,0 @@
|
|||||||
<?php declare(strict_types=1);
|
|
||||||
/**
|
|
||||||
* Ion
|
|
||||||
*
|
|
||||||
* Building blocks for web development
|
|
||||||
*
|
|
||||||
* PHP version 7.2
|
|
||||||
*
|
|
||||||
* @package Ion
|
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
|
||||||
* @version 3.0.0
|
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
|
||||||
|
|
||||||
use Aviat\Ion\XML;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
class XMLTest extends TestCase {
|
|
||||||
|
|
||||||
protected $xml;
|
|
||||||
protected $expectedXml;
|
|
||||||
protected $object;
|
|
||||||
protected $array;
|
|
||||||
|
|
||||||
public function setUp(): void {
|
|
||||||
$this->xml = file_get_contents(__DIR__ . '/test_data/XML/xmlTestFile.xml');
|
|
||||||
$this->expectedXml = file_get_contents(__DIR__ . '/test_data/XML/minifiedXmlTestFile.xml');
|
|
||||||
|
|
||||||
$this->array = [
|
|
||||||
'entry' => [
|
|
||||||
'foo' => [
|
|
||||||
'bar' => [
|
|
||||||
'baz' => 42
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'episode' => '11',
|
|
||||||
'status' => 'watching',
|
|
||||||
'score' => '7',
|
|
||||||
'storage_type' => '1',
|
|
||||||
'storage_value' => '2.5',
|
|
||||||
'times_rewatched' => '1',
|
|
||||||
'rewatch_value' => '3',
|
|
||||||
'date_start' => '01152015',
|
|
||||||
'date_finish' => '10232016',
|
|
||||||
'priority' => '2',
|
|
||||||
'enable_discussion' => '0',
|
|
||||||
'enable_rewatching' => '1',
|
|
||||||
'comments' => 'Should you say something?',
|
|
||||||
'tags' => 'test tag, 2nd tag'
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
$this->object = new XML();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testToArray()
|
|
||||||
{
|
|
||||||
$this->assertEquals($this->array, XML::toArray($this->xml));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testParse()
|
|
||||||
{
|
|
||||||
$this->object->setXML($this->xml);
|
|
||||||
$this->assertEquals($this->array, $this->object->parse());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testToXML()
|
|
||||||
{
|
|
||||||
$this->assertEquals($this->expectedXml, XML::toXML($this->array));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCreateXML()
|
|
||||||
{
|
|
||||||
$this->object->setData($this->array);
|
|
||||||
$this->assertEquals($this->expectedXml, $this->object->createXML());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testToString()
|
|
||||||
{
|
|
||||||
$this->object->setData($this->array);
|
|
||||||
$this->assertEquals($this->expectedXml, $this->object->__toString());
|
|
||||||
$this->assertEquals($this->expectedXml, (string)$this->object);
|
|
||||||
}
|
|
||||||
}
|
|
@ -21,8 +21,8 @@ require 'Ion_TestCase.php';
|
|||||||
// Ini Settings
|
// Ini Settings
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
ini_set('session.use_cookies', 0);
|
ini_set('session.use_cookies', 0);
|
||||||
ini_set('session.use_only_cookies',0);
|
ini_set("session.use_only_cookies",0);
|
||||||
ini_set('session.use_trans_sid',1);
|
ini_set("session.use_trans_sid",1);
|
||||||
// Start session here to surpress error about headers not sent
|
// Start session here to surpress error about headers not sent
|
||||||
session_start();
|
session_start();
|
||||||
|
|
||||||
|
12
tests/di.php
12
tests/di.php
@ -11,16 +11,16 @@ use Aviat\Ion\Di\Container;
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Setup DI container
|
// Setup DI container
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
return static function(array $config_array = []) {
|
return function(array $config_array = []) {
|
||||||
$container = new Container();
|
$container = new Container();
|
||||||
|
|
||||||
$container->set('config', static function() {
|
$container->set('config', function() {
|
||||||
return new Config([]);
|
return new Config([]);
|
||||||
});
|
});
|
||||||
|
|
||||||
$container->setInstance('config', new Config($config_array));
|
$container->setInstance('config', new Config($config_array));
|
||||||
|
|
||||||
$container->set('request', static function() {
|
$container->set('request', function() {
|
||||||
return ServerRequestFactory::fromGlobals(
|
return ServerRequestFactory::fromGlobals(
|
||||||
$_SERVER,
|
$_SERVER,
|
||||||
$_GET,
|
$_GET,
|
||||||
@ -30,17 +30,17 @@ return static function(array $config_array = []) {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
$container->set('response', static function() {
|
$container->set('response', function() {
|
||||||
return new Response();
|
return new Response();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create session Object
|
// Create session Object
|
||||||
$container->set('session', static function() {
|
$container->set('session', function() {
|
||||||
return (new SessionFactory())->newInstance($_COOKIE);
|
return (new SessionFactory())->newInstance($_COOKIE);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create Html helper Object
|
// Create Html helper Object
|
||||||
$container->set('html-helper', static function() {
|
$container->set('html-helper', function() {
|
||||||
return (new HelperLocatorFactory)->newInstance();
|
return (new HelperLocatorFactory)->newInstance();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
*
|
*
|
||||||
* Building blocks for web development
|
* Building blocks for web development
|
||||||
*
|
*
|
||||||
* PHP version 7.2
|
* PHP version 7
|
||||||
*
|
*
|
||||||
* @package Ion
|
* @package Ion
|
||||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
* @copyright 2015 - 2019 Timothy J. Warren
|
* @copyright 2015 - 2017 Timothy J. Warren
|
||||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
* @version 3.0.0
|
* @version 2.2.0
|
||||||
* @link https://git.timshomepage.net/aviat/ion
|
* @link https://git.timshomepage.net/timw4mail/ion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Aviat\Ion\Tests;
|
namespace Aviat\Ion\Tests;
|
||||||
@ -81,13 +81,6 @@ class TestTransformer extends AbstractTransformer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestTransformerUntransform extends TestTransformer {
|
|
||||||
public function untransform($item)
|
|
||||||
{
|
|
||||||
return (array)$item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
trait MockViewOutputTrait {
|
trait MockViewOutputTrait {
|
||||||
/*protected function output() {
|
/*protected function output() {
|
||||||
$reflect = new ReflectionClass($this);
|
$reflect = new ReflectionClass($this);
|
||||||
@ -110,7 +103,7 @@ trait MockViewOutputTrait {
|
|||||||
//$friend->output();
|
//$friend->output();
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
public function send(): void
|
public function send()
|
||||||
{
|
{
|
||||||
if ($this->hasRendered)
|
if ($this->hasRendered)
|
||||||
{
|
{
|
||||||
@ -122,7 +115,7 @@ trait MockViewOutputTrait {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class TestView extends View {
|
class TestView extends View {
|
||||||
public function send(): void
|
public function send()
|
||||||
{
|
{
|
||||||
if ($this->hasRendered)
|
if ($this->hasRendered)
|
||||||
{
|
{
|
||||||
@ -135,7 +128,7 @@ class TestView extends View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class TestHtmlView extends HtmlView {
|
class TestHtmlView extends HtmlView {
|
||||||
protected function output(): void
|
protected function output()
|
||||||
{
|
{
|
||||||
if ($this->hasRendered)
|
if ($this->hasRendered)
|
||||||
{
|
{
|
||||||
@ -147,7 +140,7 @@ class TestHtmlView extends HtmlView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class TestHttpView extends HttpView {
|
class TestHttpView extends HttpView {
|
||||||
protected function output(): void
|
protected function output()
|
||||||
{
|
{
|
||||||
if ($this->hasRendered)
|
if ($this->hasRendered)
|
||||||
{
|
{
|
||||||
@ -161,7 +154,7 @@ class TestHttpView extends HttpView {
|
|||||||
class TestJsonView extends JsonView {
|
class TestJsonView extends JsonView {
|
||||||
public function __destruct() {}
|
public function __destruct() {}
|
||||||
|
|
||||||
protected function output(): void
|
protected function output()
|
||||||
{
|
{
|
||||||
if ($this->hasRendered)
|
if ($this->hasRendered)
|
||||||
{
|
{
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<entry><foo><bar><baz>42</baz></bar></foo><episode>11</episode><status>watching</status><score>7</score><storage_type>1</storage_type><storage_value>2.5</storage_value><times_rewatched>1</times_rewatched><rewatch_value>3</rewatch_value><date_start>01152015</date_start><date_finish>10232016</date_finish><priority>2</priority><enable_discussion>0</enable_discussion><enable_rewatching>1</enable_rewatching><comments>Should you say something?</comments><tags>test tag, 2nd tag</tags></entry>
|
|
@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<entry>
|
|
||||||
<foo>
|
|
||||||
<bar>
|
|
||||||
<baz>42</baz>
|
|
||||||
</bar>
|
|
||||||
</foo>
|
|
||||||
<episode>11</episode>
|
|
||||||
<status>watching</status>
|
|
||||||
<score>7</score>
|
|
||||||
<storage_type>1</storage_type>
|
|
||||||
<storage_value>2.5</storage_value>
|
|
||||||
<times_rewatched>1</times_rewatched>
|
|
||||||
<rewatch_value>3</rewatch_value>
|
|
||||||
<date_start>01152015</date_start>
|
|
||||||
<date_finish>10232016</date_finish>
|
|
||||||
<priority>2</priority>
|
|
||||||
<enable_discussion>0</enable_discussion>
|
|
||||||
<enable_rewatching>1</enable_rewatching>
|
|
||||||
<comments>Should you say something?</comments>
|
|
||||||
<tags>test tag, 2nd tag</tags>
|
|
||||||
</entry>
|
|
Loading…
Reference in New Issue
Block a user