mirror of
https://github.com/wiosna-dev/common-library.git
synced 2026-03-12 09:31:51 +01:00
Compare commits
1 Commits
0.1.0
...
analysis-q
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b9dfa713ff |
15
.env.dist
15
.env.dist
@@ -1,15 +0,0 @@
|
||||
# -----------------------------------------------------------------------------
|
||||
### Docker
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
#
|
||||
# All containers
|
||||
#
|
||||
DOCKER_CONTAINER_OWNER=meritoo
|
||||
DOCKER_CONTAINER_PROJECT=common-library
|
||||
|
||||
#
|
||||
# PHP configuration:
|
||||
# - timezone
|
||||
#
|
||||
TIMEZONE=Europe/Warsaw
|
||||
69
.gitignore
vendored
69
.gitignore
vendored
@@ -1,58 +1,44 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Environment-related parameters
|
||||
# ------------------------------------------------------------------------------
|
||||
.env
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Vendors
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/vendor/
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Composer
|
||||
# ------------------------------------------------------------------------------
|
||||
/composer.lock
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/composer.phar
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Phing
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/phing/properties
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### PHPUnit
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/phpunit.xml
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
### PHP Coding Standards Fixer
|
||||
# ------------------------------------------------------------------------------
|
||||
/.php_cs
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### PHP Coding Standards Fixer generated files
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/.php_cs.cache
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
### Build files
|
||||
# -----------------------------------------------------------------------------
|
||||
/build/
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Generated databases
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/data/tmp
|
||||
*.sql
|
||||
*.sqlite
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Compiled source
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
*.com
|
||||
*.class
|
||||
*.dll
|
||||
@@ -61,22 +47,23 @@
|
||||
*.so
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Shell scripts
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/*.sh
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### JetBrains
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/.idea
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### NetBeans template
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
nbproject/private/
|
||||
build/
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
@@ -84,9 +71,9 @@ nbactions.xml
|
||||
.nb-gradle/
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### OSX template
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
@@ -113,9 +100,9 @@ Temporary Items
|
||||
.apdisk
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Linux template
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
@@ -128,9 +115,9 @@ Temporary Items
|
||||
.Trash-*
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Windows template
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
25
.php_cs.dist
25
.php_cs.dist
@@ -1,6 +1,13 @@
|
||||
<?php
|
||||
|
||||
$finder = PhpCsFixer\Finder::create()
|
||||
/*
|
||||
* Do not verify:
|
||||
* - all DependencyInjection/Configuration classes: the Configuration.php files
|
||||
* - autoloader from /app directory: autoload.php
|
||||
*/
|
||||
->notPath('/DependencyInjection\/Configuration\.php/')
|
||||
->notPath('/autoload\.php/')
|
||||
->in([
|
||||
__DIR__ . '/src',
|
||||
__DIR__ . '/tests',
|
||||
@@ -8,20 +15,16 @@ $finder = PhpCsFixer\Finder::create()
|
||||
|
||||
return PhpCsFixer\Config::create()
|
||||
->setRules([
|
||||
'@Symfony' => true,
|
||||
'binary_operator_spaces' => [
|
||||
'@Symfony' => true,
|
||||
'phpdoc_summary' => false,
|
||||
'phpdoc_separation' => false,
|
||||
'phpdoc_align' => false,
|
||||
'cast_spaces' => false,
|
||||
'binary_operator_spaces' => [
|
||||
'align_double_arrow' => true,
|
||||
],
|
||||
'blank_line_before_return' => false,
|
||||
'cast_spaces' => false,
|
||||
'concat_space' => [
|
||||
'concat_space' => [
|
||||
'spacing' => 'one',
|
||||
],
|
||||
'phpdoc_add_missing_param_annotation' => true,
|
||||
'phpdoc_align' => false,
|
||||
'phpdoc_order' => true,
|
||||
'phpdoc_separation' => false,
|
||||
'phpdoc_summary' => false,
|
||||
'trim_array_spaces' => false,
|
||||
])
|
||||
->setFinder($finder);
|
||||
|
||||
1
.styleci.yml
Normal file
1
.styleci.yml
Normal file
@@ -0,0 +1 @@
|
||||
preset: symfony
|
||||
@@ -5,12 +5,8 @@ php:
|
||||
- 7.0
|
||||
- 7.1
|
||||
|
||||
before_install:
|
||||
- sudo locale-gen de_DE.UTF-8 es_ES.UTF-8 en_GB.UTF-8 en_US.UTF-8 fr_FR.UTF-8 it_IT.UTF-8 pl_PL.UTF-8 ru_RU.UTF-8
|
||||
- composer global require hirak/prestissimo
|
||||
|
||||
install:
|
||||
- travis_wait 30 composer install -vvv
|
||||
- composer install
|
||||
|
||||
script:
|
||||
- php ./vendor/bin/phpunit
|
||||
|
||||
31
CHANGELOG.md
31
CHANGELOG.md
@@ -1,31 +0,0 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# 0.1.0
|
||||
|
||||
1. Composer > support/require PHP 5.6+ (instead of 5.5.9+)
|
||||
2. Docker > rename `php-cli` service to `php`
|
||||
3. Exceptions > create instance of exception using static `create()` method (instead of constructor)
|
||||
4. Documentation > Exceptions
|
||||
|
||||
# 0.0.21
|
||||
|
||||
1. Composer > require ext-pcre
|
||||
2. Arrays > minor refactoring
|
||||
3. Update @author and @copyright in classes' descriptions
|
||||
|
||||
# 0.0.20
|
||||
|
||||
1. Collection > add() method > treat empty string as not provided index (same as null)
|
||||
|
||||
# 0.0.19
|
||||
|
||||
1. Add this changelog
|
||||
2. Reorganize documentation & update [Readme](README.md)
|
||||
3. Docker: use project-related binaries globally
|
||||
4. StyleCI & PHP Coding Standards Fixer: update configuration
|
||||
5. Documentation > Docker > add paragraph for PHP Coding Standards Fixer
|
||||
6. Coding standard > fix automatically
|
||||
7. StyleCI configuration > fix bug "The provided fixer 'binary_operator_spaces' cannot be enabled again because it was already enabled"
|
||||
8. StyleCI > disable & remove
|
||||
105
README.md
105
README.md
@@ -1,28 +1,103 @@
|
||||
# Meritoo Common Library
|
||||
# Meritoo Common Library [](https://travis-ci.org/meritoo/common-library) [](https://packagist.org/packages/meritoo/common-library) [](https://styleci.io/repos/101790028) [](https://github.com/meritoo/common-library) [](https://github.com/meritoo/common-library) [](https://coveralls.io/github/meritoo/common-library?branch=master)
|
||||
Useful classes, methods, extensions etc.
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
## Installation
|
||||
|
||||
[](https://travis-ci.org/meritoo/common-library) [](https://packagist.org/packages/meritoo/common-library) [](https://github.com/meritoo/common-library) [](https://github.com/meritoo/common-library) [](https://coveralls.io/github/meritoo/common-library?branch=master)
|
||||
Run [Composer](https://getcomposer.org) to install new package:
|
||||
|
||||
# Installation
|
||||
```bash
|
||||
$ composer require meritoo/common-library
|
||||
```
|
||||
|
||||
Run [Composer](https://getcomposer.org) to install this package in your project:
|
||||
> How to install Composer: https://getcomposer.org/download
|
||||
|
||||
```bash
|
||||
composer require meritoo/common-library
|
||||
## Static methods
|
||||
|
||||
This package contains a lot of class with static methods, so usage is not so complicated. Just run the static method who would you like to use. Example:
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Utilities\Arrays;
|
||||
|
||||
$firstElement = Arrays::getFirstElement(['lorem', 'ipsum']);
|
||||
var_dump($firstElement); // string(5) "lorem"
|
||||
```
|
||||
|
||||
> [How to install Composer?](https://getcomposer.org/download)
|
||||
## Base test case with common methods and data providers
|
||||
|
||||
# Usage
|
||||
Located here: `Meritoo\Common\Test\Base\BaseTestCase`. Just extend the `BaseTestCase` class and use it like in `Meritoo\Common\Test\Utilities\DateTest` class:
|
||||
|
||||
1. [Base test case (with common methods and data providers)](docs/Base-test-case.md)
|
||||
2. [Collection of elements](docs/Collection-of-elements.md)
|
||||
3. [Exceptions](docs/Static-methods.md)
|
||||
4. [Static methods](docs/Static-methods.md)
|
||||
```php
|
||||
class DateTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* @param mixed $value Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetDateTimeEmptyValue($value)
|
||||
{
|
||||
self::assertFalse(Date::getDateTime($value));
|
||||
}
|
||||
|
||||
# Development
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
More information [you can find here](docs/Development.md)
|
||||
or in `Meritoo\Common\Test\Utilities\MimeTypesTest` class:
|
||||
|
||||
```php
|
||||
class MimeTypesTest extends BaseTestCase
|
||||
{
|
||||
(...)
|
||||
|
||||
/**
|
||||
* @param bool $mimeType The mime type, e.g. "video/mpeg"
|
||||
* @dataProvider provideBooleanValue
|
||||
*/
|
||||
public function testGetExtensionBooleanMimeType($mimeType)
|
||||
{
|
||||
self::assertEquals('', MimeTypes::getExtension($mimeType));
|
||||
}
|
||||
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
## Collection of elements
|
||||
|
||||
Located here: `Meritoo\Common\Collection\Collection`. It's a set of some elements, e.g. objects. It's iterable and countable. Provides very useful methods. Some of them:
|
||||
- `getFirst()` - returns the first element in the collection
|
||||
- `getLast()` - returns the last element in the collection
|
||||
- `isEmpty()` - returns information if collection is empty
|
||||
- `add($element, $index = null)` - adds given element (at the end of collection)
|
||||
- `addMultiple($elements, $useIndexes = false)` - adds given elements (at the end of collection)
|
||||
- `prepend($element)` - prepends given element (adds given element at the beginning of collection)
|
||||
- `remove($element)` - removes given element
|
||||
|
||||
Examples of usage below.
|
||||
|
||||
#### An empty collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$emptyCollection = new Collection();
|
||||
var_dump($emptyCollection->isEmpty()); // bool(true)
|
||||
```
|
||||
|
||||
#### Simple collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$elements = [
|
||||
'lorem',
|
||||
'ipsum',
|
||||
123 => 'dolor',
|
||||
345 => 'sit',
|
||||
];
|
||||
|
||||
$simpleCollection = new Collection($elements);
|
||||
var_dump($simpleCollection->has('dolor')); // bool(true)
|
||||
```
|
||||
|
||||
Enjoy!
|
||||
|
||||
10
build.xml
10
build.xml
@@ -4,10 +4,10 @@
|
||||
<if>
|
||||
<available file="phing/properties" property="custom.properties.available"/>
|
||||
<then>
|
||||
<property file="phing/properties"/>
|
||||
<property file="phing/properties" />
|
||||
</then>
|
||||
<else>
|
||||
<property file="phing/properties.dist"/>
|
||||
<property file="phing/properties.dist" />
|
||||
</else>
|
||||
</if>
|
||||
|
||||
@@ -18,18 +18,18 @@
|
||||
|
||||
<!-- Build app -->
|
||||
<target name="build:app" description="Prepares app to build and tests">
|
||||
<phing phingfile="phing/app.xml" haltonfailure="true"/>
|
||||
<phing phingfile="phing/app.xml" haltonfailure="true" />
|
||||
</target>
|
||||
|
||||
<!-- Build tests -->
|
||||
<target name="build:tests" description="Runs all tests, checks and creates docs">
|
||||
<phing phingfile="phing/tests.xml" haltonfailure="true"/>
|
||||
<phing phingfile="phing/tests.xml" haltonfailure="true" />
|
||||
|
||||
<!--
|
||||
Conditional running of tests.
|
||||
Disabled, because not required.
|
||||
|
||||
Meritoo <github@meritoo.pl>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<if>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "meritoo/common-library",
|
||||
"description": "Useful classes, methods, extensions etc.",
|
||||
"license": "MIT",
|
||||
"version": "0.1.0",
|
||||
"version": "0.0.7",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Meritoo.pl",
|
||||
@@ -11,31 +11,24 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.6",
|
||||
"ext-pcre": "*",
|
||||
"php": ">=5.6.0",
|
||||
"doctrine/orm": "^2.5",
|
||||
"gedmo/doctrine-extensions": "^2.4"
|
||||
"gedmo/doctrine-extensions": "^2.4",
|
||||
"symfony/http-foundation": "^3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "^2.2",
|
||||
"pdepend/pdepend": "^2.5",
|
||||
"phploc/phploc": "^2.1",
|
||||
"phpunit/phpunit": "^4.8 || ^5.0",
|
||||
"squizlabs/php_codesniffer": "^2.8",
|
||||
"phpmd/phpmd": "^2.6",
|
||||
"phpunit/phpunit": "^4.8",
|
||||
"sebastian/phpcpd": "^2.0",
|
||||
"squizlabs/php_codesniffer": "^2.9"
|
||||
"sebastian/phpcpd": "^3.0",
|
||||
"pdepend/pdepend": "^2.5",
|
||||
"phploc/phploc": "^3.0",
|
||||
"friendsofphp/php-cs-fixer": "^2.1"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Meritoo\\Common\\": "src/"
|
||||
"Meritoo\\Common\\": "src/Meritoo/Common/",
|
||||
"Meritoo\\Common\\Test\\": "tests/Meritoo/Common/Test/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Meritoo\\Common\\Test\\": "tests/"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true
|
||||
}
|
||||
}
|
||||
|
||||
3518
composer.lock
generated
Normal file
3518
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,20 +0,0 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
php:
|
||||
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
|
||||
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-php
|
||||
entrypoint: php
|
||||
command: -S 0.0.0.0:9999
|
||||
build:
|
||||
context: ./docker/config
|
||||
args:
|
||||
- TIMEZONE=$TIMEZONE
|
||||
volumes:
|
||||
- .:/project
|
||||
composer:
|
||||
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
|
||||
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-composer
|
||||
entrypoint: composer
|
||||
volumes:
|
||||
- .:/project
|
||||
@@ -1,131 +0,0 @@
|
||||
FROM php:5.6-cli
|
||||
MAINTAINER Meritoo <github@meritoo.pl>
|
||||
|
||||
#
|
||||
# Tools & libraries
|
||||
#
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
vim \
|
||||
git \
|
||||
unzip \
|
||||
libicu-dev \
|
||||
locales \
|
||||
&& apt-get clean \
|
||||
&& rm -rf \
|
||||
/var/lib/apt/lists/* \
|
||||
/tmp/* \
|
||||
/var/tmp/*
|
||||
|
||||
#
|
||||
# Generating locales:
|
||||
# - de_DE
|
||||
# - es_ES
|
||||
# - en_GB
|
||||
# - en_US
|
||||
# - fr_FR
|
||||
# - it_IT
|
||||
# - pl_PL
|
||||
# - ru_RU
|
||||
#
|
||||
RUN sed -i 's/^# de_DE/de_DE/g; \
|
||||
s/^# es_ES/es_ES/g; \
|
||||
s/^# en_GB/en_GB/g; \
|
||||
s/^# en_US/en_US/g; \
|
||||
s/^# fr_FR/fr_FR/g; \
|
||||
s/^# it_IT/it_IT/g; \
|
||||
s/^# pl_PL/pl_PL/g; \
|
||||
s/^# ru_RU/ru_RU/g;' /etc/locale.gen \
|
||||
&& locale-gen
|
||||
|
||||
#
|
||||
# Set default language
|
||||
#
|
||||
# Required to avoid problem with using strange language by error messages.
|
||||
# Example: "chmod(): Aucun fichier ou dossier de ce type"
|
||||
#
|
||||
ENV LANGUAGE=en_US.UTF-8
|
||||
|
||||
#
|
||||
# PHP extensions
|
||||
#
|
||||
RUN docker-php-ext-install \
|
||||
intl \
|
||||
mbstring
|
||||
|
||||
#
|
||||
# PHP extensions (PECL):
|
||||
# - Xdebug
|
||||
#
|
||||
RUN pecl install \
|
||||
xdebug-2.5.5 \
|
||||
&& docker-php-ext-enable \
|
||||
xdebug
|
||||
|
||||
COPY xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
|
||||
|
||||
#
|
||||
# PHP configuration:
|
||||
# - default configuration
|
||||
# - timezone
|
||||
#
|
||||
COPY php.ini /usr/local/etc/php/php.ini
|
||||
ARG TIMEZONE
|
||||
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
|
||||
&& echo ${TIMEZONE} > /etc/timezone \
|
||||
&& printf '[PHP]\ndate.timezone = "%s"\n' ${TIMEZONE} > /usr/local/etc/php/conf.d/tzone.ini \
|
||||
&& "date"
|
||||
#RUN echo "\n""date.timezone = $TIMEZONE""\n" >> /usr/local/etc/php/php.ini
|
||||
|
||||
#
|
||||
# Phing
|
||||
#
|
||||
RUN pear channel-discover pear.phing.info \
|
||||
&& pear install [--alldeps] phing/phing
|
||||
|
||||
#
|
||||
# Composer - environment variables:
|
||||
# - disable warning about running commands as root/super user
|
||||
# - disable automatic clearing of sudo sessions
|
||||
#
|
||||
# More:
|
||||
# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser
|
||||
#
|
||||
ENV COMPOSER_ALLOW_SUPERUSER 1
|
||||
|
||||
#
|
||||
# Composer + https://packagist.org/packages/hirak/prestissimo package
|
||||
#
|
||||
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
|
||||
&& php -r "if (hash_file('SHA384', 'composer-setup.php') === \
|
||||
'544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo \
|
||||
'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
|
||||
&& php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
|
||||
&& php -r "unlink('composer-setup.php');" \
|
||||
&& composer global require \
|
||||
--no-plugins \
|
||||
--no-scripts \
|
||||
--no-progress \
|
||||
--no-suggest \
|
||||
--no-interaction \
|
||||
--prefer-dist \
|
||||
--optimize-autoloader \
|
||||
--classmap-authoritative \
|
||||
hirak/prestissimo \
|
||||
&& rm -rf ~/.composer/cache/* \
|
||||
&& composer clear-cache \
|
||||
&& composer --version
|
||||
|
||||
#
|
||||
# Bash
|
||||
#
|
||||
RUN sed -i 's/^# export/export/g; \
|
||||
s/^# alias/alias/g;' ~/.bashrc \
|
||||
&& echo 'COLUMNS=200'"\n" >> ~/.bashrc
|
||||
|
||||
#
|
||||
# Use project-related binaries globally
|
||||
#
|
||||
ENV PATH="/project/vendor/bin:${PATH}"
|
||||
|
||||
WORKDIR /project
|
||||
@@ -1,3 +0,0 @@
|
||||
display_errors = On
|
||||
display_startup_errors = On
|
||||
error_reporting = E_ALL
|
||||
@@ -1,6 +0,0 @@
|
||||
[xdebug]
|
||||
zend_extension=xdebug.so
|
||||
|
||||
xdebug.remote_enable=1
|
||||
xdebug.remote_port=9001
|
||||
xdebug.remote_host=10.254.254.254
|
||||
@@ -1,52 +0,0 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# Base test case (with common methods and data providers)
|
||||
|
||||
Located here: `Meritoo\Common\Test\Base\BaseTestCase`. Just extend the `BaseTestCase` class and use it like in `Meritoo\Common\Test\Utilities\DateTest` class:
|
||||
|
||||
```php
|
||||
class DateTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* @param mixed $value Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetDateTimeEmptyValue($value)
|
||||
{
|
||||
self::assertFalse(Date::getDateTime($value));
|
||||
}
|
||||
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
or in `Meritoo\Common\Test\Utilities\MimeTypesTest` class:
|
||||
|
||||
```php
|
||||
class MimeTypesTest extends BaseTestCase
|
||||
{
|
||||
(...)
|
||||
|
||||
/**
|
||||
* @param bool $mimeType The mime type, e.g. "video/mpeg"
|
||||
* @dataProvider provideBooleanValue
|
||||
*/
|
||||
public function testGetExtensionBooleanMimeType($mimeType)
|
||||
{
|
||||
self::assertEquals('', MimeTypes::getExtension($mimeType));
|
||||
}
|
||||
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
# More
|
||||
|
||||
1. [**Base test case (with common methods and data providers)**](Base-test-case.md)
|
||||
2. [Collection of elements](Collection-of-elements.md)
|
||||
3. [Exceptions](Exceptions.md)
|
||||
4. [Static methods](Static-methods.md)
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
@@ -1,50 +0,0 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# Collection of elements
|
||||
|
||||
Located here: `Meritoo\Common\Collection\Collection`. It's a set of some elements, e.g. objects. It's iterable and countable. Provides very useful methods. Some of them:
|
||||
- `getFirst()` - returns the first element in the collection
|
||||
- `getLast()` - returns the last element in the collection
|
||||
- `isEmpty()` - returns information if collection is empty
|
||||
- `add($element, $index = null)` - adds given element (at the end of collection)
|
||||
- `addMultiple($elements, $useIndexes = false)` - adds given elements (at the end of collection)
|
||||
- `prepend($element)` - prepends given element (adds given element at the beginning of collection)
|
||||
- `remove($element)` - removes given element
|
||||
|
||||
Examples of usage below.
|
||||
|
||||
### An empty collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$emptyCollection = new Collection();
|
||||
var_dump($emptyCollection->isEmpty()); // bool(true)
|
||||
```
|
||||
|
||||
### Simple collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$elements = [
|
||||
'lorem',
|
||||
'ipsum',
|
||||
123 => 'dolor',
|
||||
345 => 'sit',
|
||||
];
|
||||
|
||||
$simpleCollection = new Collection($elements);
|
||||
var_dump($simpleCollection->has('dolor')); // bool(true)
|
||||
```
|
||||
|
||||
# More
|
||||
|
||||
1. [Base test case (with common methods and data providers)](Base-test-case.md)
|
||||
2. [**Collection of elements**](Collection-of-elements.md)
|
||||
3. [Exceptions](Exceptions.md)
|
||||
4. [Static methods](Static-methods.md)
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
@@ -1,119 +0,0 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Development-related information
|
||||
|
||||
# Requirements
|
||||
|
||||
* [Docker](https://www.docker.com)
|
||||
* Your favourite IDE :)
|
||||
|
||||
# Getting started
|
||||
|
||||
1. Build, create and start Docker's containers by running command:
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
2. Install packages by running command:
|
||||
|
||||
```bash
|
||||
docker-compose run composer install
|
||||
```
|
||||
|
||||
> [What is Docker?](https://www.docker.com/what-docker)
|
||||
|
||||
# Composer
|
||||
|
||||
Available as `composer` service. You can run any Composer's command using the `composer` service:
|
||||
|
||||
```bash
|
||||
docker-compose run composer <command>
|
||||
```
|
||||
|
||||
Examples below.
|
||||
|
||||
##### Install packages
|
||||
|
||||
```bash
|
||||
docker-compose run composer install
|
||||
```
|
||||
|
||||
##### Update packages
|
||||
|
||||
```bash
|
||||
docker-compose run composer update
|
||||
```
|
||||
|
||||
##### Add package
|
||||
|
||||
```bash
|
||||
docker-compose run composer require <vendor>/<package>
|
||||
```
|
||||
|
||||
##### Remove package
|
||||
|
||||
```bash
|
||||
docker-compose run composer remove <vendor>/<package>
|
||||
```
|
||||
|
||||
# Coding Standards Fixer
|
||||
|
||||
Fix coding standard by running command:
|
||||
|
||||
```bash
|
||||
docker-compose exec php php-cs-fixer fix
|
||||
```
|
||||
|
||||
Omit cache and run the Fixer from scratch by running command:
|
||||
|
||||
```bash
|
||||
docker-compose exec php rm .php_cs.cache && docker-compose exec php php-cs-fixer fix
|
||||
```
|
||||
|
||||
> [Want more?](https://cs.sensiolabs.org)
|
||||
|
||||
# Tests
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Install required packages by running command: `docker-compose run composer install`.
|
||||
|
||||
### Running tests
|
||||
|
||||
#### Simply & quick, without code coverage
|
||||
|
||||
Tests are running using Docker and `php` service defined in `docker-compose.yml`. Example:
|
||||
|
||||
```bash
|
||||
docker-compose exec php phpunit --no-coverage
|
||||
```
|
||||
|
||||
You can also run them in container. In this case you have to run 2 commands:
|
||||
1. Enter container:
|
||||
|
||||
```bash
|
||||
docker-compose exec php bash
|
||||
```
|
||||
|
||||
2. Run tests:
|
||||
|
||||
```bash
|
||||
phpunit --no-coverage
|
||||
```
|
||||
|
||||
#### With code coverage
|
||||
|
||||
```bash
|
||||
docker-compose exec php phpunit
|
||||
```
|
||||
|
||||
# Other
|
||||
|
||||
Rebuild project and run tests by running command:
|
||||
|
||||
```bash
|
||||
docker-compose exec php phing
|
||||
```
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
@@ -1,61 +0,0 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# Exceptions
|
||||
|
||||
### Create instance of exception
|
||||
|
||||
This package contains a lot of exceptions. Each of them contains static method `create()` with proper arguments that is used to create instance of the exception. Example:
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
|
||||
throw IncorrectBundleNameException::create('RisusIpsum');
|
||||
```
|
||||
|
||||
### Base exception for unknown type of something
|
||||
|
||||
##### Short description
|
||||
|
||||
It's a `Meritoo\Common\Exception\Base\UnknownTypeException` class. Related to `Meritoo\Common\Type\Base\BaseType` class that represents type of something, e.g. type of button, order.
|
||||
|
||||
##### Usage
|
||||
|
||||
You can extend `Meritoo\Common\Exception\Base\UnknownTypeException` class and create your own static method, e.g. `createException()`, which will be used create instance of the exception. Inside the `createException()` method you can call `parent::create()` method.
|
||||
|
||||
##### Example
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
namespace Your\Package\Exception\Type;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Your\Package\Type\SimpleType;
|
||||
|
||||
class UnknownSimpleTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $unknownType Unknown and simple type
|
||||
* @return UnknownSimpleTypeException
|
||||
*/
|
||||
public static function createException($unknownType)
|
||||
{
|
||||
/* @var UnknownSimpleTypeException $exception */
|
||||
$exception = parent::create($unknownType, new SimpleType(), 'my simple type of something');
|
||||
|
||||
return $exception;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
# More
|
||||
|
||||
1. [Base test case (with common methods and data providers)](Base-test-case.md)
|
||||
2. [Collection of elements](Collection-of-elements.md)
|
||||
3. [**Exceptions**](Exceptions.md)
|
||||
4. [Static methods](Static-methods.md)
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
@@ -1,23 +0,0 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# Static methods
|
||||
|
||||
This package contains a lot of class with static methods, so usage is not so complicated. Just run the static method who would you like to use. Example:
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Utilities\Arrays;
|
||||
|
||||
$firstElement = Arrays::getFirstElement(['lorem', 'ipsum']);
|
||||
var_dump($firstElement); // string(5) "lorem"
|
||||
```
|
||||
|
||||
# More
|
||||
|
||||
1. [Base test case (with common methods and data providers)](Base-test-case.md)
|
||||
2. [Collection of elements](Collection-of-elements.md)
|
||||
3. [Exceptions](Exceptions.md)
|
||||
4. [**Static methods**](Static-methods.md)
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
@@ -4,10 +4,10 @@
|
||||
<if>
|
||||
<available file="phing/properties" property="custom.properties.available"/>
|
||||
<then>
|
||||
<property file="phing/properties"/>
|
||||
<property file="phing/properties" />
|
||||
</then>
|
||||
<else>
|
||||
<property file="phing/properties.dist"/>
|
||||
<property file="phing/properties.dist" />
|
||||
</else>
|
||||
</if>
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
depends="app:composer, app:vendors, app:checkout"
|
||||
description="Prepares app to build." />
|
||||
|
||||
<!-- Updates Composer and validates composer.* files -->
|
||||
<target name="app:composer" description="Updates Composer and validates composer.* files">
|
||||
<echo msg="Updating Composer and validating composer.* files..." />
|
||||
<!-- Check / update composer -->
|
||||
<target name="app:composer" description="Checks / updates composer">
|
||||
<echo msg="Checking / updating composer..." />
|
||||
|
||||
<if>
|
||||
<available file="composer.phar" />
|
||||
@@ -42,14 +42,7 @@
|
||||
</if>
|
||||
</else>
|
||||
</if>
|
||||
|
||||
<!-- Update Composer -->
|
||||
<composer command="selfupdate" />
|
||||
|
||||
<!-- Validate Composer -->
|
||||
<composer command="validate">
|
||||
<arg line="--no-check-all --strict" />
|
||||
</composer>
|
||||
</target>
|
||||
|
||||
<!-- Project Install/update vendors -->
|
||||
@@ -75,8 +68,6 @@
|
||||
<then>
|
||||
<composer php="${composer.php}" composer="${composer.path}" command="install">
|
||||
<arg value="--optimize-autoloader" />
|
||||
<arg value="--prefer-dist" />
|
||||
<arg value="--classmap-authoritative" />
|
||||
</composer>
|
||||
</then>
|
||||
<else>
|
||||
|
||||
@@ -28,13 +28,7 @@ assets.installWithSymlink = true
|
||||
|
||||
# Clear cache with the "warmup" option
|
||||
#
|
||||
# The cache:clear command should always be called with the --no-warmup option. Warmup should be done via the cache:warmup command.
|
||||
# https://github.com/symfony/symfony/blob/master/UPGRADE-3.3.md#frameworkbundle
|
||||
#
|
||||
# Meritoo <github@meritoo.pl>
|
||||
# 2017-06-06
|
||||
#
|
||||
cache.clearWithWarmup = false
|
||||
cache.clearWithWarmup = true
|
||||
|
||||
# --------------------------------------------------------------------------------
|
||||
# Composer
|
||||
@@ -81,7 +75,7 @@ dir.reports.coverage = ${dir.reports}/phpunit_coverage
|
||||
# Disabled, because unnecessary right now
|
||||
# phpdocumentor/phpdocumentor cannot be installed via Composer
|
||||
#
|
||||
# Meritoo <github@meritoo.pl>
|
||||
# Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
# 2017-02-22
|
||||
#
|
||||
#dir.docs = ${dir.build}/docs
|
||||
@@ -91,15 +85,40 @@ dir.reports.coverage = ${dir.reports}/phpunit_coverage
|
||||
# Data directories
|
||||
# --------------------------------------------------------------------------------
|
||||
|
||||
dir.data.tests = ${dir.data}/tests
|
||||
dir.data.temporary = ${dir.data}/tmp
|
||||
|
||||
# --------------------------------------------------------------------------------
|
||||
# Testing
|
||||
# --------------------------------------------------------------------------------
|
||||
|
||||
# Path of the framework used to run unit tests
|
||||
# Test database path
|
||||
#
|
||||
tests.framework.path = ./vendor/bin/phpunit --verbose --no-coverage --testdox
|
||||
tests.database = ${dir.data.temporary}/database.sqlite
|
||||
|
||||
#
|
||||
# Disabled, because unnecessary right now
|
||||
# PHPUnit is installed and loaded by Composer
|
||||
#
|
||||
# Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
# 2017-02-22
|
||||
#
|
||||
# Run PHPUnit using exec task instead of phpunitTask
|
||||
#phpunit.useExec = false
|
||||
|
||||
#
|
||||
# Disabled, because unnecessary right now
|
||||
# We want generate code coverage always
|
||||
#
|
||||
# Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
# 2017-02-22
|
||||
#
|
||||
# Collect coverage data during tests
|
||||
#phpunit.withCoverage = true
|
||||
|
||||
# Path of the PHPUnit (https://phpunit.de)
|
||||
#
|
||||
phpUnit.path = ./vendor/bin/phpunit
|
||||
|
||||
# Path of the PHP Coding Standards Fixer (http://cs.sensiolabs.org)
|
||||
#
|
||||
|
||||
111
phing/tests.xml
111
phing/tests.xml
@@ -4,7 +4,7 @@
|
||||
The AutoloaderTask is required to load binaries installed by Composer.
|
||||
The "autoloaderpath" attribute of this task is not required, because it's default value is: vendor/autoload.php.
|
||||
|
||||
Meritoo <github@meritoo.pl>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-23
|
||||
-->
|
||||
<autoloader />
|
||||
@@ -13,10 +13,10 @@
|
||||
<if>
|
||||
<available file="phing/properties" property="custom.properties.available"/>
|
||||
<then>
|
||||
<property file="phing/properties"/>
|
||||
<property file="phing/properties" />
|
||||
</then>
|
||||
<else>
|
||||
<property file="phing/properties.dist"/>
|
||||
<property file="phing/properties.dist" />
|
||||
</else>
|
||||
</if>
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
|
||||
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
|
||||
|
||||
Meritoo <github@meritoo.pl>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
-->
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
|
||||
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
|
||||
|
||||
Meritoo <github@meritoo.pl>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
-->
|
||||
<!--<target name="build:doc"-->
|
||||
@@ -87,7 +87,7 @@
|
||||
|
||||
<!-- Test target -->
|
||||
<target name="build:test"
|
||||
depends="test:unit"
|
||||
depends="test:phpunit"
|
||||
description="Executes all tests" />
|
||||
|
||||
<!-- Project build clean -->
|
||||
@@ -103,8 +103,8 @@
|
||||
<!--<mkdir dir="${dir.docs}" />-->
|
||||
<!--<mkdir dir="${dir.docs.phpdoc2}" />-->
|
||||
<mkdir dir="${dir.reports}" />
|
||||
<mkdir dir="${dir.reports.coverage}" />
|
||||
<mkdir dir="${dir.reports.pdepend}" />
|
||||
<mkdir dir="${dir.reports.coverage}"/>
|
||||
</target>
|
||||
|
||||
<!-- PHPDocumentor2 API documentation target -->
|
||||
@@ -113,7 +113,7 @@
|
||||
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
|
||||
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
|
||||
|
||||
Meritoo <github@meritoo.pl>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<target name="doc:phpdoc2" description="Generates API documentations">
|
||||
@@ -142,7 +142,7 @@
|
||||
via Composer the Symfony2 standard is not included / available in this package. In this case the PHP Coding
|
||||
Standards Fixer (http://cs.sensiolabs.org) is used.
|
||||
|
||||
Meritoo <github@meritoo.pl>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
-->
|
||||
<target name="check:cs" description="Checks coding standard">
|
||||
@@ -166,7 +166,7 @@
|
||||
<!--
|
||||
Previous / old version
|
||||
|
||||
Meritoo <github@meritoo.pl>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<exec command="phpcpd \-\-log-pmd=${dir.reports}/pmd-cpd.xml ${dir.src}" />
|
||||
@@ -204,7 +204,7 @@
|
||||
<!--
|
||||
Previous / old version
|
||||
|
||||
Meritoo <github@meritoo.pl>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<exec command="phploc \-\-log-csv=${dir.reports}/phploc.csv ${dir.src}" />
|
||||
@@ -212,9 +212,94 @@
|
||||
</target>
|
||||
|
||||
<!-- Unit tests -->
|
||||
<target name="test:unit" description="Executes unit tests">
|
||||
<target name="test:phpunit" description="Executes PHPUnit tests">
|
||||
<!-- Check test database -->
|
||||
<if>
|
||||
<not>
|
||||
<available file="${dir.data.tests}" type="dir" property="dir.data.tests.available" />
|
||||
</not>
|
||||
<then>
|
||||
<mkdir dir="${dir.data.tests}" />
|
||||
</then>
|
||||
</if>
|
||||
<if>
|
||||
<not>
|
||||
<available file="${tests.database}" property="tests.database.available" />
|
||||
</not>
|
||||
<then>
|
||||
<touch file="${tests.database}" />
|
||||
</then>
|
||||
</if>
|
||||
<echo msg="Running unit tests..." />
|
||||
<exec command="${tests.framework.path}" passthru="true"/>
|
||||
<coverage-setup database="${dir.reports.coverage}/coverage.db">
|
||||
<fileset refid="sourcecode" />
|
||||
</coverage-setup>
|
||||
<exec command="${phpUnit.path} --verbose --configuration ${project.basedir}/phpunit.xml.dist" passthru="true" />
|
||||
<!--
|
||||
I have to use ExecTask to run PHPUnit instead of PHPUnitTask, because tests are not running if PHPUnitTask is
|
||||
used (don't know why):
|
||||
Total tests run: 0, Failures: 0, Errors: 0, Incomplete: 0, Skipped: 0
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-23
|
||||
|
||||
<phpunit configuration="${project.basedir}/phpunit.xml.dist" printsummary="true">
|
||||
<formatter type="xml" todir="${dir.reports}" outfile="phpunit.xml" />
|
||||
<formatter type="plain" todir="${dir.reports}" outfile="phpunit.txt" />
|
||||
<formatter type="clover" todir="${dir.reports.coverage}" />
|
||||
<formatter type="summary" todir="${dir.reports}" outfile="phpunit_summary.txt" />
|
||||
</phpunit>
|
||||
-->
|
||||
|
||||
<!--
|
||||
Previous / old version
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<if>
|
||||
<istrue value="${phpunit.useExec}" />
|
||||
<then>
|
||||
<if>
|
||||
<istrue value="${phpunit.withCoverage}" />
|
||||
<then>
|
||||
<echo message="Running tests with code coverage..." />
|
||||
<exec command="phpunit \-\-log-junit ${dir.reports}/phpunit.xml \-\-coverage-clover ${dir.reports.coverage}/clover-coverage.xml \-\-coverage-crap4j ${dir.reports.coverage}/crap4j-coverage.xml \-\-coverage-html ${dir.reports.coverage}/ -c ${project.basedir} \-\-colors" passthru="true" checkreturn="true" />
|
||||
</then>
|
||||
<else>
|
||||
<echo message="Running tests without code coverage..." />
|
||||
<exec command="phpunit \-\-log-junit ${dir.reports}/phpunit.xml -c ${project.basedir} \-\-colors" passthru="true" checkreturn="true" />
|
||||
</else>
|
||||
</if>
|
||||
</then>
|
||||
<else>
|
||||
<if>
|
||||
<istrue value="${phpunit.withCoverage}" />
|
||||
<then>
|
||||
<echo message="Running tests with code coverage..." />
|
||||
<coverage-setup database="${dir.reports.coverage}/coverage.db">
|
||||
<fileset refid="sourcecode" />
|
||||
</coverage-setup>
|
||||
<phpunit printsummary="true" codecoverage="true">
|
||||
<formatter type="xml" todir="${dir.reports}" outfile="phpunit.xml" />
|
||||
<formatter type="plain" todir="${dir.reports}" outfile="phpunit.txt" />
|
||||
<formatter type="clover" todir="${dir.reports.coverage}" />
|
||||
<formatter type="summary" todir="${dir.reports}" outfile="phpunit_summary.txt" />
|
||||
</phpunit>
|
||||
</then>
|
||||
<else>
|
||||
<echo message="Running tests without code coverage..." />
|
||||
<phpunit printsummary="true">
|
||||
<formatter todir="${dir.reports}" type="xml" outfile="phpunit.xml" />
|
||||
<batchtest>
|
||||
<fileset refid="tests" />
|
||||
</batchtest>
|
||||
</phpunit>
|
||||
</else>
|
||||
</if>
|
||||
</else>
|
||||
</if>
|
||||
-->
|
||||
</target>
|
||||
|
||||
<!-- Checkout and finalization -->
|
||||
|
||||
@@ -1,34 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<phpunit
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/4.8/phpunit.xsd"
|
||||
backupGlobals="true"
|
||||
backupStaticAttributes="false"
|
||||
bootstrap="./vendor/autoload.php"
|
||||
cacheTokens="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
forceCoversAnnotation="false"
|
||||
mapTestClassNameToCoveredClassName="false"
|
||||
processIsolation="false"
|
||||
stopOnError="false"
|
||||
stopOnFailure="false"
|
||||
stopOnIncomplete="false"
|
||||
stopOnSkipped="false"
|
||||
stopOnRisky="false"
|
||||
testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
|
||||
timeoutForSmallTests="1"
|
||||
timeoutForMediumTests="10"
|
||||
timeoutForLargeTests="60"
|
||||
verbose="true"
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="true"
|
||||
bootstrap="./vendor/autoload.php"
|
||||
>
|
||||
<php>
|
||||
<ini name="error_reporting" value="-1"/>
|
||||
</php>
|
||||
|
||||
<testsuites>
|
||||
<testsuite name="Meritoo Package - Main Test Suite">
|
||||
<directory>./tests/</directory>
|
||||
@@ -48,6 +30,6 @@
|
||||
</groups>
|
||||
|
||||
<logging>
|
||||
<log type="coverage-html" target="./build/logs/phpunit_coverage/html"/>
|
||||
<log type="coverage-html" target="./build/logs/phpunit_coverage/html" />
|
||||
</logging>
|
||||
</phpunit>
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Bundle;
|
||||
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* An exception used while name of bundle is incorrect
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class IncorrectBundleNameException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $bundleName Incorrect name of bundle
|
||||
* @return IncorrectBundleNameException
|
||||
*/
|
||||
public static function create($bundleName)
|
||||
{
|
||||
$template = 'Name of bundle \'%s\' is incorrect. It should start with big letter and end with "Bundle". Is'
|
||||
. ' there everything ok?';
|
||||
|
||||
$message = sprintf($template, $bundleName);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\File;
|
||||
|
||||
/**
|
||||
* An exception used while file with given path is empty (has no content)
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFileException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $emptyFilePath Path of the empty file
|
||||
* @return EmptyFileException
|
||||
*/
|
||||
public static function create($emptyFilePath)
|
||||
{
|
||||
$template = 'File with path \'%s\' is empty (has no content). Did you provide path of proper file?';
|
||||
$message = sprintf($template, $emptyFilePath);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\File;
|
||||
|
||||
/**
|
||||
* An exception used while path of given file is empty
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFilePathException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*/
|
||||
public static function create()
|
||||
{
|
||||
return new static('Path of the file is empty. Did you provide path of proper file?');
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\File;
|
||||
|
||||
/**
|
||||
* An exception used while file with given path does not exist
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class NotExistingFileException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $notExistingFilePath Path of not existing (or not readable) file
|
||||
* @return NotExistingFileException
|
||||
*/
|
||||
public static function create($notExistingFilePath)
|
||||
{
|
||||
$template = 'File with path \'%s\' does not exist (or is not readable). Did you provide path of proper file?';
|
||||
$message = sprintf($template, $notExistingFilePath);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Method;
|
||||
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* An exception used while method cannot be called, because is disabled
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DisabledMethodException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $disabledMethod Name of the disabled method
|
||||
* @param string $alternativeMethod (optional) Name of the alternative method
|
||||
* @return DisabledMethodException
|
||||
*/
|
||||
public static function create($disabledMethod, $alternativeMethod = '')
|
||||
{
|
||||
$template = 'Method %s() cannot be called, because is disabled.';
|
||||
|
||||
if (!empty($alternativeMethod)) {
|
||||
$template .= ' Use %s() instead.';
|
||||
}
|
||||
|
||||
$message = sprintf($template, $disabledMethod, $alternativeMethod);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while html attributes are invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidHtmlAttributesException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $htmlAttributes Invalid html attributes
|
||||
* @return InvalidHtmlAttributesException
|
||||
*/
|
||||
public static function create($htmlAttributes)
|
||||
{
|
||||
$message = sprintf('HTML attributes \'%s\' are invalid. Is there everything ok?', $htmlAttributes);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while url is invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidUrlException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $url Invalid url
|
||||
* @return InvalidUrlException
|
||||
*/
|
||||
public static function create($url)
|
||||
{
|
||||
$message = sprintf('Url \'%s\' is invalid. Is there everything ok?', $url);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Type;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
|
||||
/**
|
||||
* An exception used while type of date part, e.g. "year", is unknown
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownDatePartTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $unknownDatePart Unknown type of date part
|
||||
* @param string $value Incorrect value
|
||||
* @return UnknownDatePartTypeException
|
||||
*/
|
||||
public static function createException($unknownDatePart, $value)
|
||||
{
|
||||
/* @var UnknownDatePartTypeException $exception */
|
||||
$exception = parent::create($unknownDatePart, new DatePartType(), sprintf('date part (with value %s)', $value));
|
||||
|
||||
return $exception;
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Type;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* An exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is unknown
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownOopVisibilityTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $unknownType Unknown visibility of a property, a method or (as of PHP 7.1.0) a constant
|
||||
* @return UnknownOopVisibilityTypeException
|
||||
*/
|
||||
public static function createException($unknownType)
|
||||
{
|
||||
/* @var UnknownOopVisibilityTypeException $exception */
|
||||
$exception = parent::create($unknownType, new OopVisibilityType(), 'OOP-related visibility');
|
||||
|
||||
return $exception;
|
||||
}
|
||||
}
|
||||
@@ -18,20 +18,20 @@ use Meritoo\Common\Utilities\Arrays;
|
||||
* Collection of elements.
|
||||
* It's a set of some elements, e.g. objects.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
{
|
||||
/**
|
||||
* The elements of collection
|
||||
* The elements of collection.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $elements;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
* Class constructor.
|
||||
*
|
||||
* @param array $elements (optional) The elements of collection
|
||||
*/
|
||||
@@ -42,7 +42,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface Countable
|
||||
* Required by interface Countable.
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
@@ -51,7 +51,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface ArrayAccess
|
||||
* Required by interface ArrayAccess.
|
||||
*/
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
@@ -60,7 +60,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface ArrayAccess
|
||||
* Required by interface ArrayAccess.
|
||||
*/
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
@@ -73,7 +73,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface ArrayAccess
|
||||
* Required by interface ArrayAccess.
|
||||
*/
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
@@ -82,7 +82,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface ArrayAccess
|
||||
* Required by interface ArrayAccess.
|
||||
*/
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
@@ -93,7 +93,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface IteratorAggregate
|
||||
* Required by interface IteratorAggregate.
|
||||
*/
|
||||
public function getIterator()
|
||||
{
|
||||
@@ -101,15 +101,16 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds given element (at the end of collection)
|
||||
* Adds given element (at the end of collection).
|
||||
*
|
||||
* @param mixed $element The element to add
|
||||
* @param mixed $index (optional) Index / key of the element
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function add($element, $index = null)
|
||||
{
|
||||
if (null === $index || '' === $index) {
|
||||
if ($index === null) {
|
||||
$this->elements[] = $element;
|
||||
} else {
|
||||
$this->elements[$index] = $element;
|
||||
@@ -119,11 +120,12 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds given elements (at the end of collection)
|
||||
* Adds given elements (at the end of collection).
|
||||
*
|
||||
* @param array|Collection $elements The elements to add
|
||||
* @param bool|false $useIndexes (optional) If is set to true, indexes of given elements will be used in
|
||||
* this collection. Otherwise - not.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addMultiple($elements, $useIndexes = false)
|
||||
@@ -142,9 +144,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepends given element (adds given element at the beginning of collection)
|
||||
* Prepends given element (adds given element at the beginning of collection).
|
||||
*
|
||||
* @param mixed $element The element to prepend
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function prepend($element)
|
||||
@@ -155,9 +158,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes given element
|
||||
* Removes given element.
|
||||
*
|
||||
* @param mixed $element The element to remove
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function remove($element)
|
||||
@@ -166,6 +170,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
foreach ($this->elements as $index => $existing) {
|
||||
if ($element === $existing) {
|
||||
unset($this->elements[$index]);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -175,7 +180,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if collection is empty
|
||||
* Returns information if collection is empty.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
@@ -185,9 +190,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given element is first in the collection
|
||||
* Returns information if given element is first in the collection.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isFirst($element)
|
||||
@@ -196,9 +202,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given element is last in the collection
|
||||
* Returns information if given element is last in the collection.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast($element)
|
||||
@@ -207,22 +214,24 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if the collection has given element, iow. if given element exists in the collection
|
||||
* Returns information if the collection has given element, iow. if given element exists in the collection.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function has($element)
|
||||
{
|
||||
$index = Arrays::getIndexOf($this->elements, $element);
|
||||
|
||||
return null !== $index && false !== $index;
|
||||
return $index !== null && $index !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns previous element for given element
|
||||
* Returns previous element for given element.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return mixed|null
|
||||
*/
|
||||
public function getPrevious($element)
|
||||
@@ -231,9 +240,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns next element for given element
|
||||
* Returns next element for given element.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return mixed|null
|
||||
*/
|
||||
public function getNext($element)
|
||||
@@ -242,7 +252,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first element in the collection
|
||||
* Returns the first element in the collection.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
@@ -252,7 +262,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last element in the collection
|
||||
* Returns the last element in the collection.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
@@ -262,7 +272,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array representation of the collection
|
||||
* Returns an array representation of the collection.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
@@ -272,9 +282,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if element with given index/key exists
|
||||
* Returns information if element with given index/key exists.
|
||||
*
|
||||
* @param string|int $index The index/key of element
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function exists($index)
|
||||
@@ -13,30 +13,29 @@ use Meritoo\Common\Type\Base\BaseType;
|
||||
use Meritoo\Common\Utilities\Arrays;
|
||||
|
||||
/**
|
||||
* An exception used while type of something is unknown
|
||||
* An exception used while type of something is unknown.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
abstract class UnknownTypeException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string|int $unknownType The unknown type of something (value of constant)
|
||||
* @param BaseType $typeInstance An instance of class that contains type of the something
|
||||
* @param string $typeName Name of the something
|
||||
* @return UnknownTypeException
|
||||
*/
|
||||
public static function create($unknownType, BaseType $typeInstance, $typeName)
|
||||
public function __construct($unknownType, BaseType $typeInstance, $typeName)
|
||||
{
|
||||
$template = 'The \'%s\' type of %s is unknown. Probably doesn\'t exist or there is a typo. You should use one'
|
||||
. ' of these types: %s.';
|
||||
|
||||
$allTypes = $typeInstance->getAll();
|
||||
$types = Arrays::values2string($allTypes, '', ', ');
|
||||
$message = sprintf(sprintf($template, $unknownType, $typeName, $types));
|
||||
|
||||
return new static($message);
|
||||
$template = 'The \'%s\' type of %s is unknown. Probably doesn\'t exist or there is a typo. You should use one'
|
||||
.' of these types: %s.';
|
||||
|
||||
$message = sprintf(sprintf($template, $unknownType, $typeName, $types));
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Date;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
|
||||
/**
|
||||
* An exception used while type of date part, e.g. "year", is unknown.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class UnknownDatePartTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string $unknownDatePart Type of date part, e.g. "year". One of DatePartType class constants.
|
||||
* @param string $value Incorrect value
|
||||
*/
|
||||
public function __construct($unknownDatePart, $value)
|
||||
{
|
||||
parent::__construct($unknownDatePart, new DatePartType(), sprintf('date part (with value %s)', $value));
|
||||
}
|
||||
}
|
||||
@@ -11,23 +11,22 @@ namespace Meritoo\Common\Exception\Reflection;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* An exception used while name of class or trait cannot be resolved
|
||||
* An exception used while name of class or trait cannot be resolved.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class CannotResolveClassNameException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param array|object|string $source Source of the class's / trait's name. It can be an array of objects,
|
||||
* @param array|object|string $source Source of the class's / trait's name. It cane be an array of objects,
|
||||
* namespaces, object or namespace.
|
||||
* @param bool $forClass (optional) If is set to true, message of this exception for class is
|
||||
* prepared. Otherwise - for trait.
|
||||
* @return CannotResolveClassNameException
|
||||
*/
|
||||
public static function create($source, $forClass = true)
|
||||
public function __construct($source, $forClass = true)
|
||||
{
|
||||
$forWho = 'trait';
|
||||
$value = '';
|
||||
@@ -37,12 +36,12 @@ class CannotResolveClassNameException extends Exception
|
||||
}
|
||||
|
||||
if (is_scalar($source)) {
|
||||
$value = sprintf(' %s', (string)$source);
|
||||
$value = sprintf(' %s', (string) $source);
|
||||
}
|
||||
|
||||
$template = 'Name of %s from given \'%s\'%s cannot be resolved. Is there everything ok?';
|
||||
$message = sprintf($template, $forWho, gettype($source), $value);
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -12,28 +12,27 @@ use Exception;
|
||||
use Meritoo\Common\Utilities\Reflection;
|
||||
|
||||
/**
|
||||
* An exception used while given class has no child classes
|
||||
* An exception used while given class has no child classes.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class MissingChildClassesException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param array|object|string $parentClass Class that hasn't child classes, but it should. An array of objects,
|
||||
* strings, object or string.
|
||||
* @return MissingChildClassesException
|
||||
*/
|
||||
public static function create($parentClass)
|
||||
public function __construct($parentClass)
|
||||
{
|
||||
$template = 'The \'%s\' class requires one child class at least who will extend her (maybe is an abstract'
|
||||
. ' class), but the child classes are missing. Did you forget to extend this class?';
|
||||
.' class), but the child classes are missing. Did you forget to extend this class?';
|
||||
|
||||
$parentClassName = Reflection::getClassName($parentClass);
|
||||
$message = sprintf($template, $parentClassName);
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -12,29 +12,28 @@ use Exception;
|
||||
use Meritoo\Common\Utilities\Reflection;
|
||||
|
||||
/**
|
||||
* An exception used while given class has more than one child class
|
||||
* An exception used while given class has more than one child class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TooManyChildClassesException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param array|object|string $parentClass Class that has more than one child class, but it shouldn't. An array
|
||||
* of objects, strings, object or string.
|
||||
* @param array $childClasses Child classes
|
||||
* @return TooManyChildClassesException
|
||||
*/
|
||||
public static function create($parentClass, array $childClasses)
|
||||
public function __construct($parentClass, array $childClasses)
|
||||
{
|
||||
$template = "The '%s' class requires one child class at most who will extend her, but more than one child"
|
||||
. " class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
|
||||
." class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
|
||||
|
||||
$parentClassName = Reflection::getClassName($parentClass);
|
||||
$message = sprintf($template, $parentClassName, implode("\n- ", $childClasses), $parentClassName);
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -9,26 +9,24 @@
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while length of given hexadecimal value of color is incorrect
|
||||
* An exception used while length of given hexadecimal value of color is incorrect.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class IncorrectColorHexLengthException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string $color Incorrect hexadecimal value of color
|
||||
* @return IncorrectColorHexLengthException
|
||||
*/
|
||||
public static function create($color)
|
||||
public function __construct($color)
|
||||
{
|
||||
$template = 'Length of hexadecimal value of color \'%s\' is incorrect. It\'s %d, but it should be 3 or 6.'
|
||||
. ' Is there everything ok?';
|
||||
.' Is there everything ok?';
|
||||
|
||||
$message = sprintf($template, $color, strlen($color));
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -9,23 +9,21 @@
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while given hexadecimal value of color is invalid
|
||||
* An exception used while given hexadecimal value of color is invalid.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class InvalidColorHexValueException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string $color Invalid hexadecimal value of color
|
||||
* @return InvalidColorHexValueException
|
||||
*/
|
||||
public static function create($color)
|
||||
public function __construct($color)
|
||||
{
|
||||
$message = sprintf('Hexadecimal value of color \'%s\' is invalid. Is there everything ok?', $color);
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
23
src/Meritoo/Common/Exception/Regex/InvalidUrlException.php
Normal file
23
src/Meritoo/Common/Exception/Regex/InvalidUrlException.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while url is invalid.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class InvalidUrlException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string $url Invalid url
|
||||
*/
|
||||
public function __construct($url)
|
||||
{
|
||||
$message = sprintf('Url \'%s\' is invalid. Is there everything ok?', $url);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Meritoo\Common\Exception\Type;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* An exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is unknown.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class UnknownOopVisibilityTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct($unknownType)
|
||||
{
|
||||
parent::__construct($unknownType, new OopVisibilityType(), 'OOP-related visibility');
|
||||
}
|
||||
}
|
||||
@@ -6,36 +6,26 @@
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Traits\Test\Base;
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
use Meritoo\Common\Utilities\Miscellaneous;
|
||||
use PHPUnit_Framework_TestCase;
|
||||
use ReflectionClass;
|
||||
use ReflectionException;
|
||||
use ReflectionMethod;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* BaseTestCaseTrait
|
||||
* Created on 2017-11-02
|
||||
* Base test case with common methods and data providers.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
trait BaseTestCaseTrait
|
||||
abstract class BaseTestCase extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* Path of directory with data used by test cases
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private static $testsDataDirPath = 'data/tests';
|
||||
|
||||
/**
|
||||
* Provides an empty value
|
||||
* Provides an empty value.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -50,7 +40,7 @@ trait BaseTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides boolean value
|
||||
* Provides boolean value.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -61,7 +51,7 @@ trait BaseTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides instance of DateTime class
|
||||
* Provides instance of DateTime class.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -74,7 +64,7 @@ trait BaseTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides relative / compound format of DateTime
|
||||
* Provides relative / compound format of DateTime.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -94,7 +84,7 @@ trait BaseTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of not existing file, e.g. "lorem/ipsum.jpg"
|
||||
* Provides path of not existing file, e.g. "lorem/ipsum.jpg".
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -105,50 +95,26 @@ trait BaseTestCaseTrait
|
||||
yield['surprise/me/one/more/time.txt'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides non scalar value, e.g. [] or null
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideNonScalarValue()
|
||||
{
|
||||
yield[
|
||||
[],
|
||||
];
|
||||
|
||||
yield[
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
new stdClass(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns path of file used by tests.
|
||||
* It should be placed in /data/tests directory of this project.
|
||||
*
|
||||
* @param string $fileName Name of file
|
||||
* @param string $directoryPath (optional) Path of directory containing the file
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getFilePathForTesting($fileName, $directoryPath = '')
|
||||
public function getFilePathToTests($fileName, $directoryPath = '')
|
||||
{
|
||||
$rootPath = Miscellaneous::getProjectRootPath();
|
||||
if (!empty($directoryPath)) {
|
||||
$directoryPath = '/'.$directoryPath;
|
||||
}
|
||||
|
||||
$paths = [
|
||||
$rootPath,
|
||||
self::$testsDataDirPath,
|
||||
$directoryPath,
|
||||
$fileName,
|
||||
];
|
||||
|
||||
return Miscellaneous::concatenatePaths($paths);
|
||||
return sprintf('%s/../../../../../data/tests/%s%s', __DIR__, $fileName, $directoryPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies visibility and arguments of method
|
||||
* Verifies visibility and arguments of method.
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains method to verify
|
||||
* @param string|ReflectionMethod $method Name of method or just the method to verify
|
||||
@@ -158,14 +124,14 @@ trait BaseTestCaseTrait
|
||||
* verified method
|
||||
* @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments
|
||||
* of the verified method
|
||||
*
|
||||
* @throws UnknownOopVisibilityTypeException
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* Attention. 2nd argument, the $method, may be:
|
||||
* - string - name of the method
|
||||
* - instance of ReflectionMethod - just the method (provided by ReflectionClass::getMethod() method)
|
||||
*/
|
||||
protected static function assertMethodVisibilityAndArguments(
|
||||
protected function verifyMethodVisibilityAndArguments(
|
||||
$classNamespace,
|
||||
$method,
|
||||
$visibilityType,
|
||||
@@ -192,14 +158,17 @@ trait BaseTestCaseTrait
|
||||
switch ($visibilityType) {
|
||||
case OopVisibilityType::IS_PUBLIC:
|
||||
static::assertTrue($method->isPublic());
|
||||
|
||||
break;
|
||||
|
||||
case OopVisibilityType::IS_PROTECTED:
|
||||
static::assertTrue($method->isProtected());
|
||||
|
||||
break;
|
||||
|
||||
case OopVisibilityType::IS_PRIVATE:
|
||||
static::assertTrue($method->isPrivate());
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -208,18 +177,18 @@ trait BaseTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies visibility and arguments of class constructor
|
||||
* Verifies visibility and arguments of class constructor.
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains constructor to verify
|
||||
* @param string $classNamespace Namespace of class that contains method to verify
|
||||
* @param string $visibilityType Expected visibility of verified method. One of OopVisibilityType class
|
||||
* constants.
|
||||
* @param int $argumentsCount (optional) Expected count/amount of arguments of the verified method
|
||||
* @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments of the verified
|
||||
* method
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @throws UnknownOopVisibilityTypeException
|
||||
*/
|
||||
protected static function assertConstructorVisibilityAndArguments(
|
||||
protected function verifyConstructorVisibilityAndArguments(
|
||||
$classNamespace,
|
||||
$visibilityType,
|
||||
$argumentsCount = 0,
|
||||
@@ -231,33 +200,6 @@ trait BaseTestCaseTrait
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
$method = $reflection->getConstructor();
|
||||
|
||||
static::assertMethodVisibilityAndArguments($classNamespace, $method, $visibilityType, $argumentsCount, $requiredArgumentsCount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that class with given namespace has no constructor
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains constructor to verify
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
protected static function assertHasNoConstructor($classNamespace)
|
||||
{
|
||||
/*
|
||||
* Let's grab the constructor
|
||||
*/
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
$constructor = $reflection->getConstructor();
|
||||
|
||||
static::assertNull($constructor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets path of directory with data used by test cases
|
||||
*
|
||||
* @param string $testsDataDirPath Path of directory with data used by test cases
|
||||
*/
|
||||
protected static function setTestsDataDirPath($testsDataDirPath)
|
||||
{
|
||||
static::$testsDataDirPath = $testsDataDirPath;
|
||||
return $this->verifyMethodVisibilityAndArguments($classNamespace, $method, $visibilityType, $argumentsCount, $requiredArgumentsCount);
|
||||
}
|
||||
}
|
||||
@@ -1,26 +1,20 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Traits\Test\Base;
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
|
||||
/**
|
||||
* Trait for the base test case for the type of something
|
||||
* Base test case for the type of something.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
trait BaseTypeTestCaseTrait
|
||||
abstract class BaseTypeTestCase extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* Verifies availability of all types
|
||||
* Verifies availability of all types.
|
||||
*/
|
||||
public function testAvailabilityOfAllTypes()
|
||||
{
|
||||
@@ -31,7 +25,7 @@ trait BaseTypeTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies whether given type is correct or not
|
||||
* Verifies whether given type is correct or not.
|
||||
*
|
||||
* @param string $type Type to verify
|
||||
* @param bool $expected Information if given type is correct or not
|
||||
@@ -44,21 +38,21 @@ trait BaseTypeTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type to verify and information if it's correct
|
||||
* Provides type to verify and information if it's correct.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
abstract public function provideTypeToVerify();
|
||||
|
||||
/**
|
||||
* Returns instance of the tested type
|
||||
* Returns instance of the tested type.
|
||||
*
|
||||
* @return BaseType
|
||||
*/
|
||||
abstract protected function getTestedTypeInstance();
|
||||
|
||||
/**
|
||||
* Returns all expected types of the tested type
|
||||
* Returns all expected types of the tested type.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
@@ -14,26 +14,26 @@ use Meritoo\Common\Utilities\Reflection;
|
||||
* Base / abstract type of something, e.g. type of button, order, date etc.
|
||||
* Child class should contain constants - each of them represent one type.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
abstract class BaseType
|
||||
{
|
||||
/**
|
||||
* All types
|
||||
* All types.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $all;
|
||||
|
||||
/**
|
||||
* Returns all types
|
||||
* Returns all types.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAll()
|
||||
{
|
||||
if (null === $this->all) {
|
||||
if ($this->all === null) {
|
||||
$this->all = Reflection::getConstants($this);
|
||||
}
|
||||
|
||||
@@ -41,9 +41,10 @@ abstract class BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given type is correct
|
||||
* Returns information if given type is correct.
|
||||
*
|
||||
* @param string $type The type to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isCorrectType($type)
|
||||
@@ -11,50 +11,50 @@ namespace Meritoo\Common\Type;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
|
||||
/**
|
||||
* Type of date part, e.g. "year"
|
||||
* Type of date part, e.g. "year".
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class DatePartType extends BaseType
|
||||
{
|
||||
/**
|
||||
* The "day" date part
|
||||
* The "day" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const DAY = 'day';
|
||||
|
||||
/**
|
||||
* The "hour" date part
|
||||
* The "hour" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const HOUR = 'hour';
|
||||
|
||||
/**
|
||||
* The "minute" date part
|
||||
* The "minute" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const MINUTE = 'minute';
|
||||
|
||||
/**
|
||||
* The "month" date part
|
||||
* The "month" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const MONTH = 'month';
|
||||
|
||||
/**
|
||||
* The "second" date part
|
||||
* The "second" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const SECOND = 'second';
|
||||
|
||||
/**
|
||||
* The "year" date part
|
||||
* The "year" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
@@ -5,31 +5,31 @@ namespace Meritoo\Common\Type;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
|
||||
/**
|
||||
* The visibility of a property, a method or (as of PHP 7.1.0) a constant
|
||||
* The visibility of a property, a method or (as of PHP 7.1.0) a constant.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*
|
||||
* @see http://php.net/manual/en/language.oop5.visibility.php
|
||||
*/
|
||||
class OopVisibilityType extends BaseType
|
||||
{
|
||||
/**
|
||||
* The "private" visibility of OOP
|
||||
* The "private" visibility of OOP.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const IS_PRIVATE = 3;
|
||||
|
||||
/**
|
||||
* The "protected" visibility of OOP
|
||||
* The "protected" visibility of OOP.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const IS_PROTECTED = 2;
|
||||
|
||||
/**
|
||||
* The "public" visibility of OOP
|
||||
* The "public" visibility of OOP.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
@@ -9,15 +9,15 @@
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
/**
|
||||
* Useful arrays methods
|
||||
* Useful arrays methods.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Arrays
|
||||
{
|
||||
/**
|
||||
* Name of the array's key used to store position of element of the array
|
||||
* Name of the array's key used to store position of element of the array.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
@@ -30,6 +30,7 @@ class Arrays
|
||||
* @param array $array Array data to be converted
|
||||
* @param string|int $arrayColumnKey (optional) Column name
|
||||
* @param string $separator (optional) Separator used in resultant string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function values2string(array $array, $arrayColumnKey = '', $separator = ',')
|
||||
@@ -48,6 +49,23 @@ class Arrays
|
||||
|
||||
if (is_array($value)) {
|
||||
$effect .= self::values2string($value, $arrayColumnKey, $separator);
|
||||
/*
|
||||
* Previous version. Doesn't work with array containing arrays, e.g.:
|
||||
* array(
|
||||
* 1 => array(
|
||||
* 'item1',
|
||||
* 'item2'
|
||||
* ),
|
||||
* 2 => array(
|
||||
* 'item3',
|
||||
* 'item4'
|
||||
* )
|
||||
* )
|
||||
*
|
||||
if(isset($value[$arrayColumnKey])){
|
||||
$effect .= $value[$arrayColumnKey];
|
||||
}
|
||||
*/
|
||||
} else {
|
||||
if (empty($arrayColumnKey)) {
|
||||
$effect .= $value;
|
||||
@@ -62,12 +80,13 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts given array to string with keys, e.g. abc=1&def=2 or abc="1" def="2"
|
||||
* Converts given array to string with keys, e.g. abc=1&def=2 or abc="1" def="2".
|
||||
*
|
||||
* @param array $array Array data to be converted
|
||||
* @param string $separator (optional) Separator used between name-value pairs in resultant string
|
||||
* @param string $valuesKeysSeparator (optional) Separator used between name and value in resultant string
|
||||
* @param string $valuesWrapper (optional) Wrapper used to wrap values, e.g. double-quote: key="value"
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function valuesKeys2string($array, $separator = ',', $valuesKeysSeparator = '=', $valuesWrapper = '')
|
||||
@@ -84,7 +103,7 @@ class Arrays
|
||||
$value = sprintf('%s%s%s', $valuesWrapper, $value, $valuesWrapper);
|
||||
}
|
||||
|
||||
$effect .= $key . $valuesKeysSeparator . $value;
|
||||
$effect .= $key.$valuesKeysSeparator.$value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,10 +111,11 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts given array's rows to csv string
|
||||
* Converts given array's rows to csv string.
|
||||
*
|
||||
* @param array $array Array data to be converted. It have to be an array that represents database table.
|
||||
* @param string $separator (optional) Separator used in resultant string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function values2csv($array, $separator = ',')
|
||||
@@ -128,12 +148,13 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given element is the first one
|
||||
* Returns information if given element is the first one.
|
||||
*
|
||||
* @param array $array The array to get the first element of
|
||||
* @param mixed $element The element to check / verify
|
||||
* @param bool $firstLevelOnly (optional) If is set to true, first element is returned. Otherwise - totally
|
||||
* first element is returned (first of the First array).
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isFirstElement(array $array, $element, $firstLevelOnly = true)
|
||||
@@ -144,7 +165,7 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first element of given array
|
||||
* Returns the first element of given array.
|
||||
*
|
||||
* It may be first element of given array or the totally first element from the all elements (first element of the
|
||||
* first array).
|
||||
@@ -152,6 +173,7 @@ class Arrays
|
||||
* @param array $array The array to get the first element of
|
||||
* @param bool $firstLevelOnly (optional) If is set to true, first element is returned. Otherwise - totally
|
||||
* first element is returned (first of the first array).
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getFirstElement(array $array, $firstLevelOnly = true)
|
||||
@@ -175,9 +197,10 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns first key of array
|
||||
* Returns first key of array.
|
||||
*
|
||||
* @param array $array The array to get the first key of
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getFirstKey(array $array)
|
||||
@@ -196,12 +219,13 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given element is the last one
|
||||
* Returns information if given element is the last one.
|
||||
*
|
||||
* @param array $array The array to get the last element of
|
||||
* @param mixed $element The element to check / verify
|
||||
* @param bool $firstLevelOnly (optional) If is set to true, last element is returned. Otherwise - totally
|
||||
* last element is returned (last of the latest array).
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isLastElement(array $array, $element, $firstLevelOnly = true)
|
||||
@@ -212,7 +236,7 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last element of given array
|
||||
* Returns the last element of given array.
|
||||
*
|
||||
* It may be last element of given array or the totally last element from the all elements (last element of the
|
||||
* latest array).
|
||||
@@ -220,6 +244,7 @@ class Arrays
|
||||
* @param array $array The array to get the last element of
|
||||
* @param bool $firstLevelOnly (optional) If is set to true, last element is returned. Otherwise - totally
|
||||
* last element is returned (last of the latest array).
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getLastElement(array $array, $firstLevelOnly = true)
|
||||
@@ -242,10 +267,11 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns breadcrumb (a path) to the last element of array
|
||||
* Returns breadcrumb (a path) to the last element of array.
|
||||
*
|
||||
* @param array $array The array to get the breadcrumb
|
||||
* @param string $separator (optional) Separator used to stick the elements
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getLastElementBreadCrumb($array, $separator = '/')
|
||||
@@ -264,13 +290,14 @@ class Arrays
|
||||
$crumb = $last;
|
||||
}
|
||||
|
||||
return $breadCrumb . $separator . $crumb;
|
||||
return $breadCrumb.$separator.$crumb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last row of array
|
||||
* Returns the last row of array.
|
||||
*
|
||||
* @param array $array The array to get the last row of
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getLastRow(array $array)
|
||||
@@ -305,11 +332,12 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces array keys that match given pattern with new key name
|
||||
* Replaces array keys that match given pattern with new key name.
|
||||
*
|
||||
* @param array $dataArray The array
|
||||
* @param string $oldKeyPattern Old key pattern
|
||||
* @param string $newKey New key name
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function replaceArrayKeys($dataArray, $oldKeyPattern, $newKey)
|
||||
@@ -334,12 +362,13 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates JavaScript code for given PHP array
|
||||
* Generates JavaScript code for given PHP array.
|
||||
*
|
||||
* @param array $array The array that should be generated to JavaScript
|
||||
* @param string $jsVariableName (optional) Name of the variable that will be in generated JavaScript code
|
||||
* @param bool $preserveIndexes (optional) If is set to true and $jsVariableName isn't empty, indexes also
|
||||
* will be added to the JavaScript code. Otherwise not.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function array2JavaScript(array $array, $jsVariableName = '', $preserveIndexes = false)
|
||||
@@ -384,8 +413,8 @@ class Arrays
|
||||
if (is_array($value)) {
|
||||
$variable = $index;
|
||||
|
||||
if (is_integer($index)) {
|
||||
$variable = 'value_' . $variable;
|
||||
if (is_int($index)) {
|
||||
$variable = 'value_'.$variable;
|
||||
}
|
||||
|
||||
$value = self::array2JavaScript($value, $variable, $preserveIndexes);
|
||||
@@ -398,11 +427,11 @@ class Arrays
|
||||
* var autoGeneratedVariable = new Array(...);autoGeneratedVariable[0] = new Array(...);
|
||||
* autoGeneratedVariable[1] = new Array(...);
|
||||
*/
|
||||
if (1 === $counter) {
|
||||
if ($counter === 1) {
|
||||
$effect .= "\n";
|
||||
}
|
||||
|
||||
$effect .= $value . "\n";
|
||||
$effect .= $value."\n";
|
||||
$effect .= sprintf('%s[%s] = %s;', $jsVariableName, Miscellaneous::quoteValue($index), $variable);
|
||||
|
||||
if ($counter !== $arrayCount) {
|
||||
@@ -435,9 +464,10 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Quotes (adds quotes) to elements of an array that are strings
|
||||
* Quotes (adds quotes) to elements of an array that are strings.
|
||||
*
|
||||
* @param array $array The array to check for string values
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function quoteStrings($array)
|
||||
@@ -452,7 +482,7 @@ class Arrays
|
||||
$value = self::quoteStrings($value);
|
||||
} elseif (is_string($value)) {
|
||||
if (!Regex::isQuoted($value)) {
|
||||
$value = '\'' . $value . '\'';
|
||||
$value = '\''.$value.'\'';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -464,10 +494,11 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes marginal element (first or last)
|
||||
* Removes marginal element (first or last).
|
||||
*
|
||||
* @param string|array $item The item which should be shortened
|
||||
* @param bool $last (optional) If is set to true, last element is removed. Otherwise - first.
|
||||
*
|
||||
* @return string|array
|
||||
*/
|
||||
public static function removeMarginalElement($item, $last = true)
|
||||
@@ -492,9 +523,10 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns last key of array
|
||||
* Returns last key of array.
|
||||
*
|
||||
* @param array $array The array to get the last key of
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getLastKey(array $array)
|
||||
@@ -505,18 +537,15 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes element / item of given array
|
||||
* Removes element / item of given array.
|
||||
*
|
||||
* @param array $array The array that contains element / item which should be removed
|
||||
* @param mixed $item The element / item which should be removed
|
||||
*
|
||||
* @return bool|array
|
||||
*/
|
||||
public static function removeElement(array $array, $item)
|
||||
{
|
||||
/*
|
||||
* No elements or the element does not exist?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array) || !in_array($item, $array)) {
|
||||
return false;
|
||||
}
|
||||
@@ -540,7 +569,7 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes items from given array starting at given element (before or after the element)
|
||||
* Removes items from given array starting at given element (before or after the element).
|
||||
*
|
||||
* @param array $array The array which contains items to remove
|
||||
* @param mixed $needle The element which is start point of deletion
|
||||
@@ -592,6 +621,7 @@ class Arrays
|
||||
* value will be used with it's key, because other will be overridden.
|
||||
* Otherwise - values are preserved and keys assigned to that values are
|
||||
* returned as an array.
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* Example of $ignoreDuplicatedValues = false:
|
||||
@@ -613,10 +643,6 @@ class Arrays
|
||||
*/
|
||||
public static function setKeysAsValues(array $array, $ignoreDuplicatedValues = true)
|
||||
{
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return [];
|
||||
}
|
||||
@@ -630,6 +656,7 @@ class Arrays
|
||||
*/
|
||||
if (is_array($value)) {
|
||||
$replaced[$key] = self::setKeysAsValues($value, $ignoreDuplicatedValues);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -657,10 +684,11 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies ksort() function recursively in the given array
|
||||
* Applies ksort() function recursively in the given array.
|
||||
*
|
||||
* @param array $array The array to sort
|
||||
* @param int $sortFlags (optional) Options of ksort() function
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
public static function ksortRecursive(array &$array, $sortFlags = SORT_REGULAR)
|
||||
@@ -673,7 +701,7 @@ class Arrays
|
||||
return null;
|
||||
}
|
||||
|
||||
$effect = &$array;
|
||||
$effect = $array;
|
||||
ksort($effect, $sortFlags);
|
||||
|
||||
foreach ($effect as &$value) {
|
||||
@@ -686,9 +714,10 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns count / amount of elements that are not array
|
||||
* Returns count / amount of elements that are not array.
|
||||
*
|
||||
* @param array $array The array to count
|
||||
*
|
||||
* @return int|null
|
||||
*/
|
||||
public static function getNonArrayElementsCount(array $array)
|
||||
@@ -706,6 +735,7 @@ class Arrays
|
||||
foreach ($array as &$value) {
|
||||
if (is_array($value)) {
|
||||
$count += self::getNonArrayElementsCount($value);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -716,7 +746,7 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts given string with special separators to array
|
||||
* Converts given string with special separators to array.
|
||||
*
|
||||
* Example:
|
||||
* ~ string:
|
||||
@@ -731,6 +761,7 @@ class Arrays
|
||||
* @param string $string The string to be converted
|
||||
* @param string $separator (optional) Separator used between name-value pairs in the string
|
||||
* @param string $valuesKeysSeparator (optional) Separator used between name and value in the string
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function string2array($string, $separator = '|', $valuesKeysSeparator = ':')
|
||||
@@ -749,7 +780,7 @@ class Arrays
|
||||
foreach ($exploded as $item) {
|
||||
$exploded2 = explode($valuesKeysSeparator, $item);
|
||||
|
||||
if (2 == count($exploded2)) {
|
||||
if (count($exploded2) == 2) {
|
||||
$key = trim($exploded2[0]);
|
||||
$value = trim($exploded2[1]);
|
||||
|
||||
@@ -761,11 +792,12 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given keys exist in given array
|
||||
* Returns information if given keys exist in given array.
|
||||
*
|
||||
* @param array $keys The keys to find
|
||||
* @param array $array The array which maybe contains keys
|
||||
* @param bool $explicit (optional) If is set to true, all keys should exist in given array. Otherwise - not all.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function areKeysInArray($keys, $array, $explicit = true)
|
||||
@@ -803,7 +835,7 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns paths of the last elements
|
||||
* Returns paths of the last elements.
|
||||
*
|
||||
* @param array $array The array with elements
|
||||
* @param string $separator (optional) Separator used in resultant strings. Default: ".".
|
||||
@@ -811,6 +843,7 @@ class Arrays
|
||||
* @param string|array $stopIfMatchedBy (optional) Patterns of keys or paths that matched will stop the process
|
||||
* of path building and including children of those keys or paths (recursive
|
||||
* will not be used for keys in lower level of given array)
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* Examples - $stopIfMatchedBy argument:
|
||||
@@ -822,66 +855,62 @@ class Arrays
|
||||
*/
|
||||
public static function getLastElementsPaths(array $array, $separator = '.', $parentPath = '', $stopIfMatchedBy = '')
|
||||
{
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!empty($stopIfMatchedBy)) {
|
||||
$stopIfMatchedBy = self::makeArray($stopIfMatchedBy);
|
||||
}
|
||||
|
||||
$paths = [];
|
||||
|
||||
foreach ($array as $key => $value) {
|
||||
$path = $key;
|
||||
$stopRecursion = false;
|
||||
|
||||
/*
|
||||
* If the path of parent element is delivered,
|
||||
* I have to use it and build longer path
|
||||
*/
|
||||
if (!empty($parentPath)) {
|
||||
$pathTemplate = '%s%s%s';
|
||||
$path = sprintf($pathTemplate, $parentPath, $separator, $key);
|
||||
if (!empty($array)) {
|
||||
if (!empty($stopIfMatchedBy)) {
|
||||
$stopIfMatchedBy = self::makeArray($stopIfMatchedBy);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the key or current path matches one of patterns at which the process should be stopped,
|
||||
* the recursive not used. It means that I have to pass current value and stop processing of the
|
||||
* array (don't go to the next step).
|
||||
*/
|
||||
if (!empty($stopIfMatchedBy)) {
|
||||
foreach ($stopIfMatchedBy as $rawPattern) {
|
||||
$pattern = sprintf('|%s|', $rawPattern);
|
||||
foreach ($array as $key => $value) {
|
||||
$path = $key;
|
||||
$stopRecursion = false;
|
||||
|
||||
if (preg_match($pattern, $key) || preg_match($pattern, $path)) {
|
||||
$stopRecursion = true;
|
||||
break;
|
||||
/*
|
||||
* If the path of parent element is delivered,
|
||||
* I have to use it and build longer path
|
||||
*/
|
||||
if (!empty($parentPath)) {
|
||||
$pathTemplate = '%s%s%s';
|
||||
$path = sprintf($pathTemplate, $parentPath, $separator, $key);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the key or current path matches one of patterns at which the process should be stopped,
|
||||
* the recursive not used. It means that I have to pass current value and stop processing of the
|
||||
* array (don't go to the next step).
|
||||
*/
|
||||
if (!empty($stopIfMatchedBy)) {
|
||||
foreach ($stopIfMatchedBy as $rawPattern) {
|
||||
$pattern = sprintf('|%s|', $rawPattern);
|
||||
|
||||
if (preg_match($pattern, $key) || preg_match($pattern, $path)) {
|
||||
$stopRecursion = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The value is passed to the returned array if:
|
||||
* - it's not an array
|
||||
* or
|
||||
* - the process is stopped, recursive is not used
|
||||
*/
|
||||
if (!is_array($value) || (is_array($value) && empty($value)) || $stopRecursion) {
|
||||
$paths[$path] = $value;
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
* The value is passed to the returned array if:
|
||||
* - it's not an array
|
||||
* or
|
||||
* - the process is stopped, recursive is not used
|
||||
*/
|
||||
if (!is_array($value) || (is_array($value) && empty($value)) || $stopRecursion) {
|
||||
$paths[$path] = $value;
|
||||
|
||||
/*
|
||||
* Let's iterate through the next level, using recursive
|
||||
*/
|
||||
if (is_array($value)) {
|
||||
$recursivePaths = self::getLastElementsPaths($value, $separator, $path, $stopIfMatchedBy);
|
||||
$paths += $recursivePaths;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Let's iterate through the next level, using recursive
|
||||
*/
|
||||
if (is_array($value)) {
|
||||
$recursivePaths = self::getLastElementsPaths($value, $separator, $path, $stopIfMatchedBy);
|
||||
$paths += $recursivePaths;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -889,9 +918,10 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes and returns an array for given variable
|
||||
* Makes and returns an array for given variable.
|
||||
*
|
||||
* @param mixed $variable Variable that should be an array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function makeArray($variable)
|
||||
@@ -904,12 +934,13 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if keys / indexes of given array are matched by given pattern
|
||||
* Returns information if keys / indexes of given array are matched by given pattern.
|
||||
*
|
||||
* @param array $array The array to check
|
||||
* @param string $pattern The pattern which keys / indexes should match, e.g. "\d+"
|
||||
* @param bool $firstLevelOnly (optional) If is set to true, all keys / indexes are checked. Otherwise - from the
|
||||
* first level only.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function areAllKeysMatchedByPattern($array, $pattern, $firstLevelOnly = false)
|
||||
@@ -940,6 +971,7 @@ class Arrays
|
||||
*/
|
||||
if (!preg_match($pattern, $key)) {
|
||||
$areMatched = false;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -957,11 +989,12 @@ class Arrays
|
||||
|
||||
/**
|
||||
* Returns information if keys / indexes of given array are integers, in other words if the array contains
|
||||
* zero-based keys / indexes
|
||||
* zero-based keys / indexes.
|
||||
*
|
||||
* @param array $array The array to check
|
||||
* @param bool $firstLevelOnly (optional) If is set to true, all keys / indexes are checked. Otherwise - from the
|
||||
* first level only.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function areAllKeysIntegers($array, $firstLevelOnly = false)
|
||||
@@ -977,6 +1010,7 @@ class Arrays
|
||||
*
|
||||
* @param array $array The array which should contains a value
|
||||
* @param array $keys Keys, path of keys, to find in given array
|
||||
*
|
||||
* @return mixed
|
||||
*
|
||||
* Examples:
|
||||
@@ -1026,6 +1060,7 @@ class Arrays
|
||||
*
|
||||
* @param array $array The array to check
|
||||
* @param array $keys Keys, path of keys, to find in given array
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* Examples:
|
||||
@@ -1076,14 +1111,11 @@ class Arrays
|
||||
*
|
||||
* @param array $array The array which should contain values of the key
|
||||
* @param string $key The key
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
public static function getAllValuesOfKey(array $array, $key)
|
||||
{
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return null;
|
||||
}
|
||||
@@ -1093,6 +1125,7 @@ class Arrays
|
||||
foreach ($array as $index => $value) {
|
||||
if ($index === $key) {
|
||||
$values[] = $value;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1109,7 +1142,7 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets positions for each element / child of given array and returns the array
|
||||
* Sets positions for each element / child of given array and returns the array.
|
||||
*
|
||||
* Position for the 1st element / child of a parent is set to 1 and incremented for the next element and
|
||||
* so on. Each parent is treated as separate array, so its elements are treated as positioned at 1st level.
|
||||
@@ -1118,6 +1151,7 @@ class Arrays
|
||||
* @param string $keyName (optional) Name of key which will contain the position value
|
||||
* @param int $startPosition (optional) Default, start value of the position for main / given array, not the
|
||||
* children
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function setPositions(array $array, $keyName = self::POSITION_KEY_NAME, $startPosition = null)
|
||||
@@ -1125,7 +1159,7 @@ class Arrays
|
||||
if (!empty($array)) {
|
||||
$childPosition = 1;
|
||||
|
||||
if (null !== $startPosition) {
|
||||
if ($startPosition !== null) {
|
||||
$array[$keyName] = $startPosition;
|
||||
}
|
||||
|
||||
@@ -1141,9 +1175,10 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Trims string values of given array and returns the new array
|
||||
* Trims string values of given array and returns the new array.
|
||||
*
|
||||
* @param array $array The array which values should be trimmed
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function trimRecursive(array $array)
|
||||
@@ -1156,6 +1191,7 @@ class Arrays
|
||||
foreach ($array as $key => $value) {
|
||||
if (is_array($value)) {
|
||||
$effect[$key] = self::trimRecursive($value);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1211,6 +1247,7 @@ class Arrays
|
||||
*
|
||||
* @param array $array An array to sort
|
||||
* @param array $keysOrder An array with keys of the 1st argument in proper / required order
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
public static function sortByCustomKeysOrder(array $array, array $keysOrder)
|
||||
@@ -1252,7 +1289,7 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns smartly imploded string
|
||||
* Returns smartly imploded string.
|
||||
*
|
||||
* Separators located at the beginning or end of elements are removed.
|
||||
* It's required to avoid problems with duplicated separator, e.g. "first//second/third", where separator is a
|
||||
@@ -1260,6 +1297,7 @@ class Arrays
|
||||
*
|
||||
* @param array $array The array with elements to implode
|
||||
* @param string $separator Separator used to stick together elements of given array
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function implodeSmart(array $array, $separator)
|
||||
@@ -1290,11 +1328,12 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given array is empty, iow. information if all elements of given array are empty
|
||||
* Returns information if given array is empty, iow. information if all elements of given array are empty.
|
||||
*
|
||||
* @param array $array The array to verify
|
||||
* @param bool $strictNull (optional) If is set to true elements are verified if they are null. Otherwise - only
|
||||
* if they are empty (e.g. null, '', 0, array()).
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function areAllValuesEmpty(array $array, $strictNull = false)
|
||||
@@ -1317,7 +1356,7 @@ class Arrays
|
||||
*
|
||||
* If one of the above is true, not all elements of given array are empty
|
||||
*/
|
||||
if ((!is_array($element) && $strictNull && null !== $element) || !empty($element)) {
|
||||
if ((!is_array($element) && $strictNull && $element !== null) || !empty($element)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1344,6 +1383,7 @@ class Arrays
|
||||
* @param array $array2 The 2nd array to verify
|
||||
* @param bool $valuesOnly (optional) If is set to true, compares values only. Otherwise - keys and values
|
||||
* (default behaviour).
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function arrayDiffRecursive(array $array1, array $array2, $valuesOnly = false)
|
||||
@@ -1354,7 +1394,7 @@ class Arrays
|
||||
* Values should be compared only and both arrays are one-dimensional?
|
||||
* Let's find difference by using simple function
|
||||
*/
|
||||
if ($valuesOnly && 1 == self::getDimensionsCount($array1) && 1 == self::getDimensionsCount($array2)) {
|
||||
if ($valuesOnly && self::getDimensionsCount($array1) == 1 && self::getDimensionsCount($array2) == 1) {
|
||||
return array_diff($array1, $array2);
|
||||
}
|
||||
|
||||
@@ -1382,7 +1422,7 @@ class Arrays
|
||||
}
|
||||
}
|
||||
|
||||
if (null !== $difference) {
|
||||
if ($difference !== null) {
|
||||
$effect[] = $difference;
|
||||
}
|
||||
} else {
|
||||
@@ -1430,10 +1470,11 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an index / key of given element in given array
|
||||
* Returns an index / key of given element in given array.
|
||||
*
|
||||
* @param array $array The array to verify
|
||||
* @param mixed $element The element who index / key is needed
|
||||
*
|
||||
* @return bool|null|mixed
|
||||
*/
|
||||
public static function getIndexOf(array $array, $element)
|
||||
@@ -1456,12 +1497,13 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array with incremented indexes / keys
|
||||
* Returns an array with incremented indexes / keys.
|
||||
*
|
||||
* @param array $array The array which indexes / keys should be incremented
|
||||
* @param int|null $startIndex (optional) Index from which incrementation should be started. If not provided,
|
||||
* the first index / key will be used.
|
||||
* @param int $incrementStep (optional) Value used for incrementation. The step of incrementation.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function incrementIndexes(array $array, $startIndex = null, $incrementStep = 1)
|
||||
@@ -1473,7 +1515,7 @@ class Arrays
|
||||
* Start index not provided?
|
||||
* Let's look for the first index / key of given array
|
||||
*/
|
||||
if (null === $startIndex) {
|
||||
if ($startIndex === null) {
|
||||
$startIndex = self::getFirstKey($array);
|
||||
}
|
||||
|
||||
@@ -1512,10 +1554,11 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns next element of given array related to given element
|
||||
* Returns next element of given array related to given element.
|
||||
*
|
||||
* @param array $array The array with elements
|
||||
* @param mixed $element Element for who next element should be returned
|
||||
*
|
||||
* @return null|mixed
|
||||
*/
|
||||
public static function getNextElement(array $array, $element)
|
||||
@@ -1524,10 +1567,11 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns previous element of given array related to given element
|
||||
* Returns previous element of given array related to given element.
|
||||
*
|
||||
* @param array $array The array with elements
|
||||
* @param mixed $element Element for who previous element should be returned
|
||||
*
|
||||
* @return null|mixed
|
||||
*/
|
||||
public static function getPreviousElement(array $array, $element)
|
||||
@@ -1536,9 +1580,10 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given array is a multi dimensional array
|
||||
* Returns information if given array is a multi dimensional array.
|
||||
*
|
||||
* @param array $array The array to verify
|
||||
*
|
||||
* @return bool|null
|
||||
*/
|
||||
public static function isMultiDimensional(array $array)
|
||||
@@ -1555,9 +1600,10 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns count of dimensions, maximum nesting level actually, in given array
|
||||
* Returns count of dimensions, maximum nesting level actually, in given array.
|
||||
*
|
||||
* @param array $array The array to verify
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function getDimensionsCount(array $array)
|
||||
@@ -1582,11 +1628,12 @@ class Arrays
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns neighbour (next or previous element) for given element
|
||||
* Returns neighbour (next or previous element) for given element.
|
||||
*
|
||||
* @param array $array The array with elements
|
||||
* @param mixed $element Element for who next element should be returned
|
||||
* @param bool $next (optional) If is set to true, returns next neighbour. Otherwise - previous.
|
||||
*
|
||||
* @return mixed|null
|
||||
*/
|
||||
private static function getNeighbour(array $array, $element, $next = true)
|
||||
@@ -1618,7 +1665,7 @@ class Arrays
|
||||
* Index of element or of element's key is unknown?
|
||||
* Probably the element does not exist in given array, so... nothing to do
|
||||
*/
|
||||
if (null === $elementKey || null === $indexOfKey) {
|
||||
if ($elementKey === null || $indexOfKey === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
47
src/Meritoo/Common/Utilities/Bundle.php
Normal file
47
src/Meritoo/Common/Utilities/Bundle.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
/**
|
||||
* Useful methods for bundle.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Bundle
|
||||
{
|
||||
/**
|
||||
* Returns path to view / template of given bundle.
|
||||
*
|
||||
* @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template"
|
||||
* @param string $bundleName Name of the bundle, e.g. "MyExtraBundle"
|
||||
* @param string $extension (optional) Extension of the view / template
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getBundleViewPath($viewPath, $bundleName, $extension = 'html.twig')
|
||||
{
|
||||
/*
|
||||
* Unknown path, extension of the view / template or name of the bundle?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($viewPath) || empty($bundleName) || empty($extension)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* Path of the view / template doesn't end with given extension?
|
||||
*/
|
||||
if (!Regex::endsWith($viewPath, $extension)) {
|
||||
$viewPath = sprintf('%s.%s', $viewPath, $extension);
|
||||
}
|
||||
|
||||
return sprintf('%s:%s', $bundleName, $viewPath);
|
||||
}
|
||||
}
|
||||
@@ -11,25 +11,26 @@ namespace Meritoo\Common\Utilities;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* Useful Composer-related methods (only static functions)
|
||||
* Useful Composer-related methods (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Composer
|
||||
{
|
||||
/**
|
||||
* Name of the Composer's main file with configuration in Json format
|
||||
* Name of the Composer's main file with configuration in Json format.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const FILE_NAME_MAIN = 'composer.json';
|
||||
|
||||
/**
|
||||
* Returns value from composer.json file
|
||||
* Returns value from composer.json file.
|
||||
*
|
||||
* @param string $composerJsonPath Path of composer.json file
|
||||
* @param string $nodeName Name of node who value should be returned
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getValue($composerJsonPath, $nodeName)
|
||||
@@ -59,7 +60,7 @@ class Composer
|
||||
* Unknown data from the composer.json file or there is no node with given name?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (null === $data || !isset($data->{$nodeName})) {
|
||||
if ($data === null || !isset($data->{$nodeName})) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -10,16 +10,14 @@ namespace Meritoo\Common\Utilities;
|
||||
|
||||
use DateInterval;
|
||||
use DateTime;
|
||||
use Exception;
|
||||
use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
use Meritoo\Common\Type\DatePeriod;
|
||||
|
||||
/**
|
||||
* Useful date methods
|
||||
* Useful date methods.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Date
|
||||
{
|
||||
@@ -68,113 +66,106 @@ class Date
|
||||
* The dates are returned in an array with indexes 'start' and 'end'.
|
||||
*
|
||||
* @param int $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK.
|
||||
* @throws Exception
|
||||
* @return null|DatePeriod
|
||||
*
|
||||
* @return DatePeriod
|
||||
*/
|
||||
public static function getDatesForPeriod($period)
|
||||
{
|
||||
/*
|
||||
* Type of period is incorrect?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!(new DatePeriod())->isCorrectType($period)) {
|
||||
return null;
|
||||
}
|
||||
$datePeriod = null;
|
||||
|
||||
$dateStart = null;
|
||||
$dateEnd = null;
|
||||
if (DatePeriod::isCorrectPeriod($period)) {
|
||||
$dateStart = null;
|
||||
$dateEnd = null;
|
||||
|
||||
switch ($period) {
|
||||
case DatePeriod::LAST_WEEK:
|
||||
$thisWeekStart = new DateTime('this week');
|
||||
switch ($period) {
|
||||
case DatePeriod::LAST_WEEK:
|
||||
$thisWeekStart = new DateTime('this week');
|
||||
|
||||
$dateStart = clone $thisWeekStart;
|
||||
$dateEnd = clone $thisWeekStart;
|
||||
$dateStart = clone $thisWeekStart;
|
||||
$dateEnd = clone $thisWeekStart;
|
||||
|
||||
$dateStart->sub(new DateInterval('P7D'));
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
$dateStart->sub(new DateInterval('P7D'));
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::THIS_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
break;
|
||||
case DatePeriod::THIS_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::NEXT_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
$dateStart->add(new DateInterval('P7D'));
|
||||
break;
|
||||
case DatePeriod::NEXT_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
$dateStart->add(new DateInterval('P7D'));
|
||||
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::LAST_MONTH:
|
||||
$dateStart = new DateTime('first day of last month');
|
||||
$dateEnd = new DateTime('last day of last month');
|
||||
break;
|
||||
case DatePeriod::LAST_MONTH:
|
||||
$dateStart = new DateTime('first day of last month');
|
||||
$dateEnd = new DateTime('last day of last month');
|
||||
|
||||
break;
|
||||
case DatePeriod::THIS_MONTH:
|
||||
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
|
||||
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
|
||||
break;
|
||||
case DatePeriod::THIS_MONTH:
|
||||
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
|
||||
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
|
||||
|
||||
$dateStart = $lastMonth->getEndDate();
|
||||
$dateStart->add(new DateInterval('P1D'));
|
||||
$dateStart = $lastMonth->getEndDate();
|
||||
$dateStart->add(new DateInterval('P1D'));
|
||||
|
||||
$dateEnd = $nextMonth->getStartDate();
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
$dateEnd = $nextMonth->getStartDate();
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::NEXT_MONTH:
|
||||
$dateStart = new DateTime('first day of next month');
|
||||
$dateEnd = new DateTime('last day of next month');
|
||||
break;
|
||||
case DatePeriod::NEXT_MONTH:
|
||||
$dateStart = new DateTime('first day of next month');
|
||||
$dateEnd = new DateTime('last day of next month');
|
||||
|
||||
break;
|
||||
case DatePeriod::LAST_YEAR:
|
||||
case DatePeriod::THIS_YEAR:
|
||||
case DatePeriod::NEXT_YEAR:
|
||||
$dateStart = new DateTime();
|
||||
$dateEnd = new DateTime();
|
||||
break;
|
||||
case DatePeriod::LAST_YEAR:
|
||||
case DatePeriod::THIS_YEAR:
|
||||
case DatePeriod::NEXT_YEAR:
|
||||
$dateStart = new DateTime();
|
||||
$dateEnd = new DateTime();
|
||||
|
||||
if (DatePeriod::LAST_YEAR == $period || DatePeriod::NEXT_YEAR == $period) {
|
||||
$yearDifference = 1;
|
||||
if ($period == DatePeriod::LAST_YEAR || $period == DatePeriod::NEXT_YEAR) {
|
||||
$yearDifference = 1;
|
||||
|
||||
if (DatePeriod::LAST_YEAR == $period) {
|
||||
$yearDifference *= -1;
|
||||
if ($period == DatePeriod::LAST_YEAR) {
|
||||
$yearDifference *= -1;
|
||||
}
|
||||
|
||||
$modifyString = sprintf('%s year', $yearDifference);
|
||||
$dateStart->modify($modifyString);
|
||||
$dateEnd->modify($modifyString);
|
||||
}
|
||||
|
||||
$modifyString = sprintf('%s year', $yearDifference);
|
||||
$dateStart->modify($modifyString);
|
||||
$dateEnd->modify($modifyString);
|
||||
}
|
||||
$year = $dateStart->format('Y');
|
||||
$dateStart->setDate($year, 1, 1);
|
||||
$dateEnd->setDate($year, 12, 31);
|
||||
|
||||
$year = $dateStart->format('Y');
|
||||
$dateStart->setDate($year, 1, 1);
|
||||
$dateEnd->setDate($year, 12, 31);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
if ($dateStart !== null && $dateEnd !== null) {
|
||||
$dateStart->setTime(0, 0, 0);
|
||||
$dateEnd->setTime(23, 59, 59);
|
||||
|
||||
$datePeriod = new DatePeriod($dateStart, $dateEnd);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Start or end date is unknown?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (null === $dateStart || null === $dateEnd) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$dateStart->setTime(0, 0, 0);
|
||||
$dateEnd->setTime(23, 59, 59);
|
||||
|
||||
return new DatePeriod($dateStart, $dateEnd);
|
||||
return $datePeriod;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates and returns random time (the hour, minute and second values)
|
||||
* Generates and returns random time (the hour, minute and second values).
|
||||
*
|
||||
* @param string $format (optional) Format of returned value. A string acceptable by the DateTime::format()
|
||||
* method.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function generateRandomTime($format = 'H:i:s')
|
||||
@@ -218,9 +209,8 @@ class Date
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns current day of week
|
||||
* Returns current day of week.
|
||||
*
|
||||
* @throws UnknownDatePartTypeException
|
||||
* @return int
|
||||
*/
|
||||
public static function getCurrentDayOfWeek()
|
||||
@@ -242,34 +232,35 @@ class Date
|
||||
* @param int $month The month value
|
||||
* @param int $day The day value
|
||||
*
|
||||
* @throws UnknownDatePartTypeException
|
||||
* @return int
|
||||
*
|
||||
* @throws UnknownDatePartTypeException
|
||||
*/
|
||||
public static function getDayOfWeek($year, $month, $day)
|
||||
{
|
||||
$year = (int)$year;
|
||||
$month = (int)$month;
|
||||
$day = (int)$day;
|
||||
$year = (int) $year;
|
||||
$month = (int) $month;
|
||||
$day = (int) $day;
|
||||
|
||||
/*
|
||||
* Oops, incorrect year
|
||||
*/
|
||||
if ($year <= 0) {
|
||||
throw UnknownDatePartTypeException::createException(DatePartType::YEAR, $year);
|
||||
throw new UnknownDatePartTypeException(DatePartType::YEAR, $year);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, incorrect month
|
||||
*/
|
||||
if ($month < 1 || $month > 12) {
|
||||
throw UnknownDatePartTypeException::createException(DatePartType::MONTH, $month);
|
||||
throw new UnknownDatePartTypeException(DatePartType::MONTH, $month);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, incorrect day
|
||||
*/
|
||||
if ($day < 1 || $day > 31) {
|
||||
throw UnknownDatePartTypeException::createException(DatePartType::DAY, $day);
|
||||
throw new UnknownDatePartTypeException(DatePartType::DAY, $day);
|
||||
}
|
||||
|
||||
if ($month < 3) {
|
||||
@@ -289,7 +280,7 @@ class Date
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns based on locale name of current weekday
|
||||
* Returns based on locale name of current weekday.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -305,11 +296,12 @@ class Date
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns name of weekday based on locale
|
||||
* Returns name of weekday based on locale.
|
||||
*
|
||||
* @param int $year The year value
|
||||
* @param int $month The month value
|
||||
* @param int $day The day value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getDayOfWeekName($year, $month, $day)
|
||||
@@ -323,7 +315,7 @@ class Date
|
||||
|
||||
$encoding = mb_detect_encoding($name);
|
||||
|
||||
if (false === $encoding) {
|
||||
if ($encoding === false) {
|
||||
$name = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-2');
|
||||
}
|
||||
|
||||
@@ -350,6 +342,7 @@ class Date
|
||||
* @param int $differenceUnit (optional) Unit of date difference. One of this class
|
||||
* DATE_DIFFERENCE_UNIT_* constants. If is set to null all units are
|
||||
* returned in the array.
|
||||
*
|
||||
* @return array|int
|
||||
*/
|
||||
public static function getDateDifference($dateStart, $dateEnd, $differenceUnit = null)
|
||||
@@ -390,46 +383,46 @@ class Date
|
||||
self::DATE_DIFFERENCE_UNIT_MINUTES,
|
||||
];
|
||||
|
||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_YEARS == $differenceUnit) {
|
||||
if ($differenceUnit === null || $differenceUnit == self::DATE_DIFFERENCE_UNIT_YEARS) {
|
||||
$diff = $dateEnd->diff($dateStart);
|
||||
|
||||
/*
|
||||
* Difference between dates in years should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_YEARS == $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_YEARS) {
|
||||
return $diff->y;
|
||||
}
|
||||
|
||||
$difference[self::DATE_DIFFERENCE_UNIT_YEARS] = $diff->y;
|
||||
}
|
||||
|
||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_MONTHS == $differenceUnit) {
|
||||
if ($differenceUnit === null || $differenceUnit == self::DATE_DIFFERENCE_UNIT_MONTHS) {
|
||||
$diff = $dateEnd->diff($dateStart);
|
||||
|
||||
/*
|
||||
* Difference between dates in months should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_MONTHS == $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_MONTHS) {
|
||||
return $diff->m;
|
||||
}
|
||||
|
||||
$difference[self::DATE_DIFFERENCE_UNIT_MONTHS] = $diff->m;
|
||||
}
|
||||
|
||||
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits)) {
|
||||
$days = (int)floor($dateDiff / $daySeconds);
|
||||
if ($differenceUnit === null || in_array($differenceUnit, $relatedUnits)) {
|
||||
$days = (int) floor($dateDiff / $daySeconds);
|
||||
|
||||
/*
|
||||
* Difference between dates in days should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_DAYS == $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_DAYS) {
|
||||
return $days;
|
||||
}
|
||||
|
||||
/*
|
||||
* All units should be returned?
|
||||
*/
|
||||
if (null === $differenceUnit) {
|
||||
if ($differenceUnit === null) {
|
||||
$difference[self::DATE_DIFFERENCE_UNIT_DAYS] = $days;
|
||||
}
|
||||
|
||||
@@ -439,20 +432,20 @@ class Date
|
||||
$daysInSeconds = $days * $daySeconds;
|
||||
}
|
||||
|
||||
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits)) {
|
||||
$hours = (int)floor(($dateDiff - $daysInSeconds) / $hourSeconds);
|
||||
if ($differenceUnit === null || in_array($differenceUnit, $relatedUnits)) {
|
||||
$hours = (int) floor(($dateDiff - $daysInSeconds) / $hourSeconds);
|
||||
|
||||
/*
|
||||
* Difference between dates in hours should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_HOURS == $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_HOURS) {
|
||||
return $hours;
|
||||
}
|
||||
|
||||
/*
|
||||
* All units should be returned?
|
||||
*/
|
||||
if (null === $differenceUnit) {
|
||||
if ($differenceUnit === null) {
|
||||
$difference[self::DATE_DIFFERENCE_UNIT_HOURS] = $hours;
|
||||
}
|
||||
|
||||
@@ -462,13 +455,13 @@ class Date
|
||||
$hoursInSeconds = $hours * $hourSeconds;
|
||||
}
|
||||
|
||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_MINUTES == $differenceUnit) {
|
||||
$minutes = (int)floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60);
|
||||
if ($differenceUnit === null || $differenceUnit == self::DATE_DIFFERENCE_UNIT_MINUTES) {
|
||||
$minutes = (int) floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60);
|
||||
|
||||
/*
|
||||
* Difference between dates in minutes should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_MINUTES == $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_MINUTES) {
|
||||
return $minutes;
|
||||
}
|
||||
|
||||
@@ -487,7 +480,7 @@ class Date
|
||||
* @param string $intervalTemplate (optional) Template used to build date interval. It should contain "%d" as the
|
||||
* placeholder which is replaced with a number that represents each iteration.
|
||||
* Default: interval for days.
|
||||
* @throws Exception
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getDatesCollection(DateTime $startDate, $datesCount, $intervalTemplate = 'P%dD')
|
||||
@@ -513,7 +506,7 @@ class Date
|
||||
$matchCount = preg_match($intervalPattern, $intervalTemplate, $matches);
|
||||
|
||||
if ($matchCount > 0 && (!empty($matches[1]) || !empty($matches[2]))) {
|
||||
$datesCount = (int)$datesCount;
|
||||
$datesCount = (int) $datesCount;
|
||||
|
||||
for ($index = 1; $index <= $datesCount; ++$index) {
|
||||
$date = clone $startDate;
|
||||
@@ -526,24 +519,24 @@ class Date
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns random date based on given start date
|
||||
* Returns random date based on given start date.
|
||||
*
|
||||
* @param DateTime $startDate The start date. Start of the random date.
|
||||
* @param int $start (optional) Start of random partition
|
||||
* @param int $end (optional) End of random partition
|
||||
* @param string $intervalTemplate (optional) Template used to build date interval. The placeholder is replaced
|
||||
* with next, iterated value.
|
||||
* @throws Exception
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
public static function getRandomDate(DateTime $startDate = null, $start = 1, $end = 100, $intervalTemplate = 'P%sD')
|
||||
{
|
||||
if (null === $startDate) {
|
||||
if ($startDate === null) {
|
||||
$startDate = new DateTime();
|
||||
}
|
||||
|
||||
$start = (int)$start;
|
||||
$end = (int)$end;
|
||||
$start = (int) $start;
|
||||
$end = (int) $end;
|
||||
|
||||
/*
|
||||
* Incorrect end of random partition?
|
||||
@@ -570,6 +563,7 @@ class Date
|
||||
* @param string $dateFormat (optional) Format of date used to verify if given value is actually a date.
|
||||
* It should be format matched to the given value, e.g. "Y-m-d H:i" for
|
||||
* "2015-01-01 10:00" value.
|
||||
*
|
||||
* @return DateTime|bool
|
||||
*/
|
||||
public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d')
|
||||
@@ -604,7 +598,7 @@ class Date
|
||||
*/
|
||||
$dateFromFormat = DateTime::createFromFormat($dateFormat, $value);
|
||||
|
||||
if (false === $dateFromFormat) {
|
||||
if ($dateFromFormat === false) {
|
||||
/*
|
||||
* Nothing to do more, because:
|
||||
* a) instance of the DateTime was created
|
||||
@@ -672,12 +666,13 @@ class Date
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given value is valid date
|
||||
* Returns information if given value is valid date.
|
||||
*
|
||||
* @param mixed $value The value which maybe is a date
|
||||
* @param bool $allowCompoundFormats (optional) If is set to true, the compound formats used to create an
|
||||
* instance of DateTime class are allowed (e.g. "now", "last day of next
|
||||
* month", "yyyy"). Otherwise - not and every incorrect value is refused.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidDate($value, $allowCompoundFormats = false)
|
||||
@@ -686,9 +681,10 @@ class Date
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given format of date is valid
|
||||
* Returns information if given format of date is valid.
|
||||
*
|
||||
* @param string $format The validated format of date
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidDateFormat($format)
|
||||
@@ -6,100 +6,98 @@
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Type;
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use DateTime;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
use Meritoo\Common\Utilities\Date;
|
||||
|
||||
/**
|
||||
* A date's period.
|
||||
* Contains start and end date of the period.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class DatePeriod extends BaseType
|
||||
class DatePeriod
|
||||
{
|
||||
/**
|
||||
* The period constant: last month
|
||||
* The period constant: last month.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const LAST_MONTH = 4;
|
||||
|
||||
/**
|
||||
* The period constant: last week
|
||||
* The period constant: last week.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const LAST_WEEK = 1;
|
||||
|
||||
/**
|
||||
* The period constant: last year
|
||||
* The period constant: last year.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const LAST_YEAR = 7;
|
||||
|
||||
/**
|
||||
* The period constant: next month
|
||||
* The period constant: next month.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const NEXT_MONTH = 6;
|
||||
|
||||
/**
|
||||
* The period constant: next week
|
||||
* The period constant: next week.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const NEXT_WEEK = 3;
|
||||
|
||||
/**
|
||||
* The period constant: next year
|
||||
* The period constant: next year.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const NEXT_YEAR = 9;
|
||||
|
||||
/**
|
||||
* The period constant: this month
|
||||
* The period constant: this month.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const THIS_MONTH = 5;
|
||||
|
||||
/**
|
||||
* The period constant: this week
|
||||
* The period constant: this week.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const THIS_WEEK = 2;
|
||||
|
||||
/**
|
||||
* The period constant: this year
|
||||
* The period constant: this year.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const THIS_YEAR = 8;
|
||||
|
||||
/**
|
||||
* The start date of period
|
||||
* The start date of period.
|
||||
*
|
||||
* @var DateTime
|
||||
*/
|
||||
private $startDate;
|
||||
|
||||
/**
|
||||
* The end date of period
|
||||
* The end date of period.
|
||||
*
|
||||
* @var DateTime
|
||||
*/
|
||||
private $endDate;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
* Class constructor.
|
||||
*
|
||||
* @param DateTime $startDate (optional) The start date of period
|
||||
* @param DateTime $endDate (optional) The end date of period
|
||||
@@ -111,10 +109,23 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns formatted one of the period's date: start date or end date
|
||||
* Returns information if given period is correct.
|
||||
*
|
||||
* @param int $period The period to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isCorrectPeriod($period)
|
||||
{
|
||||
return in_array($period, Reflection::getConstants(__CLASS__));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns formatted one of the period's date: start date or end date.
|
||||
*
|
||||
* @param string $format Format used to format the date
|
||||
* @param bool $startDate (optional) If is set to true, start date is formatted. Otherwise - end date.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getFormattedDate($format, $startDate = true)
|
||||
@@ -131,7 +142,7 @@ class DatePeriod extends BaseType
|
||||
/*
|
||||
* Unknown date or format is invalid?
|
||||
*/
|
||||
if (null === $date || !Date::isValidDateFormat($format)) {
|
||||
if ($date === null || !Date::isValidDateFormat($format)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -139,7 +150,7 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the end date of period
|
||||
* Returns the end date of period.
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
@@ -149,9 +160,10 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the end date of period
|
||||
* Sets the end date of period.
|
||||
*
|
||||
* @param DateTime $endDate (optional) The end date of period
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setEndDate(DateTime $endDate = null)
|
||||
@@ -162,7 +174,7 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the start date of period
|
||||
* Returns the start date of period.
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
@@ -172,9 +184,10 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the start date of period
|
||||
* Sets the start date of period.
|
||||
*
|
||||
* @param DateTime $startDate (optional) The start date of period
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setStartDate(DateTime $startDate = null)
|
||||
@@ -11,17 +11,18 @@ namespace Meritoo\Common\Utilities;
|
||||
use Generator;
|
||||
|
||||
/**
|
||||
* Useful methods for the Generator class (only static functions)
|
||||
* Useful methods for the Generator class (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class GeneratorUtility
|
||||
{
|
||||
/**
|
||||
* Returns elements of generator
|
||||
* Returns elements of generator.
|
||||
*
|
||||
* @param Generator $generator The generator who elements should be returned
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getGeneratorElements(Generator $generator)
|
||||
@@ -9,21 +9,22 @@
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
/**
|
||||
* Useful locale methods
|
||||
* Useful locale methods.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Locale
|
||||
{
|
||||
/**
|
||||
* Sets locale for given category using given language and country code
|
||||
* Sets locale for given category using given language and country code.
|
||||
*
|
||||
* @param int $category Named constant specifying the category of the functions affected by the locale
|
||||
* setting. It's the same constant as required by setlocale() function.
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
* @param string $countryCode (optional) Country code, in ISO 3166-1 alpha-2 format, e.g. "FR"
|
||||
* @return false|string
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* Available categories (values of $category argument):
|
||||
* - LC_ALL for all of the below
|
||||
@@ -36,7 +37,7 @@ class Locale
|
||||
*/
|
||||
public static function setLocale($category, $languageCode, $countryCode = '')
|
||||
{
|
||||
$category = (int)$category;
|
||||
$category = (int) $category;
|
||||
|
||||
if (is_string($languageCode)) {
|
||||
$languageCode = trim($languageCode);
|
||||
@@ -57,37 +58,18 @@ class Locale
|
||||
}
|
||||
|
||||
$localeLongForm = self::getLongForm($languageCode, $countryCode);
|
||||
setlocale($category, $localeLongForm);
|
||||
|
||||
return setlocale($category, $localeLongForm);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns locale for given category
|
||||
*
|
||||
* @param int $category Named constant specifying the category of the functions affected by the locale setting.
|
||||
* It's the same constant as required by setlocale() function.
|
||||
* @return string
|
||||
*
|
||||
* Available categories (values of $category argument):
|
||||
* - LC_ALL for all of the below
|
||||
* - LC_COLLATE for string comparison, see strcoll()
|
||||
* - LC_CTYPE for character classification and conversion, for example strtoupper()
|
||||
* - LC_MONETARY for localeconv()
|
||||
* - LC_NUMERIC for decimal separator (See also localeconv())
|
||||
* - LC_TIME for date and time formatting with strftime()
|
||||
* - LC_MESSAGES for system responses (available if PHP was compiled with libintl)
|
||||
*/
|
||||
public static function getLocale($category)
|
||||
{
|
||||
return setlocale($category, '0');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns long form of the locale
|
||||
* Returns long form of the locale.
|
||||
*
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
* @param string $countryCode (optional) Country code, in ISO 3166-1 alpha-2 format, e.g. "FR"
|
||||
* @param string $encoding (optional) Encoding of the final locale
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* Example:
|
||||
822
src/Meritoo/Common/Utilities/MimeTypes.php
Normal file
822
src/Meritoo/Common/Utilities/MimeTypes.php
Normal file
@@ -0,0 +1,822 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
/**
|
||||
* Useful methods for mime types of files.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class MimeTypes
|
||||
{
|
||||
/**
|
||||
* Mime types data.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $mimeTypes = [
|
||||
'7z' => 'application/x-7z-compressed',
|
||||
'ez' => 'application/andrew-inset',
|
||||
'atom' => 'application/atom+xml',
|
||||
'atomcat' => 'application/atomcat+xml',
|
||||
'atomsvc' => 'application/atomsvc+xml',
|
||||
'ccxml' => 'application/ccxml+xml',
|
||||
'davmount' => 'application/davmount+xml',
|
||||
'ecma' => 'application/ecmascript',
|
||||
'pfr' => 'application/font-tdpfr',
|
||||
'stk' => 'application/hyperstudio',
|
||||
'js' => 'application/javascript',
|
||||
'json' => 'application/json',
|
||||
'hqx' => 'application/mac-binhex40',
|
||||
'cpt' => 'application/mac-compactpro',
|
||||
'mrc' => 'application/marc',
|
||||
'ma' => 'application/mathematica',
|
||||
'nb' => 'application/mathematica',
|
||||
'mb' => 'application/mathematica',
|
||||
'mathml' => 'application/mathml+xml',
|
||||
'mbox' => 'application/mbox',
|
||||
'mscml' => 'application/mediaservercontrol+xml',
|
||||
'mp4s' => 'application/mp4',
|
||||
'dot' => 'application/msword',
|
||||
'doc' => 'application/msword',
|
||||
/*
|
||||
* MS Office system file format MIME types
|
||||
* http://technet.microsoft.com/en-us/library/ee309278%28office.12%29.aspx
|
||||
*/
|
||||
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
'mxf' => 'application/mxf',
|
||||
'bin' => 'application/octet-stream',
|
||||
'dms' => 'application/octet-stream',
|
||||
'lha' => 'application/octet-stream',
|
||||
'lzh' => 'application/octet-stream',
|
||||
'class' => 'application/octet-stream',
|
||||
'so' => 'application/octet-stream',
|
||||
'iso' => 'application/octet-stream',
|
||||
'dmg' => 'application/octet-stream',
|
||||
'dist' => 'application/octet-stream',
|
||||
'distz' => 'application/octet-stream',
|
||||
'pkg' => 'application/octet-stream',
|
||||
'bpk' => 'application/octet-stream',
|
||||
'dump' => 'application/octet-stream',
|
||||
'elc' => 'application/octet-stream',
|
||||
'scpt' => 'application/octet-stream',
|
||||
'oda' => 'application/oda',
|
||||
'ogg' => 'application/ogg',
|
||||
'pdf' => 'application/pdf',
|
||||
'pgp' => 'application/pgp-encrypted',
|
||||
'asc' => 'application/pgp-signature',
|
||||
'sig' => 'application/pgp-signature',
|
||||
'prf' => 'application/pics-rules',
|
||||
'p10' => 'application/pkcs10',
|
||||
'p7m' => 'application/pkcs7-mime',
|
||||
'p7c' => 'application/pkcs7-mime',
|
||||
'p7s' => 'application/pkcs7-signature',
|
||||
'cer' => 'application/pkix-cert',
|
||||
'crl' => 'application/pkix-crl',
|
||||
'pkipath' => 'application/pkix-pkipath',
|
||||
'pki' => 'application/pkixcmp',
|
||||
'pls' => 'application/pls+xml',
|
||||
'ai' => 'application/postscript',
|
||||
'eps' => 'application/postscript',
|
||||
'ps' => 'application/postscript',
|
||||
'cww' => 'application/prs.cww',
|
||||
'rdf' => 'application/rdf+xml',
|
||||
'rif' => 'application/reginfo+xml',
|
||||
'rnc' => 'application/relax-ng-compact-syntax',
|
||||
'rl' => 'application/resource-lists+xml',
|
||||
'rs' => 'application/rls-services+xml',
|
||||
'rsd' => 'application/rsd+xml',
|
||||
'rss' => 'application/rss+xml',
|
||||
'rtf' => 'application/rtf',
|
||||
'sbml' => 'application/sbml+xml',
|
||||
'sdp' => 'application/sdp',
|
||||
'setpay' => 'application/set-payment-initiation',
|
||||
'setreg' => 'application/set-registration-initiation',
|
||||
'shf' => 'application/shf+xml',
|
||||
'smi' => 'application/smil+xml',
|
||||
'smil' => 'application/smil+xml',
|
||||
'gram' => 'application/srgs',
|
||||
'grxml' => 'application/srgs+xml',
|
||||
'ssml' => 'application/ssml+xml',
|
||||
'plb' => 'application/vnd.3gpp.pic-bw-large',
|
||||
'psb' => 'application/vnd.3gpp.pic-bw-small',
|
||||
'pvb' => 'application/vnd.3gpp.pic-bw-var',
|
||||
'pwn' => 'application/vnd.3m.post-it-notes',
|
||||
'aso' => 'application/vnd.accpac.simply.aso',
|
||||
'imp' => 'application/vnd.accpac.simply.imp',
|
||||
'acu' => 'application/vnd.acucobol',
|
||||
'atc' => 'application/vnd.acucorp',
|
||||
'acutc' => 'application/vnd.acucorp',
|
||||
'xdp' => 'application/vnd.adobe.xdp+xml',
|
||||
'xfdf' => 'application/vnd.adobe.xfdf',
|
||||
'ami' => 'application/vnd.amiga.ami',
|
||||
'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
|
||||
'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
|
||||
'atx' => 'application/vnd.antix.game-component',
|
||||
'mpkg' => 'application/vnd.apple.installer+xml',
|
||||
'aep' => 'application/vnd.audiograph',
|
||||
'mpm' => 'application/vnd.blueice.multipass',
|
||||
'bmi' => 'application/vnd.bmi',
|
||||
'rep' => 'application/vnd.businessobjects',
|
||||
'cdxml' => 'application/vnd.chemdraw+xml',
|
||||
'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
|
||||
'cdy' => 'application/vnd.cinderella',
|
||||
'cla' => 'application/vnd.claymore',
|
||||
'c4g' => 'application/vnd.clonk.c4group',
|
||||
'c4d' => 'application/vnd.clonk.c4group',
|
||||
'c4f' => 'application/vnd.clonk.c4group',
|
||||
'c4p' => 'application/vnd.clonk.c4group',
|
||||
'c4u' => 'application/vnd.clonk.c4group',
|
||||
'csp' => 'application/vnd.commonspace',
|
||||
'cst' => 'application/vnd.commonspace',
|
||||
'cdbcmsg' => 'application/vnd.contact.cmsg',
|
||||
'cmc' => 'application/vnd.cosmocaller',
|
||||
'clkx' => 'application/vnd.crick.clicker',
|
||||
'clkk' => 'application/vnd.crick.clicker.keyboard',
|
||||
'clkp' => 'application/vnd.crick.clicker.palette',
|
||||
'clkt' => 'application/vnd.crick.clicker.template',
|
||||
'clkw' => 'application/vnd.crick.clicker.wordbank',
|
||||
'wbs' => 'application/vnd.criticaltools.wbs+xml',
|
||||
'pml' => 'application/vnd.ctc-posml',
|
||||
'ppd' => 'application/vnd.cups-ppd',
|
||||
'curl' => 'application/vnd.curl',
|
||||
'rdz' => 'application/vnd.data-vision.rdz',
|
||||
'dna' => 'application/vnd.dna',
|
||||
'mlp' => 'application/vnd.dolby.mlp',
|
||||
'dpg' => 'application/vnd.dpgraph',
|
||||
'dfac' => 'application/vnd.dreamfactory',
|
||||
'mag' => 'application/vnd.ecowin.chart',
|
||||
'nml' => 'application/vnd.enliven',
|
||||
'esf' => 'application/vnd.epson.esf',
|
||||
'msf' => 'application/vnd.epson.msf',
|
||||
'qam' => 'application/vnd.epson.quickanime',
|
||||
'slt' => 'application/vnd.epson.salt',
|
||||
'ssf' => 'application/vnd.epson.ssf',
|
||||
'es3' => 'application/vnd.eszigno3+xml',
|
||||
'et3' => 'application/vnd.eszigno3+xml',
|
||||
'ez2' => 'application/vnd.ezpix-album',
|
||||
'ez3' => 'application/vnd.ezpix-package',
|
||||
'fdf' => 'application/vnd.fdf',
|
||||
'gph' => 'application/vnd.flographit',
|
||||
'ftc' => 'application/vnd.fluxtime.clip',
|
||||
'fm' => 'application/vnd.framemaker',
|
||||
'frame' => 'application/vnd.framemaker',
|
||||
'maker' => 'application/vnd.framemaker',
|
||||
'fnc' => 'application/vnd.frogans.fnc',
|
||||
'ltf' => 'application/vnd.frogans.ltf',
|
||||
'fsc' => 'application/vnd.fsc.weblaunch',
|
||||
'oas' => 'application/vnd.fujitsu.oasys',
|
||||
'oa2' => 'application/vnd.fujitsu.oasys2',
|
||||
'oa3' => 'application/vnd.fujitsu.oasys3',
|
||||
'fg5' => 'application/vnd.fujitsu.oasysgp',
|
||||
'bh2' => 'application/vnd.fujitsu.oasysprs',
|
||||
'ddd' => 'application/vnd.fujixerox.ddd',
|
||||
'xdw' => 'application/vnd.fujixerox.docuworks',
|
||||
'xbd' => 'application/vnd.fujixerox.docuworks.binder',
|
||||
'fzs' => 'application/vnd.fuzzysheet',
|
||||
'txd' => 'application/vnd.genomatix.tuxedo',
|
||||
'kml' => 'application/vnd.google-earth.kml+xml',
|
||||
'kmz' => 'application/vnd.google-earth.kmz',
|
||||
'gqf' => 'application/vnd.grafeq',
|
||||
'gqs' => 'application/vnd.grafeq',
|
||||
'gac' => 'application/vnd.groove-account',
|
||||
'ghf' => 'application/vnd.groove-help',
|
||||
'gim' => 'application/vnd.groove-identity-message',
|
||||
'grv' => 'application/vnd.groove-injector',
|
||||
'gtm' => 'application/vnd.groove-tool-message',
|
||||
'tpl' => 'application/vnd.groove-tool-template',
|
||||
'vcg' => 'application/vnd.groove-vcard',
|
||||
'zmm' => 'application/vnd.handheld-entertainment+xml',
|
||||
'hbci' => 'application/vnd.hbci',
|
||||
'les' => 'application/vnd.hhe.lesson-player',
|
||||
'hpgl' => 'application/vnd.hp-hpgl',
|
||||
'hpid' => 'application/vnd.hp-hpid',
|
||||
'hps' => 'application/vnd.hp-hps',
|
||||
'jlt' => 'application/vnd.hp-jlyt',
|
||||
'pcl' => 'application/vnd.hp-pcl',
|
||||
'pclxl' => 'application/vnd.hp-pclxl',
|
||||
'x3d' => 'application/vnd.hzn-3d-crossword',
|
||||
'mpy' => 'application/vnd.ibm.minipay',
|
||||
'afp' => 'application/vnd.ibm.modcap',
|
||||
'listafp' => 'application/vnd.ibm.modcap',
|
||||
'list3820' => 'application/vnd.ibm.modcap',
|
||||
'irm' => 'application/vnd.ibm.rights-management',
|
||||
'sc' => 'application/vnd.ibm.secure-container',
|
||||
'igl' => 'application/vnd.igloader',
|
||||
'ivp' => 'application/vnd.immervision-ivp',
|
||||
'ivu' => 'application/vnd.immervision-ivu',
|
||||
'xpw' => 'application/vnd.intercon.formnet',
|
||||
'xpx' => 'application/vnd.intercon.formnet',
|
||||
'qbo' => 'application/vnd.intu.qbo',
|
||||
'qfx' => 'application/vnd.intu.qfx',
|
||||
'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
|
||||
'irp' => 'application/vnd.irepository.package+xml',
|
||||
'xpr' => 'application/vnd.is-xpr',
|
||||
'jam' => 'application/vnd.jam',
|
||||
'rms' => 'application/vnd.jcp.javame.midlet-rms',
|
||||
'jisp' => 'application/vnd.jisp',
|
||||
'ktz' => 'application/vnd.kahootz',
|
||||
'ktr' => 'application/vnd.kahootz',
|
||||
'karbon' => 'application/vnd.kde.karbon',
|
||||
'chrt' => 'application/vnd.kde.kchart',
|
||||
'kfo' => 'application/vnd.kde.kformula',
|
||||
'flw' => 'application/vnd.kde.kivio',
|
||||
'kon' => 'application/vnd.kde.kontour',
|
||||
'kpr' => 'application/vnd.kde.kpresenter',
|
||||
'kpt' => 'application/vnd.kde.kpresenter',
|
||||
'ksp' => 'application/vnd.kde.kspread',
|
||||
'kwd' => 'application/vnd.kde.kword',
|
||||
'kwt' => 'application/vnd.kde.kword',
|
||||
'htke' => 'application/vnd.kenameaapp',
|
||||
'kia' => 'application/vnd.kidspiration',
|
||||
'kne' => 'application/vnd.kinar',
|
||||
'knp' => 'application/vnd.kinar',
|
||||
'skp' => 'application/vnd.koan',
|
||||
'skd' => 'application/vnd.koan',
|
||||
'skt' => 'application/vnd.koan',
|
||||
'skm' => 'application/vnd.koan',
|
||||
'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
|
||||
'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
|
||||
'123' => 'application/vnd.lotus-1-2-3',
|
||||
'apr' => 'application/vnd.lotus-approach',
|
||||
'pre' => 'application/vnd.lotus-freelance',
|
||||
'nsf' => 'application/vnd.lotus-notes',
|
||||
'org' => 'application/vnd.lotus-organizer',
|
||||
'scm' => 'application/vnd.lotus-screencam',
|
||||
'lwp' => 'application/vnd.lotus-wordpro',
|
||||
'portpkg' => 'application/vnd.macports.portpkg',
|
||||
'mcd' => 'application/vnd.mcd',
|
||||
'mc1' => 'application/vnd.medcalcdata',
|
||||
'cdkey' => 'application/vnd.mediastation.cdkey',
|
||||
'mwf' => 'application/vnd.mfer',
|
||||
'mfm' => 'application/vnd.mfmp',
|
||||
'flo' => 'application/vnd.micrografx.flo',
|
||||
'igx' => 'application/vnd.micrografx.igx',
|
||||
'mif' => 'application/vnd.mif',
|
||||
'daf' => 'application/vnd.mobius.daf',
|
||||
'dis' => 'application/vnd.mobius.dis',
|
||||
'mbk' => 'application/vnd.mobius.mbk',
|
||||
'mqy' => 'application/vnd.mobius.mqy',
|
||||
'msl' => 'application/vnd.mobius.msl',
|
||||
'plc' => 'application/vnd.mobius.plc',
|
||||
'txf' => 'application/vnd.mobius.txf',
|
||||
'mpn' => 'application/vnd.mophun.application',
|
||||
'mpc' => 'application/vnd.mophun.certificate',
|
||||
'xul' => 'application/vnd.mozilla.xul+xml',
|
||||
'cil' => 'application/vnd.ms-artgalry',
|
||||
'asf' => 'application/vnd.ms-asf',
|
||||
'cab' => 'application/vnd.ms-cab-compressed',
|
||||
'xls' => 'application/vnd.ms-excel',
|
||||
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'xlm' => 'application/vnd.ms-excel',
|
||||
'xla' => 'application/vnd.ms-excel',
|
||||
'xlc' => 'application/vnd.ms-excel',
|
||||
'xlt' => 'application/vnd.ms-excel',
|
||||
'xlw' => 'application/vnd.ms-excel',
|
||||
'eot' => 'application/vnd.ms-fontobject',
|
||||
'chm' => 'application/vnd.ms-htmlhelp',
|
||||
'ims' => 'application/vnd.ms-ims',
|
||||
'lrm' => 'application/vnd.ms-lrm',
|
||||
'ppt' => 'application/vnd.ms-powerpoint',
|
||||
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
||||
'pps' => 'application/vnd.ms-powerpoint',
|
||||
'pot' => 'application/vnd.ms-powerpoint',
|
||||
'mpp' => 'application/vnd.ms-project',
|
||||
'mpt' => 'application/vnd.ms-project',
|
||||
'wps' => 'application/vnd.ms-works',
|
||||
'wks' => 'application/vnd.ms-works',
|
||||
'wcm' => 'application/vnd.ms-works',
|
||||
'wdb' => 'application/vnd.ms-works',
|
||||
'wpl' => 'application/vnd.ms-wpl',
|
||||
'xps' => 'application/vnd.ms-xpsdocument',
|
||||
'mseq' => 'application/vnd.mseq',
|
||||
'mus' => 'application/vnd.musician',
|
||||
'nlu' => 'application/vnd.neurolanguage.nlu',
|
||||
'nnd' => 'application/vnd.noblenet-directory',
|
||||
'nns' => 'application/vnd.noblenet-sealer',
|
||||
'nnw' => 'application/vnd.noblenet-web',
|
||||
'ngdat' => 'application/vnd.nokia.n-gage.data',
|
||||
'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
|
||||
'rpst' => 'application/vnd.nokia.radio-preset',
|
||||
'rpss' => 'application/vnd.nokia.radio-presets',
|
||||
'edm' => 'application/vnd.novadigm.edm',
|
||||
'edx' => 'application/vnd.novadigm.edx',
|
||||
'ext' => 'application/vnd.novadigm.ext',
|
||||
'odc' => 'application/vnd.oasis.opendocument.chart',
|
||||
'otc' => 'application/vnd.oasis.opendocument.chart-template',
|
||||
'odf' => 'application/vnd.oasis.opendocument.formula',
|
||||
'otf' => 'application/vnd.oasis.opendocument.formula-template',
|
||||
'odg' => 'application/vnd.oasis.opendocument.graphics',
|
||||
'otg' => 'application/vnd.oasis.opendocument.graphics-template',
|
||||
'odi' => 'application/vnd.oasis.opendocument.image',
|
||||
'oti' => 'application/vnd.oasis.opendocument.image-template',
|
||||
'odp' => 'application/vnd.oasis.opendocument.presentation',
|
||||
'otp' => 'application/vnd.oasis.opendocument.presentation-template',
|
||||
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
|
||||
'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
|
||||
'odt' => 'application/vnd.oasis.opendocument.text',
|
||||
'otm' => 'application/vnd.oasis.opendocument.text-master',
|
||||
'ott' => 'application/vnd.oasis.opendocument.text-template',
|
||||
'oth' => 'application/vnd.oasis.opendocument.text-web',
|
||||
'xo' => 'application/vnd.olpc-sugar',
|
||||
'dd2' => 'application/vnd.oma.dd2+xml',
|
||||
'oxt' => 'application/vnd.openofficeorg.extension',
|
||||
'dp' => 'application/vnd.osgi.dp',
|
||||
'prc' => 'application/vnd.palm',
|
||||
'pdb' => 'application/vnd.palm',
|
||||
'pqa' => 'application/vnd.palm',
|
||||
'oprc' => 'application/vnd.palm',
|
||||
'str' => 'application/vnd.pg.format',
|
||||
'ei6' => 'application/vnd.pg.osasli',
|
||||
'efif' => 'application/vnd.picsel',
|
||||
'plf' => 'application/vnd.pocketlearn',
|
||||
'pbd' => 'application/vnd.powerbuilder6',
|
||||
'box' => 'application/vnd.previewsystems.box',
|
||||
'mgz' => 'application/vnd.proteus.magazine',
|
||||
'qps' => 'application/vnd.publishare-delta-tree',
|
||||
'ptid' => 'application/vnd.pvi.ptid1',
|
||||
'qxd' => 'application/vnd.quark.quarkxpress',
|
||||
'qxt' => 'application/vnd.quark.quarkxpress',
|
||||
'qwd' => 'application/vnd.quark.quarkxpress',
|
||||
'qwt' => 'application/vnd.quark.quarkxpress',
|
||||
'qxl' => 'application/vnd.quark.quarkxpress',
|
||||
'qxb' => 'application/vnd.quark.quarkxpress',
|
||||
'mxl' => 'application/vnd.recordare.musicxml',
|
||||
'rm' => 'application/vnd.rn-realmedia',
|
||||
'see' => 'application/vnd.seemail',
|
||||
'sema' => 'application/vnd.sema',
|
||||
'semd' => 'application/vnd.semd',
|
||||
'semf' => 'application/vnd.semf',
|
||||
'ifm' => 'application/vnd.shana.informed.formdata',
|
||||
'itp' => 'application/vnd.shana.informed.formtemplate',
|
||||
'iif' => 'application/vnd.shana.informed.interchange',
|
||||
'ipk' => 'application/vnd.shana.informed.package',
|
||||
'twd' => 'application/vnd.simtech-mindmapper',
|
||||
'twds' => 'application/vnd.simtech-mindmapper',
|
||||
'mmf' => 'application/vnd.smaf',
|
||||
'sdkm' => 'application/vnd.solent.sdkm+xml',
|
||||
'sdkd' => 'application/vnd.solent.sdkm+xml',
|
||||
'dxp' => 'application/vnd.spotfire.dxp',
|
||||
'sfs' => 'application/vnd.spotfire.sfs',
|
||||
'sus' => 'application/vnd.sus-calendar',
|
||||
'susp' => 'application/vnd.sus-calendar',
|
||||
'svd' => 'application/vnd.svd',
|
||||
'xsm' => 'application/vnd.syncml+xml',
|
||||
'bdm' => 'application/vnd.syncml.dm+wbxml',
|
||||
'xdm' => 'application/vnd.syncml.dm+xml',
|
||||
'tao' => 'application/vnd.tao.intent-module-archive',
|
||||
'tmo' => 'application/vnd.tmobile-livetv',
|
||||
'tpt' => 'application/vnd.trid.tpt',
|
||||
'mxs' => 'application/vnd.triscape.mxs',
|
||||
'tra' => 'application/vnd.trueapp',
|
||||
'ufd' => 'application/vnd.ufdl',
|
||||
'ufdl' => 'application/vnd.ufdl',
|
||||
'utz' => 'application/vnd.uiq.theme',
|
||||
'umj' => 'application/vnd.umajin',
|
||||
'unityweb' => 'application/vnd.unity',
|
||||
'uoml' => 'application/vnd.uoml+xml',
|
||||
'vcx' => 'application/vnd.vcx',
|
||||
'vsd' => 'application/vnd.visio',
|
||||
'vst' => 'application/vnd.visio',
|
||||
'vss' => 'application/vnd.visio',
|
||||
'vsw' => 'application/vnd.visio',
|
||||
'vis' => 'application/vnd.visionary',
|
||||
'vsf' => 'application/vnd.vsf',
|
||||
'wbxml' => 'application/vnd.wap.wbxml',
|
||||
'wmlc' => 'application/vnd.wap.wmlc',
|
||||
'wmlsc' => 'application/vnd.wap.wmlscriptc',
|
||||
'wtb' => 'application/vnd.webturbo',
|
||||
'wpd' => 'application/vnd.wordperfect',
|
||||
'wqd' => 'application/vnd.wqd',
|
||||
'stf' => 'application/vnd.wt.stf',
|
||||
'xar' => 'application/vnd.xara',
|
||||
'xfdl' => 'application/vnd.xfdl',
|
||||
'hvd' => 'application/vnd.yamaha.hv-dic',
|
||||
'hvs' => 'application/vnd.yamaha.hv-script',
|
||||
'hvp' => 'application/vnd.yamaha.hv-voice',
|
||||
'saf' => 'application/vnd.yamaha.smaf-audio',
|
||||
'spf' => 'application/vnd.yamaha.smaf-phrase',
|
||||
'cmp' => 'application/vnd.yellowriver-custom-menu',
|
||||
'zaz' => 'application/vnd.zzazz.deck+xml',
|
||||
'vxml' => 'application/voicexml+xml',
|
||||
'hlp' => 'application/winhlp',
|
||||
'wsdl' => 'application/wsdl+xml',
|
||||
'wspolicy' => 'application/wspolicy+xml',
|
||||
'ace' => 'application/x-ace-compressed',
|
||||
'bcpio' => 'application/x-bcpio',
|
||||
'torrent' => 'application/x-bittorrent',
|
||||
'bz' => 'application/x-bzip',
|
||||
'bz2' => 'application/x-bzip2',
|
||||
'boz' => 'application/x-bzip2',
|
||||
'vcd' => 'application/x-cdlink',
|
||||
'chat' => 'application/x-chat',
|
||||
'pgn' => 'application/x-chess-pgn',
|
||||
'cpio' => 'application/x-cpio',
|
||||
'csh' => 'application/x-csh',
|
||||
'dcr' => 'application/x-director',
|
||||
'dir' => 'application/x-director',
|
||||
'dxr' => 'application/x-director',
|
||||
'fgd' => 'application/x-director',
|
||||
'dvi' => 'application/x-dvi',
|
||||
'spl' => 'application/x-futuresplash',
|
||||
'gtar' => 'application/x-gtar',
|
||||
'hdf' => 'application/x-hdf',
|
||||
'jnlp' => 'application/x-java-jnlp-file',
|
||||
'latex' => 'application/x-latex',
|
||||
'wmd' => 'application/x-ms-wmd',
|
||||
'wmz' => 'application/x-ms-wmz',
|
||||
'mdb' => 'application/x-msaccess',
|
||||
'obd' => 'application/x-msbinder',
|
||||
'crd' => 'application/x-mscardfile',
|
||||
'clp' => 'application/x-msclip',
|
||||
'exe' => 'application/x-msdownload',
|
||||
'dll' => 'application/x-msdownload',
|
||||
'com' => 'application/x-msdownload',
|
||||
'bat' => 'application/x-msdownload',
|
||||
'msi' => 'application/x-msdownload',
|
||||
'mvb' => 'application/x-msmediaview',
|
||||
'm13' => 'application/x-msmediaview',
|
||||
'm14' => 'application/x-msmediaview',
|
||||
'wmf' => 'application/x-msmetafile',
|
||||
'mny' => 'application/x-msmoney',
|
||||
'pub' => 'application/x-mspublisher',
|
||||
'scd' => 'application/x-msschedule',
|
||||
'trm' => 'application/x-msterminal',
|
||||
'wri' => 'application/x-mswrite',
|
||||
'nc' => 'application/x-netcdf',
|
||||
'cdf' => 'application/x-netcdf',
|
||||
'p12' => 'application/x-pkcs12',
|
||||
'pfx' => 'application/x-pkcs12',
|
||||
'p7b' => 'application/x-pkcs7-certificates',
|
||||
'spc' => 'application/x-pkcs7-certificates',
|
||||
'p7r' => 'application/x-pkcs7-certreqresp',
|
||||
'rar' => 'application/x-rar-compressed',
|
||||
'sh' => 'application/x-sh',
|
||||
'shar' => 'application/x-shar',
|
||||
'swf' => 'application/x-shockwave-flash',
|
||||
'sit' => 'application/x-stuffit',
|
||||
'sitx' => 'application/x-stuffitx',
|
||||
'sv4cpio' => 'application/x-sv4cpio',
|
||||
'sv4crc' => 'application/x-sv4crc',
|
||||
'tar' => 'application/x-tar',
|
||||
'tcl' => 'application/x-tcl',
|
||||
'tex' => 'application/x-tex',
|
||||
'texinfo' => 'application/x-texinfo',
|
||||
'texi' => 'application/x-texinfo',
|
||||
'ustar' => 'application/x-ustar',
|
||||
'src' => 'application/x-wais-source',
|
||||
'der' => 'application/x-x509-ca-cert',
|
||||
'crt' => 'application/x-x509-ca-cert',
|
||||
'xenc' => 'application/xenc+xml',
|
||||
'xhtml' => 'application/xhtml+xml',
|
||||
'xht' => 'application/xhtml+xml',
|
||||
'xml' => 'application/xml',
|
||||
'xsl' => 'application/xml',
|
||||
'dtd' => 'application/xml-dtd',
|
||||
'xop' => 'application/xop+xml',
|
||||
'xslt' => 'application/xslt+xml',
|
||||
'xspf' => 'application/xspf+xml',
|
||||
'mxml' => 'application/xv+xml',
|
||||
'xhvml' => 'application/xv+xml',
|
||||
'xvml' => 'application/xv+xml',
|
||||
'xvm' => 'application/xv+xml',
|
||||
'zip' => 'application/zip',
|
||||
'au' => 'audio/basic',
|
||||
'snd' => 'audio/basic',
|
||||
'mid' => 'audio/midi',
|
||||
'midi' => 'audio/midi',
|
||||
'kar' => 'audio/midi',
|
||||
'rmi' => 'audio/midi',
|
||||
'mp4a' => 'audio/mp4',
|
||||
'm4a' => 'audio/mp4a-latm',
|
||||
'm4p' => 'audio/mp4a-latm',
|
||||
'mpga' => 'audio/mpeg',
|
||||
'mp2' => 'audio/mpeg',
|
||||
'mp2a' => 'audio/mpeg',
|
||||
'mp3' => 'audio/mpeg',
|
||||
'm2a' => 'audio/mpeg',
|
||||
'm3a' => 'audio/mpeg',
|
||||
'eol' => 'audio/vnd.digital-winds',
|
||||
'lvp' => 'audio/vnd.lucent.voice',
|
||||
'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
|
||||
'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
|
||||
'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
|
||||
'wav' => 'audio/wav',
|
||||
'aif' => 'audio/x-aiff',
|
||||
'aiff' => 'audio/x-aiff',
|
||||
'aifc' => 'audio/x-aiff',
|
||||
'm3u' => 'audio/x-mpegurl',
|
||||
'wax' => 'audio/x-ms-wax',
|
||||
'wma' => 'audio/x-ms-wma',
|
||||
'ram' => 'audio/x-pn-realaudio',
|
||||
'ra' => 'audio/x-pn-realaudio',
|
||||
'rmp' => 'audio/x-pn-realaudio-plugin',
|
||||
'cdx' => 'chemical/x-cdx',
|
||||
'cif' => 'chemical/x-cif',
|
||||
'cmdf' => 'chemical/x-cmdf',
|
||||
'cml' => 'chemical/x-cml',
|
||||
'csml' => 'chemical/x-csml',
|
||||
'xyz' => 'chemical/x-xyz',
|
||||
'bmp' => 'image/bmp',
|
||||
'cgm' => 'image/cgm',
|
||||
'g3' => 'image/g3fax',
|
||||
'gif' => 'image/gif',
|
||||
'ief' => 'image/ief',
|
||||
'jp2' => 'image/jp2',
|
||||
'jpeg' => 'image/jpeg',
|
||||
'jpe' => 'image/jpeg',
|
||||
'jpg' => 'image/jpeg',
|
||||
'pict' => 'image/pict',
|
||||
'pic' => 'image/pict',
|
||||
'pct' => 'image/pict',
|
||||
'png' => 'image/png',
|
||||
'btif' => 'image/prs.btif',
|
||||
'svg' => 'image/svg+xml',
|
||||
'svgz' => 'image/svg+xml',
|
||||
'tiff' => 'image/tiff',
|
||||
'tif' => 'image/tiff',
|
||||
'psd' => 'image/vnd.adobe.photoshop',
|
||||
'djvu' => 'image/vnd.djvu',
|
||||
'djv' => 'image/vnd.djvu',
|
||||
'dwg' => 'image/vnd.dwg',
|
||||
'dxf' => 'image/vnd.dxf',
|
||||
'fbs' => 'image/vnd.fastbidsheet',
|
||||
'fpx' => 'image/vnd.fpx',
|
||||
'fst' => 'image/vnd.fst',
|
||||
'mmr' => 'image/vnd.fujixerox.edmics-mmr',
|
||||
'rlc' => 'image/vnd.fujixerox.edmics-rlc',
|
||||
'ico' => 'image/vnd.microsoft.icon',
|
||||
'mdi' => 'image/vnd.ms-modi',
|
||||
'npx' => 'image/vnd.net-fpx',
|
||||
'wbmp' => 'image/vnd.wap.wbmp',
|
||||
'xif' => 'image/vnd.xiff',
|
||||
'ras' => 'image/x-cmu-raster',
|
||||
'cmx' => 'image/x-cmx',
|
||||
'pntg' => 'image/x-macpaint',
|
||||
'pnt' => 'image/x-macpaint',
|
||||
'mac' => 'image/x-macpaint',
|
||||
'pcx' => 'image/x-pcx',
|
||||
'pnm' => 'image/x-portable-anymap',
|
||||
'pbm' => 'image/x-portable-bitmap',
|
||||
'pgm' => 'image/x-portable-graymap',
|
||||
'ppm' => 'image/x-portable-pixmap',
|
||||
'qtif' => 'image/x-quicktime',
|
||||
'qti' => 'image/x-quicktime',
|
||||
'rgb' => 'image/x-rgb',
|
||||
'xbm' => 'image/x-xbitmap',
|
||||
'xpm' => 'image/x-xpixmap',
|
||||
'xwd' => 'image/x-xwindowdump',
|
||||
'eml' => 'message/rfc822',
|
||||
'mime' => 'message/rfc822',
|
||||
'igs' => 'model/iges',
|
||||
'iges' => 'model/iges',
|
||||
'msh' => 'model/mesh',
|
||||
'mesh' => 'model/mesh',
|
||||
'silo' => 'model/mesh',
|
||||
'dwf' => 'model/vnd.dwf',
|
||||
'gdl' => 'model/vnd.gdl',
|
||||
'gtw' => 'model/vnd.gtw',
|
||||
'mts' => 'model/vnd.mts',
|
||||
'vtu' => 'model/vnd.vtu',
|
||||
'wrl' => 'model/vrml',
|
||||
'vrml' => 'model/vrml',
|
||||
'ics' => 'text/calendar',
|
||||
'ifb' => 'text/calendar',
|
||||
'css' => 'text/css',
|
||||
'csv' => 'text/csv',
|
||||
'html' => 'text/html',
|
||||
'htm' => 'text/html',
|
||||
'txt' => 'text/plain',
|
||||
'text' => 'text/plain',
|
||||
'conf' => 'text/plain',
|
||||
'def' => 'text/plain',
|
||||
'list' => 'text/plain',
|
||||
'log' => 'text/plain',
|
||||
'in' => 'text/plain',
|
||||
'dsc' => 'text/prs.lines.tag',
|
||||
'rtx' => 'text/richtext',
|
||||
'sgml' => 'text/sgml',
|
||||
'sgm' => 'text/sgml',
|
||||
'tsv' => 'text/tab-separated-values',
|
||||
't' => 'text/troff',
|
||||
'tr' => 'text/troff',
|
||||
'roff' => 'text/troff',
|
||||
'man' => 'text/troff',
|
||||
'me' => 'text/troff',
|
||||
'ms' => 'text/troff',
|
||||
'uri' => 'text/uri-list',
|
||||
'uris' => 'text/uri-list',
|
||||
'urls' => 'text/uri-list',
|
||||
'fly' => 'text/vnd.fly',
|
||||
'flx' => 'text/vnd.fmi.flexstor',
|
||||
'3dml' => 'text/vnd.in3d.3dml',
|
||||
'spot' => 'text/vnd.in3d.spot',
|
||||
'jad' => 'text/vnd.sun.j2me.app-descriptor',
|
||||
'wml' => 'text/vnd.wap.wml',
|
||||
'wmls' => 'text/vnd.wap.wmlscript',
|
||||
's' => 'text/x-asm',
|
||||
'asm' => 'text/x-asm',
|
||||
'c' => 'text/x-c',
|
||||
'cc' => 'text/x-c',
|
||||
'cxx' => 'text/x-c',
|
||||
'cpp' => 'text/x-c',
|
||||
'h' => 'text/x-c',
|
||||
'hh' => 'text/x-c',
|
||||
'dic' => 'text/x-c',
|
||||
'f' => 'text/x-fortran',
|
||||
'for' => 'text/x-fortran',
|
||||
'f77' => 'text/x-fortran',
|
||||
'f90' => 'text/x-fortran',
|
||||
'p' => 'text/x-pascal',
|
||||
'pas' => 'text/x-pascal',
|
||||
'java' => 'text/x-java-source',
|
||||
'etx' => 'text/x-setext',
|
||||
'uu' => 'text/x-uuencode',
|
||||
'vcs' => 'text/x-vcalendar',
|
||||
'vcf' => 'text/x-vcard',
|
||||
'3gp' => 'video/3gpp',
|
||||
'3g2' => 'video/3gpp2',
|
||||
'h261' => 'video/h261',
|
||||
'h263' => 'video/h263',
|
||||
'h264' => 'video/h264',
|
||||
'jpgv' => 'video/jpeg',
|
||||
'jpm' => 'video/jpm',
|
||||
'jpgm' => 'video/jpm',
|
||||
'mj2' => 'video/mj2',
|
||||
'mjp2' => 'video/mj2',
|
||||
'mp4' => 'video/mp4',
|
||||
'mp4v' => 'video/mp4',
|
||||
'mpg4' => 'video/mp4',
|
||||
'm4v' => 'video/mp4',
|
||||
'mpeg' => 'video/mpeg',
|
||||
'mpg' => 'video/mpeg',
|
||||
'mpe' => 'video/mpeg',
|
||||
'm1v' => 'video/mpeg',
|
||||
'm2v' => 'video/mpeg',
|
||||
'qt' => 'video/quicktime',
|
||||
'mov' => 'video/quicktime',
|
||||
'fvt' => 'video/vnd.fvt',
|
||||
'mxu' => 'video/vnd.mpegurl',
|
||||
'm4u' => 'video/vnd.mpegurl',
|
||||
'viv' => 'video/vnd.vivo',
|
||||
'dv' => 'video/x-dv',
|
||||
'dif' => 'video/x-dv',
|
||||
'fli' => 'video/x-fli',
|
||||
'asx' => 'video/x-ms-asf',
|
||||
'wm' => 'video/x-ms-wm',
|
||||
'wmv' => 'video/x-ms-wmv',
|
||||
'wmx' => 'video/x-ms-wmx',
|
||||
'wvx' => 'video/x-ms-wvx',
|
||||
'avi' => 'video/x-msvideo',
|
||||
'movie' => 'video/x-sgi-movie',
|
||||
'ice' => 'x-conference/x-cooltalk',
|
||||
];
|
||||
|
||||
/**
|
||||
* Returns extensions for given mimes types.
|
||||
*
|
||||
* @param array $mimesTypes The mimes types, e.g. ['video/mpeg', 'image/jpeg']
|
||||
* @param bool $asUpperCase (optional) If is set to true, extensions are returned as upper case. Otherwise - lower
|
||||
* case.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getExtensions(array $mimesTypes, $asUpperCase = false)
|
||||
{
|
||||
if (empty($mimesTypes)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$extensions = [];
|
||||
|
||||
foreach ($mimesTypes as $mimeType) {
|
||||
$extension = self::getExtension($mimeType);
|
||||
|
||||
/*
|
||||
* No extension for given mime type?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($extension)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Extensions should be returned as upper case?
|
||||
*/
|
||||
if ($asUpperCase) {
|
||||
if (is_array($extension)) {
|
||||
array_walk($extension, function (&$value) {
|
||||
$value = strtoupper($value);
|
||||
});
|
||||
} else {
|
||||
$extension = strtoupper($extension);
|
||||
}
|
||||
}
|
||||
|
||||
$extensions[$mimeType] = $extension;
|
||||
}
|
||||
|
||||
return $extensions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns extension for given mime type.
|
||||
*
|
||||
* @param string $mimeType The mime type, e.g. "video/mpeg"
|
||||
*
|
||||
* @return string|array
|
||||
*/
|
||||
public static function getExtension($mimeType)
|
||||
{
|
||||
if (is_string($mimeType) && in_array($mimeType, self::$mimeTypes)) {
|
||||
$data = Arrays::setKeysAsValues(self::$mimeTypes, false);
|
||||
|
||||
return $data[$mimeType];
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information whether file with the given path is an image.
|
||||
*
|
||||
* @param string $path Path of the file to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isImagePath($path)
|
||||
{
|
||||
$mimeType = self::getMimeType($path);
|
||||
|
||||
return self::isImage($mimeType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns mime type of given file.
|
||||
*
|
||||
* @param string $filePath Path of the file to check
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public static function getMimeType($filePath)
|
||||
{
|
||||
/*
|
||||
* The file does not exist?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($filePath) || !is_readable($filePath)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
/*
|
||||
* 1st possibility: the finfo class
|
||||
*/
|
||||
if (class_exists('finfo')) {
|
||||
$finfo = new \finfo();
|
||||
|
||||
return $finfo->file($filePath, FILEINFO_MIME_TYPE);
|
||||
}
|
||||
|
||||
/*
|
||||
* 2nd possibility: the mime_content_type function
|
||||
*/
|
||||
if (function_exists('mime_content_type')) {
|
||||
return mime_content_type($filePath);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, there is no possibility to read the mime type
|
||||
*/
|
||||
$template = 'Neither \'finfo\' class nor \'mime_content_type\' function exists. There is no way to read the'
|
||||
.' mime type of file \'%s\'.';
|
||||
|
||||
$message = sprintf($template, $filePath);
|
||||
|
||||
throw new \RuntimeException($message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information whether the given file type is an image.
|
||||
*
|
||||
* @param string $mimeType The mime type of file
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isImage($mimeType)
|
||||
{
|
||||
if (in_array($mimeType, self::$mimeTypes)) {
|
||||
return (bool) preg_match('|^image/.+$|', $mimeType);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -9,26 +9,26 @@
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use Gedmo\Sluggable\Util\Urlizer;
|
||||
use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException;
|
||||
use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
|
||||
use Symfony\Component\HttpFoundation\Cookie;
|
||||
use Transliterator;
|
||||
|
||||
/**
|
||||
* Miscellaneous methods (only static functions)
|
||||
* Miscellaneous methods (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Miscellaneous
|
||||
{
|
||||
/**
|
||||
* Returns directory's content (names of directories and files)
|
||||
* Returns directory's content (names of directories and files).
|
||||
*
|
||||
* @param string $directoryPath Path of directory who content should be returned
|
||||
* @param bool $recursive (optional) If is set to true, sub-directories are also searched for content.
|
||||
* Otherwise - only content of given directory is returned.
|
||||
* @param int $maxFilesCount (optional) Maximum files that will be returned. If it's null, all files are
|
||||
* returned.
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
public static function getDirectoryContent($directoryPath, $recursive = false, $maxFilesCount = null)
|
||||
@@ -66,7 +66,7 @@ class Miscellaneous
|
||||
|
||||
if (!empty($directoryContent)) {
|
||||
foreach ($directoryContent as $fileName) {
|
||||
if ('.' != $fileName && '..' != $fileName) {
|
||||
if ($fileName != '.' && $fileName != '..') {
|
||||
$content = null;
|
||||
|
||||
if (!empty($startFileName) && !$startFileFound) {
|
||||
@@ -77,11 +77,11 @@ class Miscellaneous
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($recursive && is_dir($directoryPath . $fileName)) {
|
||||
$content = self::getDirectoryContent($directoryPath . $fileName, true, $maxFilesCount - $count);
|
||||
if ($recursive && is_dir($directoryPath.$fileName)) {
|
||||
$content = self::getDirectoryContent($directoryPath.$fileName, true, $maxFilesCount - $count);
|
||||
}
|
||||
|
||||
if (null !== $content) {
|
||||
if ($content !== null) {
|
||||
$files[$fileName] = $content;
|
||||
|
||||
if (!empty($maxFilesCount)) {
|
||||
@@ -106,9 +106,10 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given path it's a file's path, if the path contains file name
|
||||
* Returns information if given path it's a file's path, if the path contains file name.
|
||||
*
|
||||
* @param string $path The path to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isFilePath($path)
|
||||
@@ -119,15 +120,16 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts checkbox value to boolean
|
||||
* Converts checkbox value to boolean.
|
||||
*
|
||||
* @param string $checkboxValue Checkbox value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function checkboxValue2Boolean($checkboxValue)
|
||||
{
|
||||
$mapping = [
|
||||
'on' => true,
|
||||
'on' => true,
|
||||
'off' => false,
|
||||
];
|
||||
|
||||
@@ -141,21 +143,23 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts checkbox value to integer
|
||||
* Converts checkbox value to integer.
|
||||
*
|
||||
* @param string $checkboxValue Checkbox value
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function checkboxValue2Integer($checkboxValue)
|
||||
{
|
||||
return (int)self::checkboxValue2Boolean($checkboxValue);
|
||||
return (int) self::checkboxValue2Boolean($checkboxValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns name of file with given extension after verification if it contains the extension
|
||||
* Returns name of file with given extension after verification if it contains the extension.
|
||||
*
|
||||
* @param string $fileName The file name to verify
|
||||
* @param string $extension The extension to verify and include
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function includeFileExtension($fileName, $extension)
|
||||
@@ -168,10 +172,11 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns file extension
|
||||
* Returns file extension.
|
||||
*
|
||||
* @param string $fileName File name
|
||||
* @param bool $asLowerCase (optional) if true extension is returned as lowercase string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getFileExtension($fileName, $asLowerCase = false)
|
||||
@@ -191,9 +196,10 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns file name from given path
|
||||
* Returns file name from given path.
|
||||
*
|
||||
* @param string $path A path that contains file name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getFileNameFromPath($path)
|
||||
@@ -201,7 +207,7 @@ class Miscellaneous
|
||||
$matches = [];
|
||||
$pattern = sprintf('|([^\%s.]+\.[A-Za-z0-9.]+)$|', DIRECTORY_SEPARATOR);
|
||||
|
||||
if ((bool)preg_match($pattern, $path, $matches)) {
|
||||
if ((bool) preg_match($pattern, $path, $matches)) {
|
||||
return $matches[1];
|
||||
}
|
||||
|
||||
@@ -209,11 +215,12 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns unique name for file based on given original name
|
||||
* Returns unique name for file based on given original name.
|
||||
*
|
||||
* @param string $originalFileName Original name of the file
|
||||
* @param int $objectId (optional) Object ID, the ID of database's row. May be included into the
|
||||
* generated / unique name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getUniqueFileName($originalFileName, $objectId = 0)
|
||||
@@ -261,16 +268,17 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns file name without extension
|
||||
* Returns file name without extension.
|
||||
*
|
||||
* @param string $fileName The file name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getFileNameWithoutExtension($fileName)
|
||||
{
|
||||
$matches = [];
|
||||
|
||||
if (is_string($fileName) && (bool)preg_match('|(.+)\.(.+)|', $fileName, $matches)) {
|
||||
if (is_string($fileName) && (bool) preg_match('|(.+)\.(.+)|', $fileName, $matches)) {
|
||||
return $matches[1];
|
||||
}
|
||||
|
||||
@@ -278,15 +286,16 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts value to non-negative integer (element of the set {0, 1, 2, 3, ...})
|
||||
* Converts value to non-negative integer (element of the set {0, 1, 2, 3, ...}).
|
||||
*
|
||||
* @param mixed $value Value to convert
|
||||
* @param int $negativeReplacement (optional) Replacement for negative value
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function value2NonNegativeInteger($value, $negativeReplacement = 0)
|
||||
{
|
||||
$effect = (int)$value;
|
||||
$effect = (int) $value;
|
||||
|
||||
if ($effect < 0) {
|
||||
return $negativeReplacement;
|
||||
@@ -296,7 +305,7 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays variable content as preformatted text (fixed-width font and preserves both spaces and line breaks)
|
||||
* Displays variable content as preformatted text (fixed-width font and preserves both spaces and line breaks).
|
||||
*
|
||||
* If xdebug php module is loaded, displays variable using var_dump(), otherwise <pre>var_dump()</pre>.
|
||||
* You can pass as many variables as you wish.
|
||||
@@ -324,9 +333,10 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given PHP module is compiled and loaded
|
||||
* Returns information if given PHP module is compiled and loaded.
|
||||
*
|
||||
* @param string $phpModuleName PHP module name
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isPhpModuleLoaded($phpModuleName)
|
||||
@@ -337,13 +347,14 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts given string characters to latin characters
|
||||
* Converts given string characters to latin characters.
|
||||
*
|
||||
* @param string $string String to convert
|
||||
* @param bool $lowerCaseHuman (optional) If is set to true, converted string is returned as lowercase and
|
||||
* human-readable. Otherwise - as original.
|
||||
* @param string $replacementChar (optional) Replacement character for all non-latin characters and uppercase
|
||||
* letters, if 2nd argument is set to true
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function toLatin($string, $lowerCaseHuman = true, $replacementChar = '-')
|
||||
@@ -366,7 +377,7 @@ class Miscellaneous
|
||||
* Oops, cannot instantiate converter
|
||||
* Nothing to do
|
||||
*/
|
||||
if (null === $converter) {
|
||||
if ($converter === null) {
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -395,11 +406,12 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns unique string
|
||||
* Returns unique string.
|
||||
*
|
||||
* @param string $prefix (optional) Prefix of the unique string. May be used while generating the unique
|
||||
* string simultaneously on several hosts at the same microsecond.
|
||||
* @param bool $hashed (optional) If is set to true, the unique string is hashed additionally. Otherwise - not.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getUniqueString($prefix = '', $hashed = false)
|
||||
@@ -423,6 +435,7 @@ class Miscellaneous
|
||||
* @param string|array $replacement The string or an array of strings to replace. It may be: string or an array
|
||||
* of strings.
|
||||
* @param bool $quoteStrings (optional) If is set to true, strings are surrounded with single quote sign
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* Example:
|
||||
@@ -461,7 +474,7 @@ class Miscellaneous
|
||||
* Value to find is neither a string nor an array OR it's an empty string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if ((!$searchIsString && !$searchIsArray) || ($searchIsString && 0 == strlen($search))) {
|
||||
if ((!$searchIsString && !$searchIsArray) || ($searchIsString && strlen($search) == 0)) {
|
||||
return $effect;
|
||||
}
|
||||
|
||||
@@ -476,7 +489,7 @@ class Miscellaneous
|
||||
*/
|
||||
if ($searchIsString && $replacementIsString) {
|
||||
if ($quoteStrings) {
|
||||
$replacement = '\'' . $replacement . '\'';
|
||||
$replacement = '\''.$replacement.'\'';
|
||||
}
|
||||
|
||||
$effect = str_replace($search, $replacement, $subject);
|
||||
@@ -488,7 +501,7 @@ class Miscellaneous
|
||||
*/
|
||||
if ($effect == $subject && ($bothAreStrings || $bothAreArrays)) {
|
||||
if ($quoteStrings && $replacementIsString) {
|
||||
$replacement = '\'' . $replacement . '\'';
|
||||
$replacement = '\''.$replacement.'\'';
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -530,7 +543,7 @@ class Miscellaneous
|
||||
if ($quoteStrings) {
|
||||
foreach ($replacement as &$item) {
|
||||
if (is_string($item)) {
|
||||
$item = '\'' . $item . '\'';
|
||||
$item = '\''.$item.'\'';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -550,6 +563,7 @@ class Miscellaneous
|
||||
|
||||
if ($subjectIsArray) {
|
||||
$effect[] = $subEffect;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -561,11 +575,12 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns new file name after adding prefix or suffix (or both of them) to the name
|
||||
* Returns new file name after adding prefix or suffix (or both of them) to the name.
|
||||
*
|
||||
* @param string $fileName The file name
|
||||
* @param string $prefix File name prefix
|
||||
* @param string $suffix File name suffix
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getNewFileName($fileName, $prefix, $suffix)
|
||||
@@ -583,7 +598,7 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns operating system name PHP is running on
|
||||
* Returns operating system name PHP is running on.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -593,11 +608,12 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns part of string preserving words
|
||||
* Returns part of string preserving words.
|
||||
*
|
||||
* @param string $text The string / text
|
||||
* @param int $maxLength Maximum length of given string
|
||||
* @param string $suffix (optional) The suffix to add at the end of string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function substringToWord($text, $maxLength, $suffix = '...')
|
||||
@@ -613,7 +629,7 @@ class Miscellaneous
|
||||
$effect = mb_substr($text, 0, $maxLength, 'utf-8');
|
||||
$lastSpacePosition = mb_strrpos($effect, ' ', 'utf-8');
|
||||
|
||||
if (false !== $lastSpacePosition) {
|
||||
if ($lastSpacePosition !== false) {
|
||||
$effect = mb_substr($effect, 0, $lastSpacePosition, 'utf-8');
|
||||
}
|
||||
|
||||
@@ -624,13 +640,14 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Breaks long text
|
||||
* Breaks long text.
|
||||
*
|
||||
* @param string $text The text to check and break
|
||||
* @param int $perLine (optional) Characters count per line. Default: 100.
|
||||
* @param string $separator (optional) Separator that is placed between lines. Default: "<br>".
|
||||
* @param string $encoding (optional) Character encoding. Used by mb_substr(). Default: "UTF-8".
|
||||
* @param int $proportionalAberration (optional) Proportional aberration for chars (percent value). Default: 20.
|
||||
* @param int $perLine (optional) Characters count per line
|
||||
* @param string $separator (optional) Separator that is placed beetwen lines
|
||||
* @param string $encoding (optional) Character encoding. Used by mb_substr().
|
||||
* @param int $proportionalAberration (optional) Proportional aberration for chars (percent value)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function breakLongText(
|
||||
@@ -717,40 +734,30 @@ class Miscellaneous
|
||||
*
|
||||
* @param string $directoryPath Directory path
|
||||
* @param bool $contentOnly (optional) If is set to true, only content of the directory is removed, not
|
||||
* directory itself. Otherwise - directory is removed too (default behaviour).
|
||||
* @return bool|null
|
||||
* directory. Otherwise - directory is removed too.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function removeDirectory($directoryPath, $contentOnly = false)
|
||||
{
|
||||
/*
|
||||
* Directory does not exist?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!file_exists($directoryPath)) {
|
||||
return null;
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's not a directory?
|
||||
* Let's treat it like file
|
||||
*/
|
||||
if (!is_dir($directoryPath)) {
|
||||
return unlink($directoryPath);
|
||||
}
|
||||
|
||||
foreach (scandir($directoryPath) as $item) {
|
||||
if ('.' == $item || '..' == $item) {
|
||||
if ($item == '.' || $item == '..') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!self::removeDirectory($directoryPath . DIRECTORY_SEPARATOR . $item)) {
|
||||
if (!self::removeDirectory($directoryPath.DIRECTORY_SEPARATOR.$item)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Directory should be removed too?
|
||||
*/
|
||||
if (!$contentOnly) {
|
||||
return rmdir($directoryPath);
|
||||
}
|
||||
@@ -759,21 +766,23 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if value is decimal
|
||||
* Returns information if value is decimal.
|
||||
*
|
||||
* @param mixed $value The value to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isDecimal($value)
|
||||
{
|
||||
return is_scalar($value) && floor($value) !== (float)$value;
|
||||
return is_scalar($value) && floor($value) !== (float) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string in camel case
|
||||
* Returns the string in camel case.
|
||||
*
|
||||
* @param string $string The string to convert e.g. this-is-eXamplE (return: thisIsExample)
|
||||
* @param string $separator (optional) Separator used to find parts of the string, e.g. '-' or ','
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getCamelCase($string, $separator = ' ')
|
||||
@@ -788,7 +797,7 @@ class Miscellaneous
|
||||
foreach ($members as $key => $value) {
|
||||
$value = mb_strtolower($value);
|
||||
|
||||
if (0 == $key) {
|
||||
if ($key == 0) {
|
||||
$effect .= self::lowercaseFirst($value);
|
||||
} else {
|
||||
$effect .= self::uppercaseFirst($value);
|
||||
@@ -799,10 +808,11 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a string's first character lowercase
|
||||
* Make a string's first character lowercase.
|
||||
*
|
||||
* @param string $text The text to get first character lowercase
|
||||
* @param bool|null $restLowercase (optional) Information that to do with rest of given string
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* Values of the $restLowercase argument:
|
||||
@@ -824,7 +834,7 @@ class Miscellaneous
|
||||
|
||||
if ($restLowercase) {
|
||||
$effect = mb_strtolower($effect);
|
||||
} elseif (false === $restLowercase) {
|
||||
} elseif ($restLowercase === false) {
|
||||
$effect = mb_strtoupper($effect);
|
||||
}
|
||||
|
||||
@@ -834,17 +844,18 @@ class Miscellaneous
|
||||
$first = mb_strtolower($effect[0]);
|
||||
$rest = mb_substr($effect, 1);
|
||||
|
||||
$effect = $first . $rest;
|
||||
$effect = $first.$rest;
|
||||
}
|
||||
|
||||
return $effect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a string's first character uppercase
|
||||
* Make a string's first character uppercase.
|
||||
*
|
||||
* @param string $text The text to get uppercase
|
||||
* @param bool|null $restLowercase (optional) Information that to do with rest of given string
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* Values of the $restLowercase argument:
|
||||
@@ -862,7 +873,7 @@ class Miscellaneous
|
||||
|
||||
if ($restLowercase) {
|
||||
$effect = mb_strtolower($effect);
|
||||
} elseif (false === $restLowercase) {
|
||||
} elseif ($restLowercase === false) {
|
||||
$effect = mb_strtoupper($effect);
|
||||
}
|
||||
|
||||
@@ -872,17 +883,18 @@ class Miscellaneous
|
||||
$first = mb_strtoupper($effect[0]);
|
||||
$rest = mb_substr($effect, 1);
|
||||
|
||||
$effect = $first . $rest;
|
||||
$effect = $first.$rest;
|
||||
}
|
||||
|
||||
return $effect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Quotes given value with apostrophes or quotation marks
|
||||
* Quotes given value with apostrophes or quotation marks.
|
||||
*
|
||||
* @param mixed $value The value to quote
|
||||
* @param bool $useApostrophe (optional) If is set to true, apostrophes are used. Otherwise - quotation marks.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function quoteValue($value, $useApostrophe = true)
|
||||
@@ -901,9 +913,10 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns size (of file or directory) in human readable format
|
||||
* Returns size (of file or directory) in human readable format.
|
||||
*
|
||||
* @param int $sizeInBytes The size in bytes
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getHumanReadableSize($sizeInBytes)
|
||||
@@ -919,7 +932,7 @@ class Miscellaneous
|
||||
$index = floor(log($sizeInBytes, 1024));
|
||||
|
||||
$size = round($sizeInBytes / pow(1024, $index), 2);
|
||||
$unit = $units[(int)$index];
|
||||
$unit = $units[(int) $index];
|
||||
|
||||
return sprintf('%s %s', $size, $unit);
|
||||
}
|
||||
@@ -930,6 +943,7 @@ class Miscellaneous
|
||||
*
|
||||
* @param string $string The string to check
|
||||
* @param string $separator The separator which divides elements of string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getStringWithoutLastElement($string, $separator)
|
||||
@@ -943,10 +957,11 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns elements of given string divided by given separator
|
||||
* Returns elements of given string divided by given separator.
|
||||
*
|
||||
* @param string $string The string to check
|
||||
* @param string $separator The separator which divides elements of string
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getStringElements($string, $separator)
|
||||
@@ -963,10 +978,11 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last element of given string divided by given separator
|
||||
* Returns the last element of given string divided by given separator.
|
||||
*
|
||||
* @param string $string The string to check
|
||||
* @param string $separator The separator which divides elements of string
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getLastElementOfString($string, $separator)
|
||||
@@ -991,6 +1007,7 @@ class Miscellaneous
|
||||
* If the string is empty, contains only spaces, e.g. " ", nothing is done and the original string is returned.
|
||||
*
|
||||
* @param string $string The string to trim
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function trimSmart($string)
|
||||
@@ -1005,7 +1022,7 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns concatenated given paths
|
||||
* Returns concatenated given paths.
|
||||
*
|
||||
* The paths may be passed as:
|
||||
* - an array of paths / strings
|
||||
@@ -1017,6 +1034,7 @@ class Miscellaneous
|
||||
*
|
||||
* @param string|array $paths Paths co concatenate. As described above: an array of paths / strings or strings
|
||||
* passed as following arguments.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function concatenatePaths($paths)
|
||||
@@ -1044,8 +1062,6 @@ class Miscellaneous
|
||||
$separator = DIRECTORY_SEPARATOR;
|
||||
|
||||
foreach ($paths as $path) {
|
||||
$path = trim($path);
|
||||
|
||||
/*
|
||||
* Empty paths are useless
|
||||
*/
|
||||
@@ -1081,6 +1097,7 @@ class Miscellaneous
|
||||
*/
|
||||
if ($firstWindowsBased && empty($concatenated)) {
|
||||
$concatenated = $path;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1094,11 +1111,12 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the starting / beginning directory's separator
|
||||
* Removes the starting / beginning directory's separator.
|
||||
*
|
||||
* @param string $text Text that may contain a directory's separator at the start / beginning
|
||||
* @param string $separator (optional) The directory's separator, e.g. "/". If is empty (not provided), separator
|
||||
* provided by operating system will be used.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function removeStartingDirectorySeparator($text, $separator = '')
|
||||
@@ -1125,11 +1143,12 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the ending directory's separator
|
||||
* Removes the ending directory's separator.
|
||||
*
|
||||
* @param string $text Text that may contain a directory's separator at the end
|
||||
* @param string $separator (optional) The directory's separator, e.g. "/". If is empty (not provided), system's
|
||||
* separator is used.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function removeEndingDirectorySeparator($text, $separator = '')
|
||||
@@ -1156,43 +1175,49 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns safely value of global variable, found in one of the global arrays / variables, e.g. $_GET
|
||||
* Returns safely value of global variable, found in one of the global arrays / variables, e.g. $_GET.
|
||||
*
|
||||
* @param int $globalSourceType Represents the global array / variable. One of constants: INPUT_GET, INPUT_POST,
|
||||
* INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV.
|
||||
* @param string $variableName Name of the variable to return value
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getSafelyGlobalVariable($globalSourceType, $variableName)
|
||||
{
|
||||
$value = filter_input($globalSourceType, $variableName);
|
||||
|
||||
if (null === $value) {
|
||||
if ($value === null) {
|
||||
$globalSource = null;
|
||||
|
||||
switch ($globalSourceType) {
|
||||
case INPUT_GET:
|
||||
$globalSource = $_GET;
|
||||
|
||||
break;
|
||||
|
||||
case INPUT_POST:
|
||||
$globalSource = $_POST;
|
||||
|
||||
break;
|
||||
|
||||
case INPUT_COOKIE:
|
||||
$globalSource = $_COOKIE;
|
||||
|
||||
break;
|
||||
|
||||
case INPUT_SERVER:
|
||||
$globalSource = $_SERVER;
|
||||
|
||||
break;
|
||||
|
||||
case INPUT_ENV:
|
||||
$globalSource = $_ENV;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (null !== $globalSource && isset($globalSource[$variableName])) {
|
||||
if ($globalSource !== null && isset($globalSource[$variableName])) {
|
||||
$value = $globalSource[$variableName];
|
||||
|
||||
if (!ini_get('magic_quotes_gpc')) {
|
||||
@@ -1205,7 +1230,147 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds missing the "0" characters to given number until given length is reached
|
||||
* Returns a CURL response with parsed HTTP headers as array with "headers", "cookies" and "content" keys.
|
||||
*
|
||||
* The headers and cookies are parsed and returned as an array, and an array of Cookie objects. Returned array looks
|
||||
* like this example:
|
||||
* <code>
|
||||
* [
|
||||
* 'headers' => [
|
||||
* 'Content-Type' => 'text/html; charset=UTF-8',
|
||||
* ...
|
||||
* ],
|
||||
* 'cookies' => [
|
||||
* new Symfony\Component\HttpFoundation\Cookie(),
|
||||
* new Symfony\Component\HttpFoundation\Cookie(),
|
||||
* ...
|
||||
* ],
|
||||
* 'content' => '<html>...</html>'
|
||||
* ]
|
||||
* </code>
|
||||
*
|
||||
* If you want to attach HTTP headers into response content by CURL you need to set "CURLOPT_HEADER" option
|
||||
* to "true". To read exact length of HTTP headers from CURL you can use "curl_getinfo()" function
|
||||
* and read "CURLINFO_HEADER_SIZE" option.
|
||||
*
|
||||
* @param string $response the full content of response, including HTTP headers
|
||||
* @param int $headerSize The length of HTTP headers in content
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getCurlResponseWithHeaders($response, $headerSize)
|
||||
{
|
||||
$headerContent = mb_substr($response, 0, $headerSize);
|
||||
$content = mb_substr($response, $headerSize);
|
||||
$headers = [];
|
||||
$cookies = [];
|
||||
|
||||
/*
|
||||
* Let's transform headers content into two arrays: headers and cookies
|
||||
*/
|
||||
foreach (explode("\r\n", $headerContent) as $i => $line) {
|
||||
/*
|
||||
* First line is only HTTP status and is unneeded so skip it
|
||||
*/
|
||||
if ($i === 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Regex::contains($line, ':')) {
|
||||
list($key, $value) = explode(': ', $line);
|
||||
|
||||
/*
|
||||
* If the header is a "set-cookie" let's save it to "cookies" array
|
||||
*/
|
||||
if ($key === 'Set-Cookie') {
|
||||
$cookieParameters = explode(';', $value);
|
||||
|
||||
$name = '';
|
||||
$value = '';
|
||||
$expire = 0;
|
||||
$path = '/';
|
||||
$domain = null;
|
||||
$secure = false;
|
||||
$httpOnly = true;
|
||||
|
||||
foreach ($cookieParameters as $j => $parameter) {
|
||||
$param = explode('=', $parameter);
|
||||
|
||||
/*
|
||||
* First parameter will be always a cookie name and it's value. It is not needed to run
|
||||
* further actions for them, so save the values and move to next parameter.
|
||||
*/
|
||||
if ($j === 0) {
|
||||
$name = trim($param[0]);
|
||||
$value = trim($param[1]);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now there would be the rest of cookie parameters, names of params are sent different way so
|
||||
* I need to lowercase the names and remove unneeded spaces.
|
||||
*/
|
||||
$paramName = mb_strtolower(trim($param[0]));
|
||||
$paramValue = true;
|
||||
|
||||
/*
|
||||
* Some parameters don't have value e.g. "secure", but the value for them if they're specified
|
||||
* is "true". Otherwise - just read a value for parameter if exists.
|
||||
*/
|
||||
if (array_key_exists(1, $param)) {
|
||||
$paramValue = trim($param[1]);
|
||||
}
|
||||
|
||||
switch ($paramName) {
|
||||
case 'expires':
|
||||
$expire = $paramValue;
|
||||
|
||||
break;
|
||||
case 'path':
|
||||
$path = $paramValue;
|
||||
|
||||
break;
|
||||
case 'domain':
|
||||
$domain = $paramValue;
|
||||
|
||||
break;
|
||||
case 'secure':
|
||||
$secure = $paramValue;
|
||||
|
||||
break;
|
||||
case 'httponly':
|
||||
$httpOnly = $paramValue;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Create new Cookie object and add it to "cookies" array.
|
||||
* I must skip to next header as cookies shouldn't be saved in "headers" array.
|
||||
*/
|
||||
$cookies[] = new Cookie($name, $value, $expire, $path, $domain, $secure, $httpOnly);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Save response header which is not a cookie
|
||||
*/
|
||||
$headers[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'headers' => $headers,
|
||||
'cookies' => $cookies,
|
||||
'content' => $content,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds missing the "0" characters to given number until given length is reached.
|
||||
*
|
||||
* Example:
|
||||
* - number: 201
|
||||
@@ -1218,6 +1383,7 @@ class Miscellaneous
|
||||
* @param mixed $number Number for who the "0" characters should be inserted
|
||||
* @param int $length Wanted length of final number
|
||||
* @param bool $before (optional) If false, 0 characters will be inserted after given number
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function fillMissingZeros($number, $length, $before = true)
|
||||
@@ -1239,22 +1405,24 @@ class Miscellaneous
|
||||
|
||||
for ($i = ($length - $textLength); 0 < $i; --$i) {
|
||||
if ($before) {
|
||||
$text = '0' . $text;
|
||||
$text = '0'.$text;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$text = $text . '0';
|
||||
$text = $text.'0';
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given value is located in interval between given utmost left and right values
|
||||
* Returns information if given value is located in interval between given utmost left and right values.
|
||||
*
|
||||
* @param int|float $value Value to verify
|
||||
* @param int|float $left Left utmost value of interval
|
||||
* @param int|float $right Right utmost value of interval
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isBetween($value, $left, $right)
|
||||
@@ -1267,6 +1435,7 @@ class Miscellaneous
|
||||
* If it's an object, full class name is returned.
|
||||
*
|
||||
* @param mixed $variable Variable who type should be returned
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getType($variable)
|
||||
@@ -1285,11 +1454,12 @@ class Miscellaneous
|
||||
* @param int $colorComponent Color's component to verify. Decimal value, e.g. 255.
|
||||
* @param bool $asHexadecimal (optional) If is set to true, hexadecimal value is returned (default behaviour).
|
||||
* Otherwise - decimal.
|
||||
*
|
||||
* @return int|string
|
||||
*/
|
||||
public static function getValidColorComponent($colorComponent, $asHexadecimal = true)
|
||||
{
|
||||
$colorComponent = (int)$colorComponent;
|
||||
$colorComponent = (int) $colorComponent;
|
||||
|
||||
if ($colorComponent < 0 || $colorComponent > 255) {
|
||||
$colorComponent = 0;
|
||||
@@ -1298,7 +1468,7 @@ class Miscellaneous
|
||||
if ($asHexadecimal) {
|
||||
$hexadecimal = dechex($colorComponent);
|
||||
|
||||
if (1 == strlen($hexadecimal)) {
|
||||
if (strlen($hexadecimal) == 1) {
|
||||
return sprintf('0%s', $hexadecimal, $hexadecimal);
|
||||
}
|
||||
|
||||
@@ -1309,11 +1479,10 @@ class Miscellaneous
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns inverted value of color for given color
|
||||
* Returns inverted value of color for given color.
|
||||
*
|
||||
* @param string $color Hexadecimal value of color to invert (with or without hash), e.g. "dd244c" or "#22a5fe"
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getInvertedColor($color)
|
||||
@@ -1355,37 +1524,4 @@ class Miscellaneous
|
||||
|
||||
return $invertedColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns project's root path.
|
||||
* Looks for directory that contains composer.json.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getProjectRootPath()
|
||||
{
|
||||
$projectRootPath = '';
|
||||
|
||||
$fileName = 'composer.json';
|
||||
$directoryPath = __DIR__;
|
||||
|
||||
/*
|
||||
* Path of directory it's not the path of last directory?
|
||||
*/
|
||||
while (DIRECTORY_SEPARATOR !== $directoryPath) {
|
||||
$filePath = static::concatenatePaths($directoryPath, $fileName);
|
||||
|
||||
/*
|
||||
* Is here file we are looking for?
|
||||
* Maybe it's a project's root path
|
||||
*/
|
||||
if (file_exists($filePath)) {
|
||||
$projectRootPath = $directoryPath;
|
||||
}
|
||||
|
||||
$directoryPath = dirname($directoryPath);
|
||||
}
|
||||
|
||||
return $projectRootPath;
|
||||
}
|
||||
}
|
||||
@@ -10,16 +10,15 @@ namespace Meritoo\Common\Utilities;
|
||||
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\ORM\EntityManager;
|
||||
use Doctrine\ORM\OptimisticLockException;
|
||||
use Doctrine\ORM\Query\Expr\Join;
|
||||
use Doctrine\ORM\Query\Parameter;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
|
||||
/**
|
||||
* Useful methods for query builder (the Doctrine's QueryBuilder class)
|
||||
* Useful methods for query builder (the Doctrine's QueryBuilder class).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class QueryBuilderUtility
|
||||
{
|
||||
@@ -28,16 +27,13 @@ class QueryBuilderUtility
|
||||
* If null is returned, alias was not found.
|
||||
*
|
||||
* @param QueryBuilder $queryBuilder The query builder to retrieve root alias
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public static function getRootAlias(QueryBuilder $queryBuilder)
|
||||
{
|
||||
$aliases = $queryBuilder->getRootAliases();
|
||||
|
||||
/*
|
||||
* No aliases?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($aliases)) {
|
||||
return null;
|
||||
}
|
||||
@@ -47,22 +43,18 @@ class QueryBuilderUtility
|
||||
|
||||
/**
|
||||
* Returns alias of given property joined in given query builder
|
||||
*
|
||||
* If there are no joins or the join does not exist, null is returned.
|
||||
* If the join does not exist, null is returned.
|
||||
* It's also information if given property is already joined in given query builder.
|
||||
*
|
||||
* @param QueryBuilder $queryBuilder The query builder to verify
|
||||
* @param string $property Name of property that maybe is joined
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public static function getJoinedPropertyAlias(QueryBuilder $queryBuilder, $property)
|
||||
{
|
||||
$joins = $queryBuilder->getDQLPart('join');
|
||||
|
||||
/*
|
||||
* No joins?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($joins)) {
|
||||
return null;
|
||||
}
|
||||
@@ -85,13 +77,14 @@ class QueryBuilderUtility
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the WHERE criteria in given query builder
|
||||
* Sets the WHERE criteria in given query builder.
|
||||
*
|
||||
* @param QueryBuilder $queryBuilder The query builder
|
||||
* @param array $criteria (optional) The criteria used in WHERE clause. It may simple array with pairs
|
||||
* key-value or an array of arrays where second element of sub-array is the
|
||||
* comparison operator. Example below.
|
||||
* @param string $alias (optional) Alias used in the query
|
||||
*
|
||||
* @return QueryBuilder
|
||||
*
|
||||
* Example of the $criteria argument:
|
||||
@@ -109,62 +102,52 @@ class QueryBuilderUtility
|
||||
*/
|
||||
public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = '')
|
||||
{
|
||||
/*
|
||||
* No criteria used in WHERE clause?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($criteria)) {
|
||||
return $queryBuilder;
|
||||
}
|
||||
if (!empty($criteria)) {
|
||||
if (empty($alias)) {
|
||||
$alias = self::getRootAlias($queryBuilder);
|
||||
}
|
||||
|
||||
/*
|
||||
* No alias provided?
|
||||
* Let's use root alias
|
||||
*/
|
||||
if (empty($alias)) {
|
||||
$alias = self::getRootAlias($queryBuilder);
|
||||
}
|
||||
foreach ($criteria as $column => $value) {
|
||||
$compareOperator = '=';
|
||||
|
||||
foreach ($criteria as $column => $value) {
|
||||
$compareOperator = '=';
|
||||
if (is_array($value) && !empty($value)) {
|
||||
if (count($value) == 2) {
|
||||
$compareOperator = $value[1];
|
||||
}
|
||||
|
||||
if (is_array($value) && !empty($value)) {
|
||||
if (2 == count($value)) {
|
||||
$compareOperator = $value[1];
|
||||
$value = $value[0];
|
||||
}
|
||||
|
||||
$value = $value[0];
|
||||
$predicate = sprintf('%s.%s %s :%s', $alias, $column, $compareOperator, $column);
|
||||
|
||||
if ($value === null) {
|
||||
$predicate = $queryBuilder->expr()->isNull(sprintf('%s.%s', $alias, $column));
|
||||
unset($criteria[$column]);
|
||||
} else {
|
||||
$queryBuilder->setParameter($column, $value);
|
||||
}
|
||||
|
||||
$queryBuilder = $queryBuilder->andWhere($predicate);
|
||||
}
|
||||
|
||||
$predicate = sprintf('%s.%s %s :%s', $alias, $column, $compareOperator, $column);
|
||||
|
||||
if (null === $value) {
|
||||
$predicate = $queryBuilder->expr()->isNull(sprintf('%s.%s', $alias, $column));
|
||||
unset($criteria[$column]);
|
||||
} else {
|
||||
$queryBuilder->setParameter($column, $value);
|
||||
}
|
||||
|
||||
$queryBuilder = $queryBuilder->andWhere($predicate);
|
||||
}
|
||||
|
||||
return $queryBuilder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes given entities
|
||||
* Deletes given entities.
|
||||
*
|
||||
* @param EntityManager $entityManager The entity manager
|
||||
* @param array|ArrayCollection $entities The entities to delete
|
||||
* @param bool $flushDeleted (optional) If is set to true, flushes the deleted objects (default
|
||||
* behaviour). Otherwise - not.
|
||||
* @throws OptimisticLockException
|
||||
* @param bool $flushDeleted (optional) If is set to true, flushes the deleted objects.
|
||||
* Otherwise - not.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function deleteEntities(EntityManager $entityManager, $entities, $flushDeleted = true)
|
||||
{
|
||||
/*
|
||||
* No entities provided?
|
||||
* No entities found?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($entities)) {
|
||||
@@ -190,30 +173,25 @@ class QueryBuilderUtility
|
||||
* Attention. Existing parameters will be overridden.
|
||||
*
|
||||
* @param QueryBuilder $queryBuilder The query builder
|
||||
* @param array|ArrayCollection $parameters Parameters to add. Collection of Doctrine\ORM\Query\Parameter
|
||||
* instances or an array with key-value pairs.
|
||||
* @param array|ArrayCollection $parameters Parameters to add. Collection of instances of
|
||||
* Doctrine\ORM\Query\Parameter class or an array with key-value pairs.
|
||||
*
|
||||
* @return QueryBuilder
|
||||
*/
|
||||
public static function addParameters(QueryBuilder $queryBuilder, $parameters)
|
||||
{
|
||||
/*
|
||||
* No parameters?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($parameters)) {
|
||||
return $queryBuilder;
|
||||
}
|
||||
if (!empty($parameters)) {
|
||||
foreach ($parameters as $key => $parameter) {
|
||||
$name = $key;
|
||||
$value = $parameter;
|
||||
|
||||
foreach ($parameters as $key => $parameter) {
|
||||
$name = $key;
|
||||
$value = $parameter;
|
||||
if ($parameter instanceof Parameter) {
|
||||
$name = $parameter->getName();
|
||||
$value = $parameter->getValue();
|
||||
}
|
||||
|
||||
if ($parameter instanceof Parameter) {
|
||||
$name = $parameter->getName();
|
||||
$value = $parameter->getValue();
|
||||
$queryBuilder->setParameter($name, $value);
|
||||
}
|
||||
|
||||
$queryBuilder->setParameter($name, $value);
|
||||
}
|
||||
|
||||
return $queryBuilder;
|
||||
@@ -8,9 +8,9 @@
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\Common\Util\ClassUtils;
|
||||
use Doctrine\Common\Util\Inflector;
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
|
||||
use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
|
||||
use Meritoo\Common\Exception\Reflection\TooManyChildClassesException;
|
||||
@@ -21,20 +21,20 @@ use ReflectionObject;
|
||||
use ReflectionProperty;
|
||||
|
||||
/**
|
||||
* Useful reflection methods
|
||||
* Useful reflection methods.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Reflection
|
||||
{
|
||||
/**
|
||||
* Returns names of methods for given class / object
|
||||
* Returns names of methods for given class / object.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param bool $withoutInheritance (optional) If is set to true, only methods for given class are returned.
|
||||
* Otherwise - all methods, with inherited methods too.
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getMethods($class, $withoutInheritance = false)
|
||||
@@ -62,10 +62,10 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns constants of given class / object
|
||||
* Returns constants of given class / object.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getConstants($class)
|
||||
@@ -76,11 +76,11 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns maximum integer value of constant of given class / object.
|
||||
* Constants whose values are integers are considered only.
|
||||
* Returns maximum constant from all constants of given class / object.
|
||||
* Values of constants should be integers.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return int|null
|
||||
*/
|
||||
public static function getMaxNumberConstant($class)
|
||||
@@ -103,11 +103,11 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given class / object has given method
|
||||
* Returns information if given class / object has given method.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param string $method Name of the method to find
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasMethod($class, $method)
|
||||
@@ -118,11 +118,11 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given class / object has given property
|
||||
* Returns information if given class / object has given property.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param string $property Name of the property to find
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasProperty($class, $property)
|
||||
@@ -133,11 +133,11 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given class / object has given constant
|
||||
* Returns information if given class / object has given constant.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param string $constant Name of the constant to find
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasConstant($class, $constant)
|
||||
@@ -148,11 +148,11 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns value of given constant
|
||||
* Returns value of given constant.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param string $constant Name of the constant that contains a value
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getConstantValue($class, $constant)
|
||||
@@ -175,7 +175,7 @@ class Reflection
|
||||
* dot-separated, e.g. "invoice.user.email".
|
||||
* @param bool $force (optional) If is set to true, try to retrieve value even if the object doesn't have
|
||||
* property. Otherwise - not.
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getPropertyValue($object, $property, $force = false)
|
||||
@@ -206,10 +206,10 @@ class Reflection
|
||||
* while using "project.name" as property - $project has $name property ($project exists in the Deal class)
|
||||
* and the $project equals null
|
||||
*
|
||||
* Meritoo <github@meritoo.pl>
|
||||
* Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* 2016-11-07
|
||||
*/
|
||||
if (null !== $object) {
|
||||
if ($object !== null) {
|
||||
unset($exploded[0]);
|
||||
|
||||
$property = implode('.', $exploded);
|
||||
@@ -237,45 +237,33 @@ class Reflection
|
||||
if ($class->hasProperty($property) || $force) {
|
||||
$property = Inflector::classify($property);
|
||||
|
||||
$getterPrefixes = [
|
||||
$methodPrefixes = [
|
||||
'get',
|
||||
'has',
|
||||
'is',
|
||||
];
|
||||
|
||||
foreach ($getterPrefixes as $prefix) {
|
||||
$getterName = sprintf('%s%s', $prefix, $property);
|
||||
foreach ($methodPrefixes as $prefix) {
|
||||
$method = sprintf('%s%s', $prefix, $property);
|
||||
|
||||
if ($class->hasMethod($getterName)) {
|
||||
$method = new ReflectionMethod($object, $getterName);
|
||||
|
||||
/*
|
||||
* Getter is not accessible publicly?
|
||||
* I have to skip it, to avoid an error like this:
|
||||
*
|
||||
* Call to protected method My\ExtraClass::getExtraProperty() from context 'My\ExtraClass'
|
||||
*/
|
||||
if ($method->isProtected() || $method->isPrivate()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$value = $object->{$getterName}();
|
||||
if ($class->hasMethod($method)) {
|
||||
$value = $object->{$method}();
|
||||
$valueFound = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$valueFound && null !== $reflectionProperty) {
|
||||
if (!$valueFound && $reflectionProperty !== null) {
|
||||
/*
|
||||
* Oops, value of the property is still unknown
|
||||
* Oops, we have got exception.
|
||||
*
|
||||
* 3rd try:
|
||||
* Let's modify accessibility of the property and try again to get value
|
||||
* Let's try modify accessibility of the property and try again to get value.
|
||||
*/
|
||||
$reflectionProperty->setAccessible(true);
|
||||
$value = $reflectionProperty->getValue($object);
|
||||
$reflectionProperty->setAccessible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -292,19 +280,11 @@ class Reflection
|
||||
* @param string $property Name of the property that contains a value
|
||||
* @param bool $force (optional) If is set to true, try to retrieve value even if the
|
||||
* object does not have property. Otherwise - not.
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getPropertyValues($objects, $property, $force = false)
|
||||
{
|
||||
/*
|
||||
* No objects?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($objects)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if ($objects instanceof Collection) {
|
||||
$objects = $objects->toArray();
|
||||
}
|
||||
@@ -315,7 +295,7 @@ class Reflection
|
||||
foreach ($objects as $entity) {
|
||||
$value = self::getPropertyValue($entity, $property, $force);
|
||||
|
||||
if (null !== $value) {
|
||||
if ($value !== null) {
|
||||
$values[] = $value;
|
||||
}
|
||||
}
|
||||
@@ -324,11 +304,12 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a class name for given source
|
||||
* Returns a class name for given source.
|
||||
*
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
* @param bool $withoutNamespace (optional) If is set to true, namespace is omitted. Otherwise -
|
||||
* not, full name of class is returned, with namespace.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getClassName($source, $withoutNamespace = false)
|
||||
@@ -375,7 +356,7 @@ class Reflection
|
||||
if ($withoutNamespace) {
|
||||
$classOnly = Miscellaneous::getLastElementOfString($name, '\\');
|
||||
|
||||
if (null !== $classOnly) {
|
||||
if ($classOnly !== null) {
|
||||
$name = $classOnly;
|
||||
}
|
||||
|
||||
@@ -386,9 +367,10 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns namespace of class for given source
|
||||
* Returns namespace of class for given source.
|
||||
*
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getClassNamespace($source)
|
||||
@@ -409,10 +391,11 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given interface is implemented by given class / object
|
||||
* Returns information if given interface is implemented by given class / object.
|
||||
*
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
* @param string $interface The interface that should be implemented
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isInterfaceImplemented($source, $interface)
|
||||
@@ -424,10 +407,11 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given child class is a subclass of given parent class
|
||||
* Returns information if given child class is a subclass of given parent class.
|
||||
*
|
||||
* @param array|object|string $childClass The child class. An array of objects, namespaces, object or namespace.
|
||||
* @param array|object|string $parentClass The parent class. An array of objects, namespaces, object or namespace.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isChildOfClass($childClass, $parentClass)
|
||||
@@ -437,7 +421,7 @@ class Reflection
|
||||
|
||||
$parents = class_parents($childClassName);
|
||||
|
||||
if (is_array($parents) && 0 < count($parents)) {
|
||||
if (is_array($parents)) {
|
||||
return in_array($parentClassName, $parents);
|
||||
}
|
||||
|
||||
@@ -445,49 +429,35 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns given object properties
|
||||
* Returns given object properties.
|
||||
*
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class constants.
|
||||
* By default all properties are returned.
|
||||
*
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class
|
||||
* constants. By default all properties are returned.
|
||||
* @param bool $includeParents (optional) If is set to true, properties of parent classes are
|
||||
* included (recursively). Otherwise - not.
|
||||
* @throws ReflectionException
|
||||
* @return array|ReflectionProperty
|
||||
*/
|
||||
public static function getProperties($source, $filter = null, $includeParents = false)
|
||||
public static function getProperties($source, $filter = null)
|
||||
{
|
||||
$className = self::getClassName($source);
|
||||
$reflection = new ReflectionClass($className);
|
||||
|
||||
if (null === $filter) {
|
||||
if ($filter === null) {
|
||||
$filter = ReflectionProperty::IS_PRIVATE
|
||||
+ ReflectionProperty::IS_PROTECTED
|
||||
+ ReflectionProperty::IS_PUBLIC
|
||||
+ ReflectionProperty::IS_STATIC;
|
||||
}
|
||||
|
||||
$properties = $reflection->getProperties($filter);
|
||||
$parentProperties = [];
|
||||
|
||||
if ($includeParents) {
|
||||
$parent = self::getParentClass($source);
|
||||
|
||||
if (false !== $parent) {
|
||||
$parentClass = $parent->getName();
|
||||
$parentProperties = self::getProperties($parentClass, $filter, $includeParents);
|
||||
}
|
||||
}
|
||||
|
||||
return array_merge($properties, $parentProperties);
|
||||
return $reflection->getProperties($filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a parent class or false if there is no parent class
|
||||
* Returns a parent class.
|
||||
*
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
* @throws ReflectionException
|
||||
* @return ReflectionClass|bool
|
||||
*
|
||||
* @return ReflectionClass
|
||||
*/
|
||||
public static function getParentClass($source)
|
||||
{
|
||||
@@ -503,8 +473,10 @@ class Reflection
|
||||
*
|
||||
* @param array|object|string $class Class who child classes should be returned. An array of objects, strings,
|
||||
* object or string.
|
||||
* @throws CannotResolveClassNameException
|
||||
*
|
||||
* @return array|null
|
||||
*
|
||||
* @throws CannotResolveClassNameException
|
||||
*/
|
||||
public static function getChildClasses($class)
|
||||
{
|
||||
@@ -523,8 +495,8 @@ class Reflection
|
||||
/*
|
||||
* Oops, cannot resolve class
|
||||
*/
|
||||
if (null === $className) {
|
||||
throw CannotResolveClassNameException::create($class);
|
||||
if ($className === null) {
|
||||
throw new CannotResolveClassNameException($class);
|
||||
}
|
||||
|
||||
$childClasses = [];
|
||||
@@ -558,9 +530,11 @@ class Reflection
|
||||
*
|
||||
* @param array|object|string $parentClass Class who child class should be returned. An array of objects,
|
||||
* namespaces, object or namespace.
|
||||
*
|
||||
* @return mixed
|
||||
*
|
||||
* @throws MissingChildClassesException
|
||||
* @throws TooManyChildClassesException
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getOneChildClass($parentClass)
|
||||
{
|
||||
@@ -571,7 +545,7 @@ class Reflection
|
||||
* Oops, the base / parent class hasn't child class
|
||||
*/
|
||||
if (empty($childClasses)) {
|
||||
throw MissingChildClassesException::create($parentClass);
|
||||
throw new MissingChildClassesException($parentClass);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -579,20 +553,20 @@ class Reflection
|
||||
* Oops, the base / parent class has too many child classes
|
||||
*/
|
||||
if (count($childClasses) > 1) {
|
||||
throw TooManyChildClassesException::create($parentClass, $childClasses);
|
||||
throw new TooManyChildClassesException($parentClass, $childClasses);
|
||||
}
|
||||
|
||||
return trim($childClasses[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns property, the ReflectionProperty instance, of given object
|
||||
* Returns property, the ReflectionProperty instance, of given object.
|
||||
*
|
||||
* @param array|object|string $class An array of objects, namespaces, object or namespace
|
||||
* @param string $property Name of the property
|
||||
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class constants.
|
||||
* By default all properties are allowed / processed.
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return null|ReflectionProperty
|
||||
*/
|
||||
public static function getProperty($class, $property, $filter = null)
|
||||
@@ -613,14 +587,16 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given class / object uses / implements given trait
|
||||
* Returns information if given class / object uses / implements given trait.
|
||||
*
|
||||
* @param array|object|string $class An array of objects, namespaces, object or namespace
|
||||
* @param array|string $trait An array of strings or string
|
||||
* @param bool $verifyParents If is set to true, parent classes are verified if they use given
|
||||
* trait. Otherwise - not.
|
||||
* @throws CannotResolveClassNameException
|
||||
*
|
||||
* @return bool|null
|
||||
*
|
||||
* @throws CannotResolveClassNameException
|
||||
*/
|
||||
public static function usesTrait($class, $trait, $verifyParents = false)
|
||||
{
|
||||
@@ -631,7 +607,7 @@ class Reflection
|
||||
* Oops, cannot resolve class
|
||||
*/
|
||||
if (empty($className)) {
|
||||
throw CannotResolveClassNameException::create($class);
|
||||
throw new CannotResolveClassNameException($class);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -649,7 +625,7 @@ class Reflection
|
||||
if (!$uses && $verifyParents) {
|
||||
$parentClassName = self::getParentClassName($className);
|
||||
|
||||
if (null !== $parentClassName) {
|
||||
if ($parentClassName !== null) {
|
||||
return self::usesTrait($parentClassName, $trait, true);
|
||||
}
|
||||
}
|
||||
@@ -662,7 +638,7 @@ class Reflection
|
||||
* If given class does not extend another, returns null.
|
||||
*
|
||||
* @param array|object|string $class An array of objects, namespaces, object or namespace
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getParentClassName($class)
|
||||
@@ -671,7 +647,7 @@ class Reflection
|
||||
$reflection = new ReflectionClass($className);
|
||||
$parentClass = $reflection->getParentClass();
|
||||
|
||||
if (null === $parentClass || false === $parentClass) {
|
||||
if ($parentClass === null || $parentClass === false) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -12,40 +12,38 @@ use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException;
|
||||
use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
|
||||
|
||||
/**
|
||||
* Useful regular expressions methods
|
||||
* Useful regular expressions methods.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Regex
|
||||
{
|
||||
/**
|
||||
* Patterns used to validate / verify values
|
||||
* Patterns used to validate / verify values.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $patterns = [
|
||||
'email' => '/^[\w-.]{2,}@[\w-]+\.[\w]{2,}+$/',
|
||||
'phone' => '/^\+?[0-9 ]+$/',
|
||||
'camelCasePart' => '/([a-z]|[A-Z]){1}[a-z]*/',
|
||||
'urlProtocol' => '/^([a-z]+:\/\/)',
|
||||
'urlDomain' => '([\da-z\.-]+)\.([a-z\.]{2,6})(\/)?([\w\.\-]*)?(\?)?([\w \.\-\/=&]*)\/?$/i',
|
||||
'letterOrDigit' => '/[a-zA-Z0-9]+/',
|
||||
'htmlEntity' => '/&[a-z0-9]+;/',
|
||||
'htmlAttribute' => '/([\w-]+)="([\w -]+)"/',
|
||||
'fileName' => '/.+\.\w+$/',
|
||||
'isQuoted' => '/^[\'"]{1}.+[\'"]{1}$/',
|
||||
'email' => '/[\w-]{2,}@[\w-]+\.[\w]{2,}+/',
|
||||
'phone' => '/^\+?[0-9 ]+$/',
|
||||
'camelCasePart' => '/([a-z]|[A-Z]){1}[a-z]*/',
|
||||
'urlProtocol' => '/^([a-z]+:\/\/)',
|
||||
'urlDomain' => '([\da-z\.-]+)\.([a-z\.]{2,6})(\/)?([\w\.\-]*)?(\?)?([\w \.\-\/=&]*)\/?$/i',
|
||||
'letterOrDigit' => '/[a-zA-Z0-9]+/',
|
||||
'htmlEntity' => '/&[a-z0-9]+;/',
|
||||
'fileName' => '/.+\.\w+$/',
|
||||
'isQuoted' => '/^[\'"]{1}.+[\'"]{1}$/',
|
||||
'windowsBasedPath' => '/^[A-Z]{1}:\\\.*$/',
|
||||
'money' => '/^[-+]?\d+([\.,]{1}\d*)?$/',
|
||||
'color' => '/^[a-f0-9]{6}$/i',
|
||||
'bundleName' => '/^(([A-Z]{1}[a-z0-9]+)((?2))*)(Bundle)$/',
|
||||
'binaryValue' => '/[^\x20-\x7E\t\r\n]/',
|
||||
'money' => '/^[-+]?\d+([\.,]{1}\d*)?$/',
|
||||
'color' => '/^[a-f0-9]{6}$/i',
|
||||
];
|
||||
|
||||
/**
|
||||
* Returns information if given e-mail address is valid
|
||||
* Returns information if given e-mail address is valid.
|
||||
*
|
||||
* @param string $email E-mail address to validate / verify
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* Examples:
|
||||
@@ -59,215 +57,158 @@ class Regex
|
||||
*/
|
||||
public static function isValidEmail($email)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($email)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getEmailPattern();
|
||||
|
||||
return (bool)preg_match($pattern, $email);
|
||||
return (bool) preg_match($pattern, $email);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given tax ID is valid (in Poland it's named "NIP")
|
||||
* Returns information if given tax ID (in polish: NIP) is valid.
|
||||
*
|
||||
* @param string $taxidString Tax ID (NIP) string
|
||||
*
|
||||
* @param string $taxIdString Tax ID (NIP) string
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidTaxId($taxIdString)
|
||||
public static function isValidTaxid($taxidString)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($taxIdString)) {
|
||||
return false;
|
||||
}
|
||||
if (!empty($taxidString)) {
|
||||
$weights = [
|
||||
6,
|
||||
5,
|
||||
7,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
];
|
||||
$taxid = preg_replace('/[\s-]/', '', $taxidString);
|
||||
$sum = 0;
|
||||
|
||||
/*
|
||||
* Empty/Unknown value?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($taxIdString)) {
|
||||
return false;
|
||||
}
|
||||
if (strlen($taxid) == 10 && is_numeric($taxid)) {
|
||||
for ($x = 0; $x <= 8; ++$x) {
|
||||
$sum += $taxid[$x] * $weights[$x];
|
||||
}
|
||||
|
||||
$taxId = preg_replace('/[\s-]/', '', $taxIdString);
|
||||
|
||||
/*
|
||||
* Tax ID is not 10 characters length OR is not numeric?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (10 !== strlen($taxId) || !is_numeric($taxId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$weights = [
|
||||
6,
|
||||
5,
|
||||
7,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
];
|
||||
|
||||
$sum = 0;
|
||||
|
||||
for ($x = 0; $x <= 8; ++$x) {
|
||||
$sum += $taxId[$x] * $weights[$x];
|
||||
}
|
||||
|
||||
/*
|
||||
* Last number it's not a remainder from dividing per 11?
|
||||
* Nothing to do
|
||||
*/
|
||||
if ($sum % 11 == $taxId[9]) {
|
||||
return true;
|
||||
if ((($sum % 11) % 10) == $taxid[9]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given url address is valid
|
||||
* Returns information if given url address is valid.
|
||||
*
|
||||
* @param string $url The url to validate / verify
|
||||
* @param bool $requireProtocol (optional) If is set to true, the protocol is required to be passed in the url.
|
||||
* Otherwise - not.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidUrl($url, $requireProtocol = false)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($url)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getUrlPattern($requireProtocol);
|
||||
|
||||
return (bool)preg_match($pattern, $url);
|
||||
return (bool) preg_match($pattern, $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given phone number is valid
|
||||
* Returns information if given phone number is valid.
|
||||
*
|
||||
* @param string $phoneNumber The phone number to validate / verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidPhoneNumber($phoneNumber)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($phoneNumber)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getPhoneNumberPattern();
|
||||
|
||||
return (bool)preg_match($pattern, trim($phoneNumber));
|
||||
return (bool) preg_match($pattern, $phoneNumber);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array values that match given pattern (or values that keys match the pattern)
|
||||
* Returns array values that matches given pattern (or values that keys matches).
|
||||
*
|
||||
* @param string $pattern Pattern to match
|
||||
* @param array $array The array (scalar values only)
|
||||
* @param bool $itsKeyPattern (optional) If is set to true, keys will be checked if they match pattern.
|
||||
* Otherwise - values will be checked (default behaviour).
|
||||
* @param array $dataArray The array
|
||||
* @param bool $itsKeyPattern (optional) If is set to true, keys are checks if they match pattern. Otherwise -
|
||||
* values are checks.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getArrayValuesByPattern($pattern, array $array, $itsKeyPattern = false)
|
||||
public static function getArrayValuesByPattern($pattern, $dataArray, $itsKeyPattern = false)
|
||||
{
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if ($itsKeyPattern) {
|
||||
$effect = [];
|
||||
|
||||
foreach ($array as $key => $value) {
|
||||
if ((bool)preg_match($pattern, $key)) {
|
||||
$effect[$key] = $value;
|
||||
if (!empty($dataArray)) {
|
||||
$matches = [];
|
||||
|
||||
foreach ($dataArray as $key => $value) {
|
||||
if (preg_match($pattern, $key, $matches)) {
|
||||
$effect[$key] = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $effect;
|
||||
}
|
||||
|
||||
return preg_grep($pattern, $array);
|
||||
return preg_grep($pattern, $dataArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters array by given expression and column
|
||||
* Filters array by given expression and column.
|
||||
*
|
||||
* Expression can be simple compare expression, like " == 2", or regular expression.
|
||||
* Expression can be simple compare expression, like ' == 2', or regular expression.
|
||||
* Returns filtered array.
|
||||
*
|
||||
* @param array $array The 2-dimensional array that should be filtered
|
||||
* @param array $array The array that should be filtered
|
||||
* @param string $arrayColumnKey Column name
|
||||
* @param string $filterExpression Simple filter expression (e.g. "== 2" or "!= \'home\'") or regular
|
||||
* expression (e.g. "/\d+/" or "/[a-z]+[,;]{2,}/")
|
||||
* @param bool $itsRegularExpression (optional) If is set to true, means that filter expression is a regular
|
||||
* expression. Otherwise - not (default behaviour).
|
||||
* @param string $filterExpression Filter expression, e.g. '== 2' or '!= \'home\''
|
||||
* @param bool $itsRegularExpression (optional) If is set to true, means that filter expression is a
|
||||
* regular expression
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function arrayFilter($array, $arrayColumnKey, $filterExpression, $itsRegularExpression = false)
|
||||
{
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return [];
|
||||
}
|
||||
$effect = [];
|
||||
|
||||
$effect = $array;
|
||||
if (!empty($array)) {
|
||||
$effect = $array;
|
||||
|
||||
foreach ($effect as $key => &$item) {
|
||||
if (!isset($item[$arrayColumnKey])) {
|
||||
continue;
|
||||
}
|
||||
foreach ($effect as $key => &$item) {
|
||||
if (isset($item[$arrayColumnKey])) {
|
||||
$value = $item[$arrayColumnKey];
|
||||
|
||||
$value = $item[$arrayColumnKey];
|
||||
if ($itsRegularExpression) {
|
||||
$matches = [];
|
||||
$pattern = '|'.$filterExpression.'|';
|
||||
$matchesCount = preg_match($pattern, $value, $matches);
|
||||
|
||||
if ($itsRegularExpression) {
|
||||
$matchesCount = preg_match($filterExpression, $value);
|
||||
$remove = 0 == $matchesCount;
|
||||
} else {
|
||||
if (is_string($value)) {
|
||||
$value = sprintf('\'%s\'', $value);
|
||||
} elseif (is_bool($value)) {
|
||||
if (true === $value) {
|
||||
$value = 'true';
|
||||
$remove = $matchesCount == 0;
|
||||
} else {
|
||||
$value = 'false';
|
||||
if ($value == '') {
|
||||
$value = '\'\'';
|
||||
} elseif (is_string($value)) {
|
||||
$value = '\''.$value.'\'';
|
||||
}
|
||||
|
||||
eval('$isTrue = '.$value.$filterExpression.';');
|
||||
|
||||
/* @var bool $isTrue */
|
||||
$remove = !$isTrue;
|
||||
}
|
||||
|
||||
if ($remove) {
|
||||
unset($effect[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
eval(sprintf('$isEqual = %s%s;', $value, $filterExpression));
|
||||
|
||||
/* @var bool $isEqual */
|
||||
$remove = !$isEqual;
|
||||
}
|
||||
|
||||
if ($remove) {
|
||||
unset($effect[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -275,41 +216,38 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs regular expression match with many given patterns.
|
||||
* Perform regular expression match with many given patterns.
|
||||
* Returns information if given $subject matches one or all given $patterns.
|
||||
*
|
||||
* @param array|string $patterns The patterns to match
|
||||
* @param string $subject The string to check
|
||||
* @param bool $mustAllMatch (optional) If is set to true, $subject must match all $patterns. Otherwise -
|
||||
* not (default behaviour).
|
||||
* not.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function pregMultiMatch($patterns, $subject, $mustAllMatch = false)
|
||||
{
|
||||
/*
|
||||
* No patterns?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($patterns)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$effect = false;
|
||||
$patterns = Arrays::makeArray($patterns);
|
||||
|
||||
if ($mustAllMatch) {
|
||||
$effect = true;
|
||||
}
|
||||
|
||||
foreach ($patterns as $pattern) {
|
||||
$matched = (bool)preg_match_all($pattern, $subject);
|
||||
|
||||
if (!empty($patterns)) {
|
||||
if ($mustAllMatch) {
|
||||
$effect = $effect && $matched;
|
||||
} else {
|
||||
if ($matched) {
|
||||
$effect = $matched;
|
||||
break;
|
||||
$effect = true;
|
||||
}
|
||||
|
||||
foreach ($patterns as $pattern) {
|
||||
$matches = [];
|
||||
$matched = (bool) preg_match_all($pattern, $subject, $matches);
|
||||
|
||||
if ($mustAllMatch) {
|
||||
$effect = $effect && $matched;
|
||||
} else {
|
||||
if ($matched) {
|
||||
$effect = $matched;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -318,11 +256,12 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string in human readable style generated from given camel case string / text
|
||||
* Returns string in human readable style generated from given camel case string / text.
|
||||
*
|
||||
* @param string $string The string / text to convert
|
||||
* @param bool $applyUpperCaseFirst (optional) If is set to true, first word / element from the converted
|
||||
* string is uppercased. Otherwise - not.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function camelCase2humanReadable($string, $applyUpperCaseFirst = false)
|
||||
@@ -347,9 +286,10 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns parts of given camel case string / text
|
||||
* Returns parts of given camel case string / text.
|
||||
*
|
||||
* @param string $string The string / text to retrieve parts
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getCamelCaseParts($string)
|
||||
@@ -362,11 +302,12 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns simple, lowercase string generated from given camel case string / text
|
||||
* Returns simple, lowercase string generated from given camel case string / text.
|
||||
*
|
||||
* @param string $string The string / text to convert
|
||||
* @param string $separator (optional) Separator used to concatenate parts of the string, e.g. '-' or '_'
|
||||
* @param bool $applyLowercase (optional) If is set to true, returned string will be lowercased. Otherwise - not.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function camelCase2simpleLowercase($string, $separator = '', $applyLowercase = true)
|
||||
@@ -385,7 +326,7 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify or get e-mail address
|
||||
* Returns pattern used to validate / verify or get e-mail address.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -395,7 +336,7 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify or get phone number
|
||||
* Returns pattern used to validate / verify or get phone number.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -405,7 +346,7 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify or get camel case parts of string
|
||||
* Returns pattern used to validate / verify or get camel case parts of string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -415,10 +356,11 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify or get url address
|
||||
* Returns pattern used to validate / verify or get url address.
|
||||
*
|
||||
* @param bool $requireProtocol (optional) If is set to true, the protocol is required to be passed in the url.
|
||||
* Otherwise - not.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getUrlPattern($requireProtocol = false)
|
||||
@@ -435,10 +377,11 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given path is sub-path of another path, e.g. path file is owned by path of directory
|
||||
* Returns information if given path is sub-path of another path, e.g. path file is owned by path of directory.
|
||||
*
|
||||
* @param string $subPath Path to verify, probably sub-path
|
||||
* @param string $path Main / parent path
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isSubPathOf($subPath, $path)
|
||||
@@ -465,11 +408,11 @@ class Regex
|
||||
|
||||
$pattern = sprintf('/^%s.*/', $prepared);
|
||||
|
||||
return (bool)preg_match($pattern, $subPath);
|
||||
return (bool) preg_match($pattern, $subPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify letter or digit
|
||||
* Returns pattern used to validate / verify letter or digit.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -479,62 +422,66 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given character is a letter or digit
|
||||
* Returns information if given character is a letter or digit.
|
||||
*
|
||||
* @param string $char Character to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isLetterOrDigit($char)
|
||||
{
|
||||
$pattern = self::getLetterOrDigitPattern();
|
||||
|
||||
return is_scalar($char) && (bool)preg_match($pattern, $char);
|
||||
return is_scalar($char) && (bool) preg_match($pattern, $char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if the string starts with given beginning / characters
|
||||
* Returns information if the string starts with given beginning / characters.
|
||||
*
|
||||
* @param string $string String to check
|
||||
* @param string $beginning The beginning of string, one or more characters
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function startsWith($string, $beginning)
|
||||
{
|
||||
if (!empty($string) && !empty($beginning)) {
|
||||
if (1 == strlen($beginning) && !self::isLetterOrDigit($beginning)) {
|
||||
$beginning = '\\' . $beginning;
|
||||
if (strlen($beginning) == 1 && !self::isLetterOrDigit($beginning)) {
|
||||
$beginning = '\\'.$beginning;
|
||||
}
|
||||
|
||||
$pattern = sprintf('|^%s|', $beginning);
|
||||
|
||||
return (bool)preg_match($pattern, $string);
|
||||
return (bool) preg_match($pattern, $string);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if the string ends with given ending / characters
|
||||
* Returns information if the string ends with given ending / characters.
|
||||
*
|
||||
* @param string $string String to check
|
||||
* @param string $ending The ending of string, one or more characters
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function endsWith($string, $ending)
|
||||
{
|
||||
if (1 == strlen($ending) && !self::isLetterOrDigit($ending)) {
|
||||
$ending = '\\' . $ending;
|
||||
if (strlen($ending) == 1 && !self::isLetterOrDigit($ending)) {
|
||||
$ending = '\\'.$ending;
|
||||
}
|
||||
|
||||
return (bool)preg_match('|' . $ending . '$|', $string);
|
||||
return (bool) preg_match('|'.$ending.'$|', $string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if the string starts with directory's separator
|
||||
* Returns information if the string starts with directory's separator.
|
||||
*
|
||||
* @param string $string String that may contain a directory's separator at the start / beginning
|
||||
* @param string $separator (optional) The directory's separator, e.g. "/". If is empty (not provided), system's
|
||||
* separator is used.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function startsWithDirectorySeparator($string, $separator = '')
|
||||
@@ -547,11 +494,12 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if the string ends with directory's separator
|
||||
* Returns information if the string ends with directory's separator.
|
||||
*
|
||||
* @param string $text String that may contain a directory's separator at the end
|
||||
* @param string $separator (optional) The directory's separator, e.g. "/". If is empty (not provided), system's
|
||||
* separator is used.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function endsWithDirectorySeparator($text, $separator = '')
|
||||
@@ -564,19 +512,20 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if uri contains parameter
|
||||
* Returns information if uri contains parameter.
|
||||
*
|
||||
* @param string $uri Uri string (e.g. $_SERVER['REQUEST_URI'])
|
||||
* @param string $parameterName Uri parameter name
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isSetUriParameter($uri, $parameterName)
|
||||
{
|
||||
return (bool)preg_match('|[?&]{1}' . $parameterName . '=|', $uri); // e.g. ?name=phil&type=4 -> '$type='
|
||||
return (bool) preg_match('|[?&]{1}'.$parameterName.'=|', $uri); // e.g. ?name=phil&type=4 -> '$type='
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify html entity
|
||||
* Returns pattern used to validate / verify html entity.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -586,36 +535,38 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if the string contains html entities
|
||||
* Returns information if the string contains html entities.
|
||||
*
|
||||
* @param string $string String to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function containsEntities($string)
|
||||
{
|
||||
$pattern = self::getHtmlEntityPattern();
|
||||
|
||||
return (bool)preg_match_all($pattern, $string);
|
||||
return (bool) preg_match_all($pattern, $string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if one string contains another string
|
||||
* Returns information if one string contains another string.
|
||||
*
|
||||
* @param string $haystack The string to search in
|
||||
* @param string $needle The string to be search for
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function contains($haystack, $needle)
|
||||
{
|
||||
if (1 == strlen($needle) && !self::isLetterOrDigit($needle)) {
|
||||
$needle = '\\' . $needle;
|
||||
if (strlen($needle) == 1 && !self::isLetterOrDigit($needle)) {
|
||||
$needle = '\\'.$needle;
|
||||
}
|
||||
|
||||
return (bool)preg_match('|.*' . $needle . '.*|', $haystack);
|
||||
return (bool) preg_match('|.*'.$needle.'.*|', $haystack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify name of file
|
||||
* Returns pattern used to validate / verify name of file.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -629,17 +580,18 @@ class Regex
|
||||
* Verifies if given name contains a dot and an extension, e.g. "My File 001.jpg".
|
||||
*
|
||||
* @param string $fileName Name of file to check. It may be path of file also.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isFileName($fileName)
|
||||
{
|
||||
$pattern = self::getFileNamePattern();
|
||||
|
||||
return (bool)preg_match($pattern, $fileName);
|
||||
return (bool) preg_match($pattern, $fileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify if value is quoted (by apostrophes or quotation marks)
|
||||
* Returns pattern used to validate / verify if value is quoted (by apostrophes or quotation marks).
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -649,20 +601,21 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given value is quoted (by apostrophes or quotation marks)
|
||||
* Returns information if given value is quoted (by apostrophes or quotation marks).
|
||||
*
|
||||
* @param mixed $value The value to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isQuoted($value)
|
||||
{
|
||||
$pattern = self::getIsQuotedPattern();
|
||||
|
||||
return is_scalar($value) && (bool)preg_match($pattern, $value);
|
||||
return is_scalar($value) && (bool) preg_match($pattern, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify if given path is a Windows-based path, e.g. "C:\path\to\file.jpg"
|
||||
* Returns pattern used to validate / verify if given path is a Windows-based path, e.g. "C:\path\to\file.jpg".
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -672,22 +625,24 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given path is a Windows-based path, e.g. "C:\path\to\file.jpg"
|
||||
* Returns information if given path is a Windows-based path, e.g. "C:\path\to\file.jpg".
|
||||
*
|
||||
* @param string $path The path to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isWindowsBasedPath($path)
|
||||
{
|
||||
$pattern = self::getWindowsBasedPathPattern();
|
||||
|
||||
return (bool)preg_match($pattern, $path);
|
||||
return (bool) preg_match($pattern, $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given NIP number is valid
|
||||
* Returns information if given NIP number is valid.
|
||||
*
|
||||
* @param string $nip A given NIP number
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* @see https://pl.wikipedia.org/wiki/NIP#Znaczenie_numeru
|
||||
@@ -723,13 +678,13 @@ class Regex
|
||||
}
|
||||
|
||||
$modulo = $sum % 11;
|
||||
$numberControl = (10 == $modulo) ? 0 : $modulo;
|
||||
$numberControl = ($modulo == 10) ? 0 : $modulo;
|
||||
|
||||
return $numberControl == $nip[9];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify if given value is money-related value
|
||||
* Returns pattern used to validate / verify if given value is money-related value.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -739,24 +694,17 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given value is valid money-related value
|
||||
* Returns information if given value is valid money-related value.
|
||||
*
|
||||
* @param mixed $value Value to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidMoneyValue($value)
|
||||
{
|
||||
/*
|
||||
* Not a scalar value?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_scalar($value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getMoneyPattern();
|
||||
|
||||
return (bool)preg_match($pattern, $value);
|
||||
return (bool) preg_match($pattern, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -766,162 +714,40 @@ class Regex
|
||||
* @param string $color Color to verify
|
||||
* @param bool $throwException (optional) If is set to true, throws an exception if given color is invalid
|
||||
* (default behaviour). Otherwise - not.
|
||||
*
|
||||
* @return string|bool
|
||||
*
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
* @return string|bool
|
||||
*/
|
||||
public static function getValidColorHexValue($color, $throwException = true)
|
||||
{
|
||||
/*
|
||||
* Not a scalar value?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_scalar($color)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$color = Miscellaneous::replace($color, '/#/', '');
|
||||
$length = strlen($color);
|
||||
|
||||
/*
|
||||
* Color is not 3 or 6 characters long?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (3 !== $length && 6 !== $length) {
|
||||
if ($length === 3) {
|
||||
$color = Miscellaneous::replace($color, '/(.)(.)(.)/', '$1$1$2$2$3$3');
|
||||
} else {
|
||||
if ($length !== 6) {
|
||||
if ($throwException) {
|
||||
throw new IncorrectColorHexLengthException($color);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
$pattern = self::$patterns['color'];
|
||||
$match = (bool) preg_match($pattern, $color);
|
||||
|
||||
if (!$match) {
|
||||
if ($throwException) {
|
||||
throw new IncorrectColorHexLengthException($color);
|
||||
throw new InvalidColorHexValueException($color);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Color is 3 characters long?
|
||||
* Let's make it 6 characters long
|
||||
*/
|
||||
if (3 === $length) {
|
||||
$color = Miscellaneous::replace($color, '/(.)(.)(.)/', '$1$1$2$2$3$3');
|
||||
}
|
||||
|
||||
$pattern = self::$patterns['color'];
|
||||
$match = (bool)preg_match($pattern, $color);
|
||||
|
||||
/*
|
||||
* It's valid color
|
||||
* Nothing to do more
|
||||
*/
|
||||
if ($match) {
|
||||
return strtolower($color);
|
||||
}
|
||||
|
||||
if ($throwException) {
|
||||
throw new InvalidColorHexValueException($color);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given name of bundle is valid
|
||||
*
|
||||
* @param string $bundleName Full name of bundle to verify, e.g. "MyExtraBundle"
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidBundleName($bundleName)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($bundleName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getBundleNamePattern();
|
||||
|
||||
return (bool)preg_match($pattern, $bundleName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify name of bundle
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getBundleNamePattern()
|
||||
{
|
||||
return self::$patterns['bundleName'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify html attribute
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getHtmlAttributePattern()
|
||||
{
|
||||
return self::$patterns['htmlAttribute'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given html attribute is valid
|
||||
*
|
||||
* @param string $htmlAttribute The html attribute to verify
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidHtmlAttribute($htmlAttribute)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($htmlAttribute)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getHtmlAttributePattern();
|
||||
|
||||
return (bool)preg_match($pattern, $htmlAttribute);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given html attributes are valid
|
||||
*
|
||||
* @param string $htmlAttributes The html attributes to verify
|
||||
* @return bool
|
||||
*/
|
||||
public static function areValidHtmlAttributes($htmlAttributes)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($htmlAttributes)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getHtmlAttributePattern();
|
||||
|
||||
return (bool)preg_match_all($pattern, $htmlAttributes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given value is a binary value
|
||||
*
|
||||
* @param string $value Value to verify
|
||||
* @return bool
|
||||
*/
|
||||
public static function isBinaryValue($value)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::$patterns['binaryValue'];
|
||||
|
||||
return (bool)preg_match($pattern, $value);
|
||||
return strtolower($color);
|
||||
}
|
||||
}
|
||||
111
src/Meritoo/Common/Utilities/Repository.php
Normal file
111
src/Meritoo/Common/Utilities/Repository.php
Normal file
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use Doctrine\ORM\EntityRepository;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
|
||||
/**
|
||||
* Useful methods for repository.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Repository
|
||||
{
|
||||
/**
|
||||
* Replenishes positions of given items.
|
||||
*
|
||||
* @param array $items The items
|
||||
* @param bool $asLast (optional) If is set to true, items are placed at the end. Otherwise - at the top.
|
||||
* @param bool $force (optional) If is set to true, positions are set even there is no extreme position.
|
||||
* Otherwise - if extreme position is not found (is null) replenishment is stopped / skipped.
|
||||
*/
|
||||
public static function replenishPositions($items, $asLast = true, $force = false)
|
||||
{
|
||||
$position = self::getExtremePosition($items, $asLast);
|
||||
|
||||
if ($position === null && $force) {
|
||||
$position = 0;
|
||||
}
|
||||
|
||||
if ($position !== null && !empty($items)) {
|
||||
foreach ($items as $item) {
|
||||
if (method_exists($item, 'getPosition')) {
|
||||
if ($item->getPosition() === null) {
|
||||
if ($asLast) {
|
||||
++$position;
|
||||
} else {
|
||||
--$position;
|
||||
}
|
||||
|
||||
if (method_exists($item, 'setPosition')) {
|
||||
$item->setPosition($position);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns extreme position (max or min) of given items.
|
||||
*
|
||||
* @param array $items The items
|
||||
* @param bool $max (optional) If is set to true, maximum value is returned. Otherwise - minimum.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function getExtremePosition($items, $max = true)
|
||||
{
|
||||
$extreme = null;
|
||||
|
||||
if (!empty($items)) {
|
||||
foreach ($items as $item) {
|
||||
if (Reflection::hasMethod($item, 'getPosition')) {
|
||||
$position = $item->getPosition();
|
||||
|
||||
if ($max) {
|
||||
if ($position > $extreme) {
|
||||
$extreme = $position;
|
||||
}
|
||||
} else {
|
||||
if ($position < $extreme) {
|
||||
$extreme = $position;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $extreme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns query builder for given entity's repository.
|
||||
* The entity should contain given property, e.g. "name".
|
||||
*
|
||||
* @param EntityRepository $repository Repository of the entity
|
||||
* @param string $property (optional) Name of property used by the ORDER BY clause
|
||||
* @param string $direction (optional) Direction used by the ORDER BY clause ("ASC" or "DESC")
|
||||
*
|
||||
* @return QueryBuilder
|
||||
*/
|
||||
public static function getEntityOrderedQueryBuilder(
|
||||
EntityRepository $repository,
|
||||
$property = 'name',
|
||||
$direction = 'ASC'
|
||||
) {
|
||||
$alias = 'qb';
|
||||
|
||||
return $repository
|
||||
->createQueryBuilder($alias)
|
||||
->orderBy(sprintf('%s.%s', $alias, $property), $direction);
|
||||
}
|
||||
}
|
||||
@@ -9,78 +9,58 @@
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
/**
|
||||
* Useful uri methods (only static functions)
|
||||
* Useful uri methods (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Uri
|
||||
{
|
||||
/**
|
||||
* Returns full uri string
|
||||
* Returns full uri string.
|
||||
*
|
||||
* @param bool $withoutHost (optional) If is set to true, means that host / server name is omitted
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getFullUri($withoutHost = false)
|
||||
{
|
||||
$requestedUrl = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'REQUEST_URI');
|
||||
$effect = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'REQUEST_URI');
|
||||
|
||||
/*
|
||||
* Unknown requested url?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($requestedUrl)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
/*
|
||||
* Without host / server name?
|
||||
* All is done
|
||||
*/
|
||||
if ($withoutHost) {
|
||||
return $requestedUrl;
|
||||
return $effect;
|
||||
}
|
||||
|
||||
return self::getServerNameOrIp(true) . $requestedUrl;
|
||||
return self::getServerNameOrIp(true).$effect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns server name or IP address
|
||||
* Returns server name or IP address.
|
||||
*
|
||||
* @param bool $withProtocol (optional) If is set to true, protocol name is included. Otherwise isn't.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getServerNameOrIp($withProtocol = false)
|
||||
{
|
||||
$host = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_HOST');
|
||||
$protocol = '';
|
||||
|
||||
/*
|
||||
* Unknown host / server?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($host)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
/*
|
||||
* With protocol?
|
||||
* Let's include the protocol
|
||||
*/
|
||||
if ($withProtocol) {
|
||||
return sprintf('%s://%s', self::getProtocolName(), $host);
|
||||
$protocol .= self::getProtocolName().'://';
|
||||
}
|
||||
|
||||
return $host;
|
||||
return $protocol.Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_HOST');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns protocol name
|
||||
* Returns protocol name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getProtocolName()
|
||||
{
|
||||
$effect = '';
|
||||
|
||||
$matches = [];
|
||||
$protocolData = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'SERVER_PROTOCOL'); // e.g. HTTP/1.1
|
||||
$matchCount = preg_match('|(.+)\/(.+)|', $protocolData, $matches);
|
||||
@@ -90,28 +70,31 @@ class Uri
|
||||
* $matches[2] - protocol version, e.g. 1.1
|
||||
*/
|
||||
|
||||
/*
|
||||
* Oops, cannot match protocol
|
||||
*/
|
||||
if (0 == $matchCount) {
|
||||
return '';
|
||||
if ($matchCount > 0) {
|
||||
$effect = strtolower($matches[1]);
|
||||
}
|
||||
|
||||
return strtolower($matches[1]);
|
||||
return $effect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns http referer uri
|
||||
* Returns http referer uri.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getRefererUri()
|
||||
{
|
||||
return Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_REFERER');
|
||||
$effect = '';
|
||||
|
||||
if (filter_has_var(INPUT_SERVER, 'HTTP_REFERER')) {
|
||||
$effect = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_REFERER');
|
||||
}
|
||||
|
||||
return $effect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns user's IP address
|
||||
* Returns user's IP address.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -121,10 +104,11 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns name and version of user's web browser
|
||||
* Returns name and version of user's web browser.
|
||||
*
|
||||
* @param bool $withVersion (optional) If is set to true, version of the browser is returned too. Otherwise -
|
||||
* name only.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getUserWebBrowserName($withVersion = false)
|
||||
@@ -133,9 +117,9 @@ class Uri
|
||||
|
||||
$knownBrowsers = [
|
||||
'Firefox/([\d\.]+)$' => 'Mozilla Firefox',
|
||||
'OPR/([\d\.]+)$' => 'Opera',
|
||||
'Chrome/([\d\.]+)$' => 'Google Chrome',
|
||||
'Safari/([\d\.]+)$' => 'Apple Safari',
|
||||
'OPR/([\d\.]+)$' => 'Opera',
|
||||
'Chrome/([\d\.]+)$' => 'Google Chrome',
|
||||
'Safari/([\d\.]+)$' => 'Apple Safari',
|
||||
];
|
||||
|
||||
foreach ($knownBrowsers as $pattern => $browserName) {
|
||||
@@ -157,7 +141,7 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns user's web browser information
|
||||
* Returns user's web browser information.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
@@ -183,7 +167,7 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns name of user's operating system
|
||||
* Returns name of user's operating system.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -193,8 +177,8 @@ class Uri
|
||||
|
||||
$knownSystems = [
|
||||
'Linux' => 'Linux',
|
||||
'Win' => 'Windows',
|
||||
'Mac' => 'Mac OS',
|
||||
'Win' => 'Windows',
|
||||
'Mac' => 'Mac OS',
|
||||
];
|
||||
|
||||
foreach ($knownSystems as $pattern => $systemName) {
|
||||
@@ -210,7 +194,7 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if running server is localhost
|
||||
* Returns information if running server is localhost.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
@@ -226,50 +210,27 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given url is external, from another server / domain
|
||||
* Returns information if given url is external, from another server / domain.
|
||||
*
|
||||
* @param string $url The url to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isExternalUrl($url)
|
||||
{
|
||||
/*
|
||||
* Unknown url or it's just slash?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($url) || '/' === $url) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$currentUrl = self::getServerNameOrIp(true);
|
||||
$url = self::replenishProtocol($url);
|
||||
|
||||
/*
|
||||
* Let's prepare pattern of current url
|
||||
*/
|
||||
$search = [
|
||||
':',
|
||||
'/',
|
||||
'.',
|
||||
];
|
||||
|
||||
$replace = [
|
||||
'\:',
|
||||
'\/',
|
||||
'\.',
|
||||
];
|
||||
|
||||
$currentUrlPattern = str_replace($search, $replace, $currentUrl);
|
||||
|
||||
return !Regex::contains($url, $currentUrlPattern);
|
||||
return !Regex::contains($currentUrl, $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replenishes protocol in the given url
|
||||
* Replenishes protocol in the given url.
|
||||
*
|
||||
* @param string $url The url to check and replenish
|
||||
* @param string $protocol (optional) The protocol which is replenished. If is empty, protocol of current request
|
||||
* is used.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function replenishProtocol($url, $protocol = '')
|
||||
@@ -308,23 +269,16 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns url to resource secured by given htpasswd login and password
|
||||
* Returns url to resource secured by given htpasswd login and password.
|
||||
*
|
||||
* @param string $url A path / url to some resource, e.g. page, image, css file
|
||||
* @param string $user (optional) User name used to log in
|
||||
* @param string $password (optional) User password used to log in
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getSecuredUrl($url, $user = '', $password = '')
|
||||
{
|
||||
/*
|
||||
* Url is not provided?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($url)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$protocol = self::getProtocolName();
|
||||
$host = self::getServerNameOrIp();
|
||||
|
||||
@@ -332,7 +286,7 @@ class Uri
|
||||
$url = sprintf('/%s', $url);
|
||||
}
|
||||
|
||||
$url = $host . $url;
|
||||
$url = $host.$url;
|
||||
|
||||
if (!empty($user) && !empty($password)) {
|
||||
$url = sprintf('%s:%s@%s', $user, $password, $url);
|
||||
@@ -347,13 +301,14 @@ class Uri
|
||||
*
|
||||
* @param string $url Url string
|
||||
* @param string $protocol (optional) Protocol string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function addProtocolToUrl($url, $protocol = 'http')
|
||||
{
|
||||
$pattern = sprintf('/^%s.*/', $protocol);
|
||||
|
||||
if ((bool)preg_match($pattern, $url)) {
|
||||
if ((bool) preg_match($pattern, $url)) {
|
||||
return $url;
|
||||
}
|
||||
|
||||
@@ -13,10 +13,10 @@ use DOMXPath;
|
||||
use SimpleXMLElement;
|
||||
|
||||
/**
|
||||
* Useful XML-related methods (only static functions)
|
||||
* Useful XML-related methods (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Xml
|
||||
{
|
||||
@@ -26,6 +26,7 @@ class Xml
|
||||
*
|
||||
* @param SimpleXMLElement $element1 First element to merge
|
||||
* @param SimpleXMLElement $element2 Second element to merge
|
||||
*
|
||||
* @return SimpleXMLElement
|
||||
*/
|
||||
public static function mergeNodes(SimpleXMLElement $element1, SimpleXMLElement $element2)
|
||||
@@ -40,7 +41,7 @@ class Xml
|
||||
$query = $path->query('/*/*');
|
||||
$nodesCount = $query->length;
|
||||
|
||||
if (0 == $nodesCount) {
|
||||
if ($nodesCount == 0) {
|
||||
return $element1;
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use Meritoo\Common\Traits\Test\Base\BaseTestCaseTrait;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Base test case with common methods and data providers
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
abstract class BaseTestCase extends TestCase
|
||||
{
|
||||
use BaseTestCaseTrait;
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use Meritoo\Common\Traits\Test\Base\BaseTypeTestCaseTrait;
|
||||
|
||||
/**
|
||||
* Base test case for the type of something
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
abstract class BaseTypeTestCase extends BaseTestCase
|
||||
{
|
||||
use BaseTypeTestCaseTrait;
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
|
||||
|
||||
/**
|
||||
* Useful methods for bundle
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Bundle
|
||||
{
|
||||
/**
|
||||
* Returns path of given bundle to view / template with given extension
|
||||
*
|
||||
* @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template"
|
||||
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
* @param string $extension (optional) Extension of the view / template (default: "html.twig")
|
||||
* @throws IncorrectBundleNameException
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getBundleViewPath($viewPath, $bundleName, $extension = 'html.twig')
|
||||
{
|
||||
/*
|
||||
* Unknown path, extension of the view / template or name of the bundle?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($viewPath) || empty($bundleName) || empty($extension)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* Given name of bundle is invalid?
|
||||
*/
|
||||
if (!Regex::isValidBundleName($bundleName)) {
|
||||
throw IncorrectBundleNameException::create($bundleName);
|
||||
}
|
||||
|
||||
/*
|
||||
* Path of the view / template doesn't end with given extension?
|
||||
*/
|
||||
if (!Regex::endsWith($viewPath, $extension)) {
|
||||
$viewPath = sprintf('%s.%s', $viewPath, $extension);
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare short name of bundle and path of view / template with "/" (instead of ":")
|
||||
*/
|
||||
$shortBundleName = static::getShortBundleName($bundleName);
|
||||
$viewPath = str_replace(':', '/', $viewPath);
|
||||
|
||||
return sprintf('@%s/%s', $shortBundleName, $viewPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns short name of bundle (without "Bundle")
|
||||
*
|
||||
* @param string $fullBundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
* @throws IncorrectBundleNameException
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getShortBundleName($fullBundleName)
|
||||
{
|
||||
/*
|
||||
* Given name of bundle is invalid?
|
||||
*/
|
||||
if (!Regex::isValidBundleName($fullBundleName)) {
|
||||
if (!is_string($fullBundleName)) {
|
||||
$fullBundleName = gettype($fullBundleName);
|
||||
}
|
||||
|
||||
throw new IncorrectBundleNameException($fullBundleName);
|
||||
}
|
||||
|
||||
$matches = [];
|
||||
$pattern = Regex::getBundleNamePattern();
|
||||
preg_match($pattern, $fullBundleName, $matches);
|
||||
|
||||
return $matches[1];
|
||||
}
|
||||
}
|
||||
@@ -1,815 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
/**
|
||||
* Useful methods for mime types of files
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class MimeTypes
|
||||
{
|
||||
/**
|
||||
* Mime types data
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $mimeTypes = [
|
||||
'7z' => 'application/x-7z-compressed',
|
||||
'ez' => 'application/andrew-inset',
|
||||
'atom' => 'application/atom+xml',
|
||||
'atomcat' => 'application/atomcat+xml',
|
||||
'atomsvc' => 'application/atomsvc+xml',
|
||||
'ccxml' => 'application/ccxml+xml',
|
||||
'davmount' => 'application/davmount+xml',
|
||||
'ecma' => 'application/ecmascript',
|
||||
'pfr' => 'application/font-tdpfr',
|
||||
'stk' => 'application/hyperstudio',
|
||||
'js' => 'application/javascript',
|
||||
'json' => 'application/json',
|
||||
'hqx' => 'application/mac-binhex40',
|
||||
'cpt' => 'application/mac-compactpro',
|
||||
'mrc' => 'application/marc',
|
||||
'ma' => 'application/mathematica',
|
||||
'nb' => 'application/mathematica',
|
||||
'mb' => 'application/mathematica',
|
||||
'mathml' => 'application/mathml+xml',
|
||||
'mbox' => 'application/mbox',
|
||||
'mscml' => 'application/mediaservercontrol+xml',
|
||||
'mp4s' => 'application/mp4',
|
||||
'dot' => 'application/msword',
|
||||
'doc' => 'application/msword',
|
||||
/*
|
||||
* MS Office system file format MIME types
|
||||
* http://technet.microsoft.com/en-us/library/ee309278%28office.12%29.aspx
|
||||
*/
|
||||
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
'mxf' => 'application/mxf',
|
||||
'bin' => 'application/octet-stream',
|
||||
'dms' => 'application/octet-stream',
|
||||
'lha' => 'application/octet-stream',
|
||||
'lzh' => 'application/octet-stream',
|
||||
'class' => 'application/octet-stream',
|
||||
'so' => 'application/octet-stream',
|
||||
'iso' => 'application/octet-stream',
|
||||
'dmg' => 'application/octet-stream',
|
||||
'dist' => 'application/octet-stream',
|
||||
'distz' => 'application/octet-stream',
|
||||
'pkg' => 'application/octet-stream',
|
||||
'bpk' => 'application/octet-stream',
|
||||
'dump' => 'application/octet-stream',
|
||||
'elc' => 'application/octet-stream',
|
||||
'scpt' => 'application/octet-stream',
|
||||
'oda' => 'application/oda',
|
||||
'ogg' => 'application/ogg',
|
||||
'pdf' => 'application/pdf',
|
||||
'pgp' => 'application/pgp-encrypted',
|
||||
'asc' => 'application/pgp-signature',
|
||||
'sig' => 'application/pgp-signature',
|
||||
'prf' => 'application/pics-rules',
|
||||
'p10' => 'application/pkcs10',
|
||||
'p7m' => 'application/pkcs7-mime',
|
||||
'p7c' => 'application/pkcs7-mime',
|
||||
'p7s' => 'application/pkcs7-signature',
|
||||
'cer' => 'application/pkix-cert',
|
||||
'crl' => 'application/pkix-crl',
|
||||
'pkipath' => 'application/pkix-pkipath',
|
||||
'pki' => 'application/pkixcmp',
|
||||
'pls' => 'application/pls+xml',
|
||||
'ai' => 'application/postscript',
|
||||
'eps' => 'application/postscript',
|
||||
'ps' => 'application/postscript',
|
||||
'cww' => 'application/prs.cww',
|
||||
'rdf' => 'application/rdf+xml',
|
||||
'rif' => 'application/reginfo+xml',
|
||||
'rnc' => 'application/relax-ng-compact-syntax',
|
||||
'rl' => 'application/resource-lists+xml',
|
||||
'rs' => 'application/rls-services+xml',
|
||||
'rsd' => 'application/rsd+xml',
|
||||
'rss' => 'application/rss+xml',
|
||||
'rtf' => 'application/rtf',
|
||||
'sbml' => 'application/sbml+xml',
|
||||
'sdp' => 'application/sdp',
|
||||
'setpay' => 'application/set-payment-initiation',
|
||||
'setreg' => 'application/set-registration-initiation',
|
||||
'shf' => 'application/shf+xml',
|
||||
'smi' => 'application/smil+xml',
|
||||
'smil' => 'application/smil+xml',
|
||||
'gram' => 'application/srgs',
|
||||
'grxml' => 'application/srgs+xml',
|
||||
'ssml' => 'application/ssml+xml',
|
||||
'plb' => 'application/vnd.3gpp.pic-bw-large',
|
||||
'psb' => 'application/vnd.3gpp.pic-bw-small',
|
||||
'pvb' => 'application/vnd.3gpp.pic-bw-var',
|
||||
'pwn' => 'application/vnd.3m.post-it-notes',
|
||||
'aso' => 'application/vnd.accpac.simply.aso',
|
||||
'imp' => 'application/vnd.accpac.simply.imp',
|
||||
'acu' => 'application/vnd.acucobol',
|
||||
'atc' => 'application/vnd.acucorp',
|
||||
'acutc' => 'application/vnd.acucorp',
|
||||
'xdp' => 'application/vnd.adobe.xdp+xml',
|
||||
'xfdf' => 'application/vnd.adobe.xfdf',
|
||||
'ami' => 'application/vnd.amiga.ami',
|
||||
'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
|
||||
'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
|
||||
'atx' => 'application/vnd.antix.game-component',
|
||||
'mpkg' => 'application/vnd.apple.installer+xml',
|
||||
'aep' => 'application/vnd.audiograph',
|
||||
'mpm' => 'application/vnd.blueice.multipass',
|
||||
'bmi' => 'application/vnd.bmi',
|
||||
'rep' => 'application/vnd.businessobjects',
|
||||
'cdxml' => 'application/vnd.chemdraw+xml',
|
||||
'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
|
||||
'cdy' => 'application/vnd.cinderella',
|
||||
'cla' => 'application/vnd.claymore',
|
||||
'c4g' => 'application/vnd.clonk.c4group',
|
||||
'c4d' => 'application/vnd.clonk.c4group',
|
||||
'c4f' => 'application/vnd.clonk.c4group',
|
||||
'c4p' => 'application/vnd.clonk.c4group',
|
||||
'c4u' => 'application/vnd.clonk.c4group',
|
||||
'csp' => 'application/vnd.commonspace',
|
||||
'cst' => 'application/vnd.commonspace',
|
||||
'cdbcmsg' => 'application/vnd.contact.cmsg',
|
||||
'cmc' => 'application/vnd.cosmocaller',
|
||||
'clkx' => 'application/vnd.crick.clicker',
|
||||
'clkk' => 'application/vnd.crick.clicker.keyboard',
|
||||
'clkp' => 'application/vnd.crick.clicker.palette',
|
||||
'clkt' => 'application/vnd.crick.clicker.template',
|
||||
'clkw' => 'application/vnd.crick.clicker.wordbank',
|
||||
'wbs' => 'application/vnd.criticaltools.wbs+xml',
|
||||
'pml' => 'application/vnd.ctc-posml',
|
||||
'ppd' => 'application/vnd.cups-ppd',
|
||||
'curl' => 'application/vnd.curl',
|
||||
'rdz' => 'application/vnd.data-vision.rdz',
|
||||
'dna' => 'application/vnd.dna',
|
||||
'mlp' => 'application/vnd.dolby.mlp',
|
||||
'dpg' => 'application/vnd.dpgraph',
|
||||
'dfac' => 'application/vnd.dreamfactory',
|
||||
'mag' => 'application/vnd.ecowin.chart',
|
||||
'nml' => 'application/vnd.enliven',
|
||||
'esf' => 'application/vnd.epson.esf',
|
||||
'msf' => 'application/vnd.epson.msf',
|
||||
'qam' => 'application/vnd.epson.quickanime',
|
||||
'slt' => 'application/vnd.epson.salt',
|
||||
'ssf' => 'application/vnd.epson.ssf',
|
||||
'es3' => 'application/vnd.eszigno3+xml',
|
||||
'et3' => 'application/vnd.eszigno3+xml',
|
||||
'ez2' => 'application/vnd.ezpix-album',
|
||||
'ez3' => 'application/vnd.ezpix-package',
|
||||
'fdf' => 'application/vnd.fdf',
|
||||
'gph' => 'application/vnd.flographit',
|
||||
'ftc' => 'application/vnd.fluxtime.clip',
|
||||
'fm' => 'application/vnd.framemaker',
|
||||
'frame' => 'application/vnd.framemaker',
|
||||
'maker' => 'application/vnd.framemaker',
|
||||
'fnc' => 'application/vnd.frogans.fnc',
|
||||
'ltf' => 'application/vnd.frogans.ltf',
|
||||
'fsc' => 'application/vnd.fsc.weblaunch',
|
||||
'oas' => 'application/vnd.fujitsu.oasys',
|
||||
'oa2' => 'application/vnd.fujitsu.oasys2',
|
||||
'oa3' => 'application/vnd.fujitsu.oasys3',
|
||||
'fg5' => 'application/vnd.fujitsu.oasysgp',
|
||||
'bh2' => 'application/vnd.fujitsu.oasysprs',
|
||||
'ddd' => 'application/vnd.fujixerox.ddd',
|
||||
'xdw' => 'application/vnd.fujixerox.docuworks',
|
||||
'xbd' => 'application/vnd.fujixerox.docuworks.binder',
|
||||
'fzs' => 'application/vnd.fuzzysheet',
|
||||
'txd' => 'application/vnd.genomatix.tuxedo',
|
||||
'kml' => 'application/vnd.google-earth.kml+xml',
|
||||
'kmz' => 'application/vnd.google-earth.kmz',
|
||||
'gqf' => 'application/vnd.grafeq',
|
||||
'gqs' => 'application/vnd.grafeq',
|
||||
'gac' => 'application/vnd.groove-account',
|
||||
'ghf' => 'application/vnd.groove-help',
|
||||
'gim' => 'application/vnd.groove-identity-message',
|
||||
'grv' => 'application/vnd.groove-injector',
|
||||
'gtm' => 'application/vnd.groove-tool-message',
|
||||
'tpl' => 'application/vnd.groove-tool-template',
|
||||
'vcg' => 'application/vnd.groove-vcard',
|
||||
'zmm' => 'application/vnd.handheld-entertainment+xml',
|
||||
'hbci' => 'application/vnd.hbci',
|
||||
'les' => 'application/vnd.hhe.lesson-player',
|
||||
'hpgl' => 'application/vnd.hp-hpgl',
|
||||
'hpid' => 'application/vnd.hp-hpid',
|
||||
'hps' => 'application/vnd.hp-hps',
|
||||
'jlt' => 'application/vnd.hp-jlyt',
|
||||
'pcl' => 'application/vnd.hp-pcl',
|
||||
'pclxl' => 'application/vnd.hp-pclxl',
|
||||
'x3d' => 'application/vnd.hzn-3d-crossword',
|
||||
'mpy' => 'application/vnd.ibm.minipay',
|
||||
'afp' => 'application/vnd.ibm.modcap',
|
||||
'listafp' => 'application/vnd.ibm.modcap',
|
||||
'list3820' => 'application/vnd.ibm.modcap',
|
||||
'irm' => 'application/vnd.ibm.rights-management',
|
||||
'sc' => 'application/vnd.ibm.secure-container',
|
||||
'igl' => 'application/vnd.igloader',
|
||||
'ivp' => 'application/vnd.immervision-ivp',
|
||||
'ivu' => 'application/vnd.immervision-ivu',
|
||||
'xpw' => 'application/vnd.intercon.formnet',
|
||||
'xpx' => 'application/vnd.intercon.formnet',
|
||||
'qbo' => 'application/vnd.intu.qbo',
|
||||
'qfx' => 'application/vnd.intu.qfx',
|
||||
'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
|
||||
'irp' => 'application/vnd.irepository.package+xml',
|
||||
'xpr' => 'application/vnd.is-xpr',
|
||||
'jam' => 'application/vnd.jam',
|
||||
'rms' => 'application/vnd.jcp.javame.midlet-rms',
|
||||
'jisp' => 'application/vnd.jisp',
|
||||
'ktz' => 'application/vnd.kahootz',
|
||||
'ktr' => 'application/vnd.kahootz',
|
||||
'karbon' => 'application/vnd.kde.karbon',
|
||||
'chrt' => 'application/vnd.kde.kchart',
|
||||
'kfo' => 'application/vnd.kde.kformula',
|
||||
'flw' => 'application/vnd.kde.kivio',
|
||||
'kon' => 'application/vnd.kde.kontour',
|
||||
'kpr' => 'application/vnd.kde.kpresenter',
|
||||
'kpt' => 'application/vnd.kde.kpresenter',
|
||||
'ksp' => 'application/vnd.kde.kspread',
|
||||
'kwd' => 'application/vnd.kde.kword',
|
||||
'kwt' => 'application/vnd.kde.kword',
|
||||
'htke' => 'application/vnd.kenameaapp',
|
||||
'kia' => 'application/vnd.kidspiration',
|
||||
'kne' => 'application/vnd.kinar',
|
||||
'knp' => 'application/vnd.kinar',
|
||||
'skp' => 'application/vnd.koan',
|
||||
'skd' => 'application/vnd.koan',
|
||||
'skt' => 'application/vnd.koan',
|
||||
'skm' => 'application/vnd.koan',
|
||||
'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
|
||||
'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
|
||||
'123' => 'application/vnd.lotus-1-2-3',
|
||||
'apr' => 'application/vnd.lotus-approach',
|
||||
'pre' => 'application/vnd.lotus-freelance',
|
||||
'nsf' => 'application/vnd.lotus-notes',
|
||||
'org' => 'application/vnd.lotus-organizer',
|
||||
'scm' => 'application/vnd.lotus-screencam',
|
||||
'lwp' => 'application/vnd.lotus-wordpro',
|
||||
'portpkg' => 'application/vnd.macports.portpkg',
|
||||
'mcd' => 'application/vnd.mcd',
|
||||
'mc1' => 'application/vnd.medcalcdata',
|
||||
'cdkey' => 'application/vnd.mediastation.cdkey',
|
||||
'mwf' => 'application/vnd.mfer',
|
||||
'mfm' => 'application/vnd.mfmp',
|
||||
'flo' => 'application/vnd.micrografx.flo',
|
||||
'igx' => 'application/vnd.micrografx.igx',
|
||||
'mif' => 'application/vnd.mif',
|
||||
'daf' => 'application/vnd.mobius.daf',
|
||||
'dis' => 'application/vnd.mobius.dis',
|
||||
'mbk' => 'application/vnd.mobius.mbk',
|
||||
'mqy' => 'application/vnd.mobius.mqy',
|
||||
'msl' => 'application/vnd.mobius.msl',
|
||||
'plc' => 'application/vnd.mobius.plc',
|
||||
'txf' => 'application/vnd.mobius.txf',
|
||||
'mpn' => 'application/vnd.mophun.application',
|
||||
'mpc' => 'application/vnd.mophun.certificate',
|
||||
'xul' => 'application/vnd.mozilla.xul+xml',
|
||||
'cil' => 'application/vnd.ms-artgalry',
|
||||
'asf' => 'application/vnd.ms-asf',
|
||||
'cab' => 'application/vnd.ms-cab-compressed',
|
||||
'xls' => 'application/vnd.ms-excel',
|
||||
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'xlm' => 'application/vnd.ms-excel',
|
||||
'xla' => 'application/vnd.ms-excel',
|
||||
'xlc' => 'application/vnd.ms-excel',
|
||||
'xlt' => 'application/vnd.ms-excel',
|
||||
'xlw' => 'application/vnd.ms-excel',
|
||||
'eot' => 'application/vnd.ms-fontobject',
|
||||
'chm' => 'application/vnd.ms-htmlhelp',
|
||||
'ims' => 'application/vnd.ms-ims',
|
||||
'lrm' => 'application/vnd.ms-lrm',
|
||||
'ppt' => 'application/vnd.ms-powerpoint',
|
||||
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
||||
'pps' => 'application/vnd.ms-powerpoint',
|
||||
'pot' => 'application/vnd.ms-powerpoint',
|
||||
'mpp' => 'application/vnd.ms-project',
|
||||
'mpt' => 'application/vnd.ms-project',
|
||||
'wps' => 'application/vnd.ms-works',
|
||||
'wks' => 'application/vnd.ms-works',
|
||||
'wcm' => 'application/vnd.ms-works',
|
||||
'wdb' => 'application/vnd.ms-works',
|
||||
'wpl' => 'application/vnd.ms-wpl',
|
||||
'xps' => 'application/vnd.ms-xpsdocument',
|
||||
'mseq' => 'application/vnd.mseq',
|
||||
'mus' => 'application/vnd.musician',
|
||||
'nlu' => 'application/vnd.neurolanguage.nlu',
|
||||
'nnd' => 'application/vnd.noblenet-directory',
|
||||
'nns' => 'application/vnd.noblenet-sealer',
|
||||
'nnw' => 'application/vnd.noblenet-web',
|
||||
'ngdat' => 'application/vnd.nokia.n-gage.data',
|
||||
'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
|
||||
'rpst' => 'application/vnd.nokia.radio-preset',
|
||||
'rpss' => 'application/vnd.nokia.radio-presets',
|
||||
'edm' => 'application/vnd.novadigm.edm',
|
||||
'edx' => 'application/vnd.novadigm.edx',
|
||||
'ext' => 'application/vnd.novadigm.ext',
|
||||
'odc' => 'application/vnd.oasis.opendocument.chart',
|
||||
'otc' => 'application/vnd.oasis.opendocument.chart-template',
|
||||
'odf' => 'application/vnd.oasis.opendocument.formula',
|
||||
'otf' => 'application/vnd.oasis.opendocument.formula-template',
|
||||
'odg' => 'application/vnd.oasis.opendocument.graphics',
|
||||
'otg' => 'application/vnd.oasis.opendocument.graphics-template',
|
||||
'odi' => 'application/vnd.oasis.opendocument.image',
|
||||
'oti' => 'application/vnd.oasis.opendocument.image-template',
|
||||
'odp' => 'application/vnd.oasis.opendocument.presentation',
|
||||
'otp' => 'application/vnd.oasis.opendocument.presentation-template',
|
||||
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
|
||||
'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
|
||||
'odt' => 'application/vnd.oasis.opendocument.text',
|
||||
'otm' => 'application/vnd.oasis.opendocument.text-master',
|
||||
'ott' => 'application/vnd.oasis.opendocument.text-template',
|
||||
'oth' => 'application/vnd.oasis.opendocument.text-web',
|
||||
'xo' => 'application/vnd.olpc-sugar',
|
||||
'dd2' => 'application/vnd.oma.dd2+xml',
|
||||
'oxt' => 'application/vnd.openofficeorg.extension',
|
||||
'dp' => 'application/vnd.osgi.dp',
|
||||
'prc' => 'application/vnd.palm',
|
||||
'pdb' => 'application/vnd.palm',
|
||||
'pqa' => 'application/vnd.palm',
|
||||
'oprc' => 'application/vnd.palm',
|
||||
'str' => 'application/vnd.pg.format',
|
||||
'ei6' => 'application/vnd.pg.osasli',
|
||||
'efif' => 'application/vnd.picsel',
|
||||
'plf' => 'application/vnd.pocketlearn',
|
||||
'pbd' => 'application/vnd.powerbuilder6',
|
||||
'box' => 'application/vnd.previewsystems.box',
|
||||
'mgz' => 'application/vnd.proteus.magazine',
|
||||
'qps' => 'application/vnd.publishare-delta-tree',
|
||||
'ptid' => 'application/vnd.pvi.ptid1',
|
||||
'qxd' => 'application/vnd.quark.quarkxpress',
|
||||
'qxt' => 'application/vnd.quark.quarkxpress',
|
||||
'qwd' => 'application/vnd.quark.quarkxpress',
|
||||
'qwt' => 'application/vnd.quark.quarkxpress',
|
||||
'qxl' => 'application/vnd.quark.quarkxpress',
|
||||
'qxb' => 'application/vnd.quark.quarkxpress',
|
||||
'mxl' => 'application/vnd.recordare.musicxml',
|
||||
'rm' => 'application/vnd.rn-realmedia',
|
||||
'see' => 'application/vnd.seemail',
|
||||
'sema' => 'application/vnd.sema',
|
||||
'semd' => 'application/vnd.semd',
|
||||
'semf' => 'application/vnd.semf',
|
||||
'ifm' => 'application/vnd.shana.informed.formdata',
|
||||
'itp' => 'application/vnd.shana.informed.formtemplate',
|
||||
'iif' => 'application/vnd.shana.informed.interchange',
|
||||
'ipk' => 'application/vnd.shana.informed.package',
|
||||
'twd' => 'application/vnd.simtech-mindmapper',
|
||||
'twds' => 'application/vnd.simtech-mindmapper',
|
||||
'mmf' => 'application/vnd.smaf',
|
||||
'sdkm' => 'application/vnd.solent.sdkm+xml',
|
||||
'sdkd' => 'application/vnd.solent.sdkm+xml',
|
||||
'dxp' => 'application/vnd.spotfire.dxp',
|
||||
'sfs' => 'application/vnd.spotfire.sfs',
|
||||
'sus' => 'application/vnd.sus-calendar',
|
||||
'susp' => 'application/vnd.sus-calendar',
|
||||
'svd' => 'application/vnd.svd',
|
||||
'xsm' => 'application/vnd.syncml+xml',
|
||||
'bdm' => 'application/vnd.syncml.dm+wbxml',
|
||||
'xdm' => 'application/vnd.syncml.dm+xml',
|
||||
'tao' => 'application/vnd.tao.intent-module-archive',
|
||||
'tmo' => 'application/vnd.tmobile-livetv',
|
||||
'tpt' => 'application/vnd.trid.tpt',
|
||||
'mxs' => 'application/vnd.triscape.mxs',
|
||||
'tra' => 'application/vnd.trueapp',
|
||||
'ufd' => 'application/vnd.ufdl',
|
||||
'ufdl' => 'application/vnd.ufdl',
|
||||
'utz' => 'application/vnd.uiq.theme',
|
||||
'umj' => 'application/vnd.umajin',
|
||||
'unityweb' => 'application/vnd.unity',
|
||||
'uoml' => 'application/vnd.uoml+xml',
|
||||
'vcx' => 'application/vnd.vcx',
|
||||
'vsd' => 'application/vnd.visio',
|
||||
'vst' => 'application/vnd.visio',
|
||||
'vss' => 'application/vnd.visio',
|
||||
'vsw' => 'application/vnd.visio',
|
||||
'vis' => 'application/vnd.visionary',
|
||||
'vsf' => 'application/vnd.vsf',
|
||||
'wbxml' => 'application/vnd.wap.wbxml',
|
||||
'wmlc' => 'application/vnd.wap.wmlc',
|
||||
'wmlsc' => 'application/vnd.wap.wmlscriptc',
|
||||
'wtb' => 'application/vnd.webturbo',
|
||||
'wpd' => 'application/vnd.wordperfect',
|
||||
'wqd' => 'application/vnd.wqd',
|
||||
'stf' => 'application/vnd.wt.stf',
|
||||
'xar' => 'application/vnd.xara',
|
||||
'xfdl' => 'application/vnd.xfdl',
|
||||
'hvd' => 'application/vnd.yamaha.hv-dic',
|
||||
'hvs' => 'application/vnd.yamaha.hv-script',
|
||||
'hvp' => 'application/vnd.yamaha.hv-voice',
|
||||
'saf' => 'application/vnd.yamaha.smaf-audio',
|
||||
'spf' => 'application/vnd.yamaha.smaf-phrase',
|
||||
'cmp' => 'application/vnd.yellowriver-custom-menu',
|
||||
'zaz' => 'application/vnd.zzazz.deck+xml',
|
||||
'vxml' => 'application/voicexml+xml',
|
||||
'hlp' => 'application/winhlp',
|
||||
'wsdl' => 'application/wsdl+xml',
|
||||
'wspolicy' => 'application/wspolicy+xml',
|
||||
'ace' => 'application/x-ace-compressed',
|
||||
'bcpio' => 'application/x-bcpio',
|
||||
'torrent' => 'application/x-bittorrent',
|
||||
'bz' => 'application/x-bzip',
|
||||
'bz2' => 'application/x-bzip2',
|
||||
'boz' => 'application/x-bzip2',
|
||||
'vcd' => 'application/x-cdlink',
|
||||
'chat' => 'application/x-chat',
|
||||
'pgn' => 'application/x-chess-pgn',
|
||||
'cpio' => 'application/x-cpio',
|
||||
'csh' => 'application/x-csh',
|
||||
'dcr' => 'application/x-director',
|
||||
'dir' => 'application/x-director',
|
||||
'dxr' => 'application/x-director',
|
||||
'fgd' => 'application/x-director',
|
||||
'dvi' => 'application/x-dvi',
|
||||
'spl' => 'application/x-futuresplash',
|
||||
'gtar' => 'application/x-gtar',
|
||||
'hdf' => 'application/x-hdf',
|
||||
'jnlp' => 'application/x-java-jnlp-file',
|
||||
'latex' => 'application/x-latex',
|
||||
'wmd' => 'application/x-ms-wmd',
|
||||
'wmz' => 'application/x-ms-wmz',
|
||||
'mdb' => 'application/x-msaccess',
|
||||
'obd' => 'application/x-msbinder',
|
||||
'crd' => 'application/x-mscardfile',
|
||||
'clp' => 'application/x-msclip',
|
||||
'exe' => 'application/x-msdownload',
|
||||
'dll' => 'application/x-msdownload',
|
||||
'com' => 'application/x-msdownload',
|
||||
'bat' => 'application/x-msdownload',
|
||||
'msi' => 'application/x-msdownload',
|
||||
'mvb' => 'application/x-msmediaview',
|
||||
'm13' => 'application/x-msmediaview',
|
||||
'm14' => 'application/x-msmediaview',
|
||||
'wmf' => 'application/x-msmetafile',
|
||||
'mny' => 'application/x-msmoney',
|
||||
'pub' => 'application/x-mspublisher',
|
||||
'scd' => 'application/x-msschedule',
|
||||
'trm' => 'application/x-msterminal',
|
||||
'wri' => 'application/x-mswrite',
|
||||
'nc' => 'application/x-netcdf',
|
||||
'cdf' => 'application/x-netcdf',
|
||||
'p12' => 'application/x-pkcs12',
|
||||
'pfx' => 'application/x-pkcs12',
|
||||
'p7b' => 'application/x-pkcs7-certificates',
|
||||
'spc' => 'application/x-pkcs7-certificates',
|
||||
'p7r' => 'application/x-pkcs7-certreqresp',
|
||||
'rar' => 'application/x-rar-compressed',
|
||||
'sh' => 'application/x-sh',
|
||||
'shar' => 'application/x-shar',
|
||||
'swf' => 'application/x-shockwave-flash',
|
||||
'sit' => 'application/x-stuffit',
|
||||
'sitx' => 'application/x-stuffitx',
|
||||
'sv4cpio' => 'application/x-sv4cpio',
|
||||
'sv4crc' => 'application/x-sv4crc',
|
||||
'tar' => 'application/x-tar',
|
||||
'tcl' => 'application/x-tcl',
|
||||
'tex' => 'application/x-tex',
|
||||
'texinfo' => 'application/x-texinfo',
|
||||
'texi' => 'application/x-texinfo',
|
||||
'ustar' => 'application/x-ustar',
|
||||
'src' => 'application/x-wais-source',
|
||||
'der' => 'application/x-x509-ca-cert',
|
||||
'crt' => 'application/x-x509-ca-cert',
|
||||
'xenc' => 'application/xenc+xml',
|
||||
'xhtml' => 'application/xhtml+xml',
|
||||
'xht' => 'application/xhtml+xml',
|
||||
'xml' => 'application/xml',
|
||||
'xsl' => 'application/xml',
|
||||
'dtd' => 'application/xml-dtd',
|
||||
'xop' => 'application/xop+xml',
|
||||
'xslt' => 'application/xslt+xml',
|
||||
'xspf' => 'application/xspf+xml',
|
||||
'mxml' => 'application/xv+xml',
|
||||
'xhvml' => 'application/xv+xml',
|
||||
'xvml' => 'application/xv+xml',
|
||||
'xvm' => 'application/xv+xml',
|
||||
'zip' => 'application/zip',
|
||||
'au' => 'audio/basic',
|
||||
'snd' => 'audio/basic',
|
||||
'mid' => 'audio/midi',
|
||||
'midi' => 'audio/midi',
|
||||
'kar' => 'audio/midi',
|
||||
'rmi' => 'audio/midi',
|
||||
'mp4a' => 'audio/mp4',
|
||||
'm4a' => 'audio/mp4a-latm',
|
||||
'm4p' => 'audio/mp4a-latm',
|
||||
'mpga' => 'audio/mpeg',
|
||||
'mp2' => 'audio/mpeg',
|
||||
'mp2a' => 'audio/mpeg',
|
||||
'mp3' => 'audio/mpeg',
|
||||
'm2a' => 'audio/mpeg',
|
||||
'm3a' => 'audio/mpeg',
|
||||
'eol' => 'audio/vnd.digital-winds',
|
||||
'lvp' => 'audio/vnd.lucent.voice',
|
||||
'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
|
||||
'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
|
||||
'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
|
||||
'wav' => 'audio/wav',
|
||||
'aif' => 'audio/x-aiff',
|
||||
'aiff' => 'audio/x-aiff',
|
||||
'aifc' => 'audio/x-aiff',
|
||||
'm3u' => 'audio/x-mpegurl',
|
||||
'wax' => 'audio/x-ms-wax',
|
||||
'wma' => 'audio/x-ms-wma',
|
||||
'ram' => 'audio/x-pn-realaudio',
|
||||
'ra' => 'audio/x-pn-realaudio',
|
||||
'rmp' => 'audio/x-pn-realaudio-plugin',
|
||||
'cdx' => 'chemical/x-cdx',
|
||||
'cif' => 'chemical/x-cif',
|
||||
'cmdf' => 'chemical/x-cmdf',
|
||||
'cml' => 'chemical/x-cml',
|
||||
'csml' => 'chemical/x-csml',
|
||||
'xyz' => 'chemical/x-xyz',
|
||||
'bmp' => 'image/bmp',
|
||||
'cgm' => 'image/cgm',
|
||||
'g3' => 'image/g3fax',
|
||||
'gif' => 'image/gif',
|
||||
'ief' => 'image/ief',
|
||||
'jp2' => 'image/jp2',
|
||||
'jpeg' => 'image/jpeg',
|
||||
'jpe' => 'image/jpeg',
|
||||
'jpg' => 'image/jpeg',
|
||||
'pict' => 'image/pict',
|
||||
'pic' => 'image/pict',
|
||||
'pct' => 'image/pict',
|
||||
'png' => 'image/png',
|
||||
'btif' => 'image/prs.btif',
|
||||
'svg' => 'image/svg+xml',
|
||||
'svgz' => 'image/svg+xml',
|
||||
'tiff' => 'image/tiff',
|
||||
'tif' => 'image/tiff',
|
||||
'psd' => 'image/vnd.adobe.photoshop',
|
||||
'djvu' => 'image/vnd.djvu',
|
||||
'djv' => 'image/vnd.djvu',
|
||||
'dwg' => 'image/vnd.dwg',
|
||||
'dxf' => 'image/vnd.dxf',
|
||||
'fbs' => 'image/vnd.fastbidsheet',
|
||||
'fpx' => 'image/vnd.fpx',
|
||||
'fst' => 'image/vnd.fst',
|
||||
'mmr' => 'image/vnd.fujixerox.edmics-mmr',
|
||||
'rlc' => 'image/vnd.fujixerox.edmics-rlc',
|
||||
'ico' => 'image/vnd.microsoft.icon',
|
||||
'mdi' => 'image/vnd.ms-modi',
|
||||
'npx' => 'image/vnd.net-fpx',
|
||||
'wbmp' => 'image/vnd.wap.wbmp',
|
||||
'xif' => 'image/vnd.xiff',
|
||||
'ras' => 'image/x-cmu-raster',
|
||||
'cmx' => 'image/x-cmx',
|
||||
'pntg' => 'image/x-macpaint',
|
||||
'pnt' => 'image/x-macpaint',
|
||||
'mac' => 'image/x-macpaint',
|
||||
'pcx' => 'image/x-pcx',
|
||||
'pnm' => 'image/x-portable-anymap',
|
||||
'pbm' => 'image/x-portable-bitmap',
|
||||
'pgm' => 'image/x-portable-graymap',
|
||||
'ppm' => 'image/x-portable-pixmap',
|
||||
'qtif' => 'image/x-quicktime',
|
||||
'qti' => 'image/x-quicktime',
|
||||
'rgb' => 'image/x-rgb',
|
||||
'xbm' => 'image/x-xbitmap',
|
||||
'xpm' => 'image/x-xpixmap',
|
||||
'xwd' => 'image/x-xwindowdump',
|
||||
'eml' => 'message/rfc822',
|
||||
'mime' => 'message/rfc822',
|
||||
'igs' => 'model/iges',
|
||||
'iges' => 'model/iges',
|
||||
'msh' => 'model/mesh',
|
||||
'mesh' => 'model/mesh',
|
||||
'silo' => 'model/mesh',
|
||||
'dwf' => 'model/vnd.dwf',
|
||||
'gdl' => 'model/vnd.gdl',
|
||||
'gtw' => 'model/vnd.gtw',
|
||||
'mts' => 'model/vnd.mts',
|
||||
'vtu' => 'model/vnd.vtu',
|
||||
'wrl' => 'model/vrml',
|
||||
'vrml' => 'model/vrml',
|
||||
'ics' => 'text/calendar',
|
||||
'ifb' => 'text/calendar',
|
||||
'css' => 'text/css',
|
||||
'csv' => 'text/csv',
|
||||
'html' => 'text/html',
|
||||
'htm' => 'text/html',
|
||||
'txt' => 'text/plain',
|
||||
'text' => 'text/plain',
|
||||
'conf' => 'text/plain',
|
||||
'def' => 'text/plain',
|
||||
'list' => 'text/plain',
|
||||
'log' => 'text/plain',
|
||||
'in' => 'text/plain',
|
||||
'dsc' => 'text/prs.lines.tag',
|
||||
'rtx' => 'text/richtext',
|
||||
'sgml' => 'text/sgml',
|
||||
'sgm' => 'text/sgml',
|
||||
'tsv' => 'text/tab-separated-values',
|
||||
't' => 'text/troff',
|
||||
'tr' => 'text/troff',
|
||||
'roff' => 'text/troff',
|
||||
'man' => 'text/troff',
|
||||
'me' => 'text/troff',
|
||||
'ms' => 'text/troff',
|
||||
'uri' => 'text/uri-list',
|
||||
'uris' => 'text/uri-list',
|
||||
'urls' => 'text/uri-list',
|
||||
'fly' => 'text/vnd.fly',
|
||||
'flx' => 'text/vnd.fmi.flexstor',
|
||||
'3dml' => 'text/vnd.in3d.3dml',
|
||||
'spot' => 'text/vnd.in3d.spot',
|
||||
'jad' => 'text/vnd.sun.j2me.app-descriptor',
|
||||
'wml' => 'text/vnd.wap.wml',
|
||||
'wmls' => 'text/vnd.wap.wmlscript',
|
||||
's' => 'text/x-asm',
|
||||
'asm' => 'text/x-asm',
|
||||
'c' => 'text/x-c',
|
||||
'cc' => 'text/x-c',
|
||||
'cxx' => 'text/x-c',
|
||||
'cpp' => 'text/x-c',
|
||||
'h' => 'text/x-c',
|
||||
'hh' => 'text/x-c',
|
||||
'dic' => 'text/x-c',
|
||||
'f' => 'text/x-fortran',
|
||||
'for' => 'text/x-fortran',
|
||||
'f77' => 'text/x-fortran',
|
||||
'f90' => 'text/x-fortran',
|
||||
'p' => 'text/x-pascal',
|
||||
'pas' => 'text/x-pascal',
|
||||
'java' => 'text/x-java-source',
|
||||
'etx' => 'text/x-setext',
|
||||
'uu' => 'text/x-uuencode',
|
||||
'vcs' => 'text/x-vcalendar',
|
||||
'vcf' => 'text/x-vcard',
|
||||
'3gp' => 'video/3gpp',
|
||||
'3g2' => 'video/3gpp2',
|
||||
'h261' => 'video/h261',
|
||||
'h263' => 'video/h263',
|
||||
'h264' => 'video/h264',
|
||||
'jpgv' => 'video/jpeg',
|
||||
'jpm' => 'video/jpm',
|
||||
'jpgm' => 'video/jpm',
|
||||
'mj2' => 'video/mj2',
|
||||
'mjp2' => 'video/mj2',
|
||||
'mp4' => 'video/mp4',
|
||||
'mp4v' => 'video/mp4',
|
||||
'mpg4' => 'video/mp4',
|
||||
'm4v' => 'video/mp4',
|
||||
'mpeg' => 'video/mpeg',
|
||||
'mpg' => 'video/mpeg',
|
||||
'mpe' => 'video/mpeg',
|
||||
'm1v' => 'video/mpeg',
|
||||
'm2v' => 'video/mpeg',
|
||||
'qt' => 'video/quicktime',
|
||||
'mov' => 'video/quicktime',
|
||||
'fvt' => 'video/vnd.fvt',
|
||||
'mxu' => 'video/vnd.mpegurl',
|
||||
'm4u' => 'video/vnd.mpegurl',
|
||||
'viv' => 'video/vnd.vivo',
|
||||
'dv' => 'video/x-dv',
|
||||
'dif' => 'video/x-dv',
|
||||
'fli' => 'video/x-fli',
|
||||
'asx' => 'video/x-ms-asf',
|
||||
'wm' => 'video/x-ms-wm',
|
||||
'wmv' => 'video/x-ms-wmv',
|
||||
'wmx' => 'video/x-ms-wmx',
|
||||
'wvx' => 'video/x-ms-wvx',
|
||||
'avi' => 'video/x-msvideo',
|
||||
'movie' => 'video/x-sgi-movie',
|
||||
'ice' => 'x-conference/x-cooltalk',
|
||||
];
|
||||
|
||||
/**
|
||||
* Returns extensions for given mimes types
|
||||
*
|
||||
* @param array $mimesTypes The mimes types, e.g. ['video/mpeg', 'image/jpeg']
|
||||
* @param bool $asUpperCase (optional) If is set to true, extensions are returned as upper case. Otherwise - lower
|
||||
* case.
|
||||
* @return array
|
||||
*/
|
||||
public static function getExtensions(array $mimesTypes, $asUpperCase = false)
|
||||
{
|
||||
if (empty($mimesTypes)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$extensions = [];
|
||||
|
||||
foreach ($mimesTypes as $mimeType) {
|
||||
$extension = self::getExtension($mimeType);
|
||||
|
||||
/*
|
||||
* No extension for given mime type?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($extension)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Extensions should be returned as upper case?
|
||||
*/
|
||||
if ($asUpperCase) {
|
||||
if (is_array($extension)) {
|
||||
array_walk($extension, function (&$value) {
|
||||
$value = strtoupper($value);
|
||||
});
|
||||
} else {
|
||||
$extension = strtoupper($extension);
|
||||
}
|
||||
}
|
||||
|
||||
$extensions[$mimeType] = $extension;
|
||||
}
|
||||
|
||||
return $extensions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns extension for given mime type
|
||||
*
|
||||
* @param string $mimeType The mime type, e.g. "video/mpeg"
|
||||
* @return string|array
|
||||
*/
|
||||
public static function getExtension($mimeType)
|
||||
{
|
||||
if (is_string($mimeType) && in_array($mimeType, self::$mimeTypes)) {
|
||||
$data = Arrays::setKeysAsValues(self::$mimeTypes, false);
|
||||
|
||||
return $data[$mimeType];
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information whether file with the given path is an image
|
||||
*
|
||||
* @param string $path Path of the file to check
|
||||
* @return bool
|
||||
*/
|
||||
public static function isImagePath($path)
|
||||
{
|
||||
$mimeType = self::getMimeType($path);
|
||||
|
||||
return self::isImage($mimeType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns mime type of given file
|
||||
*
|
||||
* @param string $filePath Path of the file to check
|
||||
* @throws \RuntimeException
|
||||
* @return string
|
||||
*/
|
||||
public static function getMimeType($filePath)
|
||||
{
|
||||
/*
|
||||
* The file does not exist?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($filePath) || !is_readable($filePath)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
/*
|
||||
* 1st possibility: the finfo class
|
||||
*/
|
||||
if (class_exists('finfo')) {
|
||||
$finfo = new \finfo();
|
||||
|
||||
return $finfo->file($filePath, FILEINFO_MIME_TYPE);
|
||||
}
|
||||
|
||||
/*
|
||||
* 2nd possibility: the mime_content_type function
|
||||
*/
|
||||
if (function_exists('mime_content_type')) {
|
||||
return mime_content_type($filePath);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, there is no possibility to read the mime type
|
||||
*/
|
||||
$template = 'Neither \'finfo\' class nor \'mime_content_type\' function exists. There is no way to read the'
|
||||
. ' mime type of file \'%s\'.';
|
||||
|
||||
$message = sprintf($template, $filePath);
|
||||
throw new \RuntimeException($message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information whether the given file type is an image
|
||||
*
|
||||
* @param string $mimeType The mime type of file
|
||||
* @return bool
|
||||
*/
|
||||
public static function isImage($mimeType)
|
||||
{
|
||||
if (in_array($mimeType, self::$mimeTypes)) {
|
||||
return (bool)preg_match('|^image/.+$|', $mimeType);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,235 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use Doctrine\ORM\EntityRepository;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
|
||||
/**
|
||||
* Useful methods for repository
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Repository
|
||||
{
|
||||
/**
|
||||
* Name of key responsible for sorting/position of an item in array
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const POSITION_KEY = 'position';
|
||||
|
||||
/**
|
||||
* Replenishes positions of given items
|
||||
*
|
||||
* @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays
|
||||
* @param bool $asLast (optional) If is set to true, items are placed at the end (default behaviour). Otherwise -
|
||||
* at top.
|
||||
* @param bool $force (optional) If is set to true, positions are set even there is no extreme position.
|
||||
* Otherwise - if extreme position is unknown (is null) replenishment is stopped / skipped
|
||||
* (default behaviour).
|
||||
*/
|
||||
public static function replenishPositions(array &$items, $asLast = true, $force = false)
|
||||
{
|
||||
$position = self::getExtremePosition($items, $asLast);
|
||||
|
||||
/*
|
||||
* Extreme position is unknown, but it's required?
|
||||
* Use 0 as default/start value
|
||||
*/
|
||||
if (null === $position && $force) {
|
||||
$position = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Extreme position is unknown or there are no items to sort?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (null === $position || empty($items)) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($items as &$item) {
|
||||
/*
|
||||
* The item is not sortable?
|
||||
*/
|
||||
if (!self::isSortable($item)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Position has been set?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (self::isSorted($item)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate position
|
||||
*/
|
||||
if ($asLast) {
|
||||
++$position;
|
||||
} else {
|
||||
--$position;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's an object?
|
||||
* Use proper method to set position
|
||||
*/
|
||||
if (is_object($item)) {
|
||||
$item->setPosition($position);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's an array
|
||||
* Use proper key to set position
|
||||
*/
|
||||
$item[static::POSITION_KEY] = $position;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns extreme position (max or min) of given items
|
||||
*
|
||||
* @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays
|
||||
* @param bool $max (optional) If is set to true, maximum value is returned. Otherwise - minimum.
|
||||
* @return int
|
||||
*/
|
||||
public static function getExtremePosition(array $items, $max = true)
|
||||
{
|
||||
/*
|
||||
* No items?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($items)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$extreme = null;
|
||||
|
||||
foreach ($items as $item) {
|
||||
/*
|
||||
* The item is not sortable?
|
||||
*/
|
||||
if (!self::isSortable($item)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$position = null;
|
||||
|
||||
/*
|
||||
* Let's grab the position
|
||||
*/
|
||||
if (is_object($item)) {
|
||||
$position = $item->getPosition();
|
||||
} elseif (array_key_exists(static::POSITION_KEY, $item)) {
|
||||
$position = $item[static::POSITION_KEY];
|
||||
}
|
||||
|
||||
/*
|
||||
* Maximum value is expected?
|
||||
*/
|
||||
if ($max) {
|
||||
/*
|
||||
* Position was found and it's larger than previously found position (the extreme position)?
|
||||
*/
|
||||
if (null === $extreme || (null !== $position && $position > $extreme)) {
|
||||
$extreme = $position;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Minimum value is expected here.
|
||||
* Position was found and it's smaller than previously found position (the extreme position)?
|
||||
*/
|
||||
if (null === $extreme || (null !== $position && $position < $extreme)) {
|
||||
$extreme = $position;
|
||||
}
|
||||
}
|
||||
|
||||
return $extreme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns query builder for given entity's repository.
|
||||
* The entity should contain given property, e.g. "name".
|
||||
*
|
||||
* @param EntityRepository $repository Repository of the entity
|
||||
* @param string $property (optional) Name of property used by the ORDER BY clause
|
||||
* @param string $direction (optional) Direction used by the ORDER BY clause ("ASC" or "DESC")
|
||||
* @return QueryBuilder
|
||||
*/
|
||||
public static function getEntityOrderedQueryBuilder(
|
||||
EntityRepository $repository,
|
||||
$property = 'name',
|
||||
$direction = 'ASC'
|
||||
) {
|
||||
$alias = 'qb';
|
||||
|
||||
return $repository
|
||||
->createQueryBuilder($alias)
|
||||
->orderBy(sprintf('%s.%s', $alias, $property), $direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given item is sortable
|
||||
*
|
||||
* Sortable means it's an:
|
||||
* - array
|
||||
* or
|
||||
* - object and has getPosition() and setPosition()
|
||||
*
|
||||
* @param mixed $item An item to verify (object who has "getPosition()" and "setPosition()" methods or an array)
|
||||
* @return bool
|
||||
*/
|
||||
private static function isSortable($item)
|
||||
{
|
||||
return is_array($item)
|
||||
||
|
||||
(
|
||||
is_object($item)
|
||||
&&
|
||||
Reflection::hasMethod($item, 'getPosition')
|
||||
&&
|
||||
Reflection::hasMethod($item, 'setPosition')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given item is sorted (position has been set)
|
||||
*
|
||||
* @param mixed $item An item to verify (object who has "getPosition()" and "setPosition()" methods or an array)
|
||||
* @return bool
|
||||
*/
|
||||
private static function isSorted($item)
|
||||
{
|
||||
/*
|
||||
* Given item is not sortable?
|
||||
*/
|
||||
if (!self::isSortable($item)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's an object or it's an array
|
||||
* and position has been set?
|
||||
*/
|
||||
|
||||
return
|
||||
(is_object($item) && null !== $item->getPosition())
|
||||
||
|
||||
(is_array($item) && isset($item[static::POSITION_KEY]));
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Date;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while type of date part, e.g. "year", is unknown
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownDatePartTypeExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(UnknownDatePartTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $unknownDatePart Type of date part, e.g. "year". One of DatePartType class constants.
|
||||
* @param string $value Incorrect value
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideDatePartAndValue
|
||||
*/
|
||||
public function testMessage($unknownDatePart, $value, $expectedMessage)
|
||||
{
|
||||
$exception = UnknownDatePartTypeException::createException($unknownDatePart, $value);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type of date part, incorrect value and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideDatePartAndValue()
|
||||
{
|
||||
$template = 'The \'%s\' type of date part (with value %s) is unknown. Probably doesn\'t exist or there is a'
|
||||
. ' typo. You should use one of these types: day, hour, minute, month, second, year.';
|
||||
|
||||
yield[
|
||||
DatePartType::DAY,
|
||||
'44',
|
||||
sprintf($template, DatePartType::DAY, '44'),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePartType::MONTH,
|
||||
'22',
|
||||
sprintf($template, DatePartType::MONTH, '22'),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePartType::MINUTE,
|
||||
'77',
|
||||
sprintf($template, DatePartType::MINUTE, '77'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\File;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\File\EmptyFileException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while file with given path is empty (has no content)
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFileExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(EmptyFileException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $emptyFilePath Path of the empty file
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider providePathOfFile
|
||||
*/
|
||||
public function testMessage($emptyFilePath, $expectedMessage)
|
||||
{
|
||||
$exception = EmptyFileException::create($emptyFilePath);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of the empty file and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function providePathOfFile()
|
||||
{
|
||||
$template = 'File with path \'%s\' is empty (has no content). Did you provide path of proper file?';
|
||||
|
||||
yield[
|
||||
'aa/bb/cc',
|
||||
sprintf($template, 'aa/bb/cc'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'images/show/car.jpg',
|
||||
sprintf($template, 'images/show/car.jpg'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\File;
|
||||
|
||||
use Meritoo\Common\Exception\File\EmptyFilePathException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while path of given file is empty
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFilePathExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(EmptyFilePathException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
public function testConstructorMessage()
|
||||
{
|
||||
$exception = EmptyFilePathException::create();
|
||||
static::assertEquals('Path of the file is empty. Did you provide path of proper file?', $exception->getMessage());
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\File;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\File\NotExistingFileException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while file with given path does not exist
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class NotExistingFileExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(NotExistingFileException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $notExistingFilePath Path of not existing (or not readable) file
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider providePathOfFile
|
||||
*/
|
||||
public function testConstructorMessage($notExistingFilePath, $expectedMessage)
|
||||
{
|
||||
$exception = NotExistingFileException::create($notExistingFilePath);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of not existing file and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function providePathOfFile()
|
||||
{
|
||||
$template = 'File with path \'%s\' does not exist (or is not readable). Did you provide path of proper file?';
|
||||
|
||||
yield[
|
||||
'aa/bb/cc',
|
||||
sprintf($template, 'aa/bb/cc'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'images/show/car.jpg',
|
||||
sprintf($template, 'images/show/car.jpg'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Method;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Method\DisabledMethodException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while method cannot be called, because is disabled
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DisabledMethodExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(DisabledMethodException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $disabledMethod Name of the disabled method
|
||||
* @param string $alternativeMethod Name of the alternative method
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @internal param string $emptyFilePath Path of the empty file
|
||||
* @dataProvider provideMethodsNames
|
||||
*/
|
||||
public function testConstructorMessage($disabledMethod, $alternativeMethod, $expectedMessage)
|
||||
{
|
||||
$exception = DisabledMethodException::create($disabledMethod, $alternativeMethod);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides name of the disabled method, name of the alternative method and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideMethodsNames()
|
||||
{
|
||||
$templateShort = 'Method %s() cannot be called, because is disabled.';
|
||||
$templateLong = $templateShort . ' Use %s() instead.';
|
||||
|
||||
yield[
|
||||
'FooBar::loremIpsum',
|
||||
'',
|
||||
sprintf($templateShort, 'FooBar::loremIpsum'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'FooBar::loremIpsum',
|
||||
'AnotherClass::alternativeMethod',
|
||||
sprintf($templateLong, 'FooBar::loremIpsum', 'AnotherClass::alternativeMethod'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Reflection;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while name of class or trait cannot be resolved
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class CannotResolveClassNameExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(CannotResolveClassNameException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|object|string $source Source of the class's / trait's name. It can be an array of objects,
|
||||
* namespaces, object or namespace.
|
||||
* @param bool $forClass If is set to true, message of this exception for class is prepared.
|
||||
* Otherwise - for trait.
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideClassName
|
||||
*/
|
||||
public function testConstructorMessage($source, $forClass, $expectedMessage)
|
||||
{
|
||||
$exception = CannotResolveClassNameException::create($source, $forClass);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides source of the class's / trait's name, information if message of this exception should be prepared for
|
||||
* class and the expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideClassName()
|
||||
{
|
||||
yield[
|
||||
'Not\Existing\Class',
|
||||
true,
|
||||
'Name of class from given \'string\' Not\Existing\Class cannot be resolved. Is there everything ok?',
|
||||
];
|
||||
|
||||
yield[
|
||||
'Not\Existing\Trait',
|
||||
false,
|
||||
'Name of trait from given \'string\' Not\Existing\Trait cannot be resolved. Is there everything ok?',
|
||||
];
|
||||
|
||||
yield[
|
||||
[
|
||||
new \stdClass(),
|
||||
new \stdClass(),
|
||||
],
|
||||
true,
|
||||
'Name of class from given \'array\' cannot be resolved. Is there everything ok?',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Reflection;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while given class has no child classes
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class MissingChildClassesExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(MissingChildClassesException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|object|string $parentClass Class that hasn't child classes, but it should. An array of objects,
|
||||
* strings, object or string.
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideParentClass
|
||||
*/
|
||||
public function testConstructorMessage($parentClass, $expectedMessage)
|
||||
{
|
||||
$exception = MissingChildClassesException::create($parentClass);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides name of class that hasn't child classes, but it should, and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideParentClass()
|
||||
{
|
||||
$template = 'The \'%s\' class requires one child class at least who will extend her (maybe is an abstract'
|
||||
. ' class), but the child classes are missing. Did you forget to extend this class?';
|
||||
|
||||
yield[
|
||||
MissingChildClassesException::class,
|
||||
sprintf($template, MissingChildClassesException::class),
|
||||
];
|
||||
|
||||
yield[
|
||||
[
|
||||
new \stdClass(),
|
||||
new \stdClass(),
|
||||
],
|
||||
sprintf($template, \stdClass::class),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Reflection;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Reflection\TooManyChildClassesException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while given class has more than one child class
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class TooManyChildClassesExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(TooManyChildClassesException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|object|string $parentClass Class that has more than one child class, but it shouldn't. An array
|
||||
* of objects, strings, object or string.
|
||||
* @param array $childClasses Child classes
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideParentAndChildClasses
|
||||
*/
|
||||
public function testConstructorMessage($parentClass, array $childClasses, $expectedMessage)
|
||||
{
|
||||
$exception = TooManyChildClassesException::create($parentClass, $childClasses);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides name of class that has more than one child class, but it shouldn't, child classes, and expected
|
||||
* exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideParentAndChildClasses()
|
||||
{
|
||||
$template = "The '%s' class requires one child class at most who will extend her, but more than one child"
|
||||
. " class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
|
||||
|
||||
yield[
|
||||
BaseTestCase::class,
|
||||
[
|
||||
\stdClass::class,
|
||||
OopVisibilityType::class,
|
||||
],
|
||||
sprintf($template, BaseTestCase::class, implode("\n- ", [
|
||||
\stdClass::class,
|
||||
OopVisibilityType::class,
|
||||
]), BaseTestCase::class),
|
||||
];
|
||||
|
||||
yield[
|
||||
TooManyChildClassesException::class,
|
||||
[
|
||||
\stdClass::class,
|
||||
],
|
||||
sprintf($template, TooManyChildClassesException::class, implode("\n- ", [\stdClass::class]), TooManyChildClassesException::class),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Regex;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while length of given hexadecimal value of color is incorrect
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class IncorrectColorHexLengthExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(IncorrectColorHexLengthException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $color Incorrect hexadecimal value of color
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideColor
|
||||
*/
|
||||
public function testConstructorMessage($color, $expectedMessage)
|
||||
{
|
||||
$exception = IncorrectColorHexLengthException::create($color);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides incorrect hexadecimal value of color and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideColor()
|
||||
{
|
||||
$template = 'Length of hexadecimal value of color \'%s\' is incorrect. It\'s %d, but it should be 3 or 6. Is there everything ok?';
|
||||
|
||||
yield[
|
||||
'',
|
||||
sprintf($template, '', strlen('')),
|
||||
];
|
||||
|
||||
yield[
|
||||
'aa-bb-cc',
|
||||
sprintf($template, 'aa-bb-cc', strlen('aa-bb-cc')),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Regex;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while given hexadecimal value of color is invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidColorHexValueExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(InvalidColorHexValueException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $color Invalid hexadecimal value of color
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideColor
|
||||
*/
|
||||
public function testConstructorMessage($color, $expectedMessage)
|
||||
{
|
||||
$exception = InvalidColorHexValueException::create($color);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides invalid hexadecimal value of color and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideColor()
|
||||
{
|
||||
$template = 'Hexadecimal value of color \'%s\' is invalid. Is there everything ok?';
|
||||
|
||||
yield[
|
||||
'',
|
||||
sprintf($template, ''),
|
||||
];
|
||||
|
||||
yield[
|
||||
'aa-bb-cc',
|
||||
sprintf($template, 'aa-bb-cc'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Regex;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Regex\InvalidHtmlAttributesException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while html attributes are invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidHtmlAttributesExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(InvalidHtmlAttributesException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $htmlAttributes Invalid html attributes
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideHtmlAttributes
|
||||
*/
|
||||
public function testConstructorMessage($htmlAttributes, $expectedMessage)
|
||||
{
|
||||
$exception = InvalidHtmlAttributesException::create($htmlAttributes);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides html attributes
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideHtmlAttributes()
|
||||
{
|
||||
$template = 'HTML attributes \'%s\' are invalid. Is there everything ok?';
|
||||
|
||||
yield[
|
||||
'abc = def',
|
||||
sprintf($template, 'abc = def'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'abc = def ghi = jkl',
|
||||
sprintf($template, 'abc = def ghi = jkl'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'abc=def ghi=jkl',
|
||||
sprintf($template, 'abc=def ghi=jkl'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Regex;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Regex\InvalidUrlException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while url is invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidUrlExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(InvalidUrlException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $url Invalid url
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideUrl
|
||||
*/
|
||||
public function testConstructorMessage($url, $expectedMessage)
|
||||
{
|
||||
$exception = InvalidUrlException::create($url);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides invalid url and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideUrl()
|
||||
{
|
||||
$template = 'Url \'%s\' is invalid. Is there everything ok?';
|
||||
|
||||
yield[
|
||||
'aa/bb/cc',
|
||||
sprintf($template, 'aa/bb/cc'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'http:/images\show\car.jpg',
|
||||
sprintf($template, 'http:/images\show\car.jpg'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Type;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is
|
||||
* unknown
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownOopVisibilityTypeExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(UnknownOopVisibilityTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $unknownType Unknown OOP-related visibility
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideUnknownType
|
||||
*/
|
||||
public function testConstructorMessage($unknownType, $expectedMessage)
|
||||
{
|
||||
$exception = UnknownOopVisibilityTypeException::createException($unknownType);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of the empty file and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideUnknownType()
|
||||
{
|
||||
$allTypes = (new OopVisibilityType())->getAll();
|
||||
|
||||
$template = 'The \'%s\' type of OOP-related visibility is unknown. Probably doesn\'t exist or there is a typo.'
|
||||
. ' You should use one of these types: %s.';
|
||||
|
||||
yield[
|
||||
'',
|
||||
sprintf($template, '', implode(', ', $allTypes)),
|
||||
];
|
||||
|
||||
yield[
|
||||
123,
|
||||
sprintf($template, 123, implode(', ', $allTypes)),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -9,35 +9,34 @@
|
||||
namespace Meritoo\Common\Test\Collection;
|
||||
|
||||
use ArrayIterator;
|
||||
use Generator;
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of the collection of elements
|
||||
* Tests of the collection of elements.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class CollectionTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* An empty collection
|
||||
* An empty collection.
|
||||
*
|
||||
* @var Collection
|
||||
*/
|
||||
private $emptyCollection;
|
||||
|
||||
/**
|
||||
* Simple collection
|
||||
* Simple collection.
|
||||
*
|
||||
* @var Collection
|
||||
*/
|
||||
private $simpleCollection;
|
||||
|
||||
/**
|
||||
* Elements of simple collection
|
||||
* Elements of simple collection.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
@@ -130,39 +129,22 @@ class CollectionTest extends BaseTestCase
|
||||
static::assertInstanceOf(ArrayIterator::class, $this->simpleCollection->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $element The element to add
|
||||
* @param int $expectedCount Expected count of elements in collection
|
||||
* @param int $expectedIndex Expected index of added element in collection
|
||||
* @param Collection $collection The collection
|
||||
*
|
||||
* @dataProvider provideElementToAdd
|
||||
*/
|
||||
public function testAddWithoutIndex($element, $expectedCount, $expectedIndex, Collection $collection)
|
||||
public function testAdd()
|
||||
{
|
||||
$collection->add($element);
|
||||
$this->emptyCollection->add('test1');
|
||||
|
||||
static::assertTrue($collection->has($element));
|
||||
static::assertEquals($expectedCount, $collection->count());
|
||||
static::assertEquals($element, $collection[$expectedIndex]);
|
||||
static::assertTrue($this->emptyCollection->has('test1'));
|
||||
static::assertEquals(1, $this->emptyCollection->count());
|
||||
static::assertEquals('test1', $this->emptyCollection[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $element The element to add
|
||||
* @param mixed $index Index of element to add
|
||||
* @param int $expectedCount Expected count of elements in collection
|
||||
* @param int $expectedIndex Expected index of added element in collection
|
||||
* @param Collection $collection The collection
|
||||
*
|
||||
* @dataProvider provideElementToAddWithIndex
|
||||
*/
|
||||
public function testAddWithIndex($element, $index, $expectedCount, $expectedIndex, Collection $collection)
|
||||
public function testAddWithIndex()
|
||||
{
|
||||
$collection->add($element, $index);
|
||||
$this->emptyCollection->add('test2', 1234);
|
||||
|
||||
static::assertTrue($collection->has($element));
|
||||
static::assertEquals($expectedCount, $collection->count());
|
||||
static::assertEquals($element, $collection[$expectedIndex]);
|
||||
static::assertTrue($this->emptyCollection->has('test2'));
|
||||
static::assertEquals(1, $this->emptyCollection->count());
|
||||
static::assertEquals('test2', $this->emptyCollection[1234]);
|
||||
}
|
||||
|
||||
public function testAddMultipleUsingEmptyArray()
|
||||
@@ -324,88 +306,7 @@ class CollectionTest extends BaseTestCase
|
||||
|
||||
public function testExistsVisibilityAndArguments()
|
||||
{
|
||||
static::assertMethodVisibilityAndArguments(Collection::class, 'exists', OopVisibilityType::IS_PRIVATE, 1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides element to add to collection
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideElementToAdd()
|
||||
{
|
||||
$collection = new Collection();
|
||||
|
||||
yield[
|
||||
'test1',
|
||||
1,
|
||||
0,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test2',
|
||||
2,
|
||||
1,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test3',
|
||||
3,
|
||||
2,
|
||||
$collection,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides element with index to add to collection
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideElementToAddWithIndex()
|
||||
{
|
||||
$collection = new Collection();
|
||||
|
||||
yield[
|
||||
'test1',
|
||||
'aa',
|
||||
1,
|
||||
'aa',
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test2',
|
||||
'oo',
|
||||
2,
|
||||
'oo',
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test3',
|
||||
null,
|
||||
3,
|
||||
0,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test4',
|
||||
'',
|
||||
4,
|
||||
1,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test5',
|
||||
'vv',
|
||||
5,
|
||||
'vv',
|
||||
$collection,
|
||||
];
|
||||
$this->verifyMethodVisibilityAndArguments(Collection::class, 'exists', OopVisibilityType::IS_PRIVATE, 1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -9,23 +9,17 @@
|
||||
namespace Meritoo\Common\Test\Exception\Base;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
use PHPUnit_Framework_TestCase;
|
||||
|
||||
/**
|
||||
* Test case of the exception used while type of something is unknown
|
||||
* Tests of the exception used while type of something is unknown.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class UnknownTypeExceptionTest extends BaseTestCase
|
||||
class UnknownTypeExceptionTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(UnknownTestTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
public function testWithoutException()
|
||||
{
|
||||
self::assertEquals('Test 2', (new TestService())->getTranslatedType('test_2'));
|
||||
@@ -33,16 +27,16 @@ class UnknownTypeExceptionTest extends BaseTestCase
|
||||
|
||||
public function testTheException()
|
||||
{
|
||||
$this->setExpectedException(UnknownTestTypeException::class);
|
||||
$this->expectException(UnknownTestTypeException::class);
|
||||
self::assertEmpty((new TestService())->getTranslatedType('test_3'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Type of something (for testing purposes)
|
||||
* Type of something (for testing purposes).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TestType extends BaseType
|
||||
{
|
||||
@@ -52,42 +46,40 @@ class TestType extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* An exception used while type of something is unknown (for testing purposes)
|
||||
* An exception used while type of something is unknown (for testing purposes).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class UnknownTestTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string $unknownType The unknown type of something (for testing purposes)
|
||||
* @return UnknownTestTypeException
|
||||
* @param int|string $unknownType The unknown type of something (for testing purposes)
|
||||
*/
|
||||
public static function createException($unknownType)
|
||||
public function __construct($unknownType)
|
||||
{
|
||||
/* @var UnknownTestTypeException $exception */
|
||||
$exception = parent::create($unknownType, new TestType(), 'type of something used for testing');
|
||||
|
||||
return $exception;
|
||||
parent::__construct($unknownType, new TestType(), 'type of something used for testing');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Service used together with type of something (for testing purposes)
|
||||
* Service used together with type of something (for testing purposes).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TestService
|
||||
{
|
||||
/**
|
||||
* Returns translated type (for testing purposes)
|
||||
* Returns translated type (for testing purposes).
|
||||
*
|
||||
* @param string $type Type of something (for testing purposes)
|
||||
* @throws UnknownTestTypeException
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws UnknownTestTypeException
|
||||
*/
|
||||
public function getTranslatedType($type)
|
||||
{
|
||||
@@ -9,22 +9,17 @@
|
||||
namespace Meritoo\Common\Test\Type\Base;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
use PHPUnit_Framework_TestCase;
|
||||
|
||||
/**
|
||||
* Test case of the base / abstract type of something
|
||||
* Tests of the base / abstract type of something.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class BaseTypeTest extends BaseTestCase
|
||||
class BaseTypeTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(BaseType::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param BaseType $type Type of something
|
||||
* @param array $expectedTypes Expected concrete types of given instance of type
|
||||
@@ -50,7 +45,7 @@ class BaseTypeTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type of something for testing the getAll() method
|
||||
* Provides type of something for testing the getAll() method.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -71,7 +66,7 @@ class BaseTypeTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type of something for testing the isCorrectType() method
|
||||
* Provides type of something for testing the isCorrectType() method.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -182,20 +177,20 @@ class BaseTypeTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty type of something used for testing
|
||||
* Empty type of something used for testing.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TestEmptyType extends BaseType
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Type of something used for testing
|
||||
* Type of something used for testing.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TestType extends BaseType
|
||||
{
|
||||
@@ -12,10 +12,10 @@ use Meritoo\Common\Test\Base\BaseTypeTestCase;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
|
||||
/**
|
||||
* Test case of the type of date part, e.g. "year"
|
||||
* Tests of the type of date part, e.g. "year".
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class DatePartTypeTest extends BaseTypeTestCase
|
||||
{
|
||||
@@ -25,12 +25,12 @@ class DatePartTypeTest extends BaseTypeTestCase
|
||||
protected function getAllExpectedTypes()
|
||||
{
|
||||
return [
|
||||
'DAY' => DatePartType::DAY,
|
||||
'HOUR' => DatePartType::HOUR,
|
||||
'DAY' => DatePartType::DAY,
|
||||
'HOUR' => DatePartType::HOUR,
|
||||
'MINUTE' => DatePartType::MINUTE,
|
||||
'MONTH' => DatePartType::MONTH,
|
||||
'MONTH' => DatePartType::MONTH,
|
||||
'SECOND' => DatePartType::SECOND,
|
||||
'YEAR' => DatePartType::YEAR,
|
||||
'YEAR' => DatePartType::YEAR,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -8,16 +8,16 @@
|
||||
|
||||
namespace Meritoo\Common\Test\Utilities;
|
||||
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\Arrays;
|
||||
use PHPUnit_Framework_TestCase;
|
||||
|
||||
/**
|
||||
* Test case of the useful arrays methods
|
||||
* Tests of the useful arrays methods.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class ArraysTest extends BaseTestCase
|
||||
class ArraysTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
private $simpleArray;
|
||||
private $simpleArrayWithKeys;
|
||||
@@ -25,11 +25,6 @@ class ArraysTest extends BaseTestCase
|
||||
private $complexArray;
|
||||
private $superComplexArray;
|
||||
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(Arrays::class);
|
||||
}
|
||||
|
||||
public function testValues2string()
|
||||
{
|
||||
/*
|
||||
@@ -72,8 +67,8 @@ class ArraysTest extends BaseTestCase
|
||||
self::assertEquals('', Arrays::values2csv($this->simpleArray));
|
||||
|
||||
self::assertEquals("lorem,ipsum,dolor,sit,amet\n"
|
||||
. "consectetur,adipiscing,elit\n"
|
||||
. 'donec,sagittis,fringilla,eleifend', Arrays::values2csv($this->twoDimensionsArray));
|
||||
."consectetur,adipiscing,elit\n"
|
||||
.'donec,sagittis,fringilla,eleifend', Arrays::values2csv($this->twoDimensionsArray));
|
||||
}
|
||||
|
||||
public function testGetFirstKey()
|
||||
@@ -180,7 +175,7 @@ class ArraysTest extends BaseTestCase
|
||||
{
|
||||
$effect = [
|
||||
'nullam' => 'donec',
|
||||
'x' => [
|
||||
'x' => [
|
||||
'vitae' => [
|
||||
'x' => 'quis',
|
||||
],
|
||||
@@ -193,7 +188,7 @@ class ArraysTest extends BaseTestCase
|
||||
|
||||
self::assertEquals([
|
||||
'x' => 'sit',
|
||||
4 => 'amet',
|
||||
4 => 'amet',
|
||||
], Arrays::replaceArrayKeys($this->simpleArray, '|[0-3]+|', 'x'));
|
||||
}
|
||||
|
||||
@@ -375,19 +370,19 @@ letsTest[2] = value_2;';
|
||||
'lorem' => 0,
|
||||
'ipsum' => 1,
|
||||
'dolor' => 2,
|
||||
'sit' => 3,
|
||||
'amet' => 4,
|
||||
'sit' => 3,
|
||||
'amet' => 4,
|
||||
],
|
||||
[
|
||||
'consectetur' => 0,
|
||||
'adipiscing' => 1,
|
||||
'elit' => 2,
|
||||
'adipiscing' => 1,
|
||||
'elit' => 2,
|
||||
],
|
||||
[
|
||||
'donec' => 0,
|
||||
'sagittis' => 1,
|
||||
'donec' => 0,
|
||||
'sagittis' => 1,
|
||||
'fringilla' => 2,
|
||||
'eleifend' => 3,
|
||||
'eleifend' => 3,
|
||||
],
|
||||
];
|
||||
|
||||
@@ -433,16 +428,16 @@ letsTest[2] = value_2;';
|
||||
*/
|
||||
$array = [
|
||||
'light' => '#fff',
|
||||
'dark' => '#000',
|
||||
'dark' => '#000',
|
||||
];
|
||||
|
||||
self::assertEquals($array, Arrays::string2array('light:#fff|dark:#000'));
|
||||
self::assertEquals($array, Arrays::string2array('light: #fff | dark: #000'));
|
||||
|
||||
$array = [
|
||||
'red' => '#f00',
|
||||
'red' => '#f00',
|
||||
'green' => '#0f0',
|
||||
'blue' => '#00f',
|
||||
'blue' => '#00f',
|
||||
];
|
||||
|
||||
self::assertEquals($array, Arrays::string2array('red:#f00|green:#0f0|blue:#00f'));
|
||||
@@ -494,12 +489,12 @@ letsTest[2] = value_2;';
|
||||
|
||||
$keys16 = [
|
||||
'a' => 'lorem',
|
||||
11 => 'amet',
|
||||
11 => 'amet',
|
||||
];
|
||||
|
||||
$keys17 = [
|
||||
'a' => 'lorem',
|
||||
11 => 'amet',
|
||||
11 => 'amet',
|
||||
'c' => 'sit__',
|
||||
];
|
||||
|
||||
@@ -523,16 +518,16 @@ letsTest[2] = value_2;';
|
||||
* Using default separator and other default arguments
|
||||
*/
|
||||
$expected = [
|
||||
'lorem.ipsum.dolor' => 'sit',
|
||||
'lorem.ipsum.diam.non' => 'egestas',
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit.nullam' => 'donec',
|
||||
'lorem.ipsum.dolor' => 'sit',
|
||||
'lorem.ipsum.diam.non' => 'egestas',
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit.nullam' => 'donec',
|
||||
'sit.aliquet.vitae.ligula' => 'quis',
|
||||
'sit.0' => 'elit',
|
||||
'amet.0' => 'iaculis',
|
||||
'amet.1' => 'primis',
|
||||
'sit.0' => 'elit',
|
||||
'amet.0' => 'iaculis',
|
||||
'amet.1' => 'primis',
|
||||
];
|
||||
|
||||
self::assertEquals($expected, Arrays::getLastElementsPaths($this->complexArray));
|
||||
@@ -542,16 +537,16 @@ letsTest[2] = value_2;';
|
||||
*/
|
||||
$separator = ' -> ';
|
||||
$expected = [
|
||||
sprintf('lorem%sipsum%sdolor', $separator, $separator) => 'sit',
|
||||
sprintf('lorem%sipsum%sdiam%snon', $separator, $separator, $separator) => 'egestas',
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
sprintf('sit%snullam', $separator) => 'donec',
|
||||
sprintf('lorem%sipsum%sdolor', $separator, $separator) => 'sit',
|
||||
sprintf('lorem%sipsum%sdiam%snon', $separator, $separator, $separator) => 'egestas',
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
sprintf('sit%snullam', $separator) => 'donec',
|
||||
sprintf('sit%saliquet%svitae%sligula', $separator, $separator, $separator) => 'quis',
|
||||
sprintf('sit%s0', $separator) => 'elit',
|
||||
sprintf('amet%s0', $separator) => 'iaculis',
|
||||
sprintf('amet%s1', $separator) => 'primis',
|
||||
sprintf('sit%s0', $separator) => 'elit',
|
||||
sprintf('amet%s0', $separator) => 'iaculis',
|
||||
sprintf('amet%s1', $separator) => 'primis',
|
||||
];
|
||||
|
||||
self::assertEquals($expected, Arrays::getLastElementsPaths($this->complexArray, $separator));
|
||||
@@ -560,16 +555,16 @@ letsTest[2] = value_2;';
|
||||
* Special exception: do not use, stop recursive on the "diam" key
|
||||
*/
|
||||
$expected = [
|
||||
'lorem.ipsum.dolor' => 'sit',
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit.nullam' => 'donec',
|
||||
'lorem.ipsum.dolor' => 'sit',
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit.nullam' => 'donec',
|
||||
'sit.aliquet.vitae.ligula' => 'quis',
|
||||
'sit.0' => 'elit',
|
||||
'amet.0' => 'iaculis',
|
||||
'amet.1' => 'primis',
|
||||
'lorem.ipsum.diam' => [
|
||||
'sit.0' => 'elit',
|
||||
'amet.0' => 'iaculis',
|
||||
'amet.1' => 'primis',
|
||||
'lorem.ipsum.diam' => [
|
||||
'non' => 'egestas',
|
||||
],
|
||||
];
|
||||
@@ -584,17 +579,17 @@ letsTest[2] = value_2;';
|
||||
*/
|
||||
$expected = [
|
||||
'lorem . ipsum . dolor' => 'sit',
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit . nullam' => 'donec',
|
||||
'sit . 0' => 'elit',
|
||||
'amet . 0' => 'iaculis',
|
||||
'amet . 1' => 'primis',
|
||||
'lorem . ipsum . diam' => [
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit . nullam' => 'donec',
|
||||
'sit . 0' => 'elit',
|
||||
'amet . 0' => 'iaculis',
|
||||
'amet . 1' => 'primis',
|
||||
'lorem . ipsum . diam' => [
|
||||
'non' => 'egestas',
|
||||
],
|
||||
'sit . aliquet' => [
|
||||
'sit . aliquet' => [
|
||||
'vitae' => [
|
||||
'ligula' => 'quis',
|
||||
],
|
||||
@@ -628,12 +623,12 @@ letsTest[2] = value_2;';
|
||||
2,
|
||||
3,
|
||||
],
|
||||
'primis > 0' => [
|
||||
'primis > 0' => [
|
||||
'in',
|
||||
'faucibus',
|
||||
'orci',
|
||||
],
|
||||
'primis > 1' => [
|
||||
'primis > 1' => [
|
||||
'luctus',
|
||||
'et',
|
||||
'ultrices',
|
||||
@@ -658,14 +653,14 @@ letsTest[2] = value_2;';
|
||||
*/
|
||||
$expected = [
|
||||
'lorem > ipsum > dolor' => 'sit',
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit > nullam' => 'donec',
|
||||
'sit > 0' => 'elit',
|
||||
'amet > 0' => 'iaculis',
|
||||
'amet > 1' => 'primis',
|
||||
'lorem > ipsum > diam' => [
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit > nullam' => 'donec',
|
||||
'sit > 0' => 'elit',
|
||||
'amet > 0' => 'iaculis',
|
||||
'amet > 1' => 'primis',
|
||||
'lorem > ipsum > diam' => [
|
||||
'non' => 'egestas',
|
||||
],
|
||||
'sit > aliquet > vitae' => [
|
||||
@@ -684,7 +679,7 @@ letsTest[2] = value_2;';
|
||||
* Stop building of paths on these paths (verify paths only)
|
||||
*/
|
||||
$expected = [
|
||||
'ipsum > quis > vestibulum > porta-1' => [
|
||||
'ipsum > quis > vestibulum > porta-1' => [
|
||||
'turpis',
|
||||
'urna',
|
||||
],
|
||||
@@ -696,13 +691,13 @@ letsTest[2] = value_2;';
|
||||
],
|
||||
],
|
||||
],
|
||||
'ipsum > quis > vestibulum > porta-3 > 0' => 1,
|
||||
'ipsum > quis > vestibulum > porta-3 > 1' => 2,
|
||||
'ipsum > quis > vestibulum > porta-3 > 2' => 3,
|
||||
'primis > 0 > 0' => 'in',
|
||||
'primis > 0 > 1' => 'faucibus',
|
||||
'primis > 0 > 2' => 'orci',
|
||||
'primis > 1' => [
|
||||
'ipsum > quis > vestibulum > porta-3 > 0' => 1,
|
||||
'ipsum > quis > vestibulum > porta-3 > 1' => 2,
|
||||
'ipsum > quis > vestibulum > porta-3 > 2' => 3,
|
||||
'primis > 0 > 0' => 'in',
|
||||
'primis > 0 > 1' => 'faucibus',
|
||||
'primis > 0 > 2' => 'orci',
|
||||
'primis > 1' => [
|
||||
'luctus',
|
||||
'et',
|
||||
'ultrices',
|
||||
@@ -721,7 +716,7 @@ letsTest[2] = value_2;';
|
||||
* Stop building of paths if path contains any of these part (verify part of paths only)
|
||||
*/
|
||||
$expected = [
|
||||
'ipsum > quis > vestibulum > porta-1' => [
|
||||
'ipsum > quis > vestibulum > porta-1' => [
|
||||
'turpis',
|
||||
'urna',
|
||||
],
|
||||
@@ -731,15 +726,15 @@ letsTest[2] = value_2;';
|
||||
'aliquam',
|
||||
],
|
||||
],
|
||||
'ipsum > quis > vestibulum > porta-3 > 0' => 1,
|
||||
'ipsum > quis > vestibulum > porta-3 > 1' => 2,
|
||||
'ipsum > quis > vestibulum > porta-3 > 2' => 3,
|
||||
'primis > 0' => [
|
||||
'ipsum > quis > vestibulum > porta-3 > 0' => 1,
|
||||
'ipsum > quis > vestibulum > porta-3 > 1' => 2,
|
||||
'ipsum > quis > vestibulum > porta-3 > 2' => 3,
|
||||
'primis > 0' => [
|
||||
'in',
|
||||
'faucibus',
|
||||
'orci',
|
||||
],
|
||||
'primis > 1' => [
|
||||
'primis > 1' => [
|
||||
'luctus',
|
||||
'et',
|
||||
'ultrices',
|
||||
@@ -835,7 +830,7 @@ letsTest[2] = value_2;';
|
||||
];
|
||||
|
||||
$existingKeys = [
|
||||
'simpleArray' => [
|
||||
'simpleArray' => [
|
||||
1,
|
||||
3,
|
||||
4,
|
||||
@@ -844,11 +839,11 @@ letsTest[2] = value_2;';
|
||||
'dolor',
|
||||
'amet',
|
||||
],
|
||||
'twoDimensionsArray' => [
|
||||
'twoDimensionsArray' => [
|
||||
2,
|
||||
3,
|
||||
],
|
||||
'complexArray' => [
|
||||
'complexArray' => [
|
||||
'sit',
|
||||
'aliquet',
|
||||
'vitae',
|
||||
@@ -888,7 +883,7 @@ letsTest[2] = value_2;';
|
||||
2,
|
||||
2,
|
||||
],
|
||||
'complexArray' => [
|
||||
'complexArray' => [
|
||||
[
|
||||
'lorem',
|
||||
'ipsum',
|
||||
@@ -994,22 +989,22 @@ letsTest[2] = value_2;';
|
||||
* Positive case - multi-dimensions array
|
||||
*/
|
||||
$effect = [
|
||||
'amet' => [
|
||||
'amet' => [
|
||||
'iaculis',
|
||||
'primis',
|
||||
],
|
||||
'consectetur' => 'adipiscing',
|
||||
'lorem' => [
|
||||
'lorem' => [
|
||||
'ipsum' => [
|
||||
'dolor' => 'sit',
|
||||
'diam' => [
|
||||
'diam' => [
|
||||
'non' => 'egestas',
|
||||
],
|
||||
],
|
||||
],
|
||||
'mollis' => 1234,
|
||||
'sit' => [
|
||||
'nullam' => 'donec',
|
||||
'mollis' => 1234,
|
||||
'sit' => [
|
||||
'nullam' => 'donec',
|
||||
'aliquet' => [
|
||||
'vitae' => [
|
||||
'ligula' => 'quis',
|
||||
@@ -1017,7 +1012,7 @@ letsTest[2] = value_2;';
|
||||
],
|
||||
'elit',
|
||||
],
|
||||
2 => [],
|
||||
2 => [],
|
||||
];
|
||||
|
||||
self::assertEquals($effect, Arrays::ksortRecursive($this->complexArray));
|
||||
@@ -1026,23 +1021,23 @@ letsTest[2] = value_2;';
|
||||
* Positive case - multi-dimensions array - with options of ksort() function
|
||||
*/
|
||||
$effect = [
|
||||
2 => [],
|
||||
'amet' => [
|
||||
2 => [],
|
||||
'amet' => [
|
||||
'iaculis',
|
||||
'primis',
|
||||
],
|
||||
'consectetur' => 'adipiscing',
|
||||
'lorem' => [
|
||||
'lorem' => [
|
||||
'ipsum' => [
|
||||
'dolor' => 'sit',
|
||||
'diam' => [
|
||||
'diam' => [
|
||||
'non' => 'egestas',
|
||||
],
|
||||
],
|
||||
],
|
||||
'mollis' => 1234,
|
||||
'sit' => [
|
||||
'nullam' => 'donec',
|
||||
'mollis' => 1234,
|
||||
'sit' => [
|
||||
'nullam' => 'donec',
|
||||
'aliquet' => [
|
||||
'vitae' => [
|
||||
'ligula' => 'quis',
|
||||
@@ -1091,7 +1086,7 @@ letsTest[2] = value_2;';
|
||||
'dolor',
|
||||
'sit',
|
||||
],
|
||||
'amet' => [
|
||||
'amet' => [
|
||||
'consectetur',
|
||||
'adipiscing' => [
|
||||
'elit' => [
|
||||
@@ -1110,10 +1105,10 @@ letsTest[2] = value_2;';
|
||||
'sit',
|
||||
Arrays::POSITION_KEY_NAME => 1,
|
||||
],
|
||||
'amet' => [
|
||||
'amet' => [
|
||||
'consectetur',
|
||||
'adipiscing' => [
|
||||
'elit' => [
|
||||
'adipiscing' => [
|
||||
'elit' => [
|
||||
'cras',
|
||||
'quis',
|
||||
'ligula',
|
||||
@@ -1238,7 +1233,7 @@ letsTest[2] = value_2;';
|
||||
|
||||
$sorted = [
|
||||
'dolor' => 'sit',
|
||||
'amet' => 'consectetur',
|
||||
'amet' => 'consectetur',
|
||||
'Lorem' => 'ipsum',
|
||||
];
|
||||
|
||||
@@ -1311,9 +1306,9 @@ letsTest[2] = value_2;';
|
||||
* An array with elements that contain separator
|
||||
*/
|
||||
$array = [
|
||||
'lorem' . $separator,
|
||||
'lorem'.$separator,
|
||||
'ipsum',
|
||||
$separator . 'dolor',
|
||||
$separator.'dolor',
|
||||
];
|
||||
|
||||
self::assertEquals(implode($separator, [
|
||||
@@ -1663,7 +1658,7 @@ letsTest[2] = value_2;';
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides simple array to set/replace values with keys
|
||||
* Provides simple array to set/replace values with keys.
|
||||
*
|
||||
* @return \Generator
|
||||
*/
|
||||
@@ -1696,14 +1691,14 @@ letsTest[2] = value_2;';
|
||||
'Lorem' => 0,
|
||||
'ipsum' => 1,
|
||||
'dolor' => 2,
|
||||
'sit' => 3,
|
||||
'amet' => 4,
|
||||
'sit' => 3,
|
||||
'amet' => 4,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides an array with duplicated values to set/replace values with keys
|
||||
* Provides an array with duplicated values to set/replace values with keys.
|
||||
*
|
||||
* @return \Generator
|
||||
*/
|
||||
@@ -1713,18 +1708,18 @@ letsTest[2] = value_2;';
|
||||
[
|
||||
'lorem' => 'ipsum',
|
||||
'dolor' => 'ipsum',
|
||||
'sit' => 'amet',
|
||||
'diam' => 'non',
|
||||
'elit' => 'non',
|
||||
'in' => 'non',
|
||||
'sit' => 'amet',
|
||||
'diam' => 'non',
|
||||
'elit' => 'non',
|
||||
'in' => 'non',
|
||||
],
|
||||
[
|
||||
'ipsum' => [
|
||||
'lorem',
|
||||
'dolor',
|
||||
],
|
||||
'amet' => 'sit',
|
||||
'non' => [
|
||||
'amet' => 'sit',
|
||||
'non' => [
|
||||
'diam',
|
||||
'elit',
|
||||
'in',
|
||||
@@ -1734,14 +1729,14 @@ letsTest[2] = value_2;';
|
||||
|
||||
yield[
|
||||
[
|
||||
'lorem' => [
|
||||
'lorem' => [
|
||||
'diam' => 'non',
|
||||
'elit' => 'non',
|
||||
'in' => 'non',
|
||||
'in' => 'non',
|
||||
],
|
||||
'dolor1' => 'ipsum',
|
||||
'dolor2' => 'ipsum',
|
||||
'sit' => 'amet',
|
||||
'sit' => 'amet',
|
||||
],
|
||||
[
|
||||
'lorem' => [
|
||||
@@ -1755,7 +1750,7 @@ letsTest[2] = value_2;';
|
||||
'dolor1',
|
||||
'dolor2',
|
||||
],
|
||||
'amet' => 'sit',
|
||||
'amet' => 'sit',
|
||||
],
|
||||
];
|
||||
}
|
||||
@@ -1778,7 +1773,7 @@ letsTest[2] = value_2;';
|
||||
$this->simpleArrayWithKeys = [
|
||||
'Lorem' => 'ipsum',
|
||||
'dolor' => 'sit',
|
||||
'amet' => 'consectetur',
|
||||
'amet' => 'consectetur',
|
||||
];
|
||||
|
||||
$this->twoDimensionsArray = [
|
||||
@@ -1803,19 +1798,19 @@ letsTest[2] = value_2;';
|
||||
];
|
||||
|
||||
$this->complexArray = [
|
||||
'lorem' => [
|
||||
'lorem' => [
|
||||
'ipsum' => [
|
||||
'dolor' => 'sit',
|
||||
'diam' => [
|
||||
'diam' => [
|
||||
'non' => 'egestas',
|
||||
],
|
||||
],
|
||||
],
|
||||
'consectetur' => 'adipiscing',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit' => [
|
||||
'nullam' => 'donec',
|
||||
'mollis' => 1234,
|
||||
2 => [],
|
||||
'sit' => [
|
||||
'nullam' => 'donec',
|
||||
'aliquet' => [
|
||||
'vitae' => [
|
||||
'ligula' => 'quis',
|
||||
@@ -1823,14 +1818,14 @@ letsTest[2] = value_2;';
|
||||
],
|
||||
'elit',
|
||||
],
|
||||
'amet' => [
|
||||
'amet' => [
|
||||
'iaculis',
|
||||
'primis',
|
||||
],
|
||||
];
|
||||
|
||||
$this->superComplexArray = [
|
||||
'ipsum' => [
|
||||
'ipsum' => [
|
||||
'quis' => [
|
||||
'vestibulum' => [
|
||||
'porta-1' => [
|
||||
40
tests/Meritoo/Common/Test/Utilities/BundleTest.php
Normal file
40
tests/Meritoo/Common/Test/Utilities/BundleTest.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Utilities;
|
||||
|
||||
use Meritoo\Common\Utilities\Bundle;
|
||||
use PHPUnit_Framework_TestCase;
|
||||
|
||||
/**
|
||||
* Tests of the useful methods for bundle.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class BundleTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testGetBundleViewPathEmptyPathAndBundle()
|
||||
{
|
||||
self::assertNull(Bundle::getBundleViewPath('', ''));
|
||||
self::assertNull(Bundle::getBundleViewPath('test', ''));
|
||||
self::assertNull(Bundle::getBundleViewPath('', 'test'));
|
||||
}
|
||||
|
||||
public function testGetBundleViewPathWithDefaultExtension()
|
||||
{
|
||||
self::assertEquals('Lorem:Ipsum.html.twig', Bundle::getBundleViewPath('Ipsum', 'Lorem'));
|
||||
self::assertEquals('LobortisTincidunt:FusceElementum.html.twig', Bundle::getBundleViewPath('FusceElementum', 'LobortisTincidunt'));
|
||||
}
|
||||
|
||||
public function testGetBundleViewPathWithCustomExtension()
|
||||
{
|
||||
self::assertNull(Bundle::getBundleViewPath('Ipsum', 'Lorem', ''));
|
||||
self::assertEquals('Lorem:Ipsum.js.twig', Bundle::getBundleViewPath('Ipsum', 'Lorem', 'js.twig'));
|
||||
}
|
||||
}
|
||||
@@ -13,25 +13,20 @@ use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\Composer;
|
||||
|
||||
/**
|
||||
* Test case of the useful Composer-related methods
|
||||
* Tests of the useful Composer-related methods.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class ComposerTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* Path of existing composer.json used as source of data for tests
|
||||
* Path of existing composer.json used as source of data for tests.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $composerJsonPath;
|
||||
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(Composer::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $composerJsonPath Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
@@ -64,7 +59,7 @@ class ComposerTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides names and values of existing nodes
|
||||
* Provides names and values of existing nodes.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -88,6 +83,6 @@ class ComposerTest extends BaseTestCase
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->composerJsonPath = $this->getFilePathForTesting(Composer::FILE_NAME_MAIN);
|
||||
$this->composerJsonPath = $this->getFilePathToTests(Composer::FILE_NAME_MAIN);
|
||||
}
|
||||
}
|
||||
@@ -6,25 +6,25 @@
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Type;
|
||||
namespace Meritoo\Common\Test\Utilities;
|
||||
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Test\Base\BaseTypeTestCase;
|
||||
use Meritoo\Common\Type\DatePeriod;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
use Meritoo\Common\Utilities\DatePeriod;
|
||||
|
||||
/**
|
||||
* Test case of date's period
|
||||
* Tests of date's period.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class DatePeriodTest extends BaseTypeTestCase
|
||||
class DatePeriodTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(DatePeriod::class, OopVisibilityType::IS_PUBLIC, 2, 0);
|
||||
$this->verifyConstructorVisibilityAndArguments(DatePeriod::class, OopVisibilityType::IS_PUBLIC, 2, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -58,6 +58,33 @@ class DatePeriodTest extends BaseTypeTestCase
|
||||
self::assertEquals($endDate, $period->getEndDate());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $period Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testIsCorrectPeriodEmptyPeriod($period)
|
||||
{
|
||||
self::assertFalse(DatePeriod::isCorrectPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $period Incorrect period to verify
|
||||
* @dataProvider provideIncorrectPeriod
|
||||
*/
|
||||
public function testIsCorrectPeriodIncorrectPeriod($period)
|
||||
{
|
||||
self::assertFalse(DatePeriod::isCorrectPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $period The period to verify
|
||||
* @dataProvider providePeriod
|
||||
*/
|
||||
public function testIsCorrectPeriod($period)
|
||||
{
|
||||
self::assertTrue(DatePeriod::isCorrectPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DatePeriod $period The date period to verify
|
||||
* @param string $format Format used to format the date
|
||||
@@ -83,7 +110,7 @@ class DatePeriodTest extends BaseTypeTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides the start and end date of date period
|
||||
* Provides the start and end date of date period.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -116,7 +143,37 @@ class DatePeriodTest extends BaseTypeTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides period and incorrect format of date to verify
|
||||
* Provides incorrect period.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideIncorrectPeriod()
|
||||
{
|
||||
yield[-1];
|
||||
yield[0];
|
||||
yield[10];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides period to verify.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function providePeriod()
|
||||
{
|
||||
yield[DatePeriod::LAST_WEEK];
|
||||
yield[DatePeriod::THIS_WEEK];
|
||||
yield[DatePeriod::NEXT_WEEK];
|
||||
yield[DatePeriod::LAST_MONTH];
|
||||
yield[DatePeriod::THIS_MONTH];
|
||||
yield[DatePeriod::NEXT_MONTH];
|
||||
yield[DatePeriod::LAST_YEAR];
|
||||
yield[DatePeriod::THIS_YEAR];
|
||||
yield[DatePeriod::NEXT_YEAR];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides period and incorrect format of date to verify.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -142,7 +199,7 @@ class DatePeriodTest extends BaseTypeTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides period and format of date to verify
|
||||
* Provides period and format of date to verify.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -213,68 +270,4 @@ class DatePeriodTest extends BaseTypeTestCase
|
||||
'2002-02-02 00:00',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all expected types of the tested type
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getAllExpectedTypes()
|
||||
{
|
||||
return [
|
||||
'LAST_MONTH' => DatePeriod::LAST_MONTH,
|
||||
'LAST_WEEK' => DatePeriod::LAST_WEEK,
|
||||
'LAST_YEAR' => DatePeriod::LAST_YEAR,
|
||||
'NEXT_MONTH' => DatePeriod::NEXT_MONTH,
|
||||
'NEXT_WEEK' => DatePeriod::NEXT_WEEK,
|
||||
'NEXT_YEAR' => DatePeriod::NEXT_YEAR,
|
||||
'THIS_MONTH' => DatePeriod::THIS_MONTH,
|
||||
'THIS_WEEK' => DatePeriod::THIS_WEEK,
|
||||
'THIS_YEAR' => DatePeriod::THIS_YEAR,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getTestedTypeInstance()
|
||||
{
|
||||
return new DatePeriod();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function provideTypeToVerify()
|
||||
{
|
||||
yield[
|
||||
'',
|
||||
false,
|
||||
];
|
||||
|
||||
yield[
|
||||
-1,
|
||||
false,
|
||||
];
|
||||
|
||||
yield[
|
||||
true,
|
||||
false,
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::LAST_MONTH,
|
||||
true,
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::NEXT_WEEK,
|
||||
true,
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::THIS_YEAR,
|
||||
true,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -11,24 +11,18 @@ namespace Meritoo\Common\Test\Utilities;
|
||||
use DateInterval;
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\DatePeriod;
|
||||
use Meritoo\Common\Utilities\Date;
|
||||
|
||||
/**
|
||||
* Test case of the Date methods (only static functions)
|
||||
* Tests of the Date methods (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class DateTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(Date::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
@@ -195,7 +189,7 @@ class DateTest extends BaseTestCase
|
||||
|
||||
public function testGetCurrentDayOfWeek()
|
||||
{
|
||||
self::assertRegExp('/^[0-6]{1}$/', (string)Date::getCurrentDayOfWeek());
|
||||
self::assertRegExp('/^[0-6]{1}$/', (string) Date::getCurrentDayOfWeek());
|
||||
}
|
||||
|
||||
public function testGetCurrentDayOfWeekName()
|
||||
@@ -224,7 +218,7 @@ class DateTest extends BaseTestCase
|
||||
*/
|
||||
public function testGetDayOfWeekIncorrectValues($year, $month, $day)
|
||||
{
|
||||
$this->setExpectedException(UnknownDatePartTypeException::class);
|
||||
$this->expectException(UnknownDatePartTypeException::class);
|
||||
self::assertEmpty(Date::getDayOfWeek($year, $month, $day));
|
||||
}
|
||||
|
||||
@@ -237,7 +231,7 @@ class DateTest extends BaseTestCase
|
||||
*/
|
||||
public function testGetDayOfWeek($year, $month, $day)
|
||||
{
|
||||
self::assertRegExp('/^[0-6]{1}$/', (string)Date::getDayOfWeek($year, $month, $day));
|
||||
self::assertRegExp('/^[0-6]{1}$/', (string) Date::getDayOfWeek($year, $month, $day));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -266,10 +260,10 @@ class DateTest extends BaseTestCase
|
||||
$dateEnd = '2017-01-02';
|
||||
|
||||
$effect = [
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 1,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 1,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MINUTES => 0,
|
||||
];
|
||||
|
||||
@@ -286,10 +280,10 @@ class DateTest extends BaseTestCase
|
||||
* Difference of 1 day (using the relative date format)
|
||||
*/
|
||||
$effect = [
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 1,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 1,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MINUTES => 0,
|
||||
];
|
||||
|
||||
@@ -307,10 +301,10 @@ class DateTest extends BaseTestCase
|
||||
$dateEnd = '2017-01-02 14:15';
|
||||
|
||||
$effect = [
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 1,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 2,
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 1,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 2,
|
||||
Date::DATE_DIFFERENCE_UNIT_MINUTES => 15,
|
||||
];
|
||||
|
||||
@@ -336,10 +330,10 @@ class DateTest extends BaseTestCase
|
||||
$dateEnd = '2017-02-11 16:30';
|
||||
|
||||
$effect = [
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 1,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 41,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 4,
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 1,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 41,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 4,
|
||||
Date::DATE_DIFFERENCE_UNIT_MINUTES => 30,
|
||||
];
|
||||
|
||||
@@ -368,10 +362,10 @@ class DateTest extends BaseTestCase
|
||||
$dateEnd = $dateStart;
|
||||
|
||||
$effect = [
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_DAYS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_HOURS => 0,
|
||||
Date::DATE_DIFFERENCE_UNIT_MINUTES => 0,
|
||||
];
|
||||
|
||||
@@ -508,36 +502,7 @@ class DateTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $period Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetDatesForPeriodUsingEmptyPeriod($period)
|
||||
{
|
||||
self::assertNull(Date::getDatesForPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $period Incorrect period to verify
|
||||
* @dataProvider provideIncorrectPeriod
|
||||
*/
|
||||
public function testGetDatesForPeriodUsingIncorrectPeriod($period)
|
||||
{
|
||||
self::assertNull(Date::getDatesForPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK.
|
||||
* @param DatePeriod $expected Expected start and end date for given period
|
||||
*
|
||||
* @dataProvider provideCorrectPeriod
|
||||
*/
|
||||
public function testGetDatesForPeriod($period, DatePeriod $expected)
|
||||
{
|
||||
self::assertEquals($expected, Date::getDatesForPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides incorrect invalidCount of DateTime
|
||||
* Provides incorrect invalidCount of DateTime.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -587,7 +552,7 @@ class DateTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides invalid format of date
|
||||
* Provides invalid format of date.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -605,7 +570,7 @@ class DateTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide empty dates for date difference
|
||||
* Provide empty dates for date difference.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -633,7 +598,7 @@ class DateTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides incorrect values of year, month and day
|
||||
* Provides incorrect values of year, month and day.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -683,7 +648,7 @@ class DateTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides values of year, month and day
|
||||
* Provides values of year, month and day.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -733,7 +698,7 @@ class DateTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides data for the random date with incorrect end of random partition
|
||||
* Provides data for the random date with incorrect end of random partition.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -747,7 +712,7 @@ class DateTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides data for the random date
|
||||
* Provides data for the random date.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -788,112 +753,4 @@ class DateTest extends BaseTestCase
|
||||
50,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides incorrect period
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideIncorrectPeriod()
|
||||
{
|
||||
yield[-1];
|
||||
yield[0];
|
||||
yield[10];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides correct period
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideCorrectPeriod()
|
||||
{
|
||||
yield[
|
||||
DatePeriod::LAST_WEEK,
|
||||
new DatePeriod(
|
||||
(new DateTime('this week'))->sub(new DateInterval('P7D'))->setTime(0, 0, 0),
|
||||
(new DateTime('this week'))->sub(new DateInterval('P1D'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::THIS_WEEK,
|
||||
new DatePeriod(
|
||||
(new DateTime('this week'))->setTime(0, 0, 0),
|
||||
(new DateTime('this week'))->add(new DateInterval('P6D'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::NEXT_WEEK,
|
||||
new DatePeriod(
|
||||
(new DateTime('this week'))->add(new DateInterval('P7D'))->setTime(0, 0, 0),
|
||||
(new DateTime('this week'))->add(new DateInterval('P7D'))->add(new DateInterval('P6D'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::LAST_MONTH,
|
||||
new DatePeriod(
|
||||
(new DateTime('first day of last month'))->setTime(0, 0, 0),
|
||||
(new DateTime('last day of last month'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::THIS_MONTH,
|
||||
new DatePeriod(
|
||||
Date::getDatesForPeriod(DatePeriod::LAST_MONTH)
|
||||
->getEndDate()
|
||||
->add(new DateInterval('P1D'))
|
||||
->setTime(0, 0, 0),
|
||||
Date::getDatesForPeriod(DatePeriod::NEXT_MONTH)
|
||||
->getStartDate()
|
||||
->sub(new DateInterval('P1D'))
|
||||
->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::NEXT_MONTH,
|
||||
new DatePeriod(
|
||||
(new DateTime('first day of next month'))->setTime(0, 0, 0),
|
||||
(new DateTime('last day of next month'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
$lastYearStart = (new DateTime())->modify('-1 year');
|
||||
$lastYearEnd = (new DateTime())->modify('-1 year');
|
||||
$year = $lastYearStart->format('Y');
|
||||
|
||||
yield[
|
||||
DatePeriod::LAST_YEAR,
|
||||
new DatePeriod(
|
||||
$lastYearStart->setDate($year, 1, 1)->setTime(0, 0, 0),
|
||||
$lastYearEnd->setDate($year, 12, 31)->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
$year = (new DateTime())->format('Y');
|
||||
|
||||
yield[
|
||||
DatePeriod::THIS_YEAR,
|
||||
new DatePeriod(
|
||||
(new DateTime())->setDate($year, 1, 1)->setTime(0, 0, 0),
|
||||
(new DateTime())->setDate($year, 12, 31)->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
$nextYearStart = (new DateTime())->modify('1 year');
|
||||
$nextYearEnd = (new DateTime())->modify('1 year');
|
||||
$year = $nextYearStart->format('Y');
|
||||
|
||||
yield[
|
||||
DatePeriod::NEXT_YEAR,
|
||||
new DatePeriod(
|
||||
$nextYearStart->setDate($year, 1, 1)->setTime(0, 0, 0),
|
||||
$nextYearEnd->setDate($year, 12, 31)->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -12,18 +12,13 @@ use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\GeneratorUtility;
|
||||
|
||||
/**
|
||||
* Test case of the useful methods for the Generator class
|
||||
* Tests of the useful methods for the Generator class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class GeneratorUtilityTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(GeneratorUtility::class);
|
||||
}
|
||||
|
||||
public function testGetGeneratorElements()
|
||||
{
|
||||
/*
|
||||
129
tests/Meritoo/Common/Test/Utilities/LocaleTest.php
Normal file
129
tests/Meritoo/Common/Test/Utilities/LocaleTest.php
Normal file
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Utilities;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\Locale;
|
||||
|
||||
/**
|
||||
* Tests of the useful locale methods.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class LocaleTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* @param mixed $languageCode Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetLongFormEmptyLanguageCode($languageCode)
|
||||
{
|
||||
self::assertEquals('', Locale::getLongForm($languageCode));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
* @param string $countryCode Country code, in ISO 3166-1 alpha-2 format, e.g. "FR"
|
||||
* @param string $encoding Encoding of the final locale
|
||||
* @param string $expected Expected long form of the locale
|
||||
*
|
||||
* @dataProvider provideLanguageAndCountryCode
|
||||
*/
|
||||
public function testGetLongForm($languageCode, $countryCode, $encoding, $expected)
|
||||
{
|
||||
self::assertEquals($expected, Locale::getLongForm($languageCode, $countryCode, $encoding));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $emptyValue Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testSetLocaleEmptyCategoryAndLanguageCode($emptyValue)
|
||||
{
|
||||
self::assertFalse(Locale::setLocale($emptyValue, $emptyValue));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $category Named constant specifying the category of the functions affected by the locale
|
||||
* setting. It's the same constant as required by setlocale() function.
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
*
|
||||
* @dataProvider provideCategoryAndLanguageCode
|
||||
*/
|
||||
public function testSetLocale($category, $languageCode)
|
||||
{
|
||||
self::assertTrue(Locale::setLocale($category, $languageCode));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides language and country code.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideLanguageAndCountryCode()
|
||||
{
|
||||
yield[
|
||||
'fr',
|
||||
'',
|
||||
'',
|
||||
'fr_FR',
|
||||
];
|
||||
|
||||
yield[
|
||||
'fr',
|
||||
'',
|
||||
'UTF-8',
|
||||
'fr_FR.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
'fr',
|
||||
'FR',
|
||||
'',
|
||||
'fr_FR',
|
||||
];
|
||||
|
||||
yield[
|
||||
'fr',
|
||||
'FR',
|
||||
'UTF-8',
|
||||
'fr_FR.UTF-8',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides category and language.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideCategoryAndLanguageCode()
|
||||
{
|
||||
yield[
|
||||
LC_ALL,
|
||||
'fr',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_COLLATE,
|
||||
'fr',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_CTYPE,
|
||||
'en',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_NUMERIC,
|
||||
'en',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -13,18 +13,13 @@ use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\MimeTypes;
|
||||
|
||||
/**
|
||||
* Test case of the useful methods for mime types of files
|
||||
* Tests of the useful methods for mime types of files.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class MimeTypesTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(MimeTypes::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $mimeType Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
@@ -191,7 +186,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides not existing mime type
|
||||
* Provides not existing mime type.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -203,7 +198,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides mime type of non-image
|
||||
* Provides mime type of non-image.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -216,7 +211,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides mime type of image
|
||||
* Provides mime type of image.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -231,7 +226,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides existing mime type used to get single, one extension
|
||||
* Provides existing mime type used to get single, one extension.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -254,7 +249,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides existing mime type used to get multiple, more than one extension
|
||||
* Provides existing mime type used to get multiple, more than one extension.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -321,7 +316,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides not existing mime types
|
||||
* Provides not existing mime types.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -349,7 +344,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides mime types used to get extensions
|
||||
* Provides mime types used to get extensions.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -362,7 +357,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
],
|
||||
[
|
||||
'application/x-7z-compressed' => '7z',
|
||||
'application/json' => 'json',
|
||||
'application/json' => 'json',
|
||||
],
|
||||
];
|
||||
|
||||
@@ -379,12 +374,12 @@ class MimeTypesTest extends BaseTestCase
|
||||
'nb',
|
||||
'mb',
|
||||
],
|
||||
'application/xml' => [
|
||||
'application/xml' => [
|
||||
'xml',
|
||||
'xsl',
|
||||
],
|
||||
'audio/mp4' => 'mp4a',
|
||||
'video/mp4' => [
|
||||
'audio/mp4' => 'mp4a',
|
||||
'video/mp4' => [
|
||||
'mp4',
|
||||
'mp4v',
|
||||
'mpg4',
|
||||
@@ -395,7 +390,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides mime types used to get extensions as upper case
|
||||
* Provides mime types used to get extensions as upper case.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -408,7 +403,7 @@ class MimeTypesTest extends BaseTestCase
|
||||
],
|
||||
[
|
||||
'application/x-7z-compressed' => '7Z',
|
||||
'application/json' => 'JSON',
|
||||
'application/json' => 'JSON',
|
||||
],
|
||||
];
|
||||
|
||||
@@ -424,12 +419,12 @@ class MimeTypesTest extends BaseTestCase
|
||||
'XML',
|
||||
'XSL',
|
||||
],
|
||||
'audio/mp4' => 'MP4A',
|
||||
'text/html' => [
|
||||
'audio/mp4' => 'MP4A',
|
||||
'text/html' => [
|
||||
'HTML',
|
||||
'HTM',
|
||||
],
|
||||
'video/mp4' => [
|
||||
'video/mp4' => [
|
||||
'MP4',
|
||||
'MP4V',
|
||||
'MPG4',
|
||||
@@ -440,37 +435,37 @@ class MimeTypesTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides real file path to get mime type
|
||||
* Provides real file path to get mime type.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideFilePathToGetMimeTypeOfRealFile()
|
||||
{
|
||||
yield[
|
||||
$this->getFilePathForTesting('minion.jpg'),
|
||||
$this->getFilePathToTests('minion.jpg'),
|
||||
'image/jpeg',
|
||||
];
|
||||
|
||||
yield[
|
||||
$this->getFilePathForTesting('lorem-ipsum.txt'),
|
||||
$this->getFilePathToTests('lorem-ipsum.txt'),
|
||||
'text/plain',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides real file path to get information if the file is an image
|
||||
* Provides real file path to get information if the file is an image.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideExistingFilePathToCheckIsImagePath()
|
||||
{
|
||||
yield[
|
||||
$this->getFilePathForTesting('minion.jpg'),
|
||||
$this->getFilePathToTests('minion.jpg'),
|
||||
true,
|
||||
];
|
||||
|
||||
yield[
|
||||
$this->getFilePathForTesting('lorem-ipsum.txt'),
|
||||
$this->getFilePathToTests('lorem-ipsum.txt'),
|
||||
false,
|
||||
];
|
||||
}
|
||||
@@ -14,33 +14,23 @@ use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\Locale;
|
||||
use Meritoo\Common\Utilities\Miscellaneous;
|
||||
use ReflectionException;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* Test case of the Miscellaneous methods (only static functions)
|
||||
* Tests of the Miscellaneous methods (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class MiscellaneousTest extends BaseTestCase
|
||||
{
|
||||
private $stringSmall;
|
||||
private $stringCommaSeparated;
|
||||
private $stringDotSeparated;
|
||||
private $stringWithoutSpaces;
|
||||
|
||||
/**
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(Miscellaneous::class);
|
||||
}
|
||||
|
||||
public function testGetDirectoryContent()
|
||||
{
|
||||
$directoryPath = __DIR__ . '/../';
|
||||
$directoryPath = __DIR__.'/../';
|
||||
$filePath = __FILE__;
|
||||
|
||||
self::assertNull(Miscellaneous::getDirectoryContent(null));
|
||||
@@ -133,8 +123,8 @@ class MiscellaneousTest extends BaseTestCase
|
||||
*/
|
||||
$uniqueFileName2 = Miscellaneous::getUniqueFileName($originalFileName);
|
||||
|
||||
$isCorrect1 = (bool)preg_match($pattern, $uniqueFileName1);
|
||||
$isCorrect2 = (bool)preg_match($pattern, $uniqueFileName2);
|
||||
$isCorrect1 = (bool) preg_match($pattern, $uniqueFileName1);
|
||||
$isCorrect2 = (bool) preg_match($pattern, $uniqueFileName2);
|
||||
|
||||
self::assertTrue($isCorrect1);
|
||||
self::assertTrue($isCorrect2);
|
||||
@@ -164,8 +154,8 @@ class MiscellaneousTest extends BaseTestCase
|
||||
$expected = "int(123)\n";
|
||||
|
||||
if ($xdebugLoaded) {
|
||||
$libraryPath = realpath(sprintf('%s%s', dirname(__FILE__), '/../..'));
|
||||
$filePath = sprintf('%s%s', $libraryPath, '/src/Utilities/Miscellaneous.php:');
|
||||
$libraryPath = realpath(sprintf('%s%s', dirname(__FILE__), '/../../../../..'));
|
||||
$filePath = sprintf('%s%s', $libraryPath, '/src/Meritoo/Common/Utilities/Miscellaneous.php:');
|
||||
|
||||
/*
|
||||
* Attention. I have to use "\d+" at the end of $filePath, because number of line may be different if new
|
||||
@@ -355,8 +345,8 @@ class MiscellaneousTest extends BaseTestCase
|
||||
{
|
||||
$suffix = '...';
|
||||
|
||||
self::assertEquals('Lorem ipsum' . $suffix, Miscellaneous::substringToWord($this->stringCommaSeparated, 20));
|
||||
self::assertEquals('Lorem ipsum dolor sit' . $suffix, Miscellaneous::substringToWord($this->stringCommaSeparated, 25));
|
||||
self::assertEquals('Lorem ipsum'.$suffix, Miscellaneous::substringToWord($this->stringCommaSeparated, 20));
|
||||
self::assertEquals('Lorem ipsum dolor sit'.$suffix, Miscellaneous::substringToWord($this->stringCommaSeparated, 25));
|
||||
|
||||
self::assertEquals('Lorem ipsum dolor', Miscellaneous::substringToWord($this->stringCommaSeparated, 20, ''));
|
||||
self::assertEquals('Lorem ipsum dolor sit amet, consectetur', Miscellaneous::substringToWord($this->stringCommaSeparated, 40, ''));
|
||||
@@ -366,37 +356,38 @@ class MiscellaneousTest extends BaseTestCase
|
||||
{
|
||||
self::assertEquals('Lorem ipsum dolor sit<br>amet, consectetur<br>adipiscing<br>elit', Miscellaneous::breakLongText($this->stringCommaSeparated, 20));
|
||||
self::assertEquals('Lorem ipsum dolor sit---amet, consectetur---adipiscing---elit', Miscellaneous::breakLongText($this->stringCommaSeparated, 20, '---'));
|
||||
self::assertEquals('LoremIpsum<br>DolorSitAm<br>etConsecte<br>turAdipisc<br>ingElit', Miscellaneous::breakLongText($this->stringWithoutSpaces, 10));
|
||||
}
|
||||
|
||||
public function testRemoveDirectoryUsingNotExistingDirectory()
|
||||
public function testRemoveDirectory()
|
||||
{
|
||||
self::assertNull(Miscellaneous::removeDirectory('/abc/def/ghi'));
|
||||
}
|
||||
/*
|
||||
* Removing not existing directory
|
||||
*/
|
||||
self::assertTrue(Miscellaneous::removeDirectory('/abc/def/ghi'));
|
||||
|
||||
public function testRemoveDirectoryUsingNoDirectory()
|
||||
{
|
||||
$directoryPath = sys_get_temp_dir() . '/ipsum.txt';
|
||||
/*
|
||||
* Removing not directory
|
||||
*/
|
||||
$directoryPath = sys_get_temp_dir().'/ipsum.txt';
|
||||
touch($directoryPath);
|
||||
self::assertTrue(Miscellaneous::removeDirectory($directoryPath));
|
||||
}
|
||||
|
||||
public function testRemoveDirectoryUsingSimpleDirectory()
|
||||
{
|
||||
$directoryPath = sys_get_temp_dir() . '/lorem/ipsum';
|
||||
/*
|
||||
* Removing simple directory
|
||||
*/
|
||||
$directoryPath = sys_get_temp_dir().'/lorem/ipsum';
|
||||
mkdir($directoryPath, 0777, true);
|
||||
self::assertTrue(Miscellaneous::removeDirectory($directoryPath));
|
||||
}
|
||||
|
||||
public function testRemoveDirectoryUsingComplexDirectory()
|
||||
{
|
||||
$directory1Path = sys_get_temp_dir() . '/lorem/ipsum';
|
||||
$directory2Path = sys_get_temp_dir() . '/lorem/dolor/sit';
|
||||
/*
|
||||
* Removing more complex directory
|
||||
*/
|
||||
$directory1Path = sys_get_temp_dir().'/lorem/ipsum';
|
||||
$directory2Path = sys_get_temp_dir().'/lorem/dolor/sit';
|
||||
|
||||
mkdir($directory1Path, 0777, true);
|
||||
mkdir($directory2Path, 0777, true);
|
||||
|
||||
self::assertTrue(Miscellaneous::removeDirectory(sys_get_temp_dir() . '/lorem', false));
|
||||
self::assertTrue(Miscellaneous::removeDirectory(sys_get_temp_dir().'/lorem', false));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -512,35 +503,16 @@ class MiscellaneousTest extends BaseTestCase
|
||||
self::assertEquals('lorem ipsum', Miscellaneous::trimSmart(' lorem ipsum '));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $emptyPaths Empty paths co concatenate
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testConcatenatePathsWithEmptyPaths($emptyPaths)
|
||||
{
|
||||
self::assertEquals('', Miscellaneous::concatenatePaths($emptyPaths));
|
||||
}
|
||||
|
||||
public function testConcatenatePathsWithOneEmptyPath()
|
||||
{
|
||||
$paths = [
|
||||
'first/directory',
|
||||
'second/one',
|
||||
'',
|
||||
'and/the/third',
|
||||
];
|
||||
|
||||
$concatenated = Miscellaneous::concatenatePaths($paths);
|
||||
unset($paths[2]);
|
||||
$imploded = implode('/', $paths);
|
||||
|
||||
self::assertEquals('/' . $imploded, $concatenated);
|
||||
}
|
||||
|
||||
public function testConcatenatePathsInNixOs()
|
||||
public function testConcatenatePaths()
|
||||
{
|
||||
/*
|
||||
* For *nix operating system
|
||||
* Common cases
|
||||
*/
|
||||
self::assertEquals('', Miscellaneous::concatenatePaths(null));
|
||||
self::assertEquals('', Miscellaneous::concatenatePaths([]));
|
||||
|
||||
/*
|
||||
* *nix operating system
|
||||
*/
|
||||
$paths1 = [
|
||||
'first/directory',
|
||||
@@ -548,12 +520,9 @@ class MiscellaneousTest extends BaseTestCase
|
||||
'and/the/third',
|
||||
];
|
||||
|
||||
self::assertEquals('/' . implode('/', $paths1), Miscellaneous::concatenatePaths($paths1));
|
||||
self::assertEquals('/' . implode('/', $paths1), Miscellaneous::concatenatePaths($paths1[0], $paths1[1], $paths1[2]));
|
||||
}
|
||||
self::assertEquals('/'.implode('/', $paths1), Miscellaneous::concatenatePaths($paths1));
|
||||
self::assertEquals('/'.implode('/', $paths1), Miscellaneous::concatenatePaths($paths1[0], $paths1[1], $paths1[2]));
|
||||
|
||||
public function testConcatenatePathsInWindowsOs()
|
||||
{
|
||||
/*
|
||||
* For Windows operating system
|
||||
*/
|
||||
@@ -665,14 +634,9 @@ class MiscellaneousTest extends BaseTestCase
|
||||
self::assertEquals(255, Miscellaneous::getValidColorComponent(255, false));
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
*/
|
||||
public function testGetInvertedColorWithIncorrectLength()
|
||||
{
|
||||
$this->setExpectedException(IncorrectColorHexLengthException::class);
|
||||
|
||||
$this->expectException(IncorrectColorHexLengthException::class);
|
||||
Miscellaneous::getInvertedColor(null);
|
||||
Miscellaneous::getInvertedColor('');
|
||||
Miscellaneous::getInvertedColor(1);
|
||||
@@ -683,14 +647,9 @@ class MiscellaneousTest extends BaseTestCase
|
||||
Miscellaneous::getInvertedColor('1234567');
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
*/
|
||||
public function testGetInvertedColorWithInvalidValue()
|
||||
{
|
||||
$this->setExpectedException(InvalidColorHexValueException::class);
|
||||
|
||||
$this->expectException(InvalidColorHexValueException::class);
|
||||
Miscellaneous::getInvertedColor('0011zz');
|
||||
Miscellaneous::getInvertedColor('001#zz');
|
||||
Miscellaneous::getInvertedColor('001!zz');
|
||||
@@ -698,10 +657,6 @@ class MiscellaneousTest extends BaseTestCase
|
||||
Miscellaneous::getInvertedColor('00ppqq');
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
*/
|
||||
public function testGetInvertedColor()
|
||||
{
|
||||
/*
|
||||
@@ -765,13 +720,8 @@ class MiscellaneousTest extends BaseTestCase
|
||||
self::assertSame($expected, Miscellaneous::fillMissingZeros($number, $length, $before));
|
||||
}
|
||||
|
||||
public function testGetProjectRootPath()
|
||||
{
|
||||
self::assertNotEmpty(Miscellaneous::getProjectRootPath());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides string to convert characters to latin characters and not lower cased and not human-readable
|
||||
* Provides string to convert characters to latin characters and not lower cased and not human-readable.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -866,7 +816,7 @@ class MiscellaneousTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides string to convert characters to latin characters and lower cased and human-readable
|
||||
* Provides string to convert characters to latin characters and lower cased and human-readable.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -961,7 +911,7 @@ class MiscellaneousTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides names of files
|
||||
* Provides names of files.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -989,7 +939,7 @@ class MiscellaneousTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides string to convert to camel case
|
||||
* Provides string to convert to camel case.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -1015,7 +965,7 @@ class MiscellaneousTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path used to remove the starting / beginning directory's separator
|
||||
* Provides path used to remove the starting / beginning directory's separator.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -1059,7 +1009,7 @@ class MiscellaneousTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path used to remove the ending directory's separator
|
||||
* Provides path used to remove the ending directory's separator.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -1103,7 +1053,7 @@ class MiscellaneousTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides empty value used to fill missing zeros
|
||||
* Provides empty value used to fill missing zeros.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -1117,7 +1067,7 @@ class MiscellaneousTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides number used to fill missing zeros
|
||||
* Provides number used to fill missing zeros.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -1190,7 +1140,6 @@ class MiscellaneousTest extends BaseTestCase
|
||||
$this->stringSmall = 'Lorem ipsum dolor sit amet.';
|
||||
$this->stringCommaSeparated = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
|
||||
$this->stringDotSeparated = 'Etiam ullamcorper. Suspendisse a pellentesque dui, non felis.';
|
||||
$this->stringWithoutSpaces = 'LoremIpsumDolorSitAmetConsecteturAdipiscingElit';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1203,6 +1152,5 @@ class MiscellaneousTest extends BaseTestCase
|
||||
unset($this->stringSmall);
|
||||
unset($this->stringCommaSeparated);
|
||||
unset($this->stringDotSeparated);
|
||||
unset($this->stringWithoutSpaces);
|
||||
}
|
||||
}
|
||||
@@ -12,22 +12,15 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The A class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class A
|
||||
{
|
||||
use E;
|
||||
|
||||
private $count = 1;
|
||||
|
||||
protected function lorem()
|
||||
{
|
||||
return 'ipsum';
|
||||
}
|
||||
|
||||
protected function getCount()
|
||||
{
|
||||
return $this->count;
|
||||
}
|
||||
}
|
||||
@@ -9,12 +9,12 @@
|
||||
namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
|
||||
/**
|
||||
* The H interface.
|
||||
* The B class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
interface I
|
||||
class B extends A
|
||||
{
|
||||
}
|
||||
@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The C class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class C extends B
|
||||
{
|
||||
@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The D class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class D
|
||||
{
|
||||
@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The E trait.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
trait E
|
||||
{
|
||||
246
tests/Meritoo/Common/Test/Utilities/ReflectionTest.php
Normal file
246
tests/Meritoo/Common/Test/Utilities/ReflectionTest.php
Normal file
@@ -0,0 +1,246 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Utilities;
|
||||
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
|
||||
use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
|
||||
use Meritoo\Common\Exception\Reflection\TooManyChildClassesException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\A;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\B;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\C;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\D;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\E;
|
||||
use Meritoo\Common\Utilities\Reflection;
|
||||
|
||||
/**
|
||||
* Tests of the useful reflection methods.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class ReflectionTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* @param mixed $invalidClass Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetClassNameInvalidClass($invalidClass)
|
||||
{
|
||||
self::assertNull(Reflection::getClassName($invalidClass));
|
||||
self::assertNull(Reflection::getClassName(123));
|
||||
}
|
||||
|
||||
public function testGetClassNameNotExistingClass()
|
||||
{
|
||||
/*
|
||||
* Not existing class
|
||||
*/
|
||||
self::assertEquals('', Reflection::getClassName('xyz'));
|
||||
self::assertEquals('', Reflection::getClassName('xyz', true));
|
||||
}
|
||||
|
||||
public function testGetClassNameExistingClass()
|
||||
{
|
||||
/*
|
||||
* Existing class
|
||||
*/
|
||||
self::assertEquals(self::class, Reflection::getClassName(self::class));
|
||||
self::assertEquals('ReflectionTest', Reflection::getClassName(self::class, true));
|
||||
self::assertEquals(DateTime::class, Reflection::getClassName(new DateTime()));
|
||||
self::assertEquals(DateTime::class, Reflection::getClassName(new DateTime(), true));
|
||||
|
||||
self::assertEquals(DateTime::class, Reflection::getClassName([
|
||||
new DateTime(),
|
||||
new DateTime('yesterday'),
|
||||
]));
|
||||
}
|
||||
|
||||
public function testGetClassNameDuplicatedName()
|
||||
{
|
||||
/*
|
||||
* Class with namespace containing name of class (duplicated string)
|
||||
*/
|
||||
if (class_exists('Symfony\Bundle\SecurityBundle\SecurityBundle')) {
|
||||
self::assertEquals('Symfony\Bundle\SecurityBundle\SecurityBundle', Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle'));
|
||||
self::assertEquals('SecurityBundle', Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle', true));
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetClassNamespaceNotExistingClass()
|
||||
{
|
||||
/*
|
||||
* Not existing class
|
||||
*/
|
||||
self::assertEquals('', Reflection::getClassNamespace('xyz'));
|
||||
}
|
||||
|
||||
public function testGetClassNamespaceExistingClass()
|
||||
{
|
||||
/*
|
||||
* Existing class
|
||||
*/
|
||||
self::assertEquals('Meritoo\Common\Test\Utilities', Reflection::getClassNamespace(self::class));
|
||||
self::assertEquals(DateTime::class, Reflection::getClassNamespace(new DateTime()));
|
||||
|
||||
self::assertEquals(DateTime::class, Reflection::getClassNamespace([
|
||||
new DateTime(),
|
||||
new DateTime('yesterday'),
|
||||
]));
|
||||
}
|
||||
|
||||
public function testGetClassNamespaceDuplicatedName()
|
||||
{
|
||||
/*
|
||||
* Class with namespace containing name of class (duplicated string)
|
||||
*/
|
||||
if (class_exists('Symfony\Bundle\SecurityBundle\SecurityBundle')) {
|
||||
self::assertEquals('Symfony\Bundle\SecurityBundle', Reflection::getClassNamespace('Symfony\Bundle\SecurityBundle\SecurityBundle'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $invalidClass Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetChildClassesInvalidClass($invalidClass)
|
||||
{
|
||||
$this->expectException(CannotResolveClassNameException::class);
|
||||
|
||||
self::assertNull(Reflection::getChildClasses($invalidClass));
|
||||
self::assertNull(Reflection::getChildClasses(123));
|
||||
}
|
||||
|
||||
public function testGetChildClassesNotExistingClass()
|
||||
{
|
||||
$this->expectException(CannotResolveClassNameException::class);
|
||||
self::assertEquals('', Reflection::getChildClasses('xyz'));
|
||||
}
|
||||
|
||||
public function testGetChildClassesExistingClass()
|
||||
{
|
||||
/*
|
||||
* Attention. I have to create instances of these classes to load them and be available while using
|
||||
* get_declared_classes() function in the Reflection::getChildClasses() method. Without these instances the
|
||||
* Reflection::getChildClasses() method returns an empty array even if given class has child classes.
|
||||
*/
|
||||
new A();
|
||||
new B();
|
||||
new C();
|
||||
|
||||
$effect = [
|
||||
C::class,
|
||||
];
|
||||
|
||||
self::assertEquals($effect, Reflection::getChildClasses(B::class));
|
||||
|
||||
$effect = [
|
||||
B::class,
|
||||
C::class,
|
||||
];
|
||||
|
||||
self::assertEquals($effect, Reflection::getChildClasses(A::class));
|
||||
}
|
||||
|
||||
public function testGetOneChildClassWithMissingChildClasses()
|
||||
{
|
||||
$this->expectException(MissingChildClassesException::class);
|
||||
self::assertEquals('LoremIpsum', Reflection::getOneChildClass(C::class));
|
||||
}
|
||||
|
||||
public function testGetOneChildClassWithTooManyChildClasses()
|
||||
{
|
||||
$this->expectException(TooManyChildClassesException::class);
|
||||
|
||||
self::assertEquals(B::class, Reflection::getOneChildClass(A::class));
|
||||
self::assertEquals(C::class, Reflection::getOneChildClass(A::class));
|
||||
}
|
||||
|
||||
public function testGetOneChildClass()
|
||||
{
|
||||
self::assertEquals(C::class, Reflection::getOneChildClass(B::class));
|
||||
}
|
||||
|
||||
public function testGetMethods()
|
||||
{
|
||||
self::assertEquals(0, count(Reflection::getMethods(B::class, true)));
|
||||
self::assertEquals(1, count(Reflection::getMethods(B::class)));
|
||||
self::assertEquals(1, count(Reflection::getMethods(A::class)));
|
||||
self::assertEquals(2, count(Reflection::getMethods(C::class, true)));
|
||||
self::assertEquals(3, count(Reflection::getMethods(C::class)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|object|string $class An array of objects, namespaces, object or namespace
|
||||
* @param array|string $trait An array of strings or string
|
||||
*
|
||||
* @dataProvider provideInvalidClassAndTrait
|
||||
*/
|
||||
public function testUsesTraitInvalidClass($class, $trait)
|
||||
{
|
||||
$this->expectException(CannotResolveClassNameException::class);
|
||||
self::assertNull(Reflection::usesTrait($class, $trait));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $trait Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testUsesTraitInvalidTrait($trait)
|
||||
{
|
||||
$this->expectException(CannotResolveClassNameException::class);
|
||||
self::assertNull(Reflection::usesTrait(DateTime::class, $trait));
|
||||
}
|
||||
|
||||
public function testUsesTraitExistingClass()
|
||||
{
|
||||
self::assertTrue(Reflection::usesTrait(A::class, E::class));
|
||||
self::assertFalse(Reflection::usesTrait(B::class, E::class));
|
||||
self::assertFalse(Reflection::usesTrait(C::class, E::class));
|
||||
self::assertFalse(Reflection::usesTrait(D::class, E::class));
|
||||
}
|
||||
|
||||
public function testUsesTraitExistingClassAndVerifyParents()
|
||||
{
|
||||
self::assertTrue(Reflection::usesTrait(A::class, E::class, true));
|
||||
self::assertTrue(Reflection::usesTrait(B::class, E::class, true));
|
||||
self::assertTrue(Reflection::usesTrait(C::class, E::class, true));
|
||||
self::assertFalse(Reflection::usesTrait(D::class, E::class, true));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides invalid class and trait.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideInvalidClassAndTrait()
|
||||
{
|
||||
yield[
|
||||
'',
|
||||
'',
|
||||
];
|
||||
|
||||
yield[
|
||||
null,
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
0,
|
||||
0,
|
||||
];
|
||||
|
||||
yield[
|
||||
[],
|
||||
[],
|
||||
];
|
||||
}
|
||||
}
|
||||
291
tests/Meritoo/Common/Test/Utilities/RegexTest.php
Normal file
291
tests/Meritoo/Common/Test/Utilities/RegexTest.php
Normal file
@@ -0,0 +1,291 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
/**
|
||||
* Tests of the useful regular expressions methods.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class RegexTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
private $simpleText;
|
||||
|
||||
private $camelCaseText;
|
||||
|
||||
public function testGetCamelCaseParts()
|
||||
{
|
||||
$parts = [];
|
||||
self::assertEquals($parts, Regex::getCamelCaseParts(''));
|
||||
|
||||
$parts = [
|
||||
'lorem',
|
||||
];
|
||||
|
||||
self::assertEquals($parts, Regex::getCamelCaseParts('lorem'));
|
||||
|
||||
$parts = [
|
||||
'lorem',
|
||||
'Ipsum',
|
||||
'Dolor',
|
||||
'Sit',
|
||||
];
|
||||
|
||||
self::assertEquals($parts, Regex::getCamelCaseParts($this->camelCaseText));
|
||||
|
||||
$parts = [
|
||||
'Lorem',
|
||||
'Ipsum',
|
||||
'Dolor',
|
||||
'Sit',
|
||||
];
|
||||
|
||||
$string = ucfirst($this->camelCaseText); // 'LoremIpsumDolorSit'
|
||||
self::assertEquals($parts, Regex::getCamelCaseParts($string));
|
||||
}
|
||||
|
||||
public function testCamelCase2humanReadable()
|
||||
{
|
||||
self::assertEquals('', Regex::camelCase2humanReadable(''));
|
||||
self::assertEquals('lorem', Regex::camelCase2humanReadable('lorem'));
|
||||
|
||||
self::assertEquals($this->simpleText, Regex::camelCase2humanReadable($this->camelCaseText));
|
||||
self::assertEquals(ucfirst($this->simpleText), Regex::camelCase2humanReadable($this->camelCaseText, true));
|
||||
}
|
||||
|
||||
public function testCamelCase2simpleLowercase()
|
||||
{
|
||||
self::assertEquals('', Regex::camelCase2simpleLowercase(''));
|
||||
self::assertEquals('lorem', Regex::camelCase2simpleLowercase('lorem'));
|
||||
self::assertEquals('Lorem', Regex::camelCase2simpleLowercase('Lorem', '', false));
|
||||
self::assertEquals('lorem-ipsum-dolor-sit', Regex::camelCase2simpleLowercase($this->camelCaseText, '-'));
|
||||
self::assertEquals('lorem-Ipsum-Dolor-Sit', Regex::camelCase2simpleLowercase($this->camelCaseText, '-', false));
|
||||
}
|
||||
|
||||
public function testIsValidUrl()
|
||||
{
|
||||
$validUrls = [
|
||||
'http://php.net',
|
||||
'http://php.net/',
|
||||
'http://php.net/docs.php',
|
||||
'http://php.net/get-involved.php',
|
||||
'http://php.net/manual/en/function.preg-match.php',
|
||||
'http://domain.com/BigLetters',
|
||||
'http://domain.com/Another-Big-Letters',
|
||||
'http://domain.com/?a=1&b=c2d',
|
||||
'http://domAin.COM/?a=1&B=c2D',
|
||||
'http://domain.com/index.php?a=1&b=c2d',
|
||||
'http://domain.com/another-page-2.php?a=1&b=c2d',
|
||||
'https://domain.com',
|
||||
'https://domain.com/',
|
||||
];
|
||||
|
||||
$invalidUrls = [
|
||||
'',
|
||||
null,
|
||||
false,
|
||||
true,
|
||||
0,
|
||||
1,
|
||||
123,
|
||||
'123',
|
||||
'http:',
|
||||
'http://',
|
||||
'http://abc',
|
||||
'ftp://def',
|
||||
];
|
||||
|
||||
foreach ($validUrls as $url) {
|
||||
self::assertTrue(Regex::isValidUrl($url));
|
||||
}
|
||||
|
||||
foreach ($invalidUrls as $url) {
|
||||
self::assertFalse(Regex::isValidUrl($url));
|
||||
}
|
||||
}
|
||||
|
||||
public function testIsSubPathOf()
|
||||
{
|
||||
self::assertFalse(Regex::isSubPathOf(null, null));
|
||||
self::assertFalse(Regex::isSubPathOf('', ''));
|
||||
|
||||
self::assertFalse(Regex::isSubPathOf('', '/my/directory'));
|
||||
self::assertFalse(Regex::isSubPathOf('/my/file', ''));
|
||||
self::assertFalse(Regex::isSubPathOf('/my/file', '/my/directory'));
|
||||
|
||||
self::assertTrue(Regex::isSubPathOf('/my/directory', '/my/directory'));
|
||||
self::assertTrue(Regex::isSubPathOf('/my/directory/', '/my/directory'));
|
||||
self::assertTrue(Regex::isSubPathOf('/my/directory', '/my/directory/'));
|
||||
self::assertTrue(Regex::isSubPathOf('/my/directory/', '/my/directory/'));
|
||||
|
||||
self::assertTrue(Regex::isSubPathOf('/my/another/directory/another/file', '/my/another/directory'));
|
||||
}
|
||||
|
||||
public function testIsLetterOrDigit()
|
||||
{
|
||||
self::assertTrue(Regex::isLetterOrDigit('a'));
|
||||
self::assertTrue(Regex::isLetterOrDigit(10));
|
||||
self::assertFalse(Regex::isLetterOrDigit(';'));
|
||||
}
|
||||
|
||||
public function testStartsWith()
|
||||
{
|
||||
$string = 'Lorem ipsum dolor sit amet';
|
||||
|
||||
$beginning = 'Lor';
|
||||
self::assertTrue(Regex::startsWith($string, $beginning));
|
||||
|
||||
$beginning = 'L';
|
||||
self::assertTrue(Regex::startsWith($string, $beginning));
|
||||
|
||||
$beginning = 'X';
|
||||
self::assertFalse(Regex::startsWith($string, $beginning));
|
||||
|
||||
$string = '1234567890';
|
||||
$beginning = '1';
|
||||
self::assertTrue(Regex::startsWith($string, $beginning));
|
||||
|
||||
$beginning = ';';
|
||||
self::assertFalse(Regex::startsWith($string, $beginning));
|
||||
}
|
||||
|
||||
public function testStartsWithDirectorySeparator()
|
||||
{
|
||||
/*
|
||||
* Slash as separator
|
||||
*/
|
||||
$separatorSlash = '/';
|
||||
|
||||
self::assertTrue(Regex::startsWithDirectorySeparator('/my/extra/directory', $separatorSlash));
|
||||
self::assertFalse(Regex::startsWithDirectorySeparator('my/extra/directory', $separatorSlash));
|
||||
|
||||
/*
|
||||
* Backslash as separator
|
||||
*/
|
||||
$separatorBackslash = '\\';
|
||||
|
||||
self::assertTrue(Regex::startsWithDirectorySeparator('\my\extra\directory', $separatorBackslash));
|
||||
self::assertFalse(Regex::startsWithDirectorySeparator('my\extra\directory', $separatorBackslash));
|
||||
}
|
||||
|
||||
public function testEndsWithDirectorySeparator()
|
||||
{
|
||||
/*
|
||||
* Slash as separator
|
||||
*/
|
||||
$separatorSlash = '/';
|
||||
|
||||
self::assertTrue(Regex::endsWithDirectorySeparator('my simple text/', $separatorSlash));
|
||||
self::assertFalse(Regex::endsWithDirectorySeparator('my simple text', $separatorSlash));
|
||||
|
||||
/*
|
||||
* Backslash as separator
|
||||
*/
|
||||
$separatorBackslash = '\\';
|
||||
|
||||
self::assertTrue(Regex::endsWithDirectorySeparator('my simple text\\', $separatorBackslash));
|
||||
self::assertFalse(Regex::endsWithDirectorySeparator('my simple text', $separatorBackslash));
|
||||
}
|
||||
|
||||
public function testEndsWith()
|
||||
{
|
||||
self::assertFalse(Regex::endsWith($this->simpleText, '\.\.\.'));
|
||||
self::assertFalse(Regex::endsWith($this->simpleText, '\.'));
|
||||
self::assertTrue(Regex::endsWith($this->simpleText, 't'));
|
||||
}
|
||||
|
||||
public function testIsSetUriParameter()
|
||||
{
|
||||
$uri = 'www.domain.com/?name=phil&type=4';
|
||||
|
||||
$parameterName = 'type';
|
||||
self::assertTrue(Regex::isSetUriParameter($uri, $parameterName));
|
||||
|
||||
$parameterName = 'color';
|
||||
self::assertFalse(Regex::isSetUriParameter($uri, $parameterName));
|
||||
}
|
||||
|
||||
public function testContainsEntities()
|
||||
{
|
||||
self::assertFalse(Regex::containsEntities('Lorem ipsum'));
|
||||
self::assertTrue(Regex::containsEntities('Lorem ipsum »'));
|
||||
}
|
||||
|
||||
public function testContains()
|
||||
{
|
||||
self::assertTrue(Regex::contains($this->simpleText, 'ipsum'));
|
||||
self::assertFalse(Regex::contains($this->simpleText, 'neque'));
|
||||
}
|
||||
|
||||
public function testIsFileName()
|
||||
{
|
||||
$filePath = __FILE__;
|
||||
$directoryPath = dirname($filePath);
|
||||
|
||||
self::assertTrue(Regex::isFileName($filePath));
|
||||
self::assertFalse(Regex::isFileName($directoryPath));
|
||||
}
|
||||
|
||||
public function testIsQuoted()
|
||||
{
|
||||
self::assertTrue(Regex::isQuoted('\'lorem ipsum\''));
|
||||
self::assertTrue(Regex::isQuoted('"lorem ipsum"'));
|
||||
|
||||
self::assertFalse(Regex::isQuoted('lorem ipsum'));
|
||||
self::assertFalse(Regex::isQuoted(new \stdClass()));
|
||||
}
|
||||
|
||||
public function testIsWindowsBasedPath()
|
||||
{
|
||||
self::assertTrue(Regex::isWindowsBasedPath('C:\path\to\directory'));
|
||||
self::assertTrue(Regex::isWindowsBasedPath('C:\path\to\file.jpg'));
|
||||
|
||||
self::assertFalse(Regex::isWindowsBasedPath('/path/to/directory'));
|
||||
self::assertFalse(Regex::isWindowsBasedPath('/path/to/file.jpg'));
|
||||
}
|
||||
|
||||
public function testIsValidNip()
|
||||
{
|
||||
self::assertFalse(Regex::isValidNip(null));
|
||||
self::assertFalse(Regex::isValidNip(''));
|
||||
self::assertFalse(Regex::isValidNip(1234));
|
||||
self::assertFalse(Regex::isValidNip(1234567890));
|
||||
self::assertFalse(Regex::isValidNip(0000000000));
|
||||
self::assertFalse(Regex::isValidNip('1234567890'));
|
||||
self::assertFalse(Regex::isValidNip('0000000000'));
|
||||
self::assertFalse(Regex::isValidNip('abc'));
|
||||
self::assertFalse(Regex::isValidNip($this->simpleText));
|
||||
|
||||
self::assertTrue(Regex::isValidNip('7340009469')); // Onet S.A.
|
||||
self::assertTrue(Regex::isValidNip('5252530705')); // Facebook Poland sp. z o.o.
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->simpleText = 'lorem ipsum dolor sit';
|
||||
$this->camelCaseText = str_replace(' ', '', lcfirst(ucwords($this->simpleText))); // 'loremIpsumDolorSit'
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function tearDown()
|
||||
{
|
||||
parent::tearDown();
|
||||
|
||||
unset($this->simpleText);
|
||||
unset($this->camelCaseText);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user