mirror of
https://github.com/wiosna-dev/common-library.git
synced 2026-03-12 09:31:51 +01:00
Compare commits
1 Commits
feature/WZ
...
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
|
|
||||||
103
.gitignore
vendored
103
.gitignore
vendored
@@ -1,65 +1,79 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
### Environment-related parameters
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
.env
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
### Vendors
|
### Vendors
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
/vendor/
|
/vendor/
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
### Composer
|
### Composer
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
/composer.lock
|
|
||||||
/composer.phar
|
/composer.phar
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
### Phing
|
### Phing
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
/phing/properties
|
/phing/properties
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
### PHPUnit
|
### PHPUnit
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
/phpunit.xml
|
/phpunit.xml
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
### PHP Coding Standards Fixer
|
### PHP Coding Standards Fixer generated files
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
/.php_cs
|
|
||||||
/.php_cs.cache
|
/.php_cs.cache
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
### Build files
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
/build/
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
### Generated databases
|
### Generated databases
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
/data/tmp
|
/data/tmp
|
||||||
*.sql
|
*.sql
|
||||||
*.sqlite
|
*.sqlite
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
### JetBrains template
|
### Compiled source
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
|
*.com
|
||||||
|
*.class
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
*.o
|
||||||
|
*.so
|
||||||
|
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
|
### Shell scripts
|
||||||
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
|
/*.sh
|
||||||
|
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
|
### JetBrains
|
||||||
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
/.idea
|
/.idea
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
### macOS template
|
### NetBeans template
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
# General
|
nbproject/private/
|
||||||
|
build/
|
||||||
|
nbbuild/
|
||||||
|
dist/
|
||||||
|
nbdist/
|
||||||
|
nbactions.xml
|
||||||
|
.nb-gradle/
|
||||||
|
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
|
### OSX template
|
||||||
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.AppleDouble
|
.AppleDouble
|
||||||
.LSOverride
|
.LSOverride
|
||||||
@@ -77,7 +91,6 @@ Icon
|
|||||||
.TemporaryItems
|
.TemporaryItems
|
||||||
.Trashes
|
.Trashes
|
||||||
.VolumeIcon.icns
|
.VolumeIcon.icns
|
||||||
.com.apple.timemachine.donotpresent
|
|
||||||
|
|
||||||
# Directories potentially created on remote AFP share
|
# Directories potentially created on remote AFP share
|
||||||
.AppleDB
|
.AppleDB
|
||||||
@@ -87,9 +100,9 @@ Temporary Items
|
|||||||
.apdisk
|
.apdisk
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
### Linux template
|
### Linux template
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
*~
|
*~
|
||||||
|
|
||||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||||
@@ -101,23 +114,16 @@ Temporary Items
|
|||||||
# Linux trash folder which might appear on any partition or disk
|
# Linux trash folder which might appear on any partition or disk
|
||||||
.Trash-*
|
.Trash-*
|
||||||
|
|
||||||
# .nfs files are created when an open file is removed but is still being accessed
|
|
||||||
.nfs*
|
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
### Windows template
|
### Windows template
|
||||||
# ------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------
|
||||||
# Windows thumbnail cache files
|
# Windows image file caches
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
ehthumbs.db
|
ehthumbs.db
|
||||||
ehthumbs_vista.db
|
|
||||||
|
|
||||||
# Dump file
|
|
||||||
*.stackdump
|
|
||||||
|
|
||||||
# Folder config file
|
# Folder config file
|
||||||
[Dd]esktop.ini
|
Desktop.ini
|
||||||
|
|
||||||
# Recycle Bin used on file shares
|
# Recycle Bin used on file shares
|
||||||
$RECYCLE.BIN/
|
$RECYCLE.BIN/
|
||||||
@@ -125,7 +131,6 @@ $RECYCLE.BIN/
|
|||||||
# Windows Installer files
|
# Windows Installer files
|
||||||
*.cab
|
*.cab
|
||||||
*.msi
|
*.msi
|
||||||
*.msix
|
|
||||||
*.msm
|
*.msm
|
||||||
*.msp
|
*.msp
|
||||||
|
|
||||||
|
|||||||
25
.php_cs.dist
25
.php_cs.dist
@@ -1,6 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$finder = PhpCsFixer\Finder::create()
|
$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([
|
->in([
|
||||||
__DIR__ . '/src',
|
__DIR__ . '/src',
|
||||||
__DIR__ . '/tests',
|
__DIR__ . '/tests',
|
||||||
@@ -8,20 +15,16 @@ $finder = PhpCsFixer\Finder::create()
|
|||||||
|
|
||||||
return PhpCsFixer\Config::create()
|
return PhpCsFixer\Config::create()
|
||||||
->setRules([
|
->setRules([
|
||||||
'@Symfony' => true,
|
'@Symfony' => true,
|
||||||
'binary_operator_spaces' => [
|
'phpdoc_summary' => false,
|
||||||
|
'phpdoc_separation' => false,
|
||||||
|
'phpdoc_align' => false,
|
||||||
|
'cast_spaces' => false,
|
||||||
|
'binary_operator_spaces' => [
|
||||||
'align_double_arrow' => true,
|
'align_double_arrow' => true,
|
||||||
],
|
],
|
||||||
'blank_line_before_return' => false,
|
'concat_space' => [
|
||||||
'cast_spaces' => false,
|
|
||||||
'concat_space' => [
|
|
||||||
'spacing' => 'one',
|
'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);
|
->setFinder($finder);
|
||||||
|
|||||||
1
.styleci.yml
Normal file
1
.styleci.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
preset: symfony
|
||||||
@@ -4,14 +4,9 @@ php:
|
|||||||
- 5.6
|
- 5.6
|
||||||
- 7.0
|
- 7.0
|
||||||
- 7.1
|
- 7.1
|
||||||
- 7.2
|
|
||||||
|
|
||||||
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:
|
install:
|
||||||
- travis_wait 30 composer install -v
|
- composer install
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- php ./vendor/bin/phpunit
|
- php ./vendor/bin/phpunit
|
||||||
|
|||||||
83
CHANGELOG.md
83
CHANGELOG.md
@@ -1,83 +0,0 @@
|
|||||||
# Meritoo Common Library
|
|
||||||
|
|
||||||
Common and useful classes, methods, exceptions etc.
|
|
||||||
|
|
||||||
# 0.1.8
|
|
||||||
|
|
||||||
1. Size, e.g. of image
|
|
||||||
|
|
||||||
# 0.1.7
|
|
||||||
|
|
||||||
1. Collection > create trait (to make it more flexible)
|
|
||||||
|
|
||||||
# 0.1.6
|
|
||||||
|
|
||||||
1. Arrays > refactoring & more tests
|
|
||||||
2. ValueObject > Human > represents a human
|
|
||||||
3. Tests > use `Meritoo\Test\Common` namespace (instead of `Meritoo\Common\Test`)
|
|
||||||
4. Tests > use @dataProvider
|
|
||||||
|
|
||||||
# 0.1.5
|
|
||||||
|
|
||||||
1. Tests > Date > one more test case
|
|
||||||
2. Phing > update configuration
|
|
||||||
3. Miscellaneous > variableDump() method > remove, because unnecessary
|
|
||||||
4. Regex > createSlug() method > returns slug for given value
|
|
||||||
5. Arrays > getNonEmptyValues() method > returns non-empty values, e.g. without "" (empty string), null or []
|
|
||||||
6. Arrays > getNonEmptyValuesAsString() method > returns non-empty values concatenated by given separator
|
|
||||||
7. ValueObject > Company > represents a company
|
|
||||||
8. ValueObject > BankAccount > represents bank account
|
|
||||||
9. ValueObject > Address > represents address of company, institution, user etc.
|
|
||||||
|
|
||||||
# 0.1.4
|
|
||||||
|
|
||||||
1. Phing > update configuration
|
|
||||||
2. Utilities > Date > update descriptions of methods
|
|
||||||
3. Docker > docker-compose.yml > add "phpunit" service > used to run PHPUnit's tests
|
|
||||||
4. Reflection > setPropertiesValues() method > sets values of properties in given object
|
|
||||||
|
|
||||||
# 0.1.3
|
|
||||||
|
|
||||||
1. Tests > refactoring & minor improvements
|
|
||||||
2. Utilities > CssSelector > useful methods related to CSS selectors
|
|
||||||
3. Utilities > Bootstrap4CssSelector > useful methods related to CSS selectors and the Bootstrap4 (front-end component library)
|
|
||||||
|
|
||||||
# 0.1.2
|
|
||||||
|
|
||||||
1. Documentation > Value Objects
|
|
||||||
2. Docker > improve performance
|
|
||||||
3. Utilities > Reflection > setPropertyValue() method > sets value of given property
|
|
||||||
|
|
||||||
# 0.1.1
|
|
||||||
|
|
||||||
1. TravisCI > run using PHP 7.2 too
|
|
||||||
2. ValueObject > class Version > represents version of software
|
|
||||||
3. Move version of this package to `VERSION` file (from `composer.json` file)
|
|
||||||
|
|
||||||
# 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
|
|
||||||
110
README.md
110
README.md
@@ -1,43 +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://img.shields.io/badge/php-%3E%3D5.6-blue.svg) [](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
|
||||||
|
```
|
||||||
|
|
||||||
In your `composer.json` add address of repository into `repositories` section:
|
> How to install Composer: https://getcomposer.org/download
|
||||||
|
|
||||||
```json
|
## Static methods
|
||||||
"repositories": [
|
|
||||||
(...)
|
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"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 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)
|
||||||
{
|
{
|
||||||
"type": "vcs",
|
self::assertFalse(Date::getDateTime($value));
|
||||||
"url": "https://github.com/wiosna-dev/common-library"
|
|
||||||
}
|
}
|
||||||
]
|
|
||||||
|
(...)
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Run [Composer](https://getcomposer.org) to install this package in your project:
|
or in `Meritoo\Common\Test\Utilities\MimeTypesTest` class:
|
||||||
|
|
||||||
```bash
|
```php
|
||||||
composer require wiosna-dev/common-library
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
(...)
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
> [How to install Composer?](https://getcomposer.org/download)
|
## Collection of elements
|
||||||
|
|
||||||
# Usage
|
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
|
||||||
|
|
||||||
1. [Base test case (with common methods and data providers)](docs/Base-test-case.md)
|
Examples of usage below.
|
||||||
2. [Collection of elements](docs/Collection-of-elements.md)
|
|
||||||
3. [Exceptions](docs/Static-methods.md)
|
|
||||||
4. [Static methods](docs/Static-methods.md)
|
|
||||||
1. [Arrays](docs/Static-methods/Arrays.md)
|
|
||||||
2. [Regex](docs/Static-methods/Regex.md)
|
|
||||||
5. [Value Objects](docs/Value-Objects.md)
|
|
||||||
|
|
||||||
# Development
|
#### An empty collection
|
||||||
|
|
||||||
More information [you can find here](docs/Development.md)
|
```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!
|
Enjoy!
|
||||||
|
|||||||
38
build.xml
38
build.xml
@@ -1,30 +1,46 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
|
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
|
||||||
<!-- Properties -->
|
<!-- Properties -->
|
||||||
<if>
|
<if>
|
||||||
<available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
|
<available file="phing/properties" property="custom.properties.available"/>
|
||||||
<then>
|
<then>
|
||||||
<property file="${project.basedir}/phing/properties"/>
|
<property file="phing/properties" />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<property file="${project.basedir}/phing/properties.dist"/>
|
<property file="phing/properties.dist" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<!-- Default / main target -->
|
<!-- Default / main target -->
|
||||||
<target name="build:main"
|
<target name="build:main"
|
||||||
depends="build:app,
|
depends="build:app, build:tests"
|
||||||
build:tests"
|
description="Builds everything and runs all tests" />
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Build app -->
|
<!-- Build app -->
|
||||||
<target name="build:app">
|
<target name="build:app" description="Prepares app to build and tests">
|
||||||
<phing phingfile="${project.basedir}/phing/app.xml" haltonfailure="true"/>
|
<phing phingfile="phing/app.xml" haltonfailure="true" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Build tests -->
|
<!-- Build tests -->
|
||||||
<target name="build:tests">
|
<target name="build:tests" description="Runs all tests, checks and creates docs">
|
||||||
<phing phingfile="${project.basedir}/phing/tests.xml" haltonfailure="true"/>
|
<phing phingfile="phing/tests.xml" haltonfailure="true" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Conditional running of tests.
|
||||||
|
Disabled, because not required.
|
||||||
|
|
||||||
|
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
|
2017-02-22
|
||||||
|
|
||||||
|
<if>
|
||||||
|
<equals arg1="${env}" arg2="test" />
|
||||||
|
<then>
|
||||||
|
<phing phingfile="phing/tests.xml" haltonfailure="true" />
|
||||||
|
</then>
|
||||||
|
<else>
|
||||||
|
<echo message="[Skipped] Running tests, checks and creating docs, because it's a not 'test' environment..." />
|
||||||
|
</else>
|
||||||
|
</if>
|
||||||
|
-->
|
||||||
</target>
|
</target>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "wiosna-dev/common-library",
|
"name": "meritoo/common-library",
|
||||||
"description": "Useful classes, methods, extensions etc.",
|
"description": "Useful classes, methods, extensions etc.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"version": "0.0.7",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "Meritoo.pl",
|
"name": "Meritoo.pl",
|
||||||
@@ -10,35 +11,24 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.6",
|
"php": ">=5.6.0",
|
||||||
"ext-dom": "*",
|
"doctrine/orm": "^2.5",
|
||||||
"ext-fileinfo": "*",
|
"gedmo/doctrine-extensions": "^2.4",
|
||||||
"ext-json": "*",
|
"symfony/http-foundation": "^3.3"
|
||||||
"ext-simplexml": "*",
|
|
||||||
"ext-intl": "*",
|
|
||||||
"ext-pcre": "*",
|
|
||||||
"doctrine/orm": "^2.16",
|
|
||||||
"gedmo/doctrine-extensions": "^2.4 || ^3.11"
|
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"friendsofphp/php-cs-fixer": "^2.2",
|
"phpunit/phpunit": "^4.8 || ^5.0",
|
||||||
"pdepend/pdepend": "^2.5",
|
"squizlabs/php_codesniffer": "^2.8",
|
||||||
"phpmd/phpmd": "^2.6",
|
"phpmd/phpmd": "^2.6",
|
||||||
"phpunit/phpunit": "^4.8",
|
"sebastian/phpcpd": "^3.0",
|
||||||
"sebastian/phpcpd": "^2.0",
|
"pdepend/pdepend": "^2.5",
|
||||||
"squizlabs/php_codesniffer": "^2.9"
|
"phploc/phploc": "^3.0",
|
||||||
|
"friendsofphp/php-cs-fixer": "^2.1"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Meritoo\\Common\\": "src/"
|
"Meritoo\\Common\\": "src/Meritoo/Common/",
|
||||||
|
"Meritoo\\Common\\Test\\": "tests/Meritoo/Common/Test/"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"autoload-dev": {
|
|
||||||
"psr-4": {
|
|
||||||
"Meritoo\\Test\\Common\\": "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,33 +0,0 @@
|
|||||||
version: '3'
|
|
||||||
|
|
||||||
services:
|
|
||||||
#
|
|
||||||
# Required to run project
|
|
||||||
#
|
|
||||||
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:cached
|
|
||||||
composer:
|
|
||||||
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
|
|
||||||
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-composer
|
|
||||||
entrypoint: php -d memory_limit=-1 /usr/local/bin/composer
|
|
||||||
volumes:
|
|
||||||
- .:/project:cached
|
|
||||||
#
|
|
||||||
# Required to run PHPUnit's tests
|
|
||||||
#
|
|
||||||
phpunit:
|
|
||||||
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
|
|
||||||
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-phpunit
|
|
||||||
entrypoint: ./vendor/bin/phpunit
|
|
||||||
command: --version
|
|
||||||
volumes:
|
|
||||||
- .:/project:cached
|
|
||||||
@@ -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') === \
|
|
||||||
'93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { 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,55 +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)
|
|
||||||
1. [Arrays](Static-methods/Arrays.md)
|
|
||||||
2. [Regex](Static-methods/Regex.md)
|
|
||||||
5. [Value Objects](Value-Objects.md)
|
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.md)
|
|
||||||
@@ -1,53 +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)
|
|
||||||
1. [Arrays](Static-methods/Arrays.md)
|
|
||||||
2. [Regex](Static-methods/Regex.md)
|
|
||||||
5. [Value Objects](Value-Objects.md)
|
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.md)
|
|
||||||
@@ -1,123 +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. Rebuild project by running command (installs packages, prepares required directories and runs tests):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec php phing
|
|
||||||
```
|
|
||||||
|
|
||||||
> [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 --rm composer [command]
|
|
||||||
```
|
|
||||||
|
|
||||||
Examples below.
|
|
||||||
|
|
||||||
##### Install packages
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose run --rm composer install
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Update packages
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose run --rm composer update
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Add package
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose run --rm composer require [vendor]/[package]
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Remove package
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose run --rm composer remove [vendor]/[package]
|
|
||||||
```
|
|
||||||
|
|
||||||
# Coding Standards Fixer
|
|
||||||
|
|
||||||
Fix coding standard by running command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec php php-cs-fixer fix
|
|
||||||
```
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec php phing -f phing/tests.xml build:fix-coding-standards
|
|
||||||
```
|
|
||||||
|
|
||||||
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 --rm composer install`.
|
|
||||||
|
|
||||||
### Running [PHPUnit](https://phpunit.de) tests
|
|
||||||
|
|
||||||
##### Easy (with code coverage)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose run --rm phpunit --verbose
|
|
||||||
```
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec php phing -f phing/tests.xml test:phpunit
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Quick (without code coverage)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose run --rm phpunit --verbose --no-coverage
|
|
||||||
```
|
|
||||||
|
|
||||||
# Versions of packages
|
|
||||||
|
|
||||||
### squizlabs/php_codesniffer
|
|
||||||
|
|
||||||
I have to use [squizlabs/php_codesniffer](https://packagist.org/packages/squizlabs/php_codesniffer) `^2.9` instead of
|
|
||||||
`^3.3`, because [Phing doesn't support 3.x PHP_CodeSniffer](https://github.com/phingofficial/phing/issues/716).
|
|
||||||
|
|
||||||
# Other
|
|
||||||
|
|
||||||
Rebuild project and run tests by running command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose exec php phing
|
|
||||||
```
|
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.md)
|
|
||||||
@@ -1,64 +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)
|
|
||||||
1. [Arrays](Static-methods/Arrays.md)
|
|
||||||
2. [Regex](Static-methods/Regex.md)
|
|
||||||
5. [Value Objects](Value-Objects.md)
|
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.md)
|
|
||||||
@@ -1,26 +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)
|
|
||||||
1. [Arrays](Static-methods/Arrays.md)
|
|
||||||
2. [Regex](Static-methods/Regex.md)
|
|
||||||
5. [Value Objects](Value-Objects.md)
|
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.md)
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
# Meritoo Common Library
|
|
||||||
|
|
||||||
Common and useful classes, methods, exceptions etc.
|
|
||||||
|
|
||||||
# Arrays
|
|
||||||
|
|
||||||
> Useful methods related to arrays
|
|
||||||
|
|
||||||
Class: `Meritoo\Common\Utilities\Arrays`
|
|
||||||
File: `src/Utilities/Arrays.php`
|
|
||||||
|
|
||||||
### getNonEmptyValues(array $values)
|
|
||||||
|
|
||||||
> Returns non-empty values, e.g. without "" (empty string), null or []
|
|
||||||
|
|
||||||
##### Arguments
|
|
||||||
|
|
||||||
- `array $values` - The values to filter
|
|
||||||
|
|
||||||
##### Example 1
|
|
||||||
|
|
||||||
- values: `[]` (no values)
|
|
||||||
- result: `[]` (an empty array)
|
|
||||||
|
|
||||||
##### Example 2
|
|
||||||
|
|
||||||
- values: `[null, ""]` (all empty values)
|
|
||||||
- result: `[]` (an empty array)
|
|
||||||
|
|
||||||
##### Example 3
|
|
||||||
|
|
||||||
- values: `["test 1", "", 123, null, 0]`
|
|
||||||
- result: `["test 1", 123, 0]`
|
|
||||||
|
|
||||||
### getNonEmptyValuesAsString(array $values, $separator = ', ')
|
|
||||||
|
|
||||||
> Returns non-empty values concatenated by given separator
|
|
||||||
|
|
||||||
##### Arguments
|
|
||||||
|
|
||||||
- `array $values` - The values to filter
|
|
||||||
- `[string $separator]` - (optional) Separator used to implode the values. Default: ", ".
|
|
||||||
|
|
||||||
##### Example 1
|
|
||||||
|
|
||||||
- values: `[]` (no values)
|
|
||||||
- separator: default or any other string
|
|
||||||
- result: `""` (an empty string)
|
|
||||||
|
|
||||||
##### Example 2
|
|
||||||
|
|
||||||
- values: `[null, ""]` (all empty values)
|
|
||||||
- separator: default or any other string
|
|
||||||
- result: `""` (an empty string)
|
|
||||||
|
|
||||||
##### Example 3
|
|
||||||
|
|
||||||
- values: `["test 1", "", 123, null, 0]`
|
|
||||||
- separator: `", "` (default)
|
|
||||||
- result: `"test 1, 123, 0"`
|
|
||||||
|
|
||||||
##### Example 4
|
|
||||||
|
|
||||||
- values: `["test 1", "", 123, null, 0]`
|
|
||||||
- separator: `" | "`
|
|
||||||
- result: `"test 1 | 123 | 0"`
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
1. [**Arrays**](Arrays.md)
|
|
||||||
2. [Regex](Regex.md)
|
|
||||||
5. [Value Objects](../Value-Objects.md)
|
|
||||||
|
|
||||||
[‹ Back to `Readme`](../../README.md)
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
# Meritoo Common Library
|
|
||||||
|
|
||||||
Common and useful classes, methods, exceptions etc.
|
|
||||||
|
|
||||||
# Regex
|
|
||||||
|
|
||||||
> Useful methods related to regular expressions
|
|
||||||
|
|
||||||
Class: `Meritoo\Common\Utilities\Regex`
|
|
||||||
File: `src/Utilities/Regex.php`
|
|
||||||
|
|
||||||
### createSlug($value)
|
|
||||||
|
|
||||||
> Returns slug for given value
|
|
||||||
|
|
||||||
##### Arguments
|
|
||||||
|
|
||||||
- `string $value` - Value that should be transformed to slug
|
|
||||||
|
|
||||||
##### Example 1
|
|
||||||
|
|
||||||
- value: non-scalar or `null`
|
|
||||||
- result: `false`
|
|
||||||
|
|
||||||
##### Example 2
|
|
||||||
|
|
||||||
- value: `""` (an empty string)
|
|
||||||
- result: `""` (an empty string)
|
|
||||||
|
|
||||||
##### Example 3
|
|
||||||
|
|
||||||
- value: `"Lorem ipsum. Dolor sit 12.34 amet."`
|
|
||||||
- result: `"lorem-ipsum-dolor-sit-1234-amet"`
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
1. [Arrays](../Static-methods/Arrays.md)
|
|
||||||
2. [**Regex**](Regex.md)
|
|
||||||
5. [Value Objects](../Value-Objects.md)
|
|
||||||
|
|
||||||
[‹ Back to `Readme`](../../README.md)
|
|
||||||
@@ -1,303 +0,0 @@
|
|||||||
# Meritoo Common Library
|
|
||||||
|
|
||||||
Common and useful classes, methods, exceptions etc.
|
|
||||||
|
|
||||||
# Value Objects
|
|
||||||
|
|
||||||
Located in `Meritoo\Common\ValueObject` namespace and in `src/ValueObject/` directory.
|
|
||||||
|
|
||||||
### Address
|
|
||||||
|
|
||||||
##### Namespace
|
|
||||||
|
|
||||||
`Meritoo\Common\ValueObject\Address`
|
|
||||||
|
|
||||||
##### Info
|
|
||||||
|
|
||||||
Represents address of company, institution, user etc. Contains properties:
|
|
||||||
1. `$street` - the street
|
|
||||||
2. `$buildingNumber` - the number of building
|
|
||||||
3. `$flatNumber` - the number of flat
|
|
||||||
4. `$zipCode` - the zip code
|
|
||||||
5. `$city` - the city, location
|
|
||||||
|
|
||||||
##### New instance
|
|
||||||
|
|
||||||
New instance can be created using constructor
|
|
||||||
|
|
||||||
```php
|
|
||||||
new Address('New York', '00123', '4th Avenue', '10', '200');
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Methods
|
|
||||||
|
|
||||||
Has getters for each property, e.g. `getFlatNumber()` or `getZipCode()`, and 1 extra method:
|
|
||||||
|
|
||||||
```php
|
|
||||||
getFullStreet()
|
|
||||||
```
|
|
||||||
|
|
||||||
that returns name of street with related numbers (building & flat number).
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$address = new Address('New York', '00123', '4th Avenue', '10', '200');
|
|
||||||
$fullStreet = $address->getFullStreet(); // "4th Avenue 10/200"
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Conversion to string (the `__toString()` method)
|
|
||||||
|
|
||||||
Instance of `Address` may be represented as string that contains all non-empty properties separated by `, `.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$address = new Address('New York', '00123', '4th Avenue', '10', '200');
|
|
||||||
$asString = (string)$address; // "4th Avenue 10/200, 00123, New York"
|
|
||||||
```
|
|
||||||
|
|
||||||
### BankAccount
|
|
||||||
|
|
||||||
##### Namespace
|
|
||||||
|
|
||||||
`Meritoo\Common\ValueObject\BankAccount`
|
|
||||||
|
|
||||||
##### Info
|
|
||||||
|
|
||||||
Represents bank account. Contains properties:
|
|
||||||
1. `$bankName` - name of bank
|
|
||||||
2. `$accountNumber` - number of bank's account
|
|
||||||
|
|
||||||
##### New instance
|
|
||||||
|
|
||||||
New instance can be created using constructor
|
|
||||||
|
|
||||||
```php
|
|
||||||
new BankAccount('Bank of America', '1234567890')
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Methods
|
|
||||||
|
|
||||||
Has getters for each property `getBankName()` and `getAccountNumber()`.
|
|
||||||
|
|
||||||
##### Conversion to string (the `__toString()` method)
|
|
||||||
|
|
||||||
Instance of `BankAccount` may be represented as string that contains all non-empty properties separated by `, `.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$bank = new BankAccount('Bank of America', '1234567890');
|
|
||||||
$asString = (string)$bank; // "Bank of America, 1234567890"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Company
|
|
||||||
|
|
||||||
##### Namespace
|
|
||||||
|
|
||||||
`Meritoo\Common\ValueObject\Company`
|
|
||||||
|
|
||||||
##### Info
|
|
||||||
|
|
||||||
Represents a company. Contains properties:
|
|
||||||
1. `$name` - name of company
|
|
||||||
2. `$address` - address of company
|
|
||||||
3. `$bankAccount` - bank account of company
|
|
||||||
|
|
||||||
##### New instance
|
|
||||||
|
|
||||||
New instance can be created using constructor:
|
|
||||||
|
|
||||||
```php
|
|
||||||
new Company(
|
|
||||||
'Test 1',
|
|
||||||
new Address('New York', '00123', '4th Avenue', '10', '200'),
|
|
||||||
new BankAccount('Bank 1', '12345')
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Methods
|
|
||||||
|
|
||||||
Has getters for each property `getName()`, `getAddress()` and `getBankAccount()`.
|
|
||||||
|
|
||||||
##### Conversion to string (the `__toString()` method)
|
|
||||||
|
|
||||||
Instance of `Company` may be represented as string that contains all non-empty properties separated by `, `.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$company = new Company(
|
|
||||||
'Test 1',
|
|
||||||
new Address('New York', '00123', '4th Avenue', '10', '200'),
|
|
||||||
new BankAccount('Bank 1', '12345')
|
|
||||||
);
|
|
||||||
|
|
||||||
$asString = (string)$company; // "Test 1, 4th Avenue 10/200, 00123, New York, Bank 1, 12345"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Human
|
|
||||||
|
|
||||||
##### Namespace
|
|
||||||
|
|
||||||
`Meritoo\Common\ValueObject\Human`
|
|
||||||
|
|
||||||
##### Info
|
|
||||||
|
|
||||||
Represents human. Based on `\Meritoo\Common\Traits\ValueObject\HumanTrait` trait. Contains properties same as `HumanTrait` trait:
|
|
||||||
1. `$firstName` - first name
|
|
||||||
2. `$lastName` - last name
|
|
||||||
3. `$email` - email address
|
|
||||||
4. `$birthDate` - birth date
|
|
||||||
|
|
||||||
##### New instance
|
|
||||||
|
|
||||||
New instance can be created using constructor:
|
|
||||||
|
|
||||||
```php
|
|
||||||
new Human('John', 'Scott', 'john@scott.com', new \DateTime('2001-01-01'));
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Methods
|
|
||||||
|
|
||||||
Has getters for each property, e.g. `getFirstName()`, `getEmail()` etc.
|
|
||||||
|
|
||||||
##### Conversion to string (the `__toString()` method)
|
|
||||||
|
|
||||||
Instance of `Human` may be represented as string that contains first name, last name and email address (if provided).
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$human1 = new Human('John', 'Scott');
|
|
||||||
$asString1 = (string)$human1; // "John Scott"
|
|
||||||
|
|
||||||
$human2 = new Human('John', 'Scott', 'john@scott.com', new \DateTime('2001-01-01'));
|
|
||||||
$asString2 = (string)$human2; // "John Scott <john@scott.com>"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Size
|
|
||||||
|
|
||||||
##### Namespace
|
|
||||||
|
|
||||||
`Meritoo\Common\ValueObject\Size`
|
|
||||||
|
|
||||||
##### Info
|
|
||||||
|
|
||||||
Size, e.g. of image. Contains properties:
|
|
||||||
1. `width` - the width
|
|
||||||
2. `height` - the height
|
|
||||||
3. `unit` - unit used when width or height should be returned with unit, default: `"px"`
|
|
||||||
4. `separator` - separator used when converting to string, default: `" x "`
|
|
||||||
|
|
||||||
##### New instance
|
|
||||||
|
|
||||||
New instance can be created using static methods:
|
|
||||||
|
|
||||||
1. `fromArray()` - creates new instance from given array
|
|
||||||
|
|
||||||
```php
|
|
||||||
// Using default "px" unit
|
|
||||||
Size::fromArray([200, 100]);
|
|
||||||
|
|
||||||
// With custom "mm" unit
|
|
||||||
Size::fromArray([200, 100], 'mm');
|
|
||||||
```
|
|
||||||
|
|
||||||
2. `fromString()` - creates new instance from given string
|
|
||||||
|
|
||||||
```php
|
|
||||||
// Using default "px" unit and default " x " separator
|
|
||||||
Size::fromString('200 x 100');
|
|
||||||
|
|
||||||
// With custom "mm" unit and " X " separator
|
|
||||||
Size::fromString('200 X 100', 'mm', ' X ');
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Methods
|
|
||||||
|
|
||||||
Has:
|
|
||||||
- getters and setters for `width` and `height` properties.
|
|
||||||
- setter for `separator` property
|
|
||||||
- `toString()` and `toArray()` methods that returns size represented as string and array
|
|
||||||
|
|
||||||
##### Conversion to string (using `__toString()` method)
|
|
||||||
|
|
||||||
Instance of `Size` may be represented as string that contains width and height separated by separator (default: `" x "`).
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$size = Size::fromArray([200, 100]);
|
|
||||||
|
|
||||||
// With default separator
|
|
||||||
$asString1 = (string)$size; // "200 x 100"
|
|
||||||
|
|
||||||
// With custom separator
|
|
||||||
$size->setSeparator('X');
|
|
||||||
$asString2 = (string)$size; // "200X100"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Version
|
|
||||||
|
|
||||||
##### Namespace
|
|
||||||
|
|
||||||
`Meritoo\Common\ValueObject\Version`
|
|
||||||
|
|
||||||
##### Info
|
|
||||||
|
|
||||||
Represents version of software. Contains properties:
|
|
||||||
1. `$majorPart` - the "major" part of version
|
|
||||||
2. `$minorPart` - the "minor" part of version
|
|
||||||
3. `$patchPart` - the "patch" part of version
|
|
||||||
|
|
||||||
##### New instance
|
|
||||||
|
|
||||||
New instance can be created using:
|
|
||||||
|
|
||||||
1. Constructor:
|
|
||||||
|
|
||||||
```php
|
|
||||||
new Version(1, 0, 2);
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Static methods:
|
|
||||||
1. `fromArray()` - creates new instance using given version as array
|
|
||||||
|
|
||||||
```php
|
|
||||||
Version::fromArray([1, 0, 2]);
|
|
||||||
```
|
|
||||||
|
|
||||||
2. `fromString()` - creates new instance using given version as string:
|
|
||||||
|
|
||||||
```php
|
|
||||||
Version::fromString('1.0.2');
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Methods
|
|
||||||
|
|
||||||
Has getters for each property: `getMajorPart()`, `getMinorPart()`, `getPatchPart()`.
|
|
||||||
|
|
||||||
##### Conversion to string (using `__toString()` method)
|
|
||||||
|
|
||||||
Instance of `Version` may be represented as string that contains all properties separated by `.` (`$majorPart`.`$minorPart`.`$patchPart`).
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$version = new Version(1, 0, 2);
|
|
||||||
$asString = (string)$version; // "1.0.2"
|
|
||||||
```
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
1. [Arrays](Static-methods/Arrays.md)
|
|
||||||
2. [Regex](Static-methods/Regex.md)
|
|
||||||
5. [**Value Objects**](Value-Objects.md)
|
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.md)
|
|
||||||
185
phing/app.xml
185
phing/app.xml
@@ -1,184 +1,89 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
|
||||||
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.16.0">
|
|
||||||
<!-- Properties -->
|
<!-- Properties -->
|
||||||
<if>
|
<if>
|
||||||
<available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
|
<available file="phing/properties" property="custom.properties.available"/>
|
||||||
<then>
|
<then>
|
||||||
<property file="${project.basedir}/phing/properties"/>
|
<property file="phing/properties" />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<property file="${project.basedir}/phing/properties.dist"/>
|
<property file="phing/properties.dist" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<!-- Filesets -->
|
|
||||||
<import file="${project.basedir}/phing/filesets.xml"/>
|
|
||||||
|
|
||||||
<!-- Default / main target -->
|
<!-- Default / main target -->
|
||||||
<target name="build:main"
|
<target name="build:main"
|
||||||
depends="build:app"
|
depends="build:app"
|
||||||
/>
|
description="Builds the application" />
|
||||||
|
|
||||||
<!-- App target -->
|
<!-- App target -->
|
||||||
<target name="build:app"
|
<target name="build:app"
|
||||||
depends="app:clean,
|
depends="app:composer, app:vendors, app:checkout"
|
||||||
app:composer:self-update,
|
description="Prepares app to build." />
|
||||||
app:composer:install,
|
|
||||||
app:composer:validate,
|
<!-- Check / update composer -->
|
||||||
app:checkout"
|
<target name="app:composer" description="Checks / updates composer">
|
||||||
/>
|
<echo msg="Checking / updating composer..." />
|
||||||
|
|
||||||
<!-- Updates Composer -->
|
|
||||||
<target name="app:composer:self-update">
|
|
||||||
<if>
|
<if>
|
||||||
<not>
|
<available file="composer.phar" />
|
||||||
<available file="${composer.path}" property="composer.local.unavailable"/>
|
|
||||||
</not>
|
|
||||||
<then>
|
<then>
|
||||||
<if>
|
<echo msg="[Skipped] Downloading of Composer skipped, because exist in the project..." />
|
||||||
<os family="windows"/>
|
|
||||||
<then>
|
|
||||||
<fail message="Composer not found! Go to http://getcomposer.org/download and download the Composer."/>
|
|
||||||
</then>
|
|
||||||
<else>
|
|
||||||
<exec command="${composer.download_command}" checkreturn="true" passthru="true"/>
|
|
||||||
</else>
|
|
||||||
</if>
|
|
||||||
</then>
|
|
||||||
</if>
|
|
||||||
|
|
||||||
<!-- Update Composer -->
|
|
||||||
<composer php="${composer.php}" composer="${composer.path}" command="selfupdate">
|
|
||||||
<arg value="--ansi"/>
|
|
||||||
</composer>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- Validates composer.* files -->
|
|
||||||
<target name="app:composer:validate" depends="app:composer:install">
|
|
||||||
<composer php="${composer.php}" composer="${composer.path}" command="validate">
|
|
||||||
<arg value="--no-check-all"/>
|
|
||||||
<arg value="--strict"/>
|
|
||||||
<arg value="--ansi"/>
|
|
||||||
</composer>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- Project clean -->
|
|
||||||
<target name="app:clean">
|
|
||||||
<if>
|
|
||||||
<equals arg1="${env}" arg2="prod"/>
|
|
||||||
<then>
|
|
||||||
<echo message="[Skipped] Cleaning project (and directories cleanup) -> 'prod' environment"/>
|
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<foreach list="${directoriesToEmpty}" param="directory" target="app:clean:empty"/>
|
|
||||||
</else>
|
|
||||||
</if>
|
|
||||||
|
|
||||||
<foreach list="${directoriesToCheck}" param="directory" target="app:clean:check"/>
|
|
||||||
|
|
||||||
<touch file="${dir.cache}/.gitkeep"/>
|
|
||||||
<touch file="${dir.logs}/.gitkeep"/>
|
|
||||||
<touch file="${dir.sessions}/.gitkeep"/>
|
|
||||||
|
|
||||||
<foreach list="${directoriesToEmpty}" param="directory" target="app:permissions"/>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- Cleaning directory (making empty) directory -->
|
|
||||||
<target name="app:clean:empty">
|
|
||||||
<if>
|
|
||||||
<available file="${directory}" type="dir" property="dir_is_available"/>
|
|
||||||
<then>
|
|
||||||
<delete includeemptydirs="true" dir="${directory}"/>
|
|
||||||
</then>
|
|
||||||
</if>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- Checking if directory exists -->
|
|
||||||
<target name="app:clean:check">
|
|
||||||
<if>
|
|
||||||
<not>
|
|
||||||
<available file="${directory}" type="dir" property="dir_is_available"/>
|
|
||||||
</not>
|
|
||||||
<then>
|
|
||||||
<if>
|
<if>
|
||||||
<or>
|
<os family="windows" />
|
||||||
<contains string="${directory}" substring="cache"/>
|
|
||||||
<contains string="${directory}" substring="logs"/>
|
|
||||||
<contains string="${directory}" substring="sessions"/>
|
|
||||||
</or>
|
|
||||||
<then>
|
<then>
|
||||||
<mkdir dir="${directory}" mode="0777"/>
|
<fail message="Composer not found! Go to http://getcomposer.org/download and download the Composer." />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<mkdir dir="${directory}" mode="0775"/>
|
<exec command="${composer.download_command}" checkreturn="true" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
</then>
|
|
||||||
</if>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- Installs vendors -->
|
|
||||||
<target name="app:composer:install" depends="app:composer:self-update">
|
|
||||||
<composer php="${composer.php}" composer="${composer.path}" command="install">
|
|
||||||
<arg value="--optimize-autoloader"/>
|
|
||||||
<arg value="--ansi"/>
|
|
||||||
</composer>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- Clearing cache -->
|
|
||||||
<target name="app:cache">
|
|
||||||
<if>
|
|
||||||
<istrue value="${cache.clearWithWarmup}"/>
|
|
||||||
<then>
|
|
||||||
<SymfonyConsole console="bin/console" command="cache:clear">
|
|
||||||
<arg name="env" value="${env}"/>
|
|
||||||
</SymfonyConsole>
|
|
||||||
</then>
|
|
||||||
<else>
|
|
||||||
<SymfonyConsole console="bin/console" command="cache:clear">
|
|
||||||
<arg name="env" value="${env}"/>
|
|
||||||
<arg name="no-warmup"/>
|
|
||||||
</SymfonyConsole>
|
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
|
<composer command="selfupdate" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Clearing cache (faster) -->
|
<!-- Project Install/update vendors -->
|
||||||
<target name="app:cache:faster">
|
<target name="app:vendors" description="Installs / updates vendors">
|
||||||
<SymfonyConsole console="bin/console" command="cache:clear">
|
<echo msg="Installing / updating vendors..." />
|
||||||
<arg name="env" value="${env}"/>
|
|
||||||
<arg name="no-optional-warmers"/>
|
|
||||||
</SymfonyConsole>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- Warming up cache -->
|
|
||||||
<target name="app:cache:warmup">
|
|
||||||
<SymfonyConsole console="bin/console" command="cache:warmup">
|
|
||||||
<arg name="env" value="${env}"/>
|
|
||||||
</SymfonyConsole>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- Setting permissions of given directory -->
|
|
||||||
<target name="app:permissions">
|
|
||||||
<if>
|
<if>
|
||||||
<not>
|
<istrue value="${composer.self-update}"/>
|
||||||
<os family="windows"/>
|
|
||||||
</not>
|
|
||||||
<then>
|
<then>
|
||||||
<exec command="chmod -R 777 ${directory}/*"/>
|
<composer php="${composer.php}" composer="${composer.path}" command="self-update"/>
|
||||||
</then>
|
</then>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
|
<if>
|
||||||
|
<istrue value="${composer.validate}"/>
|
||||||
|
<then>
|
||||||
|
<composer php="${composer.php}" composer="${composer.path}" command="validate"/>
|
||||||
|
</then>
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if>
|
||||||
|
<equals arg1="${env}" arg2="prod" />
|
||||||
|
<then>
|
||||||
|
<composer php="${composer.php}" composer="${composer.path}" command="install">
|
||||||
|
<arg value="--optimize-autoloader" />
|
||||||
|
</composer>
|
||||||
|
</then>
|
||||||
|
<else>
|
||||||
|
<composer php="${composer.php}" composer="${composer.path}" command="install" />
|
||||||
|
</else>
|
||||||
|
</if>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Checkout and finalization -->
|
<!-- Checkout and finalization -->
|
||||||
<target name="app:checkout">
|
<target name="app:checkout">
|
||||||
<tstamp>
|
<tstamp>
|
||||||
<format property="date_end" pattern="%Y-%m-%d %H:%M"/>
|
<format property="date_end" pattern="%Y-%m-%d %H:%M" />
|
||||||
</tstamp>
|
</tstamp>
|
||||||
|
|
||||||
<echo msg="------------------------------------"/>
|
<echo msg="------------------------------------" />
|
||||||
<echo msg="Build finished at: ${date_end}"/>
|
<echo msg="Build finished at: ${date_end}" />
|
||||||
<echo msg="------------------------------------"/>
|
<echo msg="------------------------------------" />
|
||||||
</target>
|
</target>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
EXPECTED_SIGNATURE="$(curl -L https://composer.github.io/installer.sig)"
|
|
||||||
# Original line (with wget):
|
|
||||||
# EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)"
|
|
||||||
|
|
||||||
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
|
||||||
ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")"
|
|
||||||
|
|
||||||
if [[ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]]
|
|
||||||
then
|
|
||||||
>&2 echo 'ERROR: Invalid installer signature'
|
|
||||||
rm composer-setup.php
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
php composer-setup.php --quiet
|
|
||||||
RESULT=$?
|
|
||||||
rm composer-setup.php
|
|
||||||
exit ${RESULT}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.16.0">
|
|
||||||
<!-- Filesets -->
|
|
||||||
<fileset id="cache" dir="${dir.cache}">
|
|
||||||
<include name="**/*"/>
|
|
||||||
<exclude name=".gitkeep"/>
|
|
||||||
</fileset>
|
|
||||||
<fileset id="logs" dir="${dir.logs}">
|
|
||||||
<include name="**/*"/>
|
|
||||||
<exclude name=".gitkeep"/>
|
|
||||||
</fileset>
|
|
||||||
<fileset id="sessions" dir="${dir.sessions}">
|
|
||||||
<include name="**/*"/>
|
|
||||||
<exclude name=".gitkeep"/>
|
|
||||||
</fileset>
|
|
||||||
|
|
||||||
<!-- Directories to check -->
|
|
||||||
<property name="directoriesToCheck" value="
|
|
||||||
${dir.cache},
|
|
||||||
${dir.logs},
|
|
||||||
${dir.sessions},
|
|
||||||
${dir.data.tests},
|
|
||||||
${dir.data.temporary},
|
|
||||||
${dir.docker.data},
|
|
||||||
${dir.docker.logs}"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Directories to empty -->
|
|
||||||
<property name="directoriesToEmpty" value="
|
|
||||||
${dir.cache},
|
|
||||||
${dir.logs},
|
|
||||||
${dir.sessions},
|
|
||||||
${dir.data.temporary}"
|
|
||||||
/>
|
|
||||||
</project>
|
|
||||||
@@ -1,3 +1,19 @@
|
|||||||
|
# --------------------------------------------------------------------------------
|
||||||
|
# Information
|
||||||
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Property files contain key/value pairs
|
||||||
|
# key = value
|
||||||
|
#
|
||||||
|
# Property keys may contain alphanumeric chars and colons, but
|
||||||
|
# not special chars. This way you can create pseudo-namespaces
|
||||||
|
#
|
||||||
|
# You can refer to values of other properties by enclosing their keys in "${}".
|
||||||
|
# Example: dir.js = ${dir.web}/js
|
||||||
|
#
|
||||||
|
# Everything behind the equal sign is the value, you do
|
||||||
|
# not have to enclose strings: text=This is some text, Your OS is ${php.os}
|
||||||
|
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
# Common, e.g. default environment
|
# Common, e.g. default environment
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
@@ -6,77 +22,104 @@
|
|||||||
#
|
#
|
||||||
env = dev
|
env = dev
|
||||||
|
|
||||||
|
# Install assets using symlinks
|
||||||
|
#
|
||||||
|
assets.installWithSymlink = true
|
||||||
|
|
||||||
# Clear cache with the "warmup" option
|
# 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.
|
cache.clearWithWarmup = true
|
||||||
# https://github.com/symfony/symfony/blob/master/UPGRADE-3.3.md#frameworkbundle
|
|
||||||
#
|
|
||||||
# Meritoo <github@meritoo.pl>
|
|
||||||
# 2017-06-06
|
|
||||||
#
|
|
||||||
cache.clearWithWarmup = false
|
|
||||||
|
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
# Composer
|
# Composer
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
# Command used to download Composer
|
composer.download_command = php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"
|
||||||
#
|
|
||||||
composer.download_command = bash ${project.basedir}/phing/composer-install.sh
|
|
||||||
|
|
||||||
# Path to composer executable or downloaded composer.phar file
|
# Path to composer executable or composer.phar file
|
||||||
#
|
#
|
||||||
composer.path = ${project.basedir}/composer.phar
|
composer.path = composer.phar
|
||||||
|
#composer.path = /usr/local/bin/composer
|
||||||
|
|
||||||
# Path to php executable used by composer
|
# Path to php executable used by composer
|
||||||
#
|
#
|
||||||
composer.php = php
|
composer.php = php
|
||||||
|
|
||||||
|
# Self update of the composer
|
||||||
|
#
|
||||||
|
composer.self-update = false
|
||||||
|
|
||||||
|
# Validate the composer.json file
|
||||||
|
#
|
||||||
|
composer.validate = false
|
||||||
|
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
# Directories
|
# Directories
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
# System directories
|
# System directories
|
||||||
#
|
#
|
||||||
dir.src = ${project.basedir}/src
|
|
||||||
dir.var = ${project.basedir}/tests/Resources/var
|
|
||||||
dir.cache = ${dir.var}/cache
|
|
||||||
dir.logs = ${dir.var}/log
|
|
||||||
dir.sessions = ${dir.var}/sessions
|
|
||||||
dir.data = ${project.basedir}/data
|
dir.data = ${project.basedir}/data
|
||||||
|
dir.src = ${project.basedir}/src
|
||||||
dir.tests = ${project.basedir}/tests
|
dir.tests = ${project.basedir}/tests
|
||||||
|
|
||||||
|
# --------------------------------------------------------------------------------
|
||||||
# Build directories
|
# Build directories
|
||||||
#
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
dir.build = ${project.basedir}/build
|
dir.build = ${project.basedir}/build
|
||||||
dir.reports = ${dir.build}/reports
|
dir.reports = ${dir.build}/logs
|
||||||
dir.reports.pdepend = ${dir.reports}/pdepend
|
dir.reports.pdepend = ${dir.reports}/pdepend
|
||||||
dir.reports.coverage = ${dir.reports}/phpunit_coverage
|
dir.reports.coverage = ${dir.reports}/phpunit_coverage
|
||||||
|
|
||||||
# Data directories
|
|
||||||
#
|
#
|
||||||
|
# Disabled, because unnecessary right now
|
||||||
|
# phpdocumentor/phpdocumentor cannot be installed via Composer
|
||||||
|
#
|
||||||
|
# Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
|
# 2017-02-22
|
||||||
|
#
|
||||||
|
#dir.docs = ${dir.build}/docs
|
||||||
|
#dir.docs.phpdoc2 = ${dir.docs}/phpdoc2
|
||||||
|
|
||||||
|
# --------------------------------------------------------------------------------
|
||||||
|
# Data directories
|
||||||
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
dir.data.tests = ${dir.data}/tests
|
dir.data.tests = ${dir.data}/tests
|
||||||
dir.data.temporary = ${dir.data}/tmp
|
dir.data.temporary = ${dir.data}/tmp
|
||||||
|
|
||||||
# Docker directories
|
|
||||||
#
|
|
||||||
dir.docker = ${project.basedir}/docker
|
|
||||||
dir.docker.data = ${dir.docker}/data/db
|
|
||||||
dir.docker.logs = ${dir.docker}/logs/nginx
|
|
||||||
|
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
# Testing
|
# Testing
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
# Path of the PHP Coding Standards Fixer (http://cs.sensiolabs.org)
|
|
||||||
#
|
|
||||||
tests.cs_fixer.command = ./vendor/bin/php-cs-fixer fix --verbose
|
|
||||||
|
|
||||||
# Test database path
|
# Test database path
|
||||||
#
|
#
|
||||||
tests.database = ${dir.data.temporary}/database.sqlite
|
tests.database = ${dir.data.temporary}/database.sqlite
|
||||||
|
|
||||||
# Paths of frameworks used to run tests:
|
|
||||||
# - PHPUnit (unit tests)
|
|
||||||
#
|
#
|
||||||
tests.phpunit.command = ./vendor/bin/phpunit --verbose
|
# 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)
|
||||||
|
#
|
||||||
|
phpCsFixer.path = ./vendor/bin/php-cs-fixer
|
||||||
|
|||||||
308
phing/tests.xml
308
phing/tests.xml
@@ -1,125 +1,315 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
|
||||||
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.16.0">
|
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
<autoloader/>
|
2017-02-23
|
||||||
|
-->
|
||||||
|
<autoloader />
|
||||||
|
|
||||||
<!-- Properties -->
|
<!-- Properties -->
|
||||||
<if>
|
<if>
|
||||||
<available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
|
<available file="phing/properties" property="custom.properties.available"/>
|
||||||
<then>
|
<then>
|
||||||
<property file="${project.basedir}/phing/properties"/>
|
<property file="phing/properties" />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<property file="${project.basedir}/phing/properties.dist"/>
|
<property file="phing/properties.dist" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<!-- Filesets -->
|
<!-- Filesets -->
|
||||||
<fileset id="sourcecode" dir="${dir.src}">
|
<fileset id="sourcecode" dir="${dir.src}">
|
||||||
<include name="**/*.php"/>
|
<include name="**/*.php" />
|
||||||
<exclude name="*Test.php"/>
|
<exclude name="*Test.php" />
|
||||||
<exclude name="**/*Test.php"/>
|
<exclude name="**/*Test.php" />
|
||||||
<exclude name="**/Resources/**"/>
|
<exclude name="**/Resources/**" />
|
||||||
<exclude name="**/DataFixtures/**"/>
|
<exclude name="**/DataFixtures/**" />
|
||||||
<exclude name="**/Tests/**"/>
|
<exclude name="**/Tests/**" />
|
||||||
</fileset>
|
</fileset>
|
||||||
<fileset id="tests" dir="${dir.tests}">
|
<fileset id="tests" dir="${dir.tests}">
|
||||||
<include name="**/*Test*.php"/>
|
<include name="**/*Test*.php" />
|
||||||
</fileset>
|
</fileset>
|
||||||
|
|
||||||
<!-- Default / main target -->
|
<!-- Default / main target -->
|
||||||
<target name="build:main"
|
<target name="build:main"
|
||||||
depends="build:fix-coding-standards,
|
depends="build:fix-coding-standards, build:clean, build:prepare, build:check, build:test, app:checkout"
|
||||||
build:check,
|
description="Runs all tests and builds everything" />
|
||||||
build:test,
|
<!--
|
||||||
app:checkout"
|
Before:
|
||||||
/>
|
depends="build:fix-coding-standards, build:clean, build:prepare, build:check, build:test, build:doc, app:checkout"
|
||||||
|
|
||||||
|
After:
|
||||||
|
depends="build:fix-coding-standards, build:clean, build:prepare, build:check, build:test, app:checkout"
|
||||||
|
|
||||||
|
The "build:doc" task is disabled, because it cannot be installed via Composer:
|
||||||
|
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
|
||||||
|
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
|
||||||
|
|
||||||
|
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
|
2017-02-22
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- Fixing coding standards using the PHP Coding Standards Fixer (http://cs.sensiolabs.org) -->
|
<!-- Fixing coding standards using the PHP Coding Standards Fixer (http://cs.sensiolabs.org) -->
|
||||||
<target name="build:fix-coding-standards">
|
<target name="build:fix-coding-standards" description="Fixes coding standards using the PHP Coding Standards Fixer">
|
||||||
<exec command="${tests.cs_fixer.command}" passthru="true"/>
|
<echo msg="Fixing coding standards using the PHP Coding Standards Fixer (http://cs.sensiolabs.org)..." />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Attention.
|
||||||
|
Rules for formatting are defined in /.php_cs.dist file.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<exec
|
||||||
|
passthru="true"
|
||||||
|
command="${phpCsFixer.path} fix --verbose"
|
||||||
|
/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
<!-- Doc target -->
|
||||||
|
<!--
|
||||||
|
Disabled, because it cannot be installed via Composer:
|
||||||
|
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
|
||||||
|
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
|
||||||
|
|
||||||
|
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
|
2017-02-22
|
||||||
|
-->
|
||||||
|
<!--<target name="build:doc"-->
|
||||||
|
<!--depends="build:prepare, doc:phpdoc2"-->
|
||||||
|
<!--description="Generates API documentation" />-->
|
||||||
|
|
||||||
<!-- Check target -->
|
<!-- Check target -->
|
||||||
<target name="build:check"
|
<target name="build:check"
|
||||||
depends="check:cs,
|
depends="check:cs, check:md, check:cpd, check:depend, check:loc"
|
||||||
check:md,
|
description="Analyzes code" />
|
||||||
check:cpd,
|
|
||||||
check:depend"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Test target -->
|
<!-- Test target -->
|
||||||
<target name="build:test"
|
<target name="build:test"
|
||||||
depends="test:phpunit"
|
depends="test:phpunit"
|
||||||
/>
|
description="Executes all tests" />
|
||||||
|
|
||||||
|
<!-- Project build clean -->
|
||||||
|
<target name="build:clean" description="Cleans up build directories">
|
||||||
|
<echo msg="Cleaning docs and reports directories..." />
|
||||||
|
<!--<delete dir="${dir.docs}" />-->
|
||||||
|
<delete dir="${dir.reports}" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Project build prepare -->
|
||||||
|
<target name="build:prepare" description="Create build directories">
|
||||||
|
<echo msg="Creating build directories..." />
|
||||||
|
<!--<mkdir dir="${dir.docs}" />-->
|
||||||
|
<!--<mkdir dir="${dir.docs.phpdoc2}" />-->
|
||||||
|
<mkdir dir="${dir.reports}" />
|
||||||
|
<mkdir dir="${dir.reports.coverage}" />
|
||||||
|
<mkdir dir="${dir.reports.pdepend}" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- PHPDocumentor2 API documentation target -->
|
||||||
|
<!--
|
||||||
|
Disabled, because it cannot be installed via Composer:
|
||||||
|
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
|
||||||
|
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
|
||||||
|
|
||||||
|
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
|
2017-02-22
|
||||||
|
|
||||||
|
<target name="doc:phpdoc2" description="Generates API documentations">
|
||||||
|
<echo msg="Generating API Documentation with phpDocumentor 2..." />
|
||||||
|
<phpdoc2 title="${phing.project.name}"
|
||||||
|
destdir="${dir.docs.phpdoc2}"
|
||||||
|
template="responsive">
|
||||||
|
<fileset refid="sourcecode" />
|
||||||
|
</phpdoc2>
|
||||||
|
</target>
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- Symfony2 code sniffer -->
|
<!-- Symfony2 code sniffer -->
|
||||||
<target name="check:cs" depends="build:prepare">
|
<!--
|
||||||
|
Attention 1.
|
||||||
|
To use Symfony2 standards to check coding you have to:
|
||||||
|
copy, symlink or check out repo to a folder called Symfony2 inside the phpcs Standards directory.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
$ pear config-show | grep php_dir
|
||||||
|
$ cd /path/to/pear/PHP/CodeSniffer/Standards
|
||||||
|
$ git clone git://github.com/opensky/Symfony2-coding-standard.git Symfony2
|
||||||
|
|
||||||
|
Attention 2.
|
||||||
|
PSR2 standard is used instead of Symfony2 standard, because after installation squizlabs/php_codesniffer package
|
||||||
|
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.
|
||||||
|
|
||||||
|
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
|
2017-02-22
|
||||||
|
-->
|
||||||
|
<target name="check:cs" description="Checks coding standard">
|
||||||
|
<echo msg="Checking coding standard..." />
|
||||||
<phpcodesniffer standard="PSR2" showWarnings="true">
|
<phpcodesniffer standard="PSR2" showWarnings="true">
|
||||||
<fileset refid="sourcecode"/>
|
<fileset refid="sourcecode" />
|
||||||
<formatter type="checkstyle" outfile="${dir.reports}/checkstyle.xml"/>
|
<formatter type="checkstyle" outfile="${dir.reports}/checkstyle.xml" />
|
||||||
<formatter type="csv" outfile="${dir.reports}/checkstyle.csv"/>
|
<formatter type="csv" outfile="${dir.reports}/checkstyle.csv" />
|
||||||
<formatter type="summary" outfile="${dir.reports}/checkstyle_summary.txt"/>
|
<formatter type="summary" outfile="${dir.reports}/checkstyle_summary.txt" />
|
||||||
</phpcodesniffer>
|
</phpcodesniffer>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- copy/paste detector -->
|
<!-- copy/paste detector -->
|
||||||
<target name="check:cpd" depends="build:prepare">
|
<target name="check:cpd" description="Checks similar code blocks.">
|
||||||
|
<echo msg="Checking similar code blocks..." />
|
||||||
<phpcpd>
|
<phpcpd>
|
||||||
<fileset refid="sourcecode"/>
|
<fileset refid="sourcecode" />
|
||||||
<formatter type="pmd" outfile="${dir.reports}/pmd-cpd.xml"/>
|
<formatter type="pmd" outfile="${dir.reports}/pmd-cpd.xml" />
|
||||||
</phpcpd>
|
</phpcpd>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Previous / old version
|
||||||
|
|
||||||
|
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
|
2017-02-22
|
||||||
|
|
||||||
|
<exec command="phpcpd \-\-log-pmd=${dir.reports}/pmd-cpd.xml ${dir.src}" />
|
||||||
|
-->
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Mess detector -->
|
<!-- Mess detector -->
|
||||||
<target name="check:md" depends="build:prepare">
|
<target name="check:md" description="Generate code metrics">
|
||||||
|
<echo msg="Generating code metrics..." />
|
||||||
<phpmd rulesets="codesize,controversial,design,naming,unusedcode">
|
<phpmd rulesets="codesize,controversial,design,naming,unusedcode">
|
||||||
<fileset refid="sourcecode"/>
|
<fileset refid="sourcecode" />
|
||||||
<formatter type="html" outfile="${dir.reports}/phpmd.html"/>
|
<formatter type="html" outfile="${dir.reports}/phpmd.html" />
|
||||||
<formatter type="text" outfile="${dir.reports}/phpmd.txt"/>
|
<formatter type="text" outfile="${dir.reports}/phpmd.txt" />
|
||||||
</phpmd>
|
</phpmd>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Code dependency -->
|
<!-- Code dependency -->
|
||||||
<target name="check:depend" depends="build:prepare">
|
<target name="check:depend" description="Checks coupling and dependency">
|
||||||
|
<echo msg="Checking coupling and dependency..." />
|
||||||
<phpdepend>
|
<phpdepend>
|
||||||
<fileset refid="sourcecode"/>
|
<fileset refid="sourcecode" />
|
||||||
<logger type="jdepend-xml" outfile="${dir.reports.pdepend}/jdepend.xml"/>
|
<logger type="jdepend-xml" outfile="${dir.reports.pdepend}/jdepend.xml" />
|
||||||
<logger type="jdepend-chart" outfile="${dir.reports.pdepend}/dependencies.svg"/>
|
<logger type="jdepend-chart" outfile="${dir.reports.pdepend}/dependencies.svg" />
|
||||||
<logger type="overview-pyramid" outfile="${dir.reports.pdepend}/overview-pyramid.svg"/>
|
<logger type="overview-pyramid" outfile="${dir.reports.pdepend}/overview-pyramid.svg" />
|
||||||
</phpdepend>
|
</phpdepend>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- PHPUnit tests -->
|
<!-- Measure the size and analyzing the structure of a project -->
|
||||||
<target name="test:phpunit" depends="build:prepare">
|
<target name="check:loc" description="Measures the size and analyzes the structure of a project">
|
||||||
<exec command="${tests.phpunit.command}" passthru="true"/>
|
<echo msg="Measuring the size and analyzing the structure of a project..." />
|
||||||
|
<phploc reportType="txt" reportName="phploc" reportDirectory="${dir.reports}">
|
||||||
|
<fileset refid="sourcecode" />
|
||||||
|
</phploc>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Previous / old version
|
||||||
|
|
||||||
|
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
|
2017-02-22
|
||||||
|
|
||||||
|
<exec command="phploc \-\-log-csv=${dir.reports}/phploc.csv ${dir.src}" />
|
||||||
|
-->
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Project build clean -->
|
<!-- Unit tests -->
|
||||||
<target name="build:clean">
|
<target name="test:phpunit" description="Executes PHPUnit tests">
|
||||||
|
<!-- Check test database -->
|
||||||
<if>
|
<if>
|
||||||
<available file="${dir.reports}" type="dir" property="dir_is_available"/>
|
<not>
|
||||||
|
<available file="${dir.data.tests}" type="dir" property="dir.data.tests.available" />
|
||||||
|
</not>
|
||||||
<then>
|
<then>
|
||||||
<delete dir="${dir.reports}"/>
|
<mkdir dir="${dir.data.tests}" />
|
||||||
</then>
|
</then>
|
||||||
</if>
|
</if>
|
||||||
</target>
|
<if>
|
||||||
|
<not>
|
||||||
|
<available file="${tests.database}" property="tests.database.available" />
|
||||||
|
</not>
|
||||||
|
<then>
|
||||||
|
<touch file="${tests.database}" />
|
||||||
|
</then>
|
||||||
|
</if>
|
||||||
|
<echo msg="Running unit tests..." />
|
||||||
|
<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
|
||||||
|
|
||||||
<!-- Project build prepare -->
|
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
<target name="build:prepare" depends="build:clean">
|
2017-02-23
|
||||||
<mkdir dir="${dir.reports}"/>
|
|
||||||
<mkdir dir="${dir.reports.pdepend}"/>
|
<phpunit configuration="${project.basedir}/phpunit.xml.dist" printsummary="true">
|
||||||
<mkdir dir="${dir.reports.coverage}"/>
|
<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>
|
</target>
|
||||||
|
|
||||||
<!-- Checkout and finalization -->
|
<!-- Checkout and finalization -->
|
||||||
<target name="app:checkout">
|
<target name="app:checkout">
|
||||||
<tstamp>
|
<tstamp>
|
||||||
<format property="date_end" pattern="%Y-%m-%d %H:%M"/>
|
<format property="date_end" pattern="%Y-%m-%d %H:%M" />
|
||||||
</tstamp>
|
</tstamp>
|
||||||
|
|
||||||
<echo msg="--------------------------------------------"/>
|
<echo msg="--------------------------------------------" />
|
||||||
<echo msg="Build tests finished at: ${date_end}"/>
|
<echo msg="Build tests finished at: ${date_end}" />
|
||||||
<echo msg="--------------------------------------------"/>
|
<echo msg="--------------------------------------------" />
|
||||||
</target>
|
</target>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -1,30 +1,35 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<!-- https://phpunit.de/manual/4.8/en/appendixes.configuration.html -->
|
<phpunit backupGlobals="false"
|
||||||
<phpunit
|
backupStaticAttributes="false"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
colors="true"
|
||||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/4.8/phpunit.xsd"
|
convertErrorsToExceptions="true"
|
||||||
bootstrap="vendor/autoload.php"
|
convertNoticesToExceptions="true"
|
||||||
colors="true"
|
convertWarningsToExceptions="true"
|
||||||
verbose="true"
|
processIsolation="false"
|
||||||
|
stopOnFailure="false"
|
||||||
|
syntaxCheck="true"
|
||||||
|
bootstrap="./vendor/autoload.php"
|
||||||
>
|
>
|
||||||
<php>
|
|
||||||
<ini name="error_reporting" value="-1"/>
|
|
||||||
</php>
|
|
||||||
|
|
||||||
<testsuites>
|
<testsuites>
|
||||||
<testsuite name="Meritoo Package - Main Test Suite">
|
<testsuite name="Meritoo Package - Main Test Suite">
|
||||||
<directory>tests/</directory>
|
<directory>./tests/</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
|
|
||||||
<filter>
|
<filter>
|
||||||
<whitelist>
|
<whitelist>
|
||||||
<directory>src/</directory>
|
<directory>./src/</directory>
|
||||||
</whitelist>
|
</whitelist>
|
||||||
</filter>
|
</filter>
|
||||||
|
|
||||||
|
<groups>
|
||||||
|
<exclude>
|
||||||
|
<group>performance</group>
|
||||||
|
</exclude>
|
||||||
|
</groups>
|
||||||
|
|
||||||
<logging>
|
<logging>
|
||||||
<log type="coverage-html" target="build/reports/phpunit_coverage/html"/>
|
<log type="coverage-html" target="./build/logs/phpunit_coverage/html" />
|
||||||
</logging>
|
</logging>
|
||||||
</phpunit>
|
</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\Collection;
|
|
||||||
|
|
||||||
use ArrayAccess;
|
|
||||||
use Countable;
|
|
||||||
use IteratorAggregate;
|
|
||||||
use Meritoo\Common\Traits\CollectionTrait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Collection of elements.
|
|
||||||
* It's a set of some elements, e.g. objects.
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class Collection implements Countable, ArrayAccess, IteratorAggregate
|
|
||||||
{
|
|
||||||
use CollectionTrait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class constructor
|
|
||||||
*
|
|
||||||
* @param array $elements (optional) The elements of collection
|
|
||||||
*/
|
|
||||||
public function __construct(array $elements = [])
|
|
||||||
{
|
|
||||||
$this->elements = $elements;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +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\Base;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
use Meritoo\Common\Type\Base\BaseType;
|
|
||||||
use Meritoo\Common\Utilities\Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An exception used while type of something is unknown
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
abstract class UnknownTypeException extends Exception
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Creates exception
|
|
||||||
*
|
|
||||||
* @param mixed $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)
|
|
||||||
{
|
|
||||||
$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($template, $unknownType, $typeName, $types);
|
|
||||||
|
|
||||||
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\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.';
|
|
||||||
$message = sprintf($template, $disabledMethod);
|
|
||||||
|
|
||||||
if (!empty($alternativeMethod)) {
|
|
||||||
$template = '%s Use %s() instead.';
|
|
||||||
$message = sprintf($template, $message, $alternativeMethod);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new static($message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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\Exception\Reflection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An exception used while property does not exist in instance of class
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class NotExistingPropertyException extends \Exception
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Creates exception
|
|
||||||
*
|
|
||||||
* @param mixed $object Object that should contains given property
|
|
||||||
* @param string $property Name of the property
|
|
||||||
* @return NotExistingPropertyException
|
|
||||||
*/
|
|
||||||
public static function create($object, $property)
|
|
||||||
{
|
|
||||||
$template = 'Property \'%s\' does not exist in instance of class \'%s\'. Did you use proper name of property?';
|
|
||||||
$message = sprintf($template, $property, get_class($object));
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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\Exception\ValueObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An exception used while dimensions of size, passed to the instance of Size class, are invalid
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class InvalidSizeDimensionsException extends \Exception
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Creates exception
|
|
||||||
*
|
|
||||||
* @param int $width The width
|
|
||||||
* @param int $height The height
|
|
||||||
* @return InvalidSizeDimensionsException
|
|
||||||
*/
|
|
||||||
public static function create($width, $height)
|
|
||||||
{
|
|
||||||
$template = 'Dimensions of size should be positive, but they are not: %d, %d. Is there everything ok?';
|
|
||||||
$message = sprintf($template, $width, $height);
|
|
||||||
|
|
||||||
return new static($message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,36 +6,111 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Meritoo\Common\Traits\Collection;
|
namespace Meritoo\Common\Collection;
|
||||||
|
|
||||||
use Meritoo\Common\Collection\Collection;
|
use ArrayAccess;
|
||||||
|
use ArrayIterator;
|
||||||
|
use Countable;
|
||||||
|
use IteratorAggregate;
|
||||||
use Meritoo\Common\Utilities\Arrays;
|
use Meritoo\Common\Utilities\Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main trait for the Collection
|
* Collection of elements.
|
||||||
|
* It's a set of some elements, e.g. objects.
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
trait MainTrait
|
class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The elements of collection
|
* The elements of collection.
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
private $elements;
|
private $elements;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds given element (at the end of collection)
|
* Class constructor.
|
||||||
|
*
|
||||||
|
* @param array $elements (optional) The elements of collection
|
||||||
|
*/
|
||||||
|
public function __construct(array $elements = [])
|
||||||
|
{
|
||||||
|
$this->elements = $elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
* Required by interface Countable.
|
||||||
|
*/
|
||||||
|
public function count()
|
||||||
|
{
|
||||||
|
return count($this->elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
* Required by interface ArrayAccess.
|
||||||
|
*/
|
||||||
|
public function offsetExists($offset)
|
||||||
|
{
|
||||||
|
return $this->exists($offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
* Required by interface ArrayAccess.
|
||||||
|
*/
|
||||||
|
public function offsetGet($offset)
|
||||||
|
{
|
||||||
|
if ($this->exists($offset)) {
|
||||||
|
return $this->elements[$offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
* Required by interface ArrayAccess.
|
||||||
|
*/
|
||||||
|
public function offsetSet($offset, $value)
|
||||||
|
{
|
||||||
|
$this->elements[$offset] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
* Required by interface ArrayAccess.
|
||||||
|
*/
|
||||||
|
public function offsetUnset($offset)
|
||||||
|
{
|
||||||
|
if ($this->exists($offset)) {
|
||||||
|
unset($this->elements[$offset]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
* Required by interface IteratorAggregate.
|
||||||
|
*/
|
||||||
|
public function getIterator()
|
||||||
|
{
|
||||||
|
return new ArrayIterator($this->elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds given element (at the end of collection).
|
||||||
*
|
*
|
||||||
* @param mixed $element The element to add
|
* @param mixed $element The element to add
|
||||||
* @param mixed $index (optional) Index / key of the element
|
* @param mixed $index (optional) Index / key of the element
|
||||||
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function add($element, $index = null)
|
public function add($element, $index = null)
|
||||||
{
|
{
|
||||||
if (null === $index || '' === $index) {
|
if ($index === null) {
|
||||||
$this->elements[] = $element;
|
$this->elements[] = $element;
|
||||||
} else {
|
} else {
|
||||||
$this->elements[$index] = $element;
|
$this->elements[$index] = $element;
|
||||||
@@ -45,23 +120,23 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 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
|
* @param bool|false $useIndexes (optional) If is set to true, indexes of given elements will be used in
|
||||||
* this collection. Otherwise - not.
|
* this collection. Otherwise - not.
|
||||||
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function addMultiple($elements, $useIndexes = false)
|
public function addMultiple($elements, $useIndexes = false)
|
||||||
{
|
{
|
||||||
if (!empty($elements)) {
|
if (!empty($elements)) {
|
||||||
foreach ($elements as $index => $element) {
|
foreach ($elements as $index => $element) {
|
||||||
if ($useIndexes) {
|
if (!$useIndexes) {
|
||||||
$this->add($element, $index);
|
$index = null;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->add($element);
|
$this->add($element, $index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,9 +144,10 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
* @param mixed $element The element to prepend
|
||||||
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function prepend($element)
|
public function prepend($element)
|
||||||
@@ -82,9 +158,10 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes given element
|
* Removes given element.
|
||||||
*
|
*
|
||||||
* @param mixed $element The element to remove
|
* @param mixed $element The element to remove
|
||||||
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function remove($element)
|
public function remove($element)
|
||||||
@@ -93,6 +170,7 @@ trait MainTrait
|
|||||||
foreach ($this->elements as $index => $existing) {
|
foreach ($this->elements as $index => $existing) {
|
||||||
if ($element === $existing) {
|
if ($element === $existing) {
|
||||||
unset($this->elements[$index]);
|
unset($this->elements[$index]);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -102,7 +180,7 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns information if collection is empty
|
* Returns information if collection is empty.
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@@ -112,9 +190,10 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
* @param mixed $element The element to verify
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function isFirst($element)
|
public function isFirst($element)
|
||||||
@@ -123,9 +202,10 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
* @param mixed $element The element to verify
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function isLast($element)
|
public function isLast($element)
|
||||||
@@ -134,22 +214,24 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
* @param mixed $element The element to verify
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function has($element)
|
public function has($element)
|
||||||
{
|
{
|
||||||
$index = Arrays::getIndexOf($this->elements, $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
|
* @param mixed $element The element to verify
|
||||||
|
*
|
||||||
* @return mixed|null
|
* @return mixed|null
|
||||||
*/
|
*/
|
||||||
public function getPrevious($element)
|
public function getPrevious($element)
|
||||||
@@ -158,9 +240,10 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns next element for given element
|
* Returns next element for given element.
|
||||||
*
|
*
|
||||||
* @param mixed $element The element to verify
|
* @param mixed $element The element to verify
|
||||||
|
*
|
||||||
* @return mixed|null
|
* @return mixed|null
|
||||||
*/
|
*/
|
||||||
public function getNext($element)
|
public function getNext($element)
|
||||||
@@ -169,7 +252,7 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the first element in the collection
|
* Returns the first element in the collection.
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
@@ -179,7 +262,7 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the last element in the collection
|
* Returns the last element in the collection.
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
@@ -189,22 +272,7 @@ trait MainTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns element with given index
|
* Returns an array representation of the collection.
|
||||||
*
|
|
||||||
* @param mixed $index Index / key of the element
|
|
||||||
* @return mixed|null
|
|
||||||
*/
|
|
||||||
public function getByIndex($index)
|
|
||||||
{
|
|
||||||
if (isset($this->elements[$index])) {
|
|
||||||
return $this->elements[$index];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns representation of object as array
|
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@@ -212,4 +280,16 @@ trait MainTrait
|
|||||||
{
|
{
|
||||||
return $this->elements;
|
return $this->elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information if element with given index/key exists.
|
||||||
|
*
|
||||||
|
* @param string|int $index The index/key of element
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function exists($index)
|
||||||
|
{
|
||||||
|
return isset($this->elements[$index]) || array_key_exists($index, $this->elements);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
41
src/Meritoo/Common/Exception/Base/UnknownTypeException.php
Normal file
41
src/Meritoo/Common/Exception/Base/UnknownTypeException.php
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<?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\Base;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
use Meritoo\Common\Type\Base\BaseType;
|
||||||
|
use Meritoo\Common\Utilities\Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception used while type of something is unknown.
|
||||||
|
*
|
||||||
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
|
* @copyright Meritoo.pl
|
||||||
|
*/
|
||||||
|
abstract class UnknownTypeException extends 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
|
||||||
|
*/
|
||||||
|
public function __construct($unknownType, BaseType $typeInstance, $typeName)
|
||||||
|
{
|
||||||
|
$allTypes = $typeInstance->getAll();
|
||||||
|
$types = Arrays::values2string($allTypes, '', ', ');
|
||||||
|
|
||||||
|
$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;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class CannotResolveClassNameException extends Exception
|
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.
|
* namespaces, object or namespace.
|
||||||
* @param bool $forClass (optional) If is set to true, message of this exception for class is
|
* @param bool $forClass (optional) If is set to true, message of this exception for class is
|
||||||
* prepared. Otherwise - for trait.
|
* prepared. Otherwise - for trait.
|
||||||
* @return CannotResolveClassNameException
|
|
||||||
*/
|
*/
|
||||||
public static function create($source, $forClass = true)
|
public function __construct($source, $forClass = true)
|
||||||
{
|
{
|
||||||
$forWho = 'trait';
|
$forWho = 'trait';
|
||||||
$value = '';
|
$value = '';
|
||||||
@@ -37,12 +36,12 @@ class CannotResolveClassNameException extends Exception
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_scalar($source)) {
|
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?';
|
$template = 'Name of %s from given \'%s\'%s cannot be resolved. Is there everything ok?';
|
||||||
$message = sprintf($template, $forWho, gettype($source), $value);
|
$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;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class MissingChildClassesException extends Exception
|
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,
|
* @param array|object|string $parentClass Class that hasn't child classes, but it should. An array of objects,
|
||||||
* strings, object or string.
|
* 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'
|
$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);
|
$parentClassName = Reflection::getClassName($parentClass);
|
||||||
$message = sprintf($template, $parentClassName);
|
$message = sprintf($template, $parentClassName);
|
||||||
|
|
||||||
return new static($message);
|
parent::__construct($message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -12,29 +12,28 @@ use Exception;
|
|||||||
use Meritoo\Common\Utilities\Reflection;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class TooManyChildClassesException extends Exception
|
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
|
* @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.
|
* of objects, strings, object or string.
|
||||||
* @param array $childClasses Child classes
|
* @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"
|
$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);
|
$parentClassName = Reflection::getClassName($parentClass);
|
||||||
$message = sprintf($template, $parentClassName, implode("\n- ", $childClasses), $parentClassName);
|
$message = sprintf($template, $parentClassName, implode("\n- ", $childClasses), $parentClassName);
|
||||||
|
|
||||||
return new static($message);
|
parent::__construct($message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,26 +9,24 @@
|
|||||||
namespace Meritoo\Common\Exception\Regex;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class IncorrectColorHexLengthException extends \Exception
|
class IncorrectColorHexLengthException extends \Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Class constructor.
|
||||||
*
|
*
|
||||||
* @param string $color Incorrect hexadecimal value of color
|
* @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.'
|
$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));
|
$message = sprintf($template, $color, strlen($color));
|
||||||
|
parent::__construct($message);
|
||||||
return new static($message);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,23 +9,21 @@
|
|||||||
namespace Meritoo\Common\Exception\Regex;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class InvalidColorHexValueException extends \Exception
|
class InvalidColorHexValueException extends \Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Class constructor.
|
||||||
*
|
*
|
||||||
* @param string $color Invalid hexadecimal value of color
|
* @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);
|
$message = sprintf('Hexadecimal value of color \'%s\' is invalid. Is there everything ok?', $color);
|
||||||
|
parent::__construct($message);
|
||||||
return new static($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,34 +6,26 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Meritoo\Common\Traits\Test\Base;
|
namespace Meritoo\Common\Test\Base;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use Generator;
|
use Generator;
|
||||||
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
||||||
use Meritoo\Common\Type\OopVisibilityType;
|
use Meritoo\Common\Type\OopVisibilityType;
|
||||||
use Meritoo\Common\Utilities\Miscellaneous;
|
use PHPUnit_Framework_TestCase;
|
||||||
use ReflectionClass;
|
use ReflectionClass;
|
||||||
use ReflectionMethod;
|
use ReflectionMethod;
|
||||||
use stdClass;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trait for the base test case
|
* Base test case with common methods and data providers.
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
trait BaseTestCaseTrait
|
abstract class BaseTestCase extends PHPUnit_Framework_TestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Path of directory with data used by test cases
|
* Provides an empty value.
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private static $testsDataDirPath = 'data/tests';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides an empty value
|
|
||||||
*
|
*
|
||||||
* @return Generator
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
@@ -48,21 +40,7 @@ trait BaseTestCaseTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides an empty scalar value
|
* Provides boolean value.
|
||||||
*
|
|
||||||
* @return Generator
|
|
||||||
*/
|
|
||||||
public function provideEmptyScalarValue()
|
|
||||||
{
|
|
||||||
yield[''];
|
|
||||||
yield[' '];
|
|
||||||
yield[null];
|
|
||||||
yield[0];
|
|
||||||
yield[false];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides boolean value
|
|
||||||
*
|
*
|
||||||
* @return Generator
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
@@ -73,7 +51,7 @@ trait BaseTestCaseTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides instance of DateTime class
|
* Provides instance of DateTime class.
|
||||||
*
|
*
|
||||||
* @return Generator
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
@@ -86,7 +64,7 @@ trait BaseTestCaseTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides relative / compound format of DateTime
|
* Provides relative / compound format of DateTime.
|
||||||
*
|
*
|
||||||
* @return Generator
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
@@ -106,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
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
@@ -117,50 +95,26 @@ trait BaseTestCaseTrait
|
|||||||
yield['surprise/me/one/more/time.txt'];
|
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.
|
* Returns path of file used by tests.
|
||||||
* It should be placed in /data/tests directory of this project.
|
* It should be placed in /data/tests directory of this project.
|
||||||
*
|
*
|
||||||
* @param string $fileName Name of file
|
* @param string $fileName Name of file
|
||||||
* @param string $directoryPath (optional) Path of directory containing the file
|
* @param string $directoryPath (optional) Path of directory containing the file
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getFilePathForTesting($fileName, $directoryPath = '')
|
public function getFilePathToTests($fileName, $directoryPath = '')
|
||||||
{
|
{
|
||||||
$rootPath = Miscellaneous::getProjectRootPath();
|
if (!empty($directoryPath)) {
|
||||||
|
$directoryPath = '/'.$directoryPath;
|
||||||
|
}
|
||||||
|
|
||||||
$paths = [
|
return sprintf('%s/../../../../../data/tests/%s%s', __DIR__, $fileName, $directoryPath);
|
||||||
$rootPath,
|
|
||||||
self::$testsDataDirPath,
|
|
||||||
$directoryPath,
|
|
||||||
$fileName,
|
|
||||||
];
|
|
||||||
|
|
||||||
return Miscellaneous::concatenatePaths($paths);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 $classNamespace Namespace of class that contains method to verify
|
||||||
* @param string|ReflectionMethod $method Name of method or just the method to verify
|
* @param string|ReflectionMethod $method Name of method or just the method to verify
|
||||||
@@ -170,13 +124,14 @@ trait BaseTestCaseTrait
|
|||||||
* verified method
|
* verified method
|
||||||
* @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments
|
* @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments
|
||||||
* of the verified method
|
* of the verified method
|
||||||
|
*
|
||||||
* @throws UnknownOopVisibilityTypeException
|
* @throws UnknownOopVisibilityTypeException
|
||||||
*
|
*
|
||||||
* Attention. 2nd argument, the $method, may be:
|
* Attention. 2nd argument, the $method, may be:
|
||||||
* - string - name of the method
|
* - string - name of the method
|
||||||
* - instance of ReflectionMethod - just the method (provided by ReflectionClass::getMethod() method)
|
* - instance of ReflectionMethod - just the method (provided by ReflectionClass::getMethod() method)
|
||||||
*/
|
*/
|
||||||
protected static function assertMethodVisibilityAndArguments(
|
protected function verifyMethodVisibilityAndArguments(
|
||||||
$classNamespace,
|
$classNamespace,
|
||||||
$method,
|
$method,
|
||||||
$visibilityType,
|
$visibilityType,
|
||||||
@@ -203,14 +158,17 @@ trait BaseTestCaseTrait
|
|||||||
switch ($visibilityType) {
|
switch ($visibilityType) {
|
||||||
case OopVisibilityType::IS_PUBLIC:
|
case OopVisibilityType::IS_PUBLIC:
|
||||||
static::assertTrue($method->isPublic());
|
static::assertTrue($method->isPublic());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OopVisibilityType::IS_PROTECTED:
|
case OopVisibilityType::IS_PROTECTED:
|
||||||
static::assertTrue($method->isProtected());
|
static::assertTrue($method->isProtected());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OopVisibilityType::IS_PRIVATE:
|
case OopVisibilityType::IS_PRIVATE:
|
||||||
static::assertTrue($method->isPrivate());
|
static::assertTrue($method->isPrivate());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,16 +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
|
* @param string $visibilityType Expected visibility of verified method. One of OopVisibilityType class
|
||||||
* constants.
|
* constants.
|
||||||
* @param int $argumentsCount (optional) Expected count/amount of arguments of the verified method
|
* @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
|
* @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments of the verified
|
||||||
* method
|
* method
|
||||||
|
*
|
||||||
|
* @throws UnknownOopVisibilityTypeException
|
||||||
*/
|
*/
|
||||||
protected static function assertConstructorVisibilityAndArguments(
|
protected function verifyConstructorVisibilityAndArguments(
|
||||||
$classNamespace,
|
$classNamespace,
|
||||||
$visibilityType,
|
$visibilityType,
|
||||||
$argumentsCount = 0,
|
$argumentsCount = 0,
|
||||||
@@ -240,38 +200,6 @@ trait BaseTestCaseTrait
|
|||||||
$reflection = new ReflectionClass($classNamespace);
|
$reflection = new ReflectionClass($classNamespace);
|
||||||
$method = $reflection->getConstructor();
|
$method = $reflection->getConstructor();
|
||||||
|
|
||||||
static::assertMethodVisibilityAndArguments(
|
return $this->verifyMethodVisibilityAndArguments($classNamespace, $method, $visibilityType, $argumentsCount, $requiredArgumentsCount);
|
||||||
$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
|
|
||||||
*/
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,26 +1,20 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
namespace Meritoo\Common\Test\Base;
|
||||||
* (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;
|
|
||||||
|
|
||||||
use Generator;
|
use Generator;
|
||||||
use Meritoo\Common\Type\Base\BaseType;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.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()
|
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 string $type Type to verify
|
||||||
* @param bool $expected Information if given type is correct or not
|
* @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
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
abstract public function provideTypeToVerify();
|
abstract public function provideTypeToVerify();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns instance of the tested type
|
* Returns instance of the tested type.
|
||||||
*
|
*
|
||||||
* @return BaseType
|
* @return BaseType
|
||||||
*/
|
*/
|
||||||
abstract protected function getTestedTypeInstance();
|
abstract protected function getTestedTypeInstance();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all expected types of the tested type
|
* Returns all expected types of the tested type.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@@ -14,26 +14,26 @@ use Meritoo\Common\Utilities\Reflection;
|
|||||||
* Base / abstract type of something, e.g. type of button, order, date etc.
|
* Base / abstract type of something, e.g. type of button, order, date etc.
|
||||||
* Child class should contain constants - each of them represent one type.
|
* Child class should contain constants - each of them represent one type.
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
abstract class BaseType
|
abstract class BaseType
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* All types
|
* All types.
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
private $all;
|
private $all;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all types
|
* Returns all types.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function getAll()
|
public function getAll()
|
||||||
{
|
{
|
||||||
if (null === $this->all) {
|
if ($this->all === null) {
|
||||||
$this->all = Reflection::getConstants($this);
|
$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
|
||||||
*
|
*
|
||||||
* @param mixed $type The type to check
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function isCorrectType($type)
|
public function isCorrectType($type)
|
||||||
@@ -11,50 +11,50 @@ namespace Meritoo\Common\Type;
|
|||||||
use Meritoo\Common\Type\Base\BaseType;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class DatePartType extends BaseType
|
class DatePartType extends BaseType
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The "day" date part
|
* The "day" date part.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const DAY = 'day';
|
const DAY = 'day';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "hour" date part
|
* The "hour" date part.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const HOUR = 'hour';
|
const HOUR = 'hour';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "minute" date part
|
* The "minute" date part.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const MINUTE = 'minute';
|
const MINUTE = 'minute';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "month" date part
|
* The "month" date part.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const MONTH = 'month';
|
const MONTH = 'month';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "second" date part
|
* The "second" date part.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const SECOND = 'second';
|
const SECOND = 'second';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "year" date part
|
* The "year" date part.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
@@ -5,31 +5,31 @@ namespace Meritoo\Common\Type;
|
|||||||
use Meritoo\Common\Type\Base\BaseType;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*
|
*
|
||||||
* @see http://php.net/manual/en/language.oop5.visibility.php
|
* @see http://php.net/manual/en/language.oop5.visibility.php
|
||||||
*/
|
*/
|
||||||
class OopVisibilityType extends BaseType
|
class OopVisibilityType extends BaseType
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The "private" visibility of OOP
|
* The "private" visibility of OOP.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const IS_PRIVATE = 3;
|
const IS_PRIVATE = 3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "protected" visibility of OOP
|
* The "protected" visibility of OOP.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const IS_PROTECTED = 2;
|
const IS_PROTECTED = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "public" visibility of OOP
|
* The "public" visibility of OOP.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
File diff suppressed because it is too large
Load Diff
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;
|
use stdClass;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful Composer-related methods (only static functions)
|
* Useful Composer-related methods (only static functions).
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class Composer
|
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
|
* @var string
|
||||||
*/
|
*/
|
||||||
const FILE_NAME_MAIN = 'composer.json';
|
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 $composerJsonPath Path of composer.json file
|
||||||
* @param string $nodeName Name of node who value should be returned
|
* @param string $nodeName Name of node who value should be returned
|
||||||
|
*
|
||||||
* @return string|null
|
* @return string|null
|
||||||
*/
|
*/
|
||||||
public static function getValue($composerJsonPath, $nodeName)
|
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?
|
* Unknown data from the composer.json file or there is no node with given name?
|
||||||
* Nothing to do
|
* Nothing to do
|
||||||
*/
|
*/
|
||||||
if (null === $data || !isset($data->{$nodeName})) {
|
if ($data === null || !isset($data->{$nodeName})) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10,16 +10,14 @@ namespace Meritoo\Common\Utilities;
|
|||||||
|
|
||||||
use DateInterval;
|
use DateInterval;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use Exception;
|
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException;
|
||||||
use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
|
|
||||||
use Meritoo\Common\Type\DatePartType;
|
use Meritoo\Common\Type\DatePartType;
|
||||||
use Meritoo\Common\Type\DatePeriod;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful date methods
|
* Useful date methods.
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class Date
|
class Date
|
||||||
{
|
{
|
||||||
@@ -64,125 +62,110 @@ class Date
|
|||||||
const DATE_DIFFERENCE_UNIT_YEARS = 'years';
|
const DATE_DIFFERENCE_UNIT_YEARS = 'years';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns date's period (that contains start and end date) for given period
|
* Returns start and end date for given period.
|
||||||
|
* 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.
|
* @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)
|
public static function getDatesForPeriod($period)
|
||||||
{
|
{
|
||||||
/*
|
$datePeriod = null;
|
||||||
* Type of period is incorrect?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (!(new DatePeriod())->isCorrectType($period)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$dateStart = null;
|
if (DatePeriod::isCorrectPeriod($period)) {
|
||||||
$dateEnd = null;
|
$dateStart = null;
|
||||||
|
$dateEnd = null;
|
||||||
|
|
||||||
switch ($period) {
|
switch ($period) {
|
||||||
case DatePeriod::LAST_WEEK:
|
case DatePeriod::LAST_WEEK:
|
||||||
$thisWeekStart = new DateTime('this week');
|
$thisWeekStart = new DateTime('this week');
|
||||||
|
|
||||||
$dateStart = clone $thisWeekStart;
|
$dateStart = clone $thisWeekStart;
|
||||||
$dateEnd = clone $thisWeekStart;
|
$dateEnd = clone $thisWeekStart;
|
||||||
|
|
||||||
$dateStart->sub(new DateInterval('P7D'));
|
$dateStart->sub(new DateInterval('P7D'));
|
||||||
$dateEnd->sub(new DateInterval('P1D'));
|
$dateEnd->sub(new DateInterval('P1D'));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case DatePeriod::THIS_WEEK:
|
case DatePeriod::THIS_WEEK:
|
||||||
$dateStart = new DateTime('this week');
|
$dateStart = new DateTime('this week');
|
||||||
|
|
||||||
$dateEnd = clone $dateStart;
|
$dateEnd = clone $dateStart;
|
||||||
$dateEnd->add(new DateInterval('P6D'));
|
$dateEnd->add(new DateInterval('P6D'));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case DatePeriod::NEXT_WEEK:
|
case DatePeriod::NEXT_WEEK:
|
||||||
$dateStart = new DateTime('this week');
|
$dateStart = new DateTime('this week');
|
||||||
$dateStart->add(new DateInterval('P7D'));
|
$dateStart->add(new DateInterval('P7D'));
|
||||||
|
|
||||||
$dateEnd = clone $dateStart;
|
$dateEnd = clone $dateStart;
|
||||||
$dateEnd->add(new DateInterval('P6D'));
|
$dateEnd->add(new DateInterval('P6D'));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case DatePeriod::LAST_MONTH:
|
case DatePeriod::LAST_MONTH:
|
||||||
$dateStart = new DateTime('first day of last month');
|
$dateStart = new DateTime('first day of last month');
|
||||||
$dateEnd = new DateTime('last day of last month');
|
$dateEnd = new DateTime('last day of last month');
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case DatePeriod::THIS_MONTH:
|
case DatePeriod::THIS_MONTH:
|
||||||
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
|
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
|
||||||
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
|
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
|
||||||
|
|
||||||
if (null !== $lastMonth) {
|
|
||||||
$dateStart = $lastMonth->getEndDate();
|
$dateStart = $lastMonth->getEndDate();
|
||||||
$dateStart->add(new DateInterval('P1D'));
|
$dateStart->add(new DateInterval('P1D'));
|
||||||
}
|
|
||||||
|
|
||||||
if (null !== $nextMonth) {
|
|
||||||
$dateEnd = $nextMonth->getStartDate();
|
$dateEnd = $nextMonth->getStartDate();
|
||||||
$dateEnd->sub(new DateInterval('P1D'));
|
$dateEnd->sub(new DateInterval('P1D'));
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case DatePeriod::NEXT_MONTH:
|
case DatePeriod::NEXT_MONTH:
|
||||||
$dateStart = new DateTime('first day of next month');
|
$dateStart = new DateTime('first day of next month');
|
||||||
$dateEnd = new DateTime('last day of next month');
|
$dateEnd = new DateTime('last day of next month');
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case DatePeriod::LAST_YEAR:
|
case DatePeriod::LAST_YEAR:
|
||||||
case DatePeriod::THIS_YEAR:
|
case DatePeriod::THIS_YEAR:
|
||||||
case DatePeriod::NEXT_YEAR:
|
case DatePeriod::NEXT_YEAR:
|
||||||
$dateStart = new DateTime();
|
$dateStart = new DateTime();
|
||||||
$dateEnd = new DateTime();
|
$dateEnd = new DateTime();
|
||||||
|
|
||||||
$yearPeriod = [
|
if ($period == DatePeriod::LAST_YEAR || $period == DatePeriod::NEXT_YEAR) {
|
||||||
DatePeriod::LAST_YEAR,
|
$yearDifference = 1;
|
||||||
DatePeriod::NEXT_YEAR,
|
|
||||||
];
|
|
||||||
|
|
||||||
if (in_array($period, $yearPeriod, true)) {
|
if ($period == DatePeriod::LAST_YEAR) {
|
||||||
$yearDifference = 1;
|
$yearDifference *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (DatePeriod::LAST_YEAR === $period) {
|
$modifyString = sprintf('%s year', $yearDifference);
|
||||||
$yearDifference *= -1;
|
$dateStart->modify($modifyString);
|
||||||
|
$dateEnd->modify($modifyString);
|
||||||
}
|
}
|
||||||
|
|
||||||
$modifyString = sprintf('%s year', $yearDifference);
|
$year = $dateStart->format('Y');
|
||||||
$dateStart->modify($modifyString);
|
$dateStart->setDate($year, 1, 1);
|
||||||
$dateEnd->modify($modifyString);
|
$dateEnd->setDate($year, 12, 31);
|
||||||
}
|
|
||||||
|
|
||||||
$year = $dateStart->format('Y');
|
break;
|
||||||
$dateStart->setDate($year, 1, 1);
|
}
|
||||||
$dateEnd->setDate($year, 12, 31);
|
|
||||||
|
|
||||||
break;
|
if ($dateStart !== null && $dateEnd !== null) {
|
||||||
|
$dateStart->setTime(0, 0, 0);
|
||||||
|
$dateEnd->setTime(23, 59, 59);
|
||||||
|
|
||||||
|
$datePeriod = new DatePeriod($dateStart, $dateEnd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
return $datePeriod;
|
||||||
* Start or end date is unknown?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (null === $dateStart || null === $dateEnd) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$dateStart->setTime(0, 0);
|
|
||||||
$dateEnd->setTime(23, 59, 59);
|
|
||||||
|
|
||||||
return new DatePeriod($dateStart, $dateEnd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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()
|
* @param string $format (optional) Format of returned value. A string acceptable by the DateTime::format()
|
||||||
* method.
|
* method.
|
||||||
|
*
|
||||||
* @return string|null
|
* @return string|null
|
||||||
*/
|
*/
|
||||||
public static function generateRandomTime($format = 'H:i:s')
|
public static function generateRandomTime($format = 'H:i:s')
|
||||||
@@ -222,12 +205,11 @@ class Date
|
|||||||
|
|
||||||
return $dateTime
|
return $dateTime
|
||||||
->setTime($hour, $minute, $second)
|
->setTime($hour, $minute, $second)
|
||||||
->format($format)
|
->format($format);
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns current day of week
|
* Returns current day of week.
|
||||||
*
|
*
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
@@ -250,34 +232,35 @@ class Date
|
|||||||
* @param int $month The month value
|
* @param int $month The month value
|
||||||
* @param int $day The day value
|
* @param int $day The day value
|
||||||
*
|
*
|
||||||
* @throws UnknownDatePartTypeException
|
|
||||||
* @return int
|
* @return int
|
||||||
|
*
|
||||||
|
* @throws UnknownDatePartTypeException
|
||||||
*/
|
*/
|
||||||
public static function getDayOfWeek($year, $month, $day)
|
public static function getDayOfWeek($year, $month, $day)
|
||||||
{
|
{
|
||||||
$year = (int)$year;
|
$year = (int) $year;
|
||||||
$month = (int)$month;
|
$month = (int) $month;
|
||||||
$day = (int)$day;
|
$day = (int) $day;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Oops, incorrect year
|
* Oops, incorrect year
|
||||||
*/
|
*/
|
||||||
if ($year <= 0) {
|
if ($year <= 0) {
|
||||||
throw UnknownDatePartTypeException::createException(DatePartType::YEAR, $year);
|
throw new UnknownDatePartTypeException(DatePartType::YEAR, $year);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Oops, incorrect month
|
* Oops, incorrect month
|
||||||
*/
|
*/
|
||||||
if ($month < 1 || $month > 12) {
|
if ($month < 1 || $month > 12) {
|
||||||
throw UnknownDatePartTypeException::createException(DatePartType::MONTH, $month);
|
throw new UnknownDatePartTypeException(DatePartType::MONTH, $month);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Oops, incorrect day
|
* Oops, incorrect day
|
||||||
*/
|
*/
|
||||||
if ($day < 1 || $day > 31) {
|
if ($day < 1 || $day > 31) {
|
||||||
throw UnknownDatePartTypeException::createException(DatePartType::DAY, $day);
|
throw new UnknownDatePartTypeException(DatePartType::DAY, $day);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($month < 3) {
|
if ($month < 3) {
|
||||||
@@ -297,7 +280,7 @@ class Date
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns based on locale name of current weekday
|
* Returns based on locale name of current weekday.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -313,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 $year The year value
|
||||||
* @param int $month The month value
|
* @param int $month The month value
|
||||||
* @param int $day The day value
|
* @param int $day The day value
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getDayOfWeekName($year, $month, $day)
|
public static function getDayOfWeekName($year, $month, $day)
|
||||||
@@ -331,7 +315,7 @@ class Date
|
|||||||
|
|
||||||
$encoding = mb_detect_encoding($name);
|
$encoding = mb_detect_encoding($name);
|
||||||
|
|
||||||
if (false === $encoding) {
|
if ($encoding === false) {
|
||||||
$name = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-2');
|
$name = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-2');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,9 +339,10 @@ class Date
|
|||||||
*
|
*
|
||||||
* @param string|DateTime $dateStart The start date
|
* @param string|DateTime $dateStart The start date
|
||||||
* @param string|DateTime $dateEnd The end date
|
* @param string|DateTime $dateEnd The end date
|
||||||
* @param string $differenceUnit (optional) Unit of date difference. One of this class
|
* @param int $differenceUnit (optional) Unit of date difference. One of this class
|
||||||
* DATE_DIFFERENCE_UNIT_* constants. If is set to null all units are
|
* DATE_DIFFERENCE_UNIT_* constants. If is set to null all units are
|
||||||
* returned in the array.
|
* returned in the array.
|
||||||
|
*
|
||||||
* @return array|int
|
* @return array|int
|
||||||
*/
|
*/
|
||||||
public static function getDateDifference($dateStart, $dateEnd, $differenceUnit = null)
|
public static function getDateDifference($dateStart, $dateEnd, $differenceUnit = null)
|
||||||
@@ -376,11 +361,11 @@ class Date
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$start = self::getDateTime($dateStart, true);
|
$dateStart = self::getDateTime($dateStart, true);
|
||||||
$end = self::getDateTime($dateEnd, true);
|
$dateEnd = self::getDateTime($dateEnd, true);
|
||||||
|
|
||||||
$difference = [];
|
$difference = [];
|
||||||
$dateDiff = $end->getTimestamp() - $start->getTimestamp();
|
$dateDiff = $dateEnd->getTimestamp() - $dateStart->getTimestamp();
|
||||||
|
|
||||||
$daysInSeconds = 0;
|
$daysInSeconds = 0;
|
||||||
$hoursInSeconds = 0;
|
$hoursInSeconds = 0;
|
||||||
@@ -398,46 +383,46 @@ class Date
|
|||||||
self::DATE_DIFFERENCE_UNIT_MINUTES,
|
self::DATE_DIFFERENCE_UNIT_MINUTES,
|
||||||
];
|
];
|
||||||
|
|
||||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_YEARS === $differenceUnit) {
|
if ($differenceUnit === null || $differenceUnit == self::DATE_DIFFERENCE_UNIT_YEARS) {
|
||||||
$diff = $end->diff($start);
|
$diff = $dateEnd->diff($dateStart);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Difference between dates in years should be returned only?
|
* 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;
|
return $diff->y;
|
||||||
}
|
}
|
||||||
|
|
||||||
$difference[self::DATE_DIFFERENCE_UNIT_YEARS] = $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 = $end->diff($start);
|
$diff = $dateEnd->diff($dateStart);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Difference between dates in months should be returned only?
|
* 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;
|
return $diff->m;
|
||||||
}
|
}
|
||||||
|
|
||||||
$difference[self::DATE_DIFFERENCE_UNIT_MONTHS] = $diff->m;
|
$difference[self::DATE_DIFFERENCE_UNIT_MONTHS] = $diff->m;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits, true)) {
|
if ($differenceUnit === null || in_array($differenceUnit, $relatedUnits)) {
|
||||||
$days = (int)floor($dateDiff / $daySeconds);
|
$days = (int) floor($dateDiff / $daySeconds);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Difference between dates in days should be returned only?
|
* 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;
|
return $days;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All units should be returned?
|
* All units should be returned?
|
||||||
*/
|
*/
|
||||||
if (null === $differenceUnit) {
|
if ($differenceUnit === null) {
|
||||||
$difference[self::DATE_DIFFERENCE_UNIT_DAYS] = $days;
|
$difference[self::DATE_DIFFERENCE_UNIT_DAYS] = $days;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -447,20 +432,20 @@ class Date
|
|||||||
$daysInSeconds = $days * $daySeconds;
|
$daysInSeconds = $days * $daySeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits, true)) {
|
if ($differenceUnit === null || in_array($differenceUnit, $relatedUnits)) {
|
||||||
$hours = (int)floor(($dateDiff - $daysInSeconds) / $hourSeconds);
|
$hours = (int) floor(($dateDiff - $daysInSeconds) / $hourSeconds);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Difference between dates in hours should be returned only?
|
* 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;
|
return $hours;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All units should be returned?
|
* All units should be returned?
|
||||||
*/
|
*/
|
||||||
if (null === $differenceUnit) {
|
if ($differenceUnit === null) {
|
||||||
$difference[self::DATE_DIFFERENCE_UNIT_HOURS] = $hours;
|
$difference[self::DATE_DIFFERENCE_UNIT_HOURS] = $hours;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -470,13 +455,13 @@ class Date
|
|||||||
$hoursInSeconds = $hours * $hourSeconds;
|
$hoursInSeconds = $hours * $hourSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_MINUTES === $differenceUnit) {
|
if ($differenceUnit === null || $differenceUnit == self::DATE_DIFFERENCE_UNIT_MINUTES) {
|
||||||
$minutes = (int)floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60);
|
$minutes = (int) floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Difference between dates in minutes should be returned only?
|
* 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;
|
return $minutes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -495,7 +480,7 @@ class Date
|
|||||||
* @param string $intervalTemplate (optional) Template used to build date interval. It should contain "%d" as the
|
* @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.
|
* placeholder which is replaced with a number that represents each iteration.
|
||||||
* Default: interval for days.
|
* Default: interval for days.
|
||||||
* @throws Exception
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function getDatesCollection(DateTime $startDate, $datesCount, $intervalTemplate = 'P%dD')
|
public static function getDatesCollection(DateTime $startDate, $datesCount, $intervalTemplate = 'P%dD')
|
||||||
@@ -521,7 +506,7 @@ class Date
|
|||||||
$matchCount = preg_match($intervalPattern, $intervalTemplate, $matches);
|
$matchCount = preg_match($intervalPattern, $intervalTemplate, $matches);
|
||||||
|
|
||||||
if ($matchCount > 0 && (!empty($matches[1]) || !empty($matches[2]))) {
|
if ($matchCount > 0 && (!empty($matches[1]) || !empty($matches[2]))) {
|
||||||
$datesCount = (int)$datesCount;
|
$datesCount = (int) $datesCount;
|
||||||
|
|
||||||
for ($index = 1; $index <= $datesCount; ++$index) {
|
for ($index = 1; $index <= $datesCount; ++$index) {
|
||||||
$date = clone $startDate;
|
$date = clone $startDate;
|
||||||
@@ -534,28 +519,24 @@ class Date
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns random date based on given start date
|
* Returns random date based on given start date.
|
||||||
*
|
*
|
||||||
* @param DateTime $startDate (optional) Beginning of the random date. If not provided, current date will
|
* @param DateTime $startDate The start date. Start of the random date.
|
||||||
* be used (default behaviour).
|
* @param int $start (optional) Start of random partition
|
||||||
* @param int $start (optional) Start of random partition. If not provided, 1 will be used
|
* @param int $end (optional) End of random partition
|
||||||
* (default behaviour).
|
|
||||||
* @param int $end (optional) End of random partition. If not provided, 100 will be used
|
|
||||||
* (default behaviour).
|
|
||||||
* @param string $intervalTemplate (optional) Template used to build date interval. The placeholder is replaced
|
* @param string $intervalTemplate (optional) Template used to build date interval. The placeholder is replaced
|
||||||
* with next, iterated value. If not provided, "P%sD" will be used (default
|
* with next, iterated value.
|
||||||
* behaviour).
|
*
|
||||||
* @throws Exception
|
|
||||||
* @return DateTime
|
* @return DateTime
|
||||||
*/
|
*/
|
||||||
public static function getRandomDate(DateTime $startDate = null, $start = 1, $end = 100, $intervalTemplate = 'P%sD')
|
public static function getRandomDate(DateTime $startDate = null, $start = 1, $end = 100, $intervalTemplate = 'P%sD')
|
||||||
{
|
{
|
||||||
if (null === $startDate) {
|
if ($startDate === null) {
|
||||||
$startDate = new DateTime();
|
$startDate = new DateTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
$start = (int)$start;
|
$start = (int) $start;
|
||||||
$end = (int)$end;
|
$end = (int) $end;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Incorrect end of random partition?
|
* Incorrect end of random partition?
|
||||||
@@ -566,7 +547,7 @@ class Date
|
|||||||
}
|
}
|
||||||
|
|
||||||
$randomDate = clone $startDate;
|
$randomDate = clone $startDate;
|
||||||
$randomInterval = new DateInterval(sprintf($intervalTemplate, mt_rand($start, $end)));
|
$randomInterval = new DateInterval(sprintf($intervalTemplate, rand($start, $end)));
|
||||||
|
|
||||||
return $randomDate->add($randomInterval);
|
return $randomDate->add($randomInterval);
|
||||||
}
|
}
|
||||||
@@ -578,11 +559,11 @@ class Date
|
|||||||
* @param mixed $value The value which maybe is a 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
|
* @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
|
* instance of DateTime class are allowed (e.g. "now", "last day of next
|
||||||
* month", "yyyy"). Otherwise - not and every incorrect value is refused
|
* month", "yyyy"). Otherwise - not and every incorrect value is refused.
|
||||||
* (default behaviour).
|
|
||||||
* @param string $dateFormat (optional) Format of date used to verify if given value is actually a 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
|
* It should be format matched to the given value, e.g. "Y-m-d H:i" for
|
||||||
* "2015-01-01 10:00" value. Default: "Y-m-d".
|
* "2015-01-01 10:00" value.
|
||||||
|
*
|
||||||
* @return DateTime|bool
|
* @return DateTime|bool
|
||||||
*/
|
*/
|
||||||
public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d')
|
public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d')
|
||||||
@@ -617,7 +598,7 @@ class Date
|
|||||||
*/
|
*/
|
||||||
$dateFromFormat = DateTime::createFromFormat($dateFormat, $value);
|
$dateFromFormat = DateTime::createFromFormat($dateFormat, $value);
|
||||||
|
|
||||||
if (false === $dateFromFormat) {
|
if ($dateFromFormat === false) {
|
||||||
/*
|
/*
|
||||||
* Nothing to do more, because:
|
* Nothing to do more, because:
|
||||||
* a) instance of the DateTime was created
|
* a) instance of the DateTime was created
|
||||||
@@ -650,7 +631,7 @@ class Date
|
|||||||
* So, I have to refuse those special compound formats if they are not explicitly declared as
|
* So, I have to refuse those special compound formats if they are not explicitly declared as
|
||||||
* compound (2nd argument of this method, set to false by default)
|
* compound (2nd argument of this method, set to false by default)
|
||||||
*/
|
*/
|
||||||
if (in_array($value, $specialFormats, true)) {
|
if (in_array($value, $specialFormats)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -675,7 +656,7 @@ class Date
|
|||||||
*/
|
*/
|
||||||
$dateString = (new DateTime())->format($value);
|
$dateString = (new DateTime())->format($value);
|
||||||
|
|
||||||
if ($dateString !== (string)$value) {
|
if ($dateString != $value) {
|
||||||
return new DateTime($dateString);
|
return new DateTime($dateString);
|
||||||
}
|
}
|
||||||
} catch (\Exception $exception) {
|
} catch (\Exception $exception) {
|
||||||
@@ -685,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 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
|
* @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
|
* instance of DateTime class are allowed (e.g. "now", "last day of next
|
||||||
* month", "yyyy"). Otherwise - not and every incorrect value is refused.
|
* month", "yyyy"). Otherwise - not and every incorrect value is refused.
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function isValidDate($value, $allowCompoundFormats = false)
|
public static function isValidDate($value, $allowCompoundFormats = false)
|
||||||
@@ -699,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
|
* @param string $format The validated format of date
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function isValidDateFormat($format)
|
public static function isValidDateFormat($format)
|
||||||
@@ -719,7 +702,7 @@ class Date
|
|||||||
* Formatted date it's the format who is validated?
|
* Formatted date it's the format who is validated?
|
||||||
* The format is invalid
|
* The format is invalid
|
||||||
*/
|
*/
|
||||||
if ($formatted === $format) {
|
if ($formatted == $format) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6,100 +6,98 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Meritoo\Common\Type;
|
namespace Meritoo\Common\Utilities;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use Meritoo\Common\Type\Base\BaseType;
|
|
||||||
use Meritoo\Common\Utilities\Date;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A date's period.
|
* A date's period.
|
||||||
* Contains start and end date of the period.
|
* Contains start and end date of the period.
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class DatePeriod extends BaseType
|
class DatePeriod
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The period constant: last month
|
* The period constant: last month.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const LAST_MONTH = 4;
|
const LAST_MONTH = 4;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: last week
|
* The period constant: last week.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const LAST_WEEK = 1;
|
const LAST_WEEK = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: last year
|
* The period constant: last year.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const LAST_YEAR = 7;
|
const LAST_YEAR = 7;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: next month
|
* The period constant: next month.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const NEXT_MONTH = 6;
|
const NEXT_MONTH = 6;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: next week
|
* The period constant: next week.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const NEXT_WEEK = 3;
|
const NEXT_WEEK = 3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: next year
|
* The period constant: next year.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const NEXT_YEAR = 9;
|
const NEXT_YEAR = 9;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: this month
|
* The period constant: this month.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const THIS_MONTH = 5;
|
const THIS_MONTH = 5;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: this week
|
* The period constant: this week.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const THIS_WEEK = 2;
|
const THIS_WEEK = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: this year
|
* The period constant: this year.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const THIS_YEAR = 8;
|
const THIS_YEAR = 8;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The start date of period
|
* The start date of period.
|
||||||
*
|
*
|
||||||
* @var DateTime
|
* @var DateTime
|
||||||
*/
|
*/
|
||||||
private $startDate;
|
private $startDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The end date of period
|
* The end date of period.
|
||||||
*
|
*
|
||||||
* @var DateTime
|
* @var DateTime
|
||||||
*/
|
*/
|
||||||
private $endDate;
|
private $endDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class constructor
|
* Class constructor.
|
||||||
*
|
*
|
||||||
* @param DateTime $startDate (optional) The start date of period
|
* @param DateTime $startDate (optional) The start date of period
|
||||||
* @param DateTime $endDate (optional) The end 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 string $format Format used to format the date
|
||||||
* @param bool $startDate (optional) If is set to true, start date is formatted. Otherwise - end date.
|
* @param bool $startDate (optional) If is set to true, start date is formatted. Otherwise - end date.
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getFormattedDate($format, $startDate = true)
|
public function getFormattedDate($format, $startDate = true)
|
||||||
@@ -131,7 +142,7 @@ class DatePeriod extends BaseType
|
|||||||
/*
|
/*
|
||||||
* Unknown date or format is invalid?
|
* Unknown date or format is invalid?
|
||||||
*/
|
*/
|
||||||
if (null === $date || !Date::isValidDateFormat($format)) {
|
if ($date === null || !Date::isValidDateFormat($format)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,7 +150,7 @@ class DatePeriod extends BaseType
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the end date of period
|
* Returns the end date of period.
|
||||||
*
|
*
|
||||||
* @return DateTime
|
* @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
|
* @param DateTime $endDate (optional) The end date of period
|
||||||
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function setEndDate(DateTime $endDate = null)
|
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
|
* @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
|
* @param DateTime $startDate (optional) The start date of period
|
||||||
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function setStartDate(DateTime $startDate = null)
|
public function setStartDate(DateTime $startDate = null)
|
||||||
@@ -11,17 +11,18 @@ namespace Meritoo\Common\Utilities;
|
|||||||
use Generator;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class GeneratorUtility
|
class GeneratorUtility
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Returns elements of generator
|
* Returns elements of generator.
|
||||||
*
|
*
|
||||||
* @param Generator $generator The generator who elements should be returned
|
* @param Generator $generator The generator who elements should be returned
|
||||||
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function getGeneratorElements(Generator $generator)
|
public static function getGeneratorElements(Generator $generator)
|
||||||
@@ -9,21 +9,22 @@
|
|||||||
namespace Meritoo\Common\Utilities;
|
namespace Meritoo\Common\Utilities;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful locale methods
|
* Useful locale methods.
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class Locale
|
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
|
* @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.
|
* 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 $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 $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):
|
* Available categories (values of $category argument):
|
||||||
* - LC_ALL for all of the below
|
* - LC_ALL for all of the below
|
||||||
@@ -36,7 +37,7 @@ class Locale
|
|||||||
*/
|
*/
|
||||||
public static function setLocale($category, $languageCode, $countryCode = '')
|
public static function setLocale($category, $languageCode, $countryCode = '')
|
||||||
{
|
{
|
||||||
$category = (int)$category;
|
$category = (int) $category;
|
||||||
|
|
||||||
if (is_string($languageCode)) {
|
if (is_string($languageCode)) {
|
||||||
$languageCode = trim($languageCode);
|
$languageCode = trim($languageCode);
|
||||||
@@ -52,42 +53,23 @@ class Locale
|
|||||||
LC_MESSAGES,
|
LC_MESSAGES,
|
||||||
];
|
];
|
||||||
|
|
||||||
if (empty($languageCode) || !in_array($category, $availableCategories, true)) {
|
if (empty($languageCode) || !in_array($category, $availableCategories)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$localeLongForm = self::getLongForm($languageCode, $countryCode);
|
$localeLongForm = self::getLongForm($languageCode, $countryCode);
|
||||||
|
setlocale($category, $localeLongForm);
|
||||||
|
|
||||||
return setlocale($category, $localeLongForm);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns locale for given category
|
* Returns long form of the locale.
|
||||||
*
|
|
||||||
* @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
|
|
||||||
*
|
*
|
||||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
* @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 $countryCode (optional) Country code, in ISO 3166-1 alpha-2 format, e.g. "FR"
|
||||||
* @param string $encoding (optional) Encoding of the final locale
|
* @param string $encoding (optional) Encoding of the final locale
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*
|
*
|
||||||
* Example:
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -15,10 +15,10 @@ use Doctrine\ORM\Query\Parameter;
|
|||||||
use Doctrine\ORM\QueryBuilder;
|
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>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class QueryBuilderUtility
|
class QueryBuilderUtility
|
||||||
{
|
{
|
||||||
@@ -27,16 +27,13 @@ class QueryBuilderUtility
|
|||||||
* If null is returned, alias was not found.
|
* If null is returned, alias was not found.
|
||||||
*
|
*
|
||||||
* @param QueryBuilder $queryBuilder The query builder to retrieve root alias
|
* @param QueryBuilder $queryBuilder The query builder to retrieve root alias
|
||||||
|
*
|
||||||
* @return null|string
|
* @return null|string
|
||||||
*/
|
*/
|
||||||
public static function getRootAlias(QueryBuilder $queryBuilder)
|
public static function getRootAlias(QueryBuilder $queryBuilder)
|
||||||
{
|
{
|
||||||
$aliases = $queryBuilder->getRootAliases();
|
$aliases = $queryBuilder->getRootAliases();
|
||||||
|
|
||||||
/*
|
|
||||||
* No aliases?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($aliases)) {
|
if (empty($aliases)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -46,22 +43,18 @@ class QueryBuilderUtility
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns alias of given property joined in given query builder
|
* Returns alias of given property joined in given query builder
|
||||||
*
|
* If the join does not exist, null is returned.
|
||||||
* If there are no joins or the join does not exist, null is returned.
|
|
||||||
* It's also information if given property is already joined in given query builder.
|
* It's also information if given property is already joined in given query builder.
|
||||||
*
|
*
|
||||||
* @param QueryBuilder $queryBuilder The query builder to verify
|
* @param QueryBuilder $queryBuilder The query builder to verify
|
||||||
* @param string $property Name of property that maybe is joined
|
* @param string $property Name of property that maybe is joined
|
||||||
|
*
|
||||||
* @return null|string
|
* @return null|string
|
||||||
*/
|
*/
|
||||||
public static function getJoinedPropertyAlias(QueryBuilder $queryBuilder, $property)
|
public static function getJoinedPropertyAlias(QueryBuilder $queryBuilder, $property)
|
||||||
{
|
{
|
||||||
$joins = $queryBuilder->getDQLPart('join');
|
$joins = $queryBuilder->getDQLPart('join');
|
||||||
|
|
||||||
/*
|
|
||||||
* No joins?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($joins)) {
|
if (empty($joins)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -84,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 QueryBuilder $queryBuilder The query builder
|
||||||
* @param array $criteria (optional) The criteria used in WHERE clause. It may simple array with pairs
|
* @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
|
* key-value or an array of arrays where second element of sub-array is the
|
||||||
* comparison operator. Example below.
|
* comparison operator. Example below.
|
||||||
* @param string|null $alias (optional) Alias used in the query
|
* @param string $alias (optional) Alias used in the query
|
||||||
|
*
|
||||||
* @return QueryBuilder
|
* @return QueryBuilder
|
||||||
*
|
*
|
||||||
* Example of the $criteria argument:
|
* Example of the $criteria argument:
|
||||||
@@ -106,63 +100,54 @@ class QueryBuilderUtility
|
|||||||
* 'position' => 5,
|
* 'position' => 5,
|
||||||
* ]
|
* ]
|
||||||
*/
|
*/
|
||||||
public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = null)
|
public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = '')
|
||||||
{
|
{
|
||||||
/*
|
if (!empty($criteria)) {
|
||||||
* No criteria used in WHERE clause?
|
if (empty($alias)) {
|
||||||
* Nothing to do
|
$alias = self::getRootAlias($queryBuilder);
|
||||||
*/
|
}
|
||||||
if (empty($criteria)) {
|
|
||||||
return $queryBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
foreach ($criteria as $column => $value) {
|
||||||
* No alias provided?
|
$compareOperator = '=';
|
||||||
* Let's use root alias
|
|
||||||
*/
|
|
||||||
if (null === $alias || '' === $alias) {
|
|
||||||
$alias = self::getRootAlias($queryBuilder);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($criteria as $column => $value) {
|
if (is_array($value) && !empty($value)) {
|
||||||
$compareOperator = '=';
|
if (count($value) == 2) {
|
||||||
|
$compareOperator = $value[1];
|
||||||
|
}
|
||||||
|
|
||||||
if (is_array($value) && !empty($value)) {
|
$value = $value[0];
|
||||||
if (2 === count($value)) {
|
|
||||||
$compareOperator = $value[1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$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;
|
return $queryBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes given entities
|
* Deletes given entities.
|
||||||
*
|
*
|
||||||
* @param EntityManager $entityManager The entity manager
|
* @param EntityManager $entityManager The entity manager
|
||||||
* @param array|ArrayCollection $entities The entities to delete
|
* @param array|ArrayCollection $entities The entities to delete
|
||||||
* @param bool $flushDeleted (optional) If is set to true, flushes the deleted objects (default
|
* @param bool $flushDeleted (optional) If is set to true, flushes the deleted objects.
|
||||||
* behaviour). Otherwise - not.
|
* Otherwise - not.
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function deleteEntities(EntityManager $entityManager, $entities, $flushDeleted = true)
|
public static function deleteEntities(EntityManager $entityManager, $entities, $flushDeleted = true)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* No entities provided?
|
* No entities found?
|
||||||
* Nothing to do
|
* Nothing to do
|
||||||
*/
|
*/
|
||||||
if (empty($entities)) {
|
if (empty($entities)) {
|
||||||
@@ -188,30 +173,25 @@ class QueryBuilderUtility
|
|||||||
* Attention. Existing parameters will be overridden.
|
* Attention. Existing parameters will be overridden.
|
||||||
*
|
*
|
||||||
* @param QueryBuilder $queryBuilder The query builder
|
* @param QueryBuilder $queryBuilder The query builder
|
||||||
* @param array|ArrayCollection $parameters Parameters to add. Collection of Doctrine\ORM\Query\Parameter
|
* @param array|ArrayCollection $parameters Parameters to add. Collection of instances of
|
||||||
* instances or an array with key-value pairs.
|
* Doctrine\ORM\Query\Parameter class or an array with key-value pairs.
|
||||||
|
*
|
||||||
* @return QueryBuilder
|
* @return QueryBuilder
|
||||||
*/
|
*/
|
||||||
public static function addParameters(QueryBuilder $queryBuilder, $parameters)
|
public static function addParameters(QueryBuilder $queryBuilder, $parameters)
|
||||||
{
|
{
|
||||||
/*
|
if (!empty($parameters)) {
|
||||||
* No parameters?
|
foreach ($parameters as $key => $parameter) {
|
||||||
* Nothing to do
|
$name = $key;
|
||||||
*/
|
$value = $parameter;
|
||||||
if (empty($parameters)) {
|
|
||||||
return $queryBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($parameters as $key => $parameter) {
|
if ($parameter instanceof Parameter) {
|
||||||
$name = $key;
|
$name = $parameter->getName();
|
||||||
$value = $parameter;
|
$value = $parameter->getValue();
|
||||||
|
}
|
||||||
|
|
||||||
if ($parameter instanceof Parameter) {
|
$queryBuilder->setParameter($name, $value);
|
||||||
$name = $parameter->getName();
|
|
||||||
$value = $parameter->getValue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$queryBuilder->setParameter($name, $value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $queryBuilder;
|
return $queryBuilder;
|
||||||
@@ -8,42 +8,47 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Utilities;
|
namespace Meritoo\Common\Utilities;
|
||||||
|
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\Common\Util\ClassUtils;
|
use Doctrine\Common\Util\ClassUtils;
|
||||||
use Doctrine\Common\Util\Inflector;
|
use Doctrine\Common\Util\Inflector;
|
||||||
use Meritoo\Common\Collection\Collection;
|
|
||||||
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
|
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
|
||||||
use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
|
use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
|
||||||
use Meritoo\Common\Exception\Reflection\NotExistingPropertyException;
|
|
||||||
use Meritoo\Common\Exception\Reflection\TooManyChildClassesException;
|
use Meritoo\Common\Exception\Reflection\TooManyChildClassesException;
|
||||||
|
use ReflectionClass;
|
||||||
|
use ReflectionException;
|
||||||
|
use ReflectionMethod;
|
||||||
|
use ReflectionObject;
|
||||||
|
use ReflectionProperty;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful reflection methods
|
* Useful reflection methods.
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class Reflection
|
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 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.
|
* @param bool $withoutInheritance (optional) If is set to true, only methods for given class are returned.
|
||||||
* Otherwise - all methods, with inherited methods too.
|
* Otherwise - all methods, with inherited methods too.
|
||||||
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function getMethods($class, $withoutInheritance = false)
|
public static function getMethods($class, $withoutInheritance = false)
|
||||||
{
|
{
|
||||||
$effect = [];
|
$effect = [];
|
||||||
|
|
||||||
$reflection = new \ReflectionClass($class);
|
$reflection = new ReflectionClass($class);
|
||||||
$methods = $reflection->getMethods();
|
$methods = $reflection->getMethods();
|
||||||
|
|
||||||
if (!empty($methods)) {
|
if (!empty($methods)) {
|
||||||
$className = self::getClassName($class);
|
$className = self::getClassName($class);
|
||||||
|
|
||||||
foreach ($methods as $method) {
|
foreach ($methods as $method) {
|
||||||
if ($method instanceof \ReflectionMethod) {
|
if ($method instanceof ReflectionMethod) {
|
||||||
if ($withoutInheritance && $className !== $method->class) {
|
if ($withoutInheritance && $className !== $method->class) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -57,23 +62,25 @@ 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
|
* @param object|string $class The object or name of object's class
|
||||||
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function getConstants($class)
|
public static function getConstants($class)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass($class);
|
$reflection = new ReflectionClass($class);
|
||||||
|
|
||||||
return $reflection->getConstants();
|
return $reflection->getConstants();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns maximum integer value of constant of given class / object.
|
* Returns maximum constant from all constants of given class / object.
|
||||||
* Constants whose values are integers are considered only.
|
* Values of constants should be integers.
|
||||||
*
|
*
|
||||||
* @param object|string $class The object or name of object's class
|
* @param object|string $class The object or name of object's class
|
||||||
|
*
|
||||||
* @return int|null
|
* @return int|null
|
||||||
*/
|
*/
|
||||||
public static function getMaxNumberConstant($class)
|
public static function getMaxNumberConstant($class)
|
||||||
@@ -96,57 +103,61 @@ 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 object|string $class The object or name of object's class
|
||||||
* @param string $method Name of the method to find
|
* @param string $method Name of the method to find
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function hasMethod($class, $method)
|
public static function hasMethod($class, $method)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass($class);
|
$reflection = new ReflectionClass($class);
|
||||||
|
|
||||||
return $reflection->hasMethod($method);
|
return $reflection->hasMethod($method);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 object|string $class The object or name of object's class
|
||||||
* @param string $property Name of the property to find
|
* @param string $property Name of the property to find
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function hasProperty($class, $property)
|
public static function hasProperty($class, $property)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass($class);
|
$reflection = new ReflectionClass($class);
|
||||||
|
|
||||||
return $reflection->hasProperty($property);
|
return $reflection->hasProperty($property);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 object|string $class The object or name of object's class
|
||||||
* @param string $constant Name of the constant to find
|
* @param string $constant Name of the constant to find
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function hasConstant($class, $constant)
|
public static function hasConstant($class, $constant)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass($class);
|
$reflection = new ReflectionClass($class);
|
||||||
|
|
||||||
return $reflection->hasConstant($constant);
|
return $reflection->hasConstant($constant);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns value of given constant
|
* Returns value of given constant.
|
||||||
*
|
*
|
||||||
* @param object|string $class The object or name of object's class
|
* @param object|string $class The object or name of object's class
|
||||||
* @param string $constant Name of the constant that contains a value
|
* @param string $constant Name of the constant that contains a value
|
||||||
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function getConstantValue($class, $constant)
|
public static function getConstantValue($class, $constant)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass($class);
|
$reflection = new ReflectionClass($class);
|
||||||
|
|
||||||
if (self::hasConstant($class, $constant)) {
|
if (self::hasConstant($class, $constant)) {
|
||||||
return $reflection->getConstant($constant);
|
return $reflection->getConstant($constant);
|
||||||
@@ -164,6 +175,7 @@ class Reflection
|
|||||||
* dot-separated, e.g. "invoice.user.email".
|
* 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
|
* @param bool $force (optional) If is set to true, try to retrieve value even if the object doesn't have
|
||||||
* property. Otherwise - not.
|
* property. Otherwise - not.
|
||||||
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function getPropertyValue($object, $property, $force = false)
|
public static function getPropertyValue($object, $property, $force = false)
|
||||||
@@ -185,19 +197,19 @@ class Reflection
|
|||||||
* Let's dig more and get proper value
|
* Let's dig more and get proper value
|
||||||
*
|
*
|
||||||
* Required to avoid bug:
|
* Required to avoid bug:
|
||||||
* \ReflectionObject::__construct() expects parameter 1 to be object, null given
|
* ReflectionObject::__construct() expects parameter 1 to be object, null given
|
||||||
* (...)
|
* (...)
|
||||||
* 4. at \ReflectionObject->__construct (null)
|
* 4. at ReflectionObject->__construct (null)
|
||||||
* 5. at Reflection ::getPropertyValue (null, 'name', true)
|
* 5. at Reflection ::getPropertyValue (null, 'name', true)
|
||||||
* 6. at ListService->getItemValue (object(Deal), 'project.name', '0')
|
* 6. at ListService->getItemValue (object(Deal), 'project.name', '0')
|
||||||
*
|
*
|
||||||
* while using "project.name" as property - $project has $name property ($project exists in the Deal class)
|
* while using "project.name" as property - $project has $name property ($project exists in the Deal class)
|
||||||
* and the $project equals null
|
* and the $project equals null
|
||||||
*
|
*
|
||||||
* Meritoo <github@meritoo.pl>
|
* Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* 2016-11-07
|
* 2016-11-07
|
||||||
*/
|
*/
|
||||||
if (null !== $object) {
|
if ($object !== null) {
|
||||||
unset($exploded[0]);
|
unset($exploded[0]);
|
||||||
|
|
||||||
$property = implode('.', $exploded);
|
$property = implode('.', $exploded);
|
||||||
@@ -212,58 +224,46 @@ class Reflection
|
|||||||
* Use \ReflectionObject class
|
* Use \ReflectionObject class
|
||||||
*/
|
*/
|
||||||
try {
|
try {
|
||||||
$reflectionProperty = new \ReflectionProperty($className, $property);
|
$reflectionProperty = new ReflectionProperty($className, $property);
|
||||||
$value = $reflectionProperty->getValue($object);
|
$value = $reflectionProperty->getValue($object);
|
||||||
} catch (\ReflectionException $exception) {
|
} catch (ReflectionException $exception) {
|
||||||
/*
|
/*
|
||||||
* 2nd try:
|
* 2nd try:
|
||||||
* Look for the get / has / is methods
|
* Look for the get / has / is methods
|
||||||
*/
|
*/
|
||||||
$class = new \ReflectionObject($object);
|
$class = new ReflectionObject($object);
|
||||||
$valueFound = false;
|
$valueFound = false;
|
||||||
|
|
||||||
if ($force || $class->hasProperty($property)) {
|
if ($class->hasProperty($property) || $force) {
|
||||||
$property = Inflector::classify($property);
|
$property = Inflector::classify($property);
|
||||||
|
|
||||||
$getterPrefixes = [
|
$methodPrefixes = [
|
||||||
'get',
|
'get',
|
||||||
'has',
|
'has',
|
||||||
'is',
|
'is',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($getterPrefixes as $prefix) {
|
foreach ($methodPrefixes as $prefix) {
|
||||||
$getterName = sprintf('%s%s', $prefix, $property);
|
$method = sprintf('%s%s', $prefix, $property);
|
||||||
|
|
||||||
if ($class->hasMethod($getterName)) {
|
if ($class->hasMethod($method)) {
|
||||||
$method = new \ReflectionMethod($object, $getterName);
|
$value = $object->{$method}();
|
||||||
|
|
||||||
/*
|
|
||||||
* 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}();
|
|
||||||
$valueFound = true;
|
$valueFound = true;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$valueFound && null !== $reflectionProperty) {
|
if (!$valueFound && $reflectionProperty !== null) {
|
||||||
/*
|
/*
|
||||||
* Oops, value of the property is still unknown
|
* Oops, we have got exception.
|
||||||
*
|
*
|
||||||
* 3rd try:
|
* 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);
|
$reflectionProperty->setAccessible(true);
|
||||||
$value = $reflectionProperty->getValue($object);
|
$value = $reflectionProperty->getValue($object);
|
||||||
$reflectionProperty->setAccessible(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -280,18 +280,11 @@ class Reflection
|
|||||||
* @param string $property Name of the property that contains a value
|
* @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
|
* @param bool $force (optional) If is set to true, try to retrieve value even if the
|
||||||
* object does not have property. Otherwise - not.
|
* object does not have property. Otherwise - not.
|
||||||
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function getPropertyValues($objects, $property, $force = false)
|
public static function getPropertyValues($objects, $property, $force = false)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* No objects?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($objects)) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($objects instanceof Collection) {
|
if ($objects instanceof Collection) {
|
||||||
$objects = $objects->toArray();
|
$objects = $objects->toArray();
|
||||||
}
|
}
|
||||||
@@ -302,7 +295,7 @@ class Reflection
|
|||||||
foreach ($objects as $entity) {
|
foreach ($objects as $entity) {
|
||||||
$value = self::getPropertyValue($entity, $property, $force);
|
$value = self::getPropertyValue($entity, $property, $force);
|
||||||
|
|
||||||
if (null !== $value) {
|
if ($value !== null) {
|
||||||
$values[] = $value;
|
$values[] = $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -311,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 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 -
|
* @param bool $withoutNamespace (optional) If is set to true, namespace is omitted. Otherwise -
|
||||||
* not, full name of class is returned, with namespace.
|
* not, full name of class is returned, with namespace.
|
||||||
|
*
|
||||||
* @return string|null
|
* @return string|null
|
||||||
*/
|
*/
|
||||||
public static function getClassName($source, $withoutNamespace = false)
|
public static function getClassName($source, $withoutNamespace = false)
|
||||||
@@ -362,7 +356,7 @@ class Reflection
|
|||||||
if ($withoutNamespace) {
|
if ($withoutNamespace) {
|
||||||
$classOnly = Miscellaneous::getLastElementOfString($name, '\\');
|
$classOnly = Miscellaneous::getLastElementOfString($name, '\\');
|
||||||
|
|
||||||
if (null !== $classOnly) {
|
if ($classOnly !== null) {
|
||||||
$name = $classOnly;
|
$name = $classOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,22 +367,23 @@ 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
|
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getClassNamespace($source)
|
public static function getClassNamespace($source)
|
||||||
{
|
{
|
||||||
$fullClassName = self::getClassName($source);
|
$fullClassName = self::getClassName($source);
|
||||||
|
|
||||||
if (null === $fullClassName || '' === $fullClassName) {
|
if (empty($fullClassName)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$className = self::getClassName($source, true);
|
$className = self::getClassName($source, true);
|
||||||
|
|
||||||
if ($className === $fullClassName) {
|
if ($className == $fullClassName) {
|
||||||
return $className;
|
return $className;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -396,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 array|object|string $source An array of objects, namespaces, object or namespace
|
||||||
* @param string $interface The interface that should be implemented
|
* @param string $interface The interface that should be implemented
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function isInterfaceImplemented($source, $interface)
|
public static function isInterfaceImplemented($source, $interface)
|
||||||
@@ -407,14 +403,15 @@ class Reflection
|
|||||||
$className = self::getClassName($source);
|
$className = self::getClassName($source);
|
||||||
$interfaces = class_implements($className);
|
$interfaces = class_implements($className);
|
||||||
|
|
||||||
return in_array($interface, $interfaces, true);
|
return in_array($interface, $interfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 $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.
|
* @param array|object|string $parentClass The parent class. An array of objects, namespaces, object or namespace.
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function isChildOfClass($childClass, $parentClass)
|
public static function isChildOfClass($childClass, $parentClass)
|
||||||
@@ -424,60 +421,48 @@ class Reflection
|
|||||||
|
|
||||||
$parents = class_parents($childClassName);
|
$parents = class_parents($childClassName);
|
||||||
|
|
||||||
if (is_array($parents) && 0 < count($parents)) {
|
if (is_array($parents)) {
|
||||||
return in_array($parentClassName, $parents, true);
|
return in_array($parentClassName, $parents);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns given object properties
|
* Returns given object properties.
|
||||||
*
|
*
|
||||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||||
* @param int $filter (optional) Filter of properties. Uses \ReflectionProperty class
|
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class constants.
|
||||||
* constants. By default all properties are returned.
|
* By default all properties are returned.
|
||||||
* @param bool $includeParents (optional) If is set to true, properties of parent classes are
|
*
|
||||||
* included (recursively). Otherwise - not.
|
* @return array|ReflectionProperty
|
||||||
* @return array|\ReflectionProperty
|
|
||||||
*/
|
*/
|
||||||
public static function getProperties($source, $filter = null, $includeParents = false)
|
public static function getProperties($source, $filter = null)
|
||||||
{
|
{
|
||||||
$className = self::getClassName($source);
|
$className = self::getClassName($source);
|
||||||
$reflection = new \ReflectionClass($className);
|
$reflection = new ReflectionClass($className);
|
||||||
|
|
||||||
if (null === $filter) {
|
if ($filter === null) {
|
||||||
$filter = \ReflectionProperty::IS_PRIVATE
|
$filter = ReflectionProperty::IS_PRIVATE
|
||||||
+ \ReflectionProperty::IS_PROTECTED
|
+ ReflectionProperty::IS_PROTECTED
|
||||||
+ \ReflectionProperty::IS_PUBLIC
|
+ ReflectionProperty::IS_PUBLIC
|
||||||
+ \ReflectionProperty::IS_STATIC;
|
+ ReflectionProperty::IS_STATIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
$properties = $reflection->getProperties($filter);
|
return $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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||||
* @return \ReflectionClass|bool
|
*
|
||||||
|
* @return ReflectionClass
|
||||||
*/
|
*/
|
||||||
public static function getParentClass($source)
|
public static function getParentClass($source)
|
||||||
{
|
{
|
||||||
$className = self::getClassName($source);
|
$className = self::getClassName($source);
|
||||||
$reflection = new \ReflectionClass($className);
|
$reflection = new ReflectionClass($className);
|
||||||
|
|
||||||
return $reflection->getParentClass();
|
return $reflection->getParentClass();
|
||||||
}
|
}
|
||||||
@@ -488,8 +473,10 @@ class Reflection
|
|||||||
*
|
*
|
||||||
* @param array|object|string $class Class who child classes should be returned. An array of objects, strings,
|
* @param array|object|string $class Class who child classes should be returned. An array of objects, strings,
|
||||||
* object or string.
|
* object or string.
|
||||||
* @throws CannotResolveClassNameException
|
*
|
||||||
* @return array|null
|
* @return array|null
|
||||||
|
*
|
||||||
|
* @throws CannotResolveClassNameException
|
||||||
*/
|
*/
|
||||||
public static function getChildClasses($class)
|
public static function getChildClasses($class)
|
||||||
{
|
{
|
||||||
@@ -508,8 +495,8 @@ class Reflection
|
|||||||
/*
|
/*
|
||||||
* Oops, cannot resolve class
|
* Oops, cannot resolve class
|
||||||
*/
|
*/
|
||||||
if (null === $className) {
|
if ($className === null) {
|
||||||
throw CannotResolveClassNameException::create($class);
|
throw new CannotResolveClassNameException($class);
|
||||||
}
|
}
|
||||||
|
|
||||||
$childClasses = [];
|
$childClasses = [];
|
||||||
@@ -526,7 +513,7 @@ class Reflection
|
|||||||
*/
|
*/
|
||||||
$realClass = ClassUtils::getRealClass($oneClass);
|
$realClass = ClassUtils::getRealClass($oneClass);
|
||||||
|
|
||||||
if (in_array($realClass, $childClasses, true)) {
|
if (in_array($realClass, $childClasses)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -543,9 +530,11 @@ class Reflection
|
|||||||
*
|
*
|
||||||
* @param array|object|string $parentClass Class who child class should be returned. An array of objects,
|
* @param array|object|string $parentClass Class who child class should be returned. An array of objects,
|
||||||
* namespaces, object or namespace.
|
* namespaces, object or namespace.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*
|
||||||
* @throws MissingChildClassesException
|
* @throws MissingChildClassesException
|
||||||
* @throws TooManyChildClassesException
|
* @throws TooManyChildClassesException
|
||||||
* @return mixed
|
|
||||||
*/
|
*/
|
||||||
public static function getOneChildClass($parentClass)
|
public static function getOneChildClass($parentClass)
|
||||||
{
|
{
|
||||||
@@ -556,7 +545,7 @@ class Reflection
|
|||||||
* Oops, the base / parent class hasn't child class
|
* Oops, the base / parent class hasn't child class
|
||||||
*/
|
*/
|
||||||
if (empty($childClasses)) {
|
if (empty($childClasses)) {
|
||||||
throw MissingChildClassesException::create($parentClass);
|
throw new MissingChildClassesException($parentClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -564,20 +553,21 @@ class Reflection
|
|||||||
* Oops, the base / parent class has too many child classes
|
* Oops, the base / parent class has too many child classes
|
||||||
*/
|
*/
|
||||||
if (count($childClasses) > 1) {
|
if (count($childClasses) > 1) {
|
||||||
throw TooManyChildClassesException::create($parentClass, $childClasses);
|
throw new TooManyChildClassesException($parentClass, $childClasses);
|
||||||
}
|
}
|
||||||
|
|
||||||
return trim($childClasses[0]);
|
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 array|object|string $class An array of objects, namespaces, object or namespace
|
||||||
* @param string $property Name of the property
|
* @param string $property Name of the property
|
||||||
* @param int $filter (optional) Filter of properties. Uses \ReflectionProperty class constants.
|
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class constants.
|
||||||
* By default all properties are allowed / processed.
|
* By default all properties are allowed / processed.
|
||||||
* @return null|\ReflectionProperty
|
*
|
||||||
|
* @return null|ReflectionProperty
|
||||||
*/
|
*/
|
||||||
public static function getProperty($class, $property, $filter = null)
|
public static function getProperty($class, $property, $filter = null)
|
||||||
{
|
{
|
||||||
@@ -585,9 +575,9 @@ class Reflection
|
|||||||
$properties = self::getProperties($className, $filter);
|
$properties = self::getProperties($className, $filter);
|
||||||
|
|
||||||
if (!empty($properties)) {
|
if (!empty($properties)) {
|
||||||
/* @var $reflectionProperty \ReflectionProperty */
|
/* @var $reflectionProperty ReflectionProperty */
|
||||||
foreach ($properties as $reflectionProperty) {
|
foreach ($properties as $reflectionProperty) {
|
||||||
if ($reflectionProperty->getName() === $property) {
|
if ($reflectionProperty->getName() == $property) {
|
||||||
return $reflectionProperty;
|
return $reflectionProperty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -597,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|object|string $class An array of objects, namespaces, object or namespace
|
||||||
* @param array|string $trait An array of strings or string
|
* @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
|
* @param bool $verifyParents If is set to true, parent classes are verified if they use given
|
||||||
* trait. Otherwise - not.
|
* trait. Otherwise - not.
|
||||||
* @throws CannotResolveClassNameException
|
*
|
||||||
* @return bool|null
|
* @return bool|null
|
||||||
|
*
|
||||||
|
* @throws CannotResolveClassNameException
|
||||||
*/
|
*/
|
||||||
public static function usesTrait($class, $trait, $verifyParents = false)
|
public static function usesTrait($class, $trait, $verifyParents = false)
|
||||||
{
|
{
|
||||||
@@ -614,26 +606,26 @@ class Reflection
|
|||||||
/*
|
/*
|
||||||
* Oops, cannot resolve class
|
* Oops, cannot resolve class
|
||||||
*/
|
*/
|
||||||
if (null === $className || '' === $className) {
|
if (empty($className)) {
|
||||||
throw CannotResolveClassNameException::create($class);
|
throw new CannotResolveClassNameException($class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Oops, cannot resolve trait
|
* Oops, cannot resolve trait
|
||||||
*/
|
*/
|
||||||
if (null === $traitName || '' === $traitName) {
|
if (empty($traitName)) {
|
||||||
throw new CannotResolveClassNameException($class, false);
|
throw new CannotResolveClassNameException($class, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
$reflection = new \ReflectionClass($className);
|
$reflection = new ReflectionClass($className);
|
||||||
$traitsNames = $reflection->getTraitNames();
|
$traitsNames = $reflection->getTraitNames();
|
||||||
|
|
||||||
$uses = in_array($traitName, $traitsNames, true);
|
$uses = in_array($traitName, $traitsNames);
|
||||||
|
|
||||||
if (!$uses && $verifyParents) {
|
if (!$uses && $verifyParents) {
|
||||||
$parentClassName = self::getParentClassName($className);
|
$parentClassName = self::getParentClassName($className);
|
||||||
|
|
||||||
if (null !== $parentClassName) {
|
if ($parentClassName !== null) {
|
||||||
return self::usesTrait($parentClassName, $trait, true);
|
return self::usesTrait($parentClassName, $trait, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -646,71 +638,19 @@ class Reflection
|
|||||||
* If given class does not extend another, returns null.
|
* If given class does not extend another, returns null.
|
||||||
*
|
*
|
||||||
* @param array|object|string $class An array of objects, namespaces, object or namespace
|
* @param array|object|string $class An array of objects, namespaces, object or namespace
|
||||||
|
*
|
||||||
* @return string|null
|
* @return string|null
|
||||||
*/
|
*/
|
||||||
public static function getParentClassName($class)
|
public static function getParentClassName($class)
|
||||||
{
|
{
|
||||||
$className = self::getClassName($class);
|
$className = self::getClassName($class);
|
||||||
$reflection = new \ReflectionClass($className);
|
$reflection = new ReflectionClass($className);
|
||||||
$parentClass = $reflection->getParentClass();
|
$parentClass = $reflection->getParentClass();
|
||||||
|
|
||||||
if (null === $parentClass || false === $parentClass) {
|
if ($parentClass === null || $parentClass === false) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $parentClass->getName();
|
return $parentClass->getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets value of given property in given object
|
|
||||||
*
|
|
||||||
* @param mixed $object Object that should contains given property
|
|
||||||
* @param string $property Name of the property
|
|
||||||
* @param mixed $value Value of the property
|
|
||||||
* @throws NotExistingPropertyException
|
|
||||||
*/
|
|
||||||
public static function setPropertyValue($object, $property, $value)
|
|
||||||
{
|
|
||||||
$reflectionProperty = self::getProperty($object, $property);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Oops, property does not exist
|
|
||||||
*/
|
|
||||||
if (null === $reflectionProperty) {
|
|
||||||
throw NotExistingPropertyException::create($object, $property);
|
|
||||||
}
|
|
||||||
|
|
||||||
$notAccessible = $reflectionProperty->isPrivate() || $reflectionProperty->isProtected();
|
|
||||||
|
|
||||||
if ($notAccessible) {
|
|
||||||
$reflectionProperty->setAccessible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
$reflectionProperty->setValue($object, $value);
|
|
||||||
|
|
||||||
if ($notAccessible) {
|
|
||||||
$reflectionProperty->setAccessible(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets values of properties in given object
|
|
||||||
*
|
|
||||||
* @param mixed $object Object that should contains given property
|
|
||||||
* @param array $propertiesValues Key-value pairs, where key - name of the property, value - value of the property
|
|
||||||
*/
|
|
||||||
public static function setPropertiesValues($object, array $propertiesValues)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* No properties?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($propertiesValues)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($propertiesValues as $property => $value) {
|
|
||||||
static::setPropertyValue($object, $property, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
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;
|
namespace Meritoo\Common\Utilities;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful uri methods (only static functions)
|
* Useful uri methods (only static functions).
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class Uri
|
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
|
* @param bool $withoutHost (optional) If is set to true, means that host / server name is omitted
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getFullUri($withoutHost = false)
|
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) {
|
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.
|
* @param bool $withProtocol (optional) If is set to true, protocol name is included. Otherwise isn't.
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getServerNameOrIp($withProtocol = false)
|
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) {
|
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
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getProtocolName()
|
public static function getProtocolName()
|
||||||
{
|
{
|
||||||
|
$effect = '';
|
||||||
|
|
||||||
$matches = [];
|
$matches = [];
|
||||||
$protocolData = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'SERVER_PROTOCOL'); // e.g. HTTP/1.1
|
$protocolData = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'SERVER_PROTOCOL'); // e.g. HTTP/1.1
|
||||||
$matchCount = preg_match('|(.+)\/(.+)|', $protocolData, $matches);
|
$matchCount = preg_match('|(.+)\/(.+)|', $protocolData, $matches);
|
||||||
@@ -90,28 +70,31 @@ class Uri
|
|||||||
* $matches[2] - protocol version, e.g. 1.1
|
* $matches[2] - protocol version, e.g. 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
if ($matchCount > 0) {
|
||||||
* Oops, cannot match protocol
|
$effect = strtolower($matches[1]);
|
||||||
*/
|
|
||||||
if (0 === $matchCount) {
|
|
||||||
return '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return strtolower($matches[1]);
|
return $effect;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns http referer uri
|
* Returns http referer uri.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getRefererUri()
|
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
|
* @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 -
|
* @param bool $withVersion (optional) If is set to true, version of the browser is returned too. Otherwise -
|
||||||
* name only.
|
* name only.
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getUserWebBrowserName($withVersion = false)
|
public static function getUserWebBrowserName($withVersion = false)
|
||||||
@@ -133,9 +117,9 @@ class Uri
|
|||||||
|
|
||||||
$knownBrowsers = [
|
$knownBrowsers = [
|
||||||
'Firefox/([\d\.]+)$' => 'Mozilla Firefox',
|
'Firefox/([\d\.]+)$' => 'Mozilla Firefox',
|
||||||
'OPR/([\d\.]+)$' => 'Opera',
|
'OPR/([\d\.]+)$' => 'Opera',
|
||||||
'Chrome/([\d\.]+)$' => 'Google Chrome',
|
'Chrome/([\d\.]+)$' => 'Google Chrome',
|
||||||
'Safari/([\d\.]+)$' => 'Apple Safari',
|
'Safari/([\d\.]+)$' => 'Apple Safari',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($knownBrowsers as $pattern => $browserName) {
|
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
|
* @return string
|
||||||
*
|
*
|
||||||
@@ -183,7 +167,7 @@ class Uri
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns name of user's operating system
|
* Returns name of user's operating system.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -193,8 +177,8 @@ class Uri
|
|||||||
|
|
||||||
$knownSystems = [
|
$knownSystems = [
|
||||||
'Linux' => 'Linux',
|
'Linux' => 'Linux',
|
||||||
'Win' => 'Windows',
|
'Win' => 'Windows',
|
||||||
'Mac' => 'Mac OS',
|
'Mac' => 'Mac OS',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($knownSystems as $pattern => $systemName) {
|
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
|
* @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
|
* @param string $url The url to check
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function isExternalUrl($url)
|
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);
|
$currentUrl = self::getServerNameOrIp(true);
|
||||||
$url = self::replenishProtocol($url);
|
$url = self::replenishProtocol($url);
|
||||||
|
|
||||||
/*
|
return !Regex::contains($currentUrl, $url);
|
||||||
* Let's prepare pattern of current url
|
|
||||||
*/
|
|
||||||
$search = [
|
|
||||||
':',
|
|
||||||
'/',
|
|
||||||
'.',
|
|
||||||
];
|
|
||||||
|
|
||||||
$replace = [
|
|
||||||
'\:',
|
|
||||||
'\/',
|
|
||||||
'\.',
|
|
||||||
];
|
|
||||||
|
|
||||||
$currentUrlPattern = str_replace($search, $replace, $currentUrl);
|
|
||||||
|
|
||||||
return !Regex::contains($url, $currentUrlPattern);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replenishes protocol in the given url
|
* Replenishes protocol in the given url.
|
||||||
*
|
*
|
||||||
* @param string $url The url to check and replenish
|
* @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
|
* @param string $protocol (optional) The protocol which is replenished. If is empty, protocol of current request
|
||||||
* is used.
|
* is used.
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function replenishProtocol($url, $protocol = '')
|
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 $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 $user (optional) User name used to log in
|
||||||
* @param string $password (optional) User password used to log in
|
* @param string $password (optional) User password used to log in
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getSecuredUrl($url, $user = '', $password = '')
|
public static function getSecuredUrl($url, $user = '', $password = '')
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* Url is not provided?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($url)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$protocol = self::getProtocolName();
|
$protocol = self::getProtocolName();
|
||||||
$host = self::getServerNameOrIp();
|
$host = self::getServerNameOrIp();
|
||||||
|
|
||||||
@@ -332,7 +286,7 @@ class Uri
|
|||||||
$url = sprintf('/%s', $url);
|
$url = sprintf('/%s', $url);
|
||||||
}
|
}
|
||||||
|
|
||||||
$url = $host . $url;
|
$url = $host.$url;
|
||||||
|
|
||||||
if (!empty($user) && !empty($password)) {
|
if (!empty($user) && !empty($password)) {
|
||||||
$url = sprintf('%s:%s@%s', $user, $password, $url);
|
$url = sprintf('%s:%s@%s', $user, $password, $url);
|
||||||
@@ -347,13 +301,14 @@ class Uri
|
|||||||
*
|
*
|
||||||
* @param string $url Url string
|
* @param string $url Url string
|
||||||
* @param string $protocol (optional) Protocol string
|
* @param string $protocol (optional) Protocol string
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function addProtocolToUrl($url, $protocol = 'http')
|
public static function addProtocolToUrl($url, $protocol = 'http')
|
||||||
{
|
{
|
||||||
$pattern = sprintf('/^%s.*/', $protocol);
|
$pattern = sprintf('/^%s.*/', $protocol);
|
||||||
|
|
||||||
if ((bool)preg_match($pattern, $url)) {
|
if ((bool) preg_match($pattern, $url)) {
|
||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13,10 +13,10 @@ use DOMXPath;
|
|||||||
use SimpleXMLElement;
|
use SimpleXMLElement;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful XML-related methods (only static functions)
|
* Useful XML-related methods (only static functions).
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo.pl
|
||||||
*/
|
*/
|
||||||
class Xml
|
class Xml
|
||||||
{
|
{
|
||||||
@@ -26,6 +26,7 @@ class Xml
|
|||||||
*
|
*
|
||||||
* @param SimpleXMLElement $element1 First element to merge
|
* @param SimpleXMLElement $element1 First element to merge
|
||||||
* @param SimpleXMLElement $element2 Second element to merge
|
* @param SimpleXMLElement $element2 Second element to merge
|
||||||
|
*
|
||||||
* @return SimpleXMLElement
|
* @return SimpleXMLElement
|
||||||
*/
|
*/
|
||||||
public static function mergeNodes(SimpleXMLElement $element1, SimpleXMLElement $element2)
|
public static function mergeNodes(SimpleXMLElement $element1, SimpleXMLElement $element2)
|
||||||
@@ -40,7 +41,7 @@ class Xml
|
|||||||
$query = $path->query('/*/*');
|
$query = $path->query('/*/*');
|
||||||
$nodesCount = $query->length;
|
$nodesCount = $query->length;
|
||||||
|
|
||||||
if (0 === $nodesCount) {
|
if ($nodesCount == 0) {
|
||||||
return $element1;
|
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,67 +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\Traits\Collection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trait for the Collection required by ArrayAccess interface
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
trait ArrayAccessTrait
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function offsetExists($offset)
|
|
||||||
{
|
|
||||||
return $this->exists($offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function offsetGet($offset)
|
|
||||||
{
|
|
||||||
if ($this->exists($offset)) {
|
|
||||||
return $this->elements[$offset];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function offsetSet($offset, $value)
|
|
||||||
{
|
|
||||||
$this->elements[$offset] = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function offsetUnset($offset)
|
|
||||||
{
|
|
||||||
if ($this->exists($offset)) {
|
|
||||||
unset($this->elements[$offset]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns information if element with given index/key exists
|
|
||||||
*
|
|
||||||
* @param string|int $index The index/key of element
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
private function exists($index)
|
|
||||||
{
|
|
||||||
return isset($this->elements[$index]) || array_key_exists($index, $this->elements);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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\Traits\Collection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trait for the Collection required by Countable interface
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
trait CountableTrait
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function count()
|
|
||||||
{
|
|
||||||
return count($this->elements);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +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\Traits\Collection;
|
|
||||||
|
|
||||||
use ArrayIterator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trait for the Collection required by IteratorAggregate interface
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
trait IteratorAggregateTrait
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function getIterator()
|
|
||||||
{
|
|
||||||
return new ArrayIterator($this->elements);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +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\Traits;
|
|
||||||
|
|
||||||
use Meritoo\Common\Traits\Collection\ArrayAccessTrait;
|
|
||||||
use Meritoo\Common\Traits\Collection\CountableTrait;
|
|
||||||
use Meritoo\Common\Traits\Collection\IteratorAggregateTrait;
|
|
||||||
use Meritoo\Common\Traits\Collection\MainTrait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trait for the Collection
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
trait CollectionTrait
|
|
||||||
{
|
|
||||||
use MainTrait;
|
|
||||||
use CountableTrait;
|
|
||||||
use ArrayAccessTrait;
|
|
||||||
use IteratorAggregateTrait;
|
|
||||||
}
|
|
||||||
@@ -1,110 +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\Traits\CssSelector;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Useful methods related to CSS selectors of form
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
trait FormCssSelector
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Returns selector of form based on its name
|
|
||||||
*
|
|
||||||
* @param string $formName Name of form (value of the "name" attribute)
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getFormByNameSelector($formName)
|
|
||||||
{
|
|
||||||
$formName = trim($formName);
|
|
||||||
|
|
||||||
if (empty($formName)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('form[name="%s"]', $formName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns selector of the input field based on its name
|
|
||||||
*
|
|
||||||
* @param string $formName Name of form (value of the "name" attribute)
|
|
||||||
* @param string $fieldName Name of field (value of the "name" attribute)
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getInputByNameSelector($formName, $fieldName)
|
|
||||||
{
|
|
||||||
$formSelector = static::getFormByNameSelector($formName);
|
|
||||||
$fieldName = trim($fieldName);
|
|
||||||
|
|
||||||
if (empty($formSelector) || empty($fieldName)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('%s input[name="%s"]', $formSelector, $fieldName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns selector of the input field based on its ID
|
|
||||||
*
|
|
||||||
* @param string $formName Name of form (value of the "name" attribute)
|
|
||||||
* @param string $fieldId ID of field (value of the "id" attribute)
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getInputByIdSelector($formName, $fieldId)
|
|
||||||
{
|
|
||||||
$formSelector = static::getFormByNameSelector($formName);
|
|
||||||
$fieldId = trim($fieldId);
|
|
||||||
|
|
||||||
if (empty($formSelector) || empty($fieldId)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('%s input#%s', $formSelector, $fieldId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns selector of label
|
|
||||||
*
|
|
||||||
* @param string $formName Name of form (value of the "name" attribute)
|
|
||||||
* @param string $fieldId ID of field (value of the "id" attribute)
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getLabelSelector($formName, $fieldId)
|
|
||||||
{
|
|
||||||
$formSelector = static::getFormByNameSelector($formName);
|
|
||||||
$fieldId = trim($fieldId);
|
|
||||||
|
|
||||||
if (empty($formSelector) || empty($fieldId)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('%s label[for="%s"]', $formSelector, $fieldId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns selector of field-set using index/position of the field-set
|
|
||||||
*
|
|
||||||
* @param string $formName Name of form (value of the "name" attribute)
|
|
||||||
* @param int $fieldSetIndex Index/Position of the field-set
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getFieldSetByIndexSelector($formName, $fieldSetIndex)
|
|
||||||
{
|
|
||||||
$formSelector = static::getFormByNameSelector($formName);
|
|
||||||
|
|
||||||
if (empty($formSelector) || 0 > $fieldSetIndex) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('%s fieldset:nth-of-type(%d)', $formSelector, $fieldSetIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,137 +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\Traits\ValueObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Methods and properties related to human
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
trait HumanTrait
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* First name
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $firstName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Last name
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $lastName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Email address
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $email;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Birth date
|
|
||||||
*
|
|
||||||
* @var \DateTime
|
|
||||||
*/
|
|
||||||
protected $birthDate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class constructor
|
|
||||||
*
|
|
||||||
* @param string $firstName First name
|
|
||||||
* @param string $lastName Last name
|
|
||||||
* @param string $email (optional) Email address
|
|
||||||
* @param \DateTime $birthDate (optional) Birth date
|
|
||||||
*/
|
|
||||||
public function __construct($firstName, $lastName, $email = null, \DateTime $birthDate = null)
|
|
||||||
{
|
|
||||||
$this->firstName = $firstName;
|
|
||||||
$this->lastName = $lastName;
|
|
||||||
$this->email = $email;
|
|
||||||
$this->birthDate = $birthDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns representation of object as string
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
$template = '%s';
|
|
||||||
|
|
||||||
if ('' !== $this->email && null !== $this->email) {
|
|
||||||
$template .= ' <%s>';
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf($template, $this->getFullName(), $this->email);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns first name
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getFirstName()
|
|
||||||
{
|
|
||||||
return $this->firstName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns last name
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getLastName()
|
|
||||||
{
|
|
||||||
return $this->lastName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns email address
|
|
||||||
*
|
|
||||||
* @return string|null
|
|
||||||
*/
|
|
||||||
public function getEmail()
|
|
||||||
{
|
|
||||||
return $this->email;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns birth date
|
|
||||||
*
|
|
||||||
* @return \DateTime|null
|
|
||||||
*/
|
|
||||||
public function getBirthDate()
|
|
||||||
{
|
|
||||||
return $this->birthDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the full name
|
|
||||||
*
|
|
||||||
* @param bool $firstNameFirst (optional) If is set to true, first name is the first part. Otherwise - last name.
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getFullName($firstNameFirst = true)
|
|
||||||
{
|
|
||||||
$beginning = $this->lastName;
|
|
||||||
$finish = $this->firstName;
|
|
||||||
|
|
||||||
if ($firstNameFirst) {
|
|
||||||
$beginning = $this->firstName;
|
|
||||||
$finish = $this->lastName;
|
|
||||||
}
|
|
||||||
|
|
||||||
return trim(sprintf('%s %s', $beginning, $finish));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,85 +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 related to CSS selectors and the Bootstrap4 (front-end component library)
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class Bootstrap4CssSelector
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Returns selector of container with field's validation error
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getFieldErrorContainerSelector()
|
|
||||||
{
|
|
||||||
return '.invalid-feedback .form-error-message';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns selector of field's validation error
|
|
||||||
*
|
|
||||||
* @param string $formName Name of form (value of the "name" attribute)
|
|
||||||
* @param string $fieldId ID of field (value of the "id" attribute)
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getFieldErrorSelector($formName, $fieldId)
|
|
||||||
{
|
|
||||||
$labelSelector = CssSelector::getLabelSelector($formName, $fieldId);
|
|
||||||
|
|
||||||
if (empty($labelSelector)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$errorContainerSelector = static::getFieldErrorContainerSelector();
|
|
||||||
|
|
||||||
return sprintf('%s %s', $labelSelector, $errorContainerSelector);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns selector of radio-button's validation error
|
|
||||||
*
|
|
||||||
* @param string $formName Name of form (value of the "name" attribute)
|
|
||||||
* @param int $fieldSetIndex Index/Position of the field-set
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getRadioButtonErrorSelector($formName, $fieldSetIndex)
|
|
||||||
{
|
|
||||||
$fieldSetSelector = CssSelector::getFieldSetByIndexSelector($formName, $fieldSetIndex);
|
|
||||||
|
|
||||||
if (empty($fieldSetSelector)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$errorContainerSelector = static::getFieldErrorContainerSelector();
|
|
||||||
|
|
||||||
return sprintf('%s legend.col-form-label %s', $fieldSetSelector, $errorContainerSelector);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns selector of field's group
|
|
||||||
*
|
|
||||||
* @param string $formName Name of form (value of the "name" attribute)
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getFieldGroupSelector($formName)
|
|
||||||
{
|
|
||||||
$formSelector = CssSelector::getFormByNameSelector($formName);
|
|
||||||
|
|
||||||
if (empty($formSelector)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('%s .form-group', $formSelector);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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,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\Utilities;
|
|
||||||
|
|
||||||
use Meritoo\Common\Traits\CssSelector\FormCssSelector;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Useful methods related to CSS selectors
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class CssSelector
|
|
||||||
{
|
|
||||||
use FormCssSelector;
|
|
||||||
}
|
|
||||||
@@ -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, true)) {
|
|
||||||
$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, true)) {
|
|
||||||
return (bool)preg_match('|^image/.+$|', $mimeType);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,238 +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';
|
|
||||||
$queryBuilder = $repository->createQueryBuilder($alias);
|
|
||||||
|
|
||||||
if (empty($property)) {
|
|
||||||
return $queryBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $queryBuilder->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,159 +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\ValueObject;
|
|
||||||
|
|
||||||
use Meritoo\Common\Utilities\Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Address
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class Address
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The street
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $street;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The number of building
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $buildingNumber;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The number of flat
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $flatNumber;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The zip code
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $zipCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The city, location
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $city;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class constructor
|
|
||||||
*
|
|
||||||
* @param string $city City, location
|
|
||||||
* @param string $zipCode The zip code
|
|
||||||
* @param string $street The street
|
|
||||||
* @param string $buildingNumber The number of building
|
|
||||||
* @param string $flatNumber (optional) The number of flat. Default: "".
|
|
||||||
*/
|
|
||||||
public function __construct($city, $zipCode, $street, $buildingNumber, $flatNumber = '')
|
|
||||||
{
|
|
||||||
$this->city = $city;
|
|
||||||
$this->zipCode = $zipCode;
|
|
||||||
$this->street = $street;
|
|
||||||
$this->buildingNumber = $buildingNumber;
|
|
||||||
$this->flatNumber = $flatNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns representation of object as string
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
$values = [
|
|
||||||
$this->getFullStreet(),
|
|
||||||
$this->zipCode,
|
|
||||||
$this->city,
|
|
||||||
];
|
|
||||||
|
|
||||||
return Arrays::getNonEmptyValuesAsString($values);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns street
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getStreet()
|
|
||||||
{
|
|
||||||
return $this->street;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns full street (name + building & flat number)
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getFullStreet()
|
|
||||||
{
|
|
||||||
if (empty($this->street)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$numbers = $this->buildingNumber;
|
|
||||||
|
|
||||||
if (!empty($numbers) && !empty($this->flatNumber)) {
|
|
||||||
$numbers = sprintf('%s/%s', $numbers, $this->flatNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('%s %s', $this->street, $numbers);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns number of building
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getBuildingNumber()
|
|
||||||
{
|
|
||||||
return $this->buildingNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns number of flat
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getFlatNumber()
|
|
||||||
{
|
|
||||||
return $this->flatNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns zip code
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getZipCode()
|
|
||||||
{
|
|
||||||
return $this->zipCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns city, location
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getCity()
|
|
||||||
{
|
|
||||||
return $this->city;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,81 +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\ValueObject;
|
|
||||||
|
|
||||||
use Meritoo\Common\Utilities\Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bank account
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class BankAccount
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Name of bank
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $bankName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Number of bank's account
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $accountNumber;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class constructor
|
|
||||||
*
|
|
||||||
* @param string $bankName Name of bank
|
|
||||||
* @param string $accountNumber Number of bank's account
|
|
||||||
*/
|
|
||||||
public function __construct($bankName, $accountNumber)
|
|
||||||
{
|
|
||||||
$this->bankName = $bankName;
|
|
||||||
$this->accountNumber = $accountNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns representation of object as string
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
$values = [
|
|
||||||
$this->bankName,
|
|
||||||
$this->accountNumber,
|
|
||||||
];
|
|
||||||
|
|
||||||
return Arrays::getNonEmptyValuesAsString($values);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns name of bank
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getBankName()
|
|
||||||
{
|
|
||||||
return $this->bankName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns number of bank's account
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getAccountNumber()
|
|
||||||
{
|
|
||||||
return $this->accountNumber;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,101 +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\ValueObject;
|
|
||||||
|
|
||||||
use Meritoo\Common\Utilities\Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Company
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class Company
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Name of company
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Address of company
|
|
||||||
*
|
|
||||||
* @var Address
|
|
||||||
*/
|
|
||||||
protected $address;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bank account of company
|
|
||||||
*
|
|
||||||
* @var BankAccount
|
|
||||||
*/
|
|
||||||
protected $bankAccount;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class constructor
|
|
||||||
*
|
|
||||||
* @param string $name Name of company
|
|
||||||
* @param Address $address Address of company
|
|
||||||
* @param BankAccount|null $bankAccount (optional) Bank account of company
|
|
||||||
*/
|
|
||||||
public function __construct($name, Address $address, BankAccount $bankAccount = null)
|
|
||||||
{
|
|
||||||
$this->name = $name;
|
|
||||||
$this->address = $address;
|
|
||||||
$this->bankAccount = $bankAccount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns representation of object as string
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
$values = [
|
|
||||||
$this->name,
|
|
||||||
$this->address,
|
|
||||||
$this->bankAccount,
|
|
||||||
];
|
|
||||||
|
|
||||||
return Arrays::getNonEmptyValuesAsString($values);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns name of company
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return $this->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns address of company
|
|
||||||
*
|
|
||||||
* @return Address
|
|
||||||
*/
|
|
||||||
public function getAddress()
|
|
||||||
{
|
|
||||||
return $this->address;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns bank account of company
|
|
||||||
*
|
|
||||||
* @return BankAccount|null
|
|
||||||
*/
|
|
||||||
public function getBankAccount()
|
|
||||||
{
|
|
||||||
return $this->bankAccount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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\ValueObject;
|
|
||||||
|
|
||||||
use Meritoo\Common\Traits\ValueObject\HumanTrait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Human
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class Human
|
|
||||||
{
|
|
||||||
use HumanTrait;
|
|
||||||
}
|
|
||||||
@@ -1,245 +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\ValueObject;
|
|
||||||
|
|
||||||
use Meritoo\Common\Exception\ValueObject\InvalidSizeDimensionsException;
|
|
||||||
use Meritoo\Common\Utilities\Regex;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Size, e.g. of image
|
|
||||||
*
|
|
||||||
* Instance of this class may be created using static methods:
|
|
||||||
* - fromString()
|
|
||||||
* - fromArray()
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class Size
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The width
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
protected $width;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The height
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
protected $height;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unit used when width or height should be returned with unit
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $unit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Separator used when converting to string
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $separator = ' x ';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class constructor
|
|
||||||
*
|
|
||||||
* @param int $width (optional) The width
|
|
||||||
* @param int $height (optional) The height
|
|
||||||
* @param string $unit (optional) Unit used when width or height should be returned with unit. Default: "px".
|
|
||||||
*
|
|
||||||
* @throws InvalidSizeDimensionsException
|
|
||||||
*/
|
|
||||||
private function __construct($width = null, $height = null, $unit = 'px')
|
|
||||||
{
|
|
||||||
$width = (int)$width;
|
|
||||||
$height = (int)$height;
|
|
||||||
|
|
||||||
if ($width < 0 || $height < 0) {
|
|
||||||
throw new InvalidSizeDimensionsException($width, $height);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this
|
|
||||||
->setWidth($width)
|
|
||||||
->setHeight($height)
|
|
||||||
;
|
|
||||||
|
|
||||||
$this->unit = $unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns string representation of instance of this class in human readable format, e.g. '200 x 100'
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return $this->toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets separator used when converting to string
|
|
||||||
*
|
|
||||||
* @param string $separator The separator
|
|
||||||
* @return Size
|
|
||||||
*/
|
|
||||||
public function setSeparator($separator)
|
|
||||||
{
|
|
||||||
$this->separator = $separator;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the width
|
|
||||||
*
|
|
||||||
* @param bool $withUnit (optional) If is set to true, width is returned with unit ("px"). Otherwise - without
|
|
||||||
* (default behaviour).
|
|
||||||
* @return int|string
|
|
||||||
*/
|
|
||||||
public function getWidth($withUnit = false)
|
|
||||||
{
|
|
||||||
if ($withUnit) {
|
|
||||||
return sprintf('%d %s', $this->width, $this->unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->width;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the width
|
|
||||||
*
|
|
||||||
* @param int|string $width The width
|
|
||||||
* @return Size
|
|
||||||
*/
|
|
||||||
public function setWidth($width)
|
|
||||||
{
|
|
||||||
$this->width = (int)$width;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the height
|
|
||||||
*
|
|
||||||
* @param bool $withUnit (optional) If is set to true, height is returned with unit ("px"). Otherwise - without
|
|
||||||
* (default behaviour).
|
|
||||||
* @return int|string
|
|
||||||
*/
|
|
||||||
public function getHeight($withUnit = false)
|
|
||||||
{
|
|
||||||
if ($withUnit) {
|
|
||||||
return sprintf('%d %s', $this->height, $this->unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the height
|
|
||||||
*
|
|
||||||
* @param int $height The height
|
|
||||||
* @return Size
|
|
||||||
*/
|
|
||||||
public function setHeight($height)
|
|
||||||
{
|
|
||||||
$this->height = (int)$height;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns string representation of instance of this class, e.g. '200 x 100' or '200x100'
|
|
||||||
*
|
|
||||||
* @param bool $withUnit (optional) If is set to true, width and height are returned with unit ("px"). Otherwise
|
|
||||||
* - without (default behaviour).
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function toString($withUnit = false)
|
|
||||||
{
|
|
||||||
$width = $this->getWidth($withUnit);
|
|
||||||
$height = $this->getHeight($withUnit);
|
|
||||||
|
|
||||||
return sprintf('%s%s%s', $width, $this->separator, $height);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns instance of this class as an array.
|
|
||||||
* Values of the array are width and height, eg. [800, 600] or ['800px', '600px'].
|
|
||||||
*
|
|
||||||
* @param bool $withUnits (optional) If is set to true, width and height are returned with unit ("px"). Otherwise
|
|
||||||
* - without (default behaviour).
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function toArray($withUnits = false)
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
$this->getWidth($withUnits),
|
|
||||||
$this->getHeight($withUnits),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates new instance from given string
|
|
||||||
*
|
|
||||||
* @param string $size The size represented as string (width and height separated by given separator)
|
|
||||||
* @param string $unit (optional) Unit used when width or height should be returned with unit. Default: "px".
|
|
||||||
* @param string $separator (optional) Separator used to split width and height. Default: " x ".
|
|
||||||
* @return Size|null
|
|
||||||
*/
|
|
||||||
public static function fromString($size, $unit = 'px', $separator = ' x ')
|
|
||||||
{
|
|
||||||
if (is_string($size)) {
|
|
||||||
$matches = [];
|
|
||||||
$pattern = Regex::getSizePattern($separator);
|
|
||||||
|
|
||||||
if ((bool)preg_match($pattern, $size, $matches)) {
|
|
||||||
$width = (int)$matches[1];
|
|
||||||
$height = (int)$matches[2];
|
|
||||||
$sizeObject = new self($width, $height, $unit);
|
|
||||||
|
|
||||||
return $sizeObject->setSeparator($separator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates new instance from given array
|
|
||||||
*
|
|
||||||
* The array should contain 2 elements: width and height.
|
|
||||||
* Examples: ['800', '600'], [800, 600].
|
|
||||||
*
|
|
||||||
* @param array $array The size represented as array
|
|
||||||
* @param string $unit (optional) Unit used when width or height should be returned with unit. Default: "px".
|
|
||||||
* @return Size|null
|
|
||||||
*/
|
|
||||||
public static function fromArray(array $array, $unit = 'px')
|
|
||||||
{
|
|
||||||
// Requirements for given array:
|
|
||||||
// - indexes "0" and "1"
|
|
||||||
// - should contains exactly 2 elements
|
|
||||||
if (
|
|
||||||
array_key_exists(0, $array)
|
|
||||||
&& array_key_exists(1, $array)
|
|
||||||
&& 2 === count($array)
|
|
||||||
) {
|
|
||||||
list($width, $height) = $array;
|
|
||||||
|
|
||||||
return new self($width, $height, $unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,179 +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\ValueObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Version of software
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class Version
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The "major" part.
|
|
||||||
* Incremented when you make incompatible API changes.
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
protected $majorPart;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "minor" part.
|
|
||||||
* Incremented when you add functionality in a backwards-compatible manner.
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
protected $minorPart;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "patch" part.
|
|
||||||
* Incremented when you make backwards-compatible bug fixes.
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
protected $patchPart;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class constructor
|
|
||||||
*
|
|
||||||
* @param int $majorPart The "major" part. Incremented when you make incompatible API changes.
|
|
||||||
* @param int $minorPart The "minor" part. Incremented when you add functionality in a backwards-compatible manner.
|
|
||||||
* @param int $patchPart The "patch" part. Incremented when you make backwards-compatible bug fixes.
|
|
||||||
*/
|
|
||||||
public function __construct($majorPart, $minorPart, $patchPart)
|
|
||||||
{
|
|
||||||
$this->majorPart = $majorPart;
|
|
||||||
$this->minorPart = $minorPart;
|
|
||||||
$this->patchPart = $patchPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the "major" part.
|
|
||||||
* Incremented when you make incompatible API changes.
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public function getMajorPart()
|
|
||||||
{
|
|
||||||
return $this->majorPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the "minor" part.
|
|
||||||
* Incremented when you add functionality in a backwards-compatible manner.
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public function getMinorPart()
|
|
||||||
{
|
|
||||||
return $this->minorPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the "patch" part.
|
|
||||||
* Incremented when you make backwards-compatible bug fixes.
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public function getPatchPart()
|
|
||||||
{
|
|
||||||
return $this->patchPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns representation of object as string
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('%d.%d.%d', $this->getMajorPart(), $this->getMinorPart(), $this->getPatchPart());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns new instance based on given version as string.
|
|
||||||
* Given version should contain 3 dot-separated integers, 1 per each part ("major", "minor" and "patch").
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
* "1.0.2";
|
|
||||||
* "10.4.0";
|
|
||||||
*
|
|
||||||
* @param string $version The version
|
|
||||||
* @return Version|null
|
|
||||||
*/
|
|
||||||
public static function fromString($version)
|
|
||||||
{
|
|
||||||
$version = trim($version);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* No version provided?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($version)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$matches = [];
|
|
||||||
$pattern = '/^(\d+)\.(\d+)\.(\d+)$/'; // e.g. "1.0.2"
|
|
||||||
$matched = preg_match($pattern, $version, $matches);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Incorrect version?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (0 === $matched || false === $matched) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$majorPart = (int)$matches[1];
|
|
||||||
$minorPart = (int)$matches[2];
|
|
||||||
$patchPart = (int)$matches[3];
|
|
||||||
|
|
||||||
return new static($majorPart, $minorPart, $patchPart);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns new instance based on given version as array.
|
|
||||||
* Given version should contain 3 integers, 1 per each part ("major", "minor" and "patch").
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
* [1, 0, 2];
|
|
||||||
* [10, 4, 0];
|
|
||||||
*
|
|
||||||
* @param array $version The version
|
|
||||||
* @return Version|null
|
|
||||||
*/
|
|
||||||
public static function fromArray(array $version)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* No version provided?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($version)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$count = count($version);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Incorrect version?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (3 !== $count) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$majorPart = (int)$version[0];
|
|
||||||
$minorPart = (int)$version[1];
|
|
||||||
$patchPart = (int)$version[2];
|
|
||||||
|
|
||||||
return new static($majorPart, $minorPart, $patchPart);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,508 +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\Test\Common\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
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class CollectionTest extends BaseTestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* An empty collection
|
|
||||||
*
|
|
||||||
* @var Collection
|
|
||||||
*/
|
|
||||||
private $emptyCollection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simple collection
|
|
||||||
*
|
|
||||||
* @var Collection
|
|
||||||
*/
|
|
||||||
private $simpleCollection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Elements of simple collection
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $simpleElements;
|
|
||||||
|
|
||||||
public function testEmptyCollection()
|
|
||||||
{
|
|
||||||
static::assertSame(0, $this->emptyCollection->count());
|
|
||||||
static::assertCount(0, $this->emptyCollection);
|
|
||||||
static::assertEmpty($this->emptyCollection);
|
|
||||||
|
|
||||||
static::assertTrue($this->emptyCollection->isEmpty());
|
|
||||||
static::assertSame([], $this->emptyCollection->toArray());
|
|
||||||
static::assertEmpty($this->emptyCollection->toArray());
|
|
||||||
|
|
||||||
static::assertNull($this->emptyCollection->getFirst());
|
|
||||||
static::assertNull($this->emptyCollection->getLast());
|
|
||||||
static::assertNull($this->emptyCollection[1]);
|
|
||||||
static::assertNull($this->emptyCollection['abc']);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testNotEmptyCollection()
|
|
||||||
{
|
|
||||||
static::assertSame(4, $this->simpleCollection->count());
|
|
||||||
static::assertCount(4, $this->simpleCollection);
|
|
||||||
static::assertNotEmpty($this->simpleCollection);
|
|
||||||
|
|
||||||
static::assertFalse($this->simpleCollection->isEmpty());
|
|
||||||
static::assertSame($this->simpleElements, $this->simpleCollection->toArray());
|
|
||||||
static::assertNotEmpty($this->simpleCollection->toArray());
|
|
||||||
|
|
||||||
static::assertSame('lorem', $this->simpleCollection->getFirst());
|
|
||||||
static::assertSame('sit', $this->simpleCollection->getLast());
|
|
||||||
static::assertSame('dolor', $this->simpleCollection[123]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCount()
|
|
||||||
{
|
|
||||||
static::assertSame(0, $this->emptyCollection->count());
|
|
||||||
static::assertSame(4, $this->simpleCollection->count());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testOffsetExists()
|
|
||||||
{
|
|
||||||
static::assertFalse(isset($this->emptyCollection['abc']));
|
|
||||||
static::assertFalse(isset($this->simpleCollection['abc']));
|
|
||||||
|
|
||||||
static::assertTrue(isset($this->simpleCollection[0]));
|
|
||||||
static::assertTrue(isset($this->simpleCollection[345]));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testOffsetGet()
|
|
||||||
{
|
|
||||||
static::assertNull($this->emptyCollection['abc']);
|
|
||||||
static::assertNull($this->simpleCollection['abc']);
|
|
||||||
|
|
||||||
static::assertSame('lorem', $this->simpleCollection[0]);
|
|
||||||
static::assertSame('sit', $this->simpleCollection[345]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testOffsetSet()
|
|
||||||
{
|
|
||||||
$this->emptyCollection['test1'] = 1234;
|
|
||||||
$this->simpleCollection['test2'] = 5678;
|
|
||||||
|
|
||||||
static::assertTrue($this->emptyCollection->has(1234));
|
|
||||||
static::assertSame(1234, $this->emptyCollection['test1']);
|
|
||||||
|
|
||||||
static::assertTrue($this->simpleCollection->has(5678));
|
|
||||||
static::assertSame(5678, $this->simpleCollection['test2']);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testOffsetUnset()
|
|
||||||
{
|
|
||||||
unset($this->simpleCollection[0]);
|
|
||||||
|
|
||||||
static::assertFalse($this->simpleCollection->has('lorem'));
|
|
||||||
static::assertSame('ipsum', $this->simpleCollection[1]);
|
|
||||||
static::assertSame(3, $this->simpleCollection->count());
|
|
||||||
|
|
||||||
unset($this->simpleCollection[123]);
|
|
||||||
|
|
||||||
static::assertFalse($this->simpleCollection->has('dolor'));
|
|
||||||
static::assertSame('ipsum', $this->simpleCollection[1]);
|
|
||||||
static::assertSame(2, $this->simpleCollection->count());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetIterator()
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
$collection->add($element);
|
|
||||||
|
|
||||||
static::assertTrue($collection->has($element));
|
|
||||||
static::assertSame($expectedCount, $collection->count());
|
|
||||||
static::assertSame($element, $collection[$expectedIndex]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
$collection->add($element, $index);
|
|
||||||
|
|
||||||
static::assertTrue($collection->has($element));
|
|
||||||
static::assertSame($expectedCount, $collection->count());
|
|
||||||
static::assertSame($element, $collection[$expectedIndex]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAddMultipleUsingEmptyArray()
|
|
||||||
{
|
|
||||||
$this->emptyCollection->addMultiple([]);
|
|
||||||
|
|
||||||
static::assertSame(0, $this->emptyCollection->count());
|
|
||||||
static::assertTrue($this->emptyCollection->isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAddMultiple()
|
|
||||||
{
|
|
||||||
$elements = [
|
|
||||||
'test1',
|
|
||||||
'test2',
|
|
||||||
1234 => 'test3',
|
|
||||||
5678 => 'test4',
|
|
||||||
];
|
|
||||||
|
|
||||||
$this->emptyCollection->addMultiple($elements);
|
|
||||||
|
|
||||||
static::assertFalse($this->emptyCollection->isEmpty());
|
|
||||||
static::assertSame(4, $this->emptyCollection->count());
|
|
||||||
|
|
||||||
static::assertSame('test1', $this->emptyCollection[0]);
|
|
||||||
static::assertSame('test2', $this->emptyCollection[1]);
|
|
||||||
static::assertSame('test3', $this->emptyCollection[2]);
|
|
||||||
static::assertSame('test4', $this->emptyCollection[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAddMultipleUsingIndexes()
|
|
||||||
{
|
|
||||||
$elements = [
|
|
||||||
'test1',
|
|
||||||
'test2',
|
|
||||||
1234 => 'test3',
|
|
||||||
5678 => 'test4',
|
|
||||||
];
|
|
||||||
|
|
||||||
$this->emptyCollection->addMultiple($elements, true);
|
|
||||||
|
|
||||||
static::assertFalse($this->emptyCollection->isEmpty());
|
|
||||||
static::assertSame(4, $this->emptyCollection->count());
|
|
||||||
|
|
||||||
static::assertSame('test1', $this->emptyCollection[0]);
|
|
||||||
static::assertSame('test2', $this->emptyCollection[1]);
|
|
||||||
static::assertSame('test3', $this->emptyCollection[1234]);
|
|
||||||
static::assertSame('test4', $this->emptyCollection[5678]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testPrepend()
|
|
||||||
{
|
|
||||||
$this->emptyCollection->prepend('lorem-ipsum');
|
|
||||||
|
|
||||||
static::assertFalse($this->emptyCollection->isEmpty());
|
|
||||||
static::assertSame(1, $this->emptyCollection->count());
|
|
||||||
static::assertSame('lorem-ipsum', $this->emptyCollection[0]);
|
|
||||||
|
|
||||||
$this->simpleCollection->prepend('lorem-ipsum');
|
|
||||||
|
|
||||||
static::assertFalse($this->simpleCollection->isEmpty());
|
|
||||||
static::assertSame(5, $this->simpleCollection->count());
|
|
||||||
static::assertSame('lorem-ipsum', $this->simpleCollection[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testRemoveNotExistingElement()
|
|
||||||
{
|
|
||||||
$this->emptyCollection->remove('abc');
|
|
||||||
|
|
||||||
static::assertTrue($this->emptyCollection->isEmpty());
|
|
||||||
static::assertSame(0, $this->emptyCollection->count());
|
|
||||||
|
|
||||||
$this->simpleCollection->remove('abc');
|
|
||||||
|
|
||||||
static::assertFalse($this->simpleCollection->isEmpty());
|
|
||||||
static::assertSame(4, $this->simpleCollection->count());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testRemove()
|
|
||||||
{
|
|
||||||
static::assertFalse($this->simpleCollection->isEmpty());
|
|
||||||
static::assertSame(4, $this->simpleCollection->count());
|
|
||||||
static::assertSame('ipsum', $this->simpleCollection[1]);
|
|
||||||
|
|
||||||
$this->simpleCollection->remove('ipsum');
|
|
||||||
|
|
||||||
static::assertFalse($this->simpleCollection->isEmpty());
|
|
||||||
static::assertSame(3, $this->simpleCollection->count());
|
|
||||||
static::assertNull($this->simpleCollection[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testIsEmpty()
|
|
||||||
{
|
|
||||||
static::assertTrue($this->emptyCollection->isEmpty());
|
|
||||||
static::assertFalse($this->simpleCollection->isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testIsFirst()
|
|
||||||
{
|
|
||||||
static::assertFalse($this->emptyCollection->isFirst('abc'));
|
|
||||||
static::assertFalse($this->simpleCollection->isFirst('abc'));
|
|
||||||
static::assertFalse($this->simpleCollection->isFirst('dolor'));
|
|
||||||
static::assertTrue($this->simpleCollection->isFirst('lorem'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testIsLast()
|
|
||||||
{
|
|
||||||
static::assertFalse($this->emptyCollection->isLast('abc'));
|
|
||||||
static::assertFalse($this->simpleCollection->isLast('abc'));
|
|
||||||
static::assertFalse($this->simpleCollection->isLast('dolor'));
|
|
||||||
static::assertTrue($this->simpleCollection->isLast('sit'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testHas()
|
|
||||||
{
|
|
||||||
static::assertFalse($this->emptyCollection->has('abc'));
|
|
||||||
static::assertFalse($this->simpleCollection->has('abc'));
|
|
||||||
static::assertTrue($this->simpleCollection->has('lorem'));
|
|
||||||
static::assertTrue($this->simpleCollection->has('dolor'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetPrevious()
|
|
||||||
{
|
|
||||||
static::assertNull($this->emptyCollection->getPrevious('abc'));
|
|
||||||
static::assertNull($this->simpleCollection->getPrevious('abc'));
|
|
||||||
static::assertNull($this->simpleCollection->getPrevious('lorem'));
|
|
||||||
|
|
||||||
static::assertSame('lorem', $this->simpleCollection->getPrevious('ipsum'));
|
|
||||||
static::assertSame('dolor', $this->simpleCollection->getPrevious('sit'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetNext()
|
|
||||||
{
|
|
||||||
static::assertNull($this->emptyCollection->getNext('abc'));
|
|
||||||
static::assertNull($this->simpleCollection->getNext('abc'));
|
|
||||||
static::assertNull($this->simpleCollection->getNext('sit'));
|
|
||||||
|
|
||||||
static::assertSame('dolor', $this->simpleCollection->getNext('ipsum'));
|
|
||||||
static::assertSame('sit', $this->simpleCollection->getNext('dolor'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetFirst()
|
|
||||||
{
|
|
||||||
static::assertNull($this->emptyCollection->getFirst());
|
|
||||||
static::assertSame('lorem', $this->simpleCollection->getFirst());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetLast()
|
|
||||||
{
|
|
||||||
static::assertNull($this->emptyCollection->getLast());
|
|
||||||
static::assertSame('sit', $this->simpleCollection->getLast());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testToArray()
|
|
||||||
{
|
|
||||||
static::assertSame([], $this->emptyCollection->toArray());
|
|
||||||
static::assertSame($this->simpleElements, $this->simpleCollection->toArray());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testExistsVisibilityAndArguments()
|
|
||||||
{
|
|
||||||
static::assertMethodVisibilityAndArguments(Collection::class, 'exists', OopVisibilityType::IS_PRIVATE, 1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $description Description of test
|
|
||||||
* @param Collection $collection Collection to search for element with given index
|
|
||||||
* @param mixed $index Index / key of the element
|
|
||||||
* @param mixed $expected Expected element with given index
|
|
||||||
*
|
|
||||||
* @dataProvider provideElementGetByIndex
|
|
||||||
*/
|
|
||||||
public function testGetByIndex($description, Collection $collection, $index, $expected)
|
|
||||||
{
|
|
||||||
static::assertEquals($expected, $collection->getByIndex($index), $description);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function provideElementGetByIndex()
|
|
||||||
{
|
|
||||||
yield[
|
|
||||||
'An empty collection and empty index',
|
|
||||||
new Collection(),
|
|
||||||
'',
|
|
||||||
null,
|
|
||||||
];
|
|
||||||
|
|
||||||
yield[
|
|
||||||
'An empty collection and non-empty index',
|
|
||||||
new Collection(),
|
|
||||||
'test',
|
|
||||||
null,
|
|
||||||
];
|
|
||||||
|
|
||||||
yield[
|
|
||||||
'Non-empty collection and not existing index',
|
|
||||||
new Collection([
|
|
||||||
'lorem' => 'ipsum',
|
|
||||||
'dolor' => 'sit',
|
|
||||||
]),
|
|
||||||
'test',
|
|
||||||
null,
|
|
||||||
];
|
|
||||||
|
|
||||||
yield[
|
|
||||||
'Collection with existing index',
|
|
||||||
new Collection([
|
|
||||||
'lorem' => 'ipsum',
|
|
||||||
'dolor' => 'sit',
|
|
||||||
]),
|
|
||||||
'lorem',
|
|
||||||
'ipsum',
|
|
||||||
];
|
|
||||||
|
|
||||||
yield[
|
|
||||||
'Collection with existing index (collection of arrays)',
|
|
||||||
new Collection([
|
|
||||||
[
|
|
||||||
'lorem',
|
|
||||||
'ipsum',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'dolor',
|
|
||||||
'sit',
|
|
||||||
],
|
|
||||||
]),
|
|
||||||
0,
|
|
||||||
[
|
|
||||||
'lorem',
|
|
||||||
'ipsum',
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
yield[
|
|
||||||
'Collection with existing index (collection of objects)',
|
|
||||||
new Collection([
|
|
||||||
'x' => new \DateTime(),
|
|
||||||
'y' => new \DateTime('2001-01-01'),
|
|
||||||
'z' => new \DateTime('yesterday'),
|
|
||||||
]),
|
|
||||||
'y',
|
|
||||||
new \DateTime('2001-01-01'),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function setUp()
|
|
||||||
{
|
|
||||||
parent::setUp();
|
|
||||||
|
|
||||||
$this->simpleElements = [
|
|
||||||
'lorem',
|
|
||||||
'ipsum',
|
|
||||||
123 => 'dolor',
|
|
||||||
345 => 'sit',
|
|
||||||
];
|
|
||||||
|
|
||||||
$this->emptyCollection = new Collection();
|
|
||||||
$this->simpleCollection = new Collection($this->simpleElements);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,100 +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\Test\Common\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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test case of the exception used while type of something is unknown
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class UnknownTypeExceptionTest extends BaseTestCase
|
|
||||||
{
|
|
||||||
public function testConstructorVisibilityAndArguments()
|
|
||||||
{
|
|
||||||
static::assertConstructorVisibilityAndArguments(UnknownTestTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testWithoutException()
|
|
||||||
{
|
|
||||||
self::assertEquals('Test 2', (new TestService())->getTranslatedType('test_2'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testTheException()
|
|
||||||
{
|
|
||||||
$this->setExpectedException(UnknownTestTypeException::class);
|
|
||||||
self::assertEmpty((new TestService())->getTranslatedType('test_3'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Type of something (for testing purposes)
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class TestType extends BaseType
|
|
||||||
{
|
|
||||||
const TEST_1 = 'test_1';
|
|
||||||
|
|
||||||
const TEST_2 = 'test_2';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An exception used while type of something is unknown (for testing purposes)
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class UnknownTestTypeException extends UnknownTypeException
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Creates exception
|
|
||||||
*
|
|
||||||
* @param string $unknownType The unknown type of something (for testing purposes)
|
|
||||||
* @return UnknownTestTypeException
|
|
||||||
*/
|
|
||||||
public static function createException($unknownType)
|
|
||||||
{
|
|
||||||
/* @var UnknownTestTypeException $exception */
|
|
||||||
$exception = parent::create($unknownType, new TestType(), 'type of something used for testing');
|
|
||||||
|
|
||||||
return $exception;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Service used together with type of something (for testing purposes)
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class TestService
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Returns translated type (for testing purposes)
|
|
||||||
*
|
|
||||||
* @param string $type Type of something (for testing purposes)
|
|
||||||
* @throws UnknownTestTypeException
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getTranslatedType($type)
|
|
||||||
{
|
|
||||||
if ((new TestType())->isCorrectType($type)) {
|
|
||||||
return ucfirst(str_replace('_', ' ', $type));
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new UnknownTestTypeException($type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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\Test\Common\Exception\Bundle;
|
|
||||||
|
|
||||||
use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
|
|
||||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
|
||||||
use Meritoo\Common\Type\OopVisibilityType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test case of an exception used while name of bundle is incorrect
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class IncorrectBundleNameExceptionTest extends BaseTestCase
|
|
||||||
{
|
|
||||||
public function testConstructor()
|
|
||||||
{
|
|
||||||
static::assertConstructorVisibilityAndArguments(
|
|
||||||
IncorrectBundleNameException::class,
|
|
||||||
OopVisibilityType::IS_PUBLIC,
|
|
||||||
3
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $description Description of test
|
|
||||||
* @param string $bundleName Incorrect name of bundle
|
|
||||||
* @param string $expectedMessage Expected exception's message
|
|
||||||
*
|
|
||||||
* @dataProvider provideBundleNameAndMessage
|
|
||||||
*/
|
|
||||||
public function testCreate($description, $bundleName, $expectedMessage)
|
|
||||||
{
|
|
||||||
$exception = IncorrectBundleNameException::create($bundleName);
|
|
||||||
static::assertSame($expectedMessage, $exception->getMessage(), $description);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function provideBundleNameAndMessage()
|
|
||||||
{
|
|
||||||
$template = 'Name of bundle \'%s\' is incorrect. It should start with big letter and end with "Bundle". Is'
|
|
||||||
. ' there everything ok?';
|
|
||||||
|
|
||||||
yield[
|
|
||||||
'An empty string as name of bundle',
|
|
||||||
'',
|
|
||||||
sprintf($template, ''),
|
|
||||||
];
|
|
||||||
|
|
||||||
yield[
|
|
||||||
'Null as name of bundle',
|
|
||||||
null,
|
|
||||||
sprintf($template, ''),
|
|
||||||
];
|
|
||||||
|
|
||||||
yield[
|
|
||||||
'String with spaces as name of bundle',
|
|
||||||
'This is test',
|
|
||||||
sprintf($template, 'This is test'),
|
|
||||||
];
|
|
||||||
|
|
||||||
yield[
|
|
||||||
'String without spaces as name of bundle',
|
|
||||||
'ThisIsTest',
|
|
||||||
sprintf($template, 'ThisIsTest'),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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\Test\Common\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::assertSame($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\Test\Common\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::assertSame($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\Test\Common\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::assertSame('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\Test\Common\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::assertSame($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\Test\Common\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::assertSame($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\Test\Common\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::assertSame($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?',
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user