mirror of
https://github.com/wiosna-dev/common-library.git
synced 2026-03-12 09:31:51 +01:00
Compare commits
1 Commits
0.1.5
...
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
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/vendor/
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Composer
|
||||
# ------------------------------------------------------------------------------
|
||||
/composer.lock
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/composer.phar
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Phing
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/phing/properties
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### PHPUnit
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/phpunit.xml
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
### PHP Coding Standards Fixer
|
||||
# ------------------------------------------------------------------------------
|
||||
/.php_cs
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### PHP Coding Standards Fixer generated files
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/.php_cs.cache
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
### Build files
|
||||
# -----------------------------------------------------------------------------
|
||||
/build/
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Generated databases
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/data/tmp
|
||||
*.sql
|
||||
*.sqlite
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
### JetBrains template
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Compiled source
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
*.com
|
||||
*.class
|
||||
*.dll
|
||||
*.exe
|
||||
*.o
|
||||
*.so
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Shell scripts
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/*.sh
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### JetBrains
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
/.idea
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
### macOS template
|
||||
# ------------------------------------------------------------------------------
|
||||
# General
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### NetBeans template
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
nbproject/private/
|
||||
build/
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
nbactions.xml
|
||||
.nb-gradle/
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### OSX template
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
@@ -77,7 +91,6 @@ Icon
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
@@ -87,9 +100,9 @@ Temporary Items
|
||||
.apdisk
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Linux template
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
@@ -101,23 +114,16 @@ Temporary Items
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### Windows template
|
||||
# ------------------------------------------------------------------------------
|
||||
# Windows thumbnail cache files
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
@@ -125,7 +131,6 @@ $RECYCLE.BIN/
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
|
||||
25
.php_cs.dist
25
.php_cs.dist
@@ -1,6 +1,13 @@
|
||||
<?php
|
||||
|
||||
$finder = PhpCsFixer\Finder::create()
|
||||
/*
|
||||
* Do not verify:
|
||||
* - all DependencyInjection/Configuration classes: the Configuration.php files
|
||||
* - autoloader from /app directory: autoload.php
|
||||
*/
|
||||
->notPath('/DependencyInjection\/Configuration\.php/')
|
||||
->notPath('/autoload\.php/')
|
||||
->in([
|
||||
__DIR__ . '/src',
|
||||
__DIR__ . '/tests',
|
||||
@@ -8,20 +15,16 @@ $finder = PhpCsFixer\Finder::create()
|
||||
|
||||
return PhpCsFixer\Config::create()
|
||||
->setRules([
|
||||
'@Symfony' => true,
|
||||
'binary_operator_spaces' => [
|
||||
'@Symfony' => true,
|
||||
'phpdoc_summary' => false,
|
||||
'phpdoc_separation' => false,
|
||||
'phpdoc_align' => false,
|
||||
'cast_spaces' => false,
|
||||
'binary_operator_spaces' => [
|
||||
'align_double_arrow' => true,
|
||||
],
|
||||
'blank_line_before_return' => false,
|
||||
'cast_spaces' => false,
|
||||
'concat_space' => [
|
||||
'concat_space' => [
|
||||
'spacing' => 'one',
|
||||
],
|
||||
'phpdoc_add_missing_param_annotation' => true,
|
||||
'phpdoc_align' => false,
|
||||
'phpdoc_order' => true,
|
||||
'phpdoc_separation' => false,
|
||||
'phpdoc_summary' => false,
|
||||
'trim_array_spaces' => false,
|
||||
])
|
||||
->setFinder($finder);
|
||||
|
||||
1
.styleci.yml
Normal file
1
.styleci.yml
Normal file
@@ -0,0 +1 @@
|
||||
preset: symfony
|
||||
@@ -4,14 +4,9 @@ php:
|
||||
- 5.6
|
||||
- 7.0
|
||||
- 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:
|
||||
- travis_wait 30 composer install -v
|
||||
- composer install
|
||||
|
||||
script:
|
||||
- php ./vendor/bin/phpunit
|
||||
|
||||
68
CHANGELOG.md
68
CHANGELOG.md
@@ -1,68 +0,0 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# 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
|
||||
108
README.md
108
README.md
@@ -1,31 +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
|
||||
```
|
||||
|
||||
Run [Composer](https://getcomposer.org) to install this package in your project:
|
||||
> How to install Composer: https://getcomposer.org/download
|
||||
|
||||
```bash
|
||||
composer require meritoo/common-library
|
||||
## Static methods
|
||||
|
||||
This package contains a lot of class with static methods, so usage is not so complicated. Just run the static method who would you like to use. Example:
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Utilities\Arrays;
|
||||
|
||||
$firstElement = Arrays::getFirstElement(['lorem', 'ipsum']);
|
||||
var_dump($firstElement); // string(5) "lorem"
|
||||
```
|
||||
|
||||
> [How to install Composer?](https://getcomposer.org/download)
|
||||
## Base test case with common methods and data providers
|
||||
|
||||
# Usage
|
||||
Located here: `Meritoo\Common\Test\Base\BaseTestCase`. Just extend the `BaseTestCase` class and use it like in `Meritoo\Common\Test\Utilities\DateTest` class:
|
||||
|
||||
1. [Base test case (with common methods and data providers)](docs/Base-test-case.md)
|
||||
2. [Collection of elements](docs/Collection-of-elements.md)
|
||||
3. [Exceptions](docs/Static-methods.md)
|
||||
4. [Static methods](docs/Static-methods.md)
|
||||
1. [Arrays](docs/Static-methods/Arrays.md)
|
||||
2. [Regex](docs/Static-methods/Regex.md)
|
||||
5. [Value Objects](docs/Value-Objects.md)
|
||||
```php
|
||||
class DateTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* @param mixed $value Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetDateTimeEmptyValue($value)
|
||||
{
|
||||
self::assertFalse(Date::getDateTime($value));
|
||||
}
|
||||
|
||||
# Development
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
More information [you can find here](docs/Development.md)
|
||||
or in `Meritoo\Common\Test\Utilities\MimeTypesTest` class:
|
||||
|
||||
```php
|
||||
class MimeTypesTest extends BaseTestCase
|
||||
{
|
||||
(...)
|
||||
|
||||
/**
|
||||
* @param bool $mimeType The mime type, e.g. "video/mpeg"
|
||||
* @dataProvider provideBooleanValue
|
||||
*/
|
||||
public function testGetExtensionBooleanMimeType($mimeType)
|
||||
{
|
||||
self::assertEquals('', MimeTypes::getExtension($mimeType));
|
||||
}
|
||||
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
## Collection of elements
|
||||
|
||||
Located here: `Meritoo\Common\Collection\Collection`. It's a set of some elements, e.g. objects. It's iterable and countable. Provides very useful methods. Some of them:
|
||||
- `getFirst()` - returns the first element in the collection
|
||||
- `getLast()` - returns the last element in the collection
|
||||
- `isEmpty()` - returns information if collection is empty
|
||||
- `add($element, $index = null)` - adds given element (at the end of collection)
|
||||
- `addMultiple($elements, $useIndexes = false)` - adds given elements (at the end of collection)
|
||||
- `prepend($element)` - prepends given element (adds given element at the beginning of collection)
|
||||
- `remove($element)` - removes given element
|
||||
|
||||
Examples of usage below.
|
||||
|
||||
#### An empty collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$emptyCollection = new Collection();
|
||||
var_dump($emptyCollection->isEmpty()); // bool(true)
|
||||
```
|
||||
|
||||
#### Simple collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$elements = [
|
||||
'lorem',
|
||||
'ipsum',
|
||||
123 => 'dolor',
|
||||
345 => 'sit',
|
||||
];
|
||||
|
||||
$simpleCollection = new Collection($elements);
|
||||
var_dump($simpleCollection->has('dolor')); // bool(true)
|
||||
```
|
||||
|
||||
Enjoy!
|
||||
|
||||
38
build.xml
38
build.xml
@@ -1,30 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
|
||||
<!-- Properties -->
|
||||
<if>
|
||||
<available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
|
||||
<available file="phing/properties" property="custom.properties.available"/>
|
||||
<then>
|
||||
<property file="${project.basedir}/phing/properties"/>
|
||||
<property file="phing/properties" />
|
||||
</then>
|
||||
<else>
|
||||
<property file="${project.basedir}/phing/properties.dist"/>
|
||||
<property file="phing/properties.dist" />
|
||||
</else>
|
||||
</if>
|
||||
|
||||
<!-- Default / main target -->
|
||||
<target name="build:main"
|
||||
depends="build:app,
|
||||
build:tests"
|
||||
/>
|
||||
depends="build:app, build:tests"
|
||||
description="Builds everything and runs all tests" />
|
||||
|
||||
<!-- Build app -->
|
||||
<target name="build:app">
|
||||
<phing phingfile="${project.basedir}/phing/app.xml" haltonfailure="true"/>
|
||||
<target name="build:app" description="Prepares app to build and tests">
|
||||
<phing phingfile="phing/app.xml" haltonfailure="true" />
|
||||
</target>
|
||||
|
||||
<!-- Build tests -->
|
||||
<target name="build:tests">
|
||||
<phing phingfile="${project.basedir}/phing/tests.xml" haltonfailure="true"/>
|
||||
<target name="build:tests" description="Runs all tests, checks and creates docs">
|
||||
<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>
|
||||
</project>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"name": "meritoo/common-library",
|
||||
"description": "Useful classes, methods, extensions etc.",
|
||||
"license": "MIT",
|
||||
"version": "0.0.7",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Meritoo.pl",
|
||||
@@ -10,36 +11,24 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"ext-fileinfo": "*",
|
||||
"ext-json": "*",
|
||||
"ext-simplexml": "*",
|
||||
"php": ">=5.6",
|
||||
"ext-intl": "*",
|
||||
"ext-pcre": "*",
|
||||
"php": ">=5.6.0",
|
||||
"doctrine/orm": "^2.5",
|
||||
"gedmo/doctrine-extensions": "^2.4"
|
||||
"gedmo/doctrine-extensions": "^2.4",
|
||||
"symfony/http-foundation": "^3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "^2.2",
|
||||
"pdepend/pdepend": "^2.5",
|
||||
"phploc/phploc": "^2.1",
|
||||
"phpunit/phpunit": "^4.8 || ^5.0",
|
||||
"squizlabs/php_codesniffer": "^2.8",
|
||||
"phpmd/phpmd": "^2.6",
|
||||
"phpunit/phpunit": "^4.8",
|
||||
"sebastian/phpcpd": "^2.0",
|
||||
"squizlabs/php_codesniffer": "^2.9"
|
||||
"sebastian/phpcpd": "^3.0",
|
||||
"pdepend/pdepend": "^2.5",
|
||||
"phploc/phploc": "^3.0",
|
||||
"friendsofphp/php-cs-fixer": "^2.1"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Meritoo\\Common\\": "src/"
|
||||
"Meritoo\\Common\\": "src/Meritoo/Common/",
|
||||
"Meritoo\\Common\\Test\\": "tests/Meritoo/Common/Test/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Meritoo\\Common\\Test\\": "tests/"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true
|
||||
}
|
||||
}
|
||||
|
||||
3518
composer.lock
generated
Normal file
3518
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,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,186 +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"
|
||||
```
|
||||
|
||||
### 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');
|
||||
```
|
||||
|
||||
# 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"?>
|
||||
|
||||
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.16.0">
|
||||
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
|
||||
<!-- Properties -->
|
||||
<if>
|
||||
<available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
|
||||
<available file="phing/properties" property="custom.properties.available"/>
|
||||
<then>
|
||||
<property file="${project.basedir}/phing/properties"/>
|
||||
<property file="phing/properties" />
|
||||
</then>
|
||||
<else>
|
||||
<property file="${project.basedir}/phing/properties.dist"/>
|
||||
<property file="phing/properties.dist" />
|
||||
</else>
|
||||
</if>
|
||||
|
||||
<!-- Filesets -->
|
||||
<import file="${project.basedir}/phing/filesets.xml"/>
|
||||
|
||||
<!-- Default / main target -->
|
||||
<target name="build:main"
|
||||
depends="build:app"
|
||||
/>
|
||||
description="Builds the application" />
|
||||
|
||||
<!-- App target -->
|
||||
<target name="build:app"
|
||||
depends="app:clean,
|
||||
app:composer:self-update,
|
||||
app:composer:install,
|
||||
app:composer:validate,
|
||||
app:checkout"
|
||||
/>
|
||||
depends="app:composer, app:vendors, app:checkout"
|
||||
description="Prepares app to build." />
|
||||
|
||||
<!-- Check / update composer -->
|
||||
<target name="app:composer" description="Checks / updates composer">
|
||||
<echo msg="Checking / updating composer..." />
|
||||
|
||||
<!-- Updates Composer -->
|
||||
<target name="app:composer:self-update">
|
||||
<if>
|
||||
<not>
|
||||
<available file="${composer.path}" property="composer.local.unavailable"/>
|
||||
</not>
|
||||
<available file="composer.phar" />
|
||||
<then>
|
||||
<if>
|
||||
<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"/>
|
||||
<echo msg="[Skipped] Downloading of Composer skipped, because exist in the project..." />
|
||||
</then>
|
||||
<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>
|
||||
<or>
|
||||
<contains string="${directory}" substring="cache"/>
|
||||
<contains string="${directory}" substring="logs"/>
|
||||
<contains string="${directory}" substring="sessions"/>
|
||||
</or>
|
||||
<os family="windows" />
|
||||
<then>
|
||||
<mkdir dir="${directory}" mode="0777"/>
|
||||
<fail message="Composer not found! Go to http://getcomposer.org/download and download the Composer." />
|
||||
</then>
|
||||
<else>
|
||||
<mkdir dir="${directory}" mode="0775"/>
|
||||
<exec command="${composer.download_command}" checkreturn="true" />
|
||||
</else>
|
||||
</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>
|
||||
</if>
|
||||
<composer command="selfupdate" />
|
||||
</target>
|
||||
|
||||
<!-- Clearing cache (faster) -->
|
||||
<target name="app:cache:faster">
|
||||
<SymfonyConsole console="bin/console" command="cache:clear">
|
||||
<arg name="env" value="${env}"/>
|
||||
<arg name="no-optional-warmers"/>
|
||||
</SymfonyConsole>
|
||||
</target>
|
||||
<!-- Project Install/update vendors -->
|
||||
<target name="app:vendors" description="Installs / updates vendors">
|
||||
<echo msg="Installing / updating vendors..." />
|
||||
|
||||
<!-- 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>
|
||||
<not>
|
||||
<os family="windows"/>
|
||||
</not>
|
||||
<istrue value="${composer.self-update}"/>
|
||||
<then>
|
||||
<exec command="chmod -R 777 ${directory}/*"/>
|
||||
<composer php="${composer.php}" composer="${composer.path}" command="self-update"/>
|
||||
</then>
|
||||
</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>
|
||||
|
||||
<!-- Checkout and finalization -->
|
||||
<target name="app:checkout">
|
||||
<tstamp>
|
||||
<format property="date_end" pattern="%Y-%m-%d %H:%M"/>
|
||||
<format property="date_end" pattern="%Y-%m-%d %H:%M" />
|
||||
</tstamp>
|
||||
|
||||
<echo msg="------------------------------------"/>
|
||||
<echo msg="Build finished at: ${date_end}"/>
|
||||
<echo msg="------------------------------------"/>
|
||||
<echo msg="------------------------------------" />
|
||||
<echo msg="Build finished at: ${date_end}" />
|
||||
<echo msg="------------------------------------" />
|
||||
</target>
|
||||
</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
|
||||
# --------------------------------------------------------------------------------
|
||||
@@ -6,77 +22,104 @@
|
||||
#
|
||||
env = dev
|
||||
|
||||
# Install assets using symlinks
|
||||
#
|
||||
assets.installWithSymlink = true
|
||||
|
||||
# Clear cache with the "warmup" option
|
||||
#
|
||||
# The cache:clear command should always be called with the --no-warmup option. Warmup should be done via the cache:warmup command.
|
||||
# https://github.com/symfony/symfony/blob/master/UPGRADE-3.3.md#frameworkbundle
|
||||
#
|
||||
# Meritoo <github@meritoo.pl>
|
||||
# 2017-06-06
|
||||
#
|
||||
cache.clearWithWarmup = false
|
||||
cache.clearWithWarmup = true
|
||||
|
||||
# --------------------------------------------------------------------------------
|
||||
# Composer
|
||||
# --------------------------------------------------------------------------------
|
||||
|
||||
# Command used to download Composer
|
||||
#
|
||||
composer.download_command = bash ${project.basedir}/phing/composer-install.sh
|
||||
composer.download_command = php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"
|
||||
|
||||
# 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
|
||||
#
|
||||
composer.php = php
|
||||
|
||||
# Self update of the composer
|
||||
#
|
||||
composer.self-update = false
|
||||
|
||||
# Validate the composer.json file
|
||||
#
|
||||
composer.validate = false
|
||||
|
||||
# --------------------------------------------------------------------------------
|
||||
# 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.src = ${project.basedir}/src
|
||||
dir.tests = ${project.basedir}/tests
|
||||
|
||||
# --------------------------------------------------------------------------------
|
||||
# Build directories
|
||||
#
|
||||
# --------------------------------------------------------------------------------
|
||||
|
||||
dir.build = ${project.basedir}/build
|
||||
dir.reports = ${dir.build}/reports
|
||||
dir.reports = ${dir.build}/logs
|
||||
dir.reports.pdepend = ${dir.reports}/pdepend
|
||||
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.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
|
||||
# --------------------------------------------------------------------------------
|
||||
|
||||
# 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
|
||||
#
|
||||
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
|
||||
|
||||
310
phing/tests.xml
310
phing/tests.xml
@@ -1,133 +1,315 @@
|
||||
<?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">
|
||||
<autoloader/>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-23
|
||||
-->
|
||||
<autoloader />
|
||||
|
||||
<!-- Properties -->
|
||||
<if>
|
||||
<available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
|
||||
<available file="phing/properties" property="custom.properties.available"/>
|
||||
<then>
|
||||
<property file="${project.basedir}/phing/properties"/>
|
||||
<property file="phing/properties" />
|
||||
</then>
|
||||
<else>
|
||||
<property file="${project.basedir}/phing/properties.dist"/>
|
||||
<property file="phing/properties.dist" />
|
||||
</else>
|
||||
</if>
|
||||
|
||||
<!-- Filesets -->
|
||||
<fileset id="sourcecode" dir="${dir.src}">
|
||||
<include name="**/*.php"/>
|
||||
<exclude name="*Test.php"/>
|
||||
<exclude name="**/*Test.php"/>
|
||||
<exclude name="**/Resources/**"/>
|
||||
<exclude name="**/DataFixtures/**"/>
|
||||
<exclude name="**/Tests/**"/>
|
||||
<include name="**/*.php" />
|
||||
<exclude name="*Test.php" />
|
||||
<exclude name="**/*Test.php" />
|
||||
<exclude name="**/Resources/**" />
|
||||
<exclude name="**/DataFixtures/**" />
|
||||
<exclude name="**/Tests/**" />
|
||||
</fileset>
|
||||
<fileset id="tests" dir="${dir.tests}">
|
||||
<include name="**/*Test*.php"/>
|
||||
<include name="**/*Test*.php" />
|
||||
</fileset>
|
||||
|
||||
<!-- Default / main target -->
|
||||
<target name="build:main"
|
||||
depends="build:fix-coding-standards,
|
||||
build:check,
|
||||
build:test,
|
||||
app:checkout"
|
||||
/>
|
||||
depends="build:fix-coding-standards, build:clean, build:prepare, build:check, build:test, app:checkout"
|
||||
description="Runs all tests and builds everything" />
|
||||
<!--
|
||||
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) -->
|
||||
<target name="build:fix-coding-standards">
|
||||
<exec command="${tests.cs_fixer.command}" passthru="true"/>
|
||||
<target name="build:fix-coding-standards" description="Fixes coding standards using the PHP Coding Standards Fixer">
|
||||
<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>
|
||||
|
||||
<!-- 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 -->
|
||||
<target name="build:check"
|
||||
depends="check:cs,
|
||||
check:md,
|
||||
check:cpd,
|
||||
check:depend,
|
||||
check:loc"
|
||||
/>
|
||||
depends="check:cs, check:md, check:cpd, check:depend, check:loc"
|
||||
description="Analyzes code" />
|
||||
|
||||
<!-- Test target -->
|
||||
<target name="build:test"
|
||||
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 -->
|
||||
<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">
|
||||
<fileset refid="sourcecode"/>
|
||||
<formatter type="checkstyle" outfile="${dir.reports}/checkstyle.xml"/>
|
||||
<formatter type="csv" outfile="${dir.reports}/checkstyle.csv"/>
|
||||
<formatter type="summary" outfile="${dir.reports}/checkstyle_summary.txt"/>
|
||||
<fileset refid="sourcecode" />
|
||||
<formatter type="checkstyle" outfile="${dir.reports}/checkstyle.xml" />
|
||||
<formatter type="csv" outfile="${dir.reports}/checkstyle.csv" />
|
||||
<formatter type="summary" outfile="${dir.reports}/checkstyle_summary.txt" />
|
||||
</phpcodesniffer>
|
||||
</target>
|
||||
|
||||
<!-- 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>
|
||||
<fileset refid="sourcecode"/>
|
||||
<formatter type="pmd" outfile="${dir.reports}/pmd-cpd.xml"/>
|
||||
<fileset refid="sourcecode" />
|
||||
<formatter type="pmd" outfile="${dir.reports}/pmd-cpd.xml" />
|
||||
</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>
|
||||
|
||||
<!-- 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">
|
||||
<fileset refid="sourcecode"/>
|
||||
<formatter type="html" outfile="${dir.reports}/phpmd.html"/>
|
||||
<formatter type="text" outfile="${dir.reports}/phpmd.txt"/>
|
||||
<fileset refid="sourcecode" />
|
||||
<formatter type="html" outfile="${dir.reports}/phpmd.html" />
|
||||
<formatter type="text" outfile="${dir.reports}/phpmd.txt" />
|
||||
</phpmd>
|
||||
</target>
|
||||
|
||||
<!-- 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>
|
||||
<fileset refid="sourcecode"/>
|
||||
<logger type="jdepend-xml" outfile="${dir.reports.pdepend}/jdepend.xml"/>
|
||||
<logger type="jdepend-chart" outfile="${dir.reports.pdepend}/dependencies.svg"/>
|
||||
<logger type="overview-pyramid" outfile="${dir.reports.pdepend}/overview-pyramid.svg"/>
|
||||
<fileset refid="sourcecode" />
|
||||
<logger type="jdepend-xml" outfile="${dir.reports.pdepend}/jdepend.xml" />
|
||||
<logger type="jdepend-chart" outfile="${dir.reports.pdepend}/dependencies.svg" />
|
||||
<logger type="overview-pyramid" outfile="${dir.reports.pdepend}/overview-pyramid.svg" />
|
||||
</phpdepend>
|
||||
</target>
|
||||
|
||||
<!-- Measure the size and analyzing the structure of a project -->
|
||||
<target name="check:loc" depends="build:prepare">
|
||||
<target name="check:loc" description="Measures the size and analyzes the structure of a project">
|
||||
<echo msg="Measuring the size and analyzing the structure of a project..." />
|
||||
<phploc reportType="txt" reportName="phploc" reportDirectory="${dir.reports}">
|
||||
<fileset refid="sourcecode"/>
|
||||
<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>
|
||||
|
||||
<!-- PHPUnit tests -->
|
||||
<target name="test:phpunit" depends="build:prepare">
|
||||
<exec command="${tests.phpunit.command}" passthru="true"/>
|
||||
</target>
|
||||
|
||||
<!-- Project build clean -->
|
||||
<target name="build:clean">
|
||||
<!-- Unit tests -->
|
||||
<target name="test:phpunit" description="Executes PHPUnit tests">
|
||||
<!-- Check test database -->
|
||||
<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>
|
||||
<delete dir="${dir.reports}"/>
|
||||
<mkdir dir="${dir.data.tests}" />
|
||||
</then>
|
||||
</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 -->
|
||||
<target name="build:prepare" depends="build:clean">
|
||||
<mkdir dir="${dir.reports}"/>
|
||||
<mkdir dir="${dir.reports.pdepend}"/>
|
||||
<mkdir dir="${dir.reports.coverage}"/>
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-23
|
||||
|
||||
<phpunit configuration="${project.basedir}/phpunit.xml.dist" printsummary="true">
|
||||
<formatter type="xml" todir="${dir.reports}" outfile="phpunit.xml" />
|
||||
<formatter type="plain" todir="${dir.reports}" outfile="phpunit.txt" />
|
||||
<formatter type="clover" todir="${dir.reports.coverage}" />
|
||||
<formatter type="summary" todir="${dir.reports}" outfile="phpunit_summary.txt" />
|
||||
</phpunit>
|
||||
-->
|
||||
|
||||
<!--
|
||||
Previous / old version
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<if>
|
||||
<istrue value="${phpunit.useExec}" />
|
||||
<then>
|
||||
<if>
|
||||
<istrue value="${phpunit.withCoverage}" />
|
||||
<then>
|
||||
<echo message="Running tests with code coverage..." />
|
||||
<exec command="phpunit \-\-log-junit ${dir.reports}/phpunit.xml \-\-coverage-clover ${dir.reports.coverage}/clover-coverage.xml \-\-coverage-crap4j ${dir.reports.coverage}/crap4j-coverage.xml \-\-coverage-html ${dir.reports.coverage}/ -c ${project.basedir} \-\-colors" passthru="true" checkreturn="true" />
|
||||
</then>
|
||||
<else>
|
||||
<echo message="Running tests without code coverage..." />
|
||||
<exec command="phpunit \-\-log-junit ${dir.reports}/phpunit.xml -c ${project.basedir} \-\-colors" passthru="true" checkreturn="true" />
|
||||
</else>
|
||||
</if>
|
||||
</then>
|
||||
<else>
|
||||
<if>
|
||||
<istrue value="${phpunit.withCoverage}" />
|
||||
<then>
|
||||
<echo message="Running tests with code coverage..." />
|
||||
<coverage-setup database="${dir.reports.coverage}/coverage.db">
|
||||
<fileset refid="sourcecode" />
|
||||
</coverage-setup>
|
||||
<phpunit printsummary="true" codecoverage="true">
|
||||
<formatter type="xml" todir="${dir.reports}" outfile="phpunit.xml" />
|
||||
<formatter type="plain" todir="${dir.reports}" outfile="phpunit.txt" />
|
||||
<formatter type="clover" todir="${dir.reports.coverage}" />
|
||||
<formatter type="summary" todir="${dir.reports}" outfile="phpunit_summary.txt" />
|
||||
</phpunit>
|
||||
</then>
|
||||
<else>
|
||||
<echo message="Running tests without code coverage..." />
|
||||
<phpunit printsummary="true">
|
||||
<formatter todir="${dir.reports}" type="xml" outfile="phpunit.xml" />
|
||||
<batchtest>
|
||||
<fileset refid="tests" />
|
||||
</batchtest>
|
||||
</phpunit>
|
||||
</else>
|
||||
</if>
|
||||
</else>
|
||||
</if>
|
||||
-->
|
||||
</target>
|
||||
|
||||
<!-- Checkout and finalization -->
|
||||
<target name="app:checkout">
|
||||
<tstamp>
|
||||
<format property="date_end" pattern="%Y-%m-%d %H:%M"/>
|
||||
<format property="date_end" pattern="%Y-%m-%d %H:%M" />
|
||||
</tstamp>
|
||||
|
||||
<echo msg="--------------------------------------------"/>
|
||||
<echo msg="Build tests finished at: ${date_end}"/>
|
||||
<echo msg="--------------------------------------------"/>
|
||||
<echo msg="--------------------------------------------" />
|
||||
<echo msg="Build tests finished at: ${date_end}" />
|
||||
<echo msg="--------------------------------------------" />
|
||||
</target>
|
||||
</project>
|
||||
|
||||
@@ -1,30 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!-- https://phpunit.de/manual/4.8/en/appendixes.configuration.html -->
|
||||
<phpunit
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/4.8/phpunit.xsd"
|
||||
bootstrap="vendor/autoload.php"
|
||||
colors="true"
|
||||
verbose="true"
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="true"
|
||||
bootstrap="./vendor/autoload.php"
|
||||
>
|
||||
<php>
|
||||
<ini name="error_reporting" value="-1"/>
|
||||
</php>
|
||||
|
||||
<testsuites>
|
||||
<testsuite name="Meritoo Package - Main Test Suite">
|
||||
<directory>tests/</directory>
|
||||
<directory>./tests/</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
|
||||
<filter>
|
||||
<whitelist>
|
||||
<directory>src/</directory>
|
||||
<directory>./src/</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
|
||||
<groups>
|
||||
<exclude>
|
||||
<group>performance</group>
|
||||
</exclude>
|
||||
</groups>
|
||||
|
||||
<logging>
|
||||
<log type="coverage-html" target="build/reports/phpunit_coverage/html"/>
|
||||
<log type="coverage-html" target="./build/logs/phpunit_coverage/html" />
|
||||
</logging>
|
||||
</phpunit>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -18,20 +18,20 @@ use Meritoo\Common\Utilities\Arrays;
|
||||
* Collection of elements.
|
||||
* It's a set of some elements, e.g. objects.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
{
|
||||
/**
|
||||
* The elements of collection
|
||||
* The elements of collection.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $elements;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
* Class constructor.
|
||||
*
|
||||
* @param array $elements (optional) The elements of collection
|
||||
*/
|
||||
@@ -42,7 +42,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface Countable
|
||||
* Required by interface Countable.
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
@@ -51,7 +51,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface ArrayAccess
|
||||
* Required by interface ArrayAccess.
|
||||
*/
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
@@ -60,7 +60,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface ArrayAccess
|
||||
* Required by interface ArrayAccess.
|
||||
*/
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
@@ -73,7 +73,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface ArrayAccess
|
||||
* Required by interface ArrayAccess.
|
||||
*/
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
@@ -82,7 +82,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface ArrayAccess
|
||||
* Required by interface ArrayAccess.
|
||||
*/
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
@@ -93,7 +93,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Required by interface IteratorAggregate
|
||||
* Required by interface IteratorAggregate.
|
||||
*/
|
||||
public function getIterator()
|
||||
{
|
||||
@@ -101,15 +101,16 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds given element (at the end of collection)
|
||||
* Adds given element (at the end of collection).
|
||||
*
|
||||
* @param mixed $element The element to add
|
||||
* @param mixed $index (optional) Index / key of the element
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function add($element, $index = null)
|
||||
{
|
||||
if (null === $index || '' === $index) {
|
||||
if ($index === null) {
|
||||
$this->elements[] = $element;
|
||||
} else {
|
||||
$this->elements[$index] = $element;
|
||||
@@ -119,23 +120,23 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds given elements (at the end of collection)
|
||||
* Adds given elements (at the end of collection).
|
||||
*
|
||||
* @param array|Collection $elements The elements to add
|
||||
* @param bool|false $useIndexes (optional) If is set to true, indexes of given elements will be used in
|
||||
* this collection. Otherwise - not.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addMultiple($elements, $useIndexes = false)
|
||||
{
|
||||
if (!empty($elements)) {
|
||||
foreach ($elements as $index => $element) {
|
||||
if ($useIndexes) {
|
||||
$this->add($element, $index);
|
||||
continue;
|
||||
if (!$useIndexes) {
|
||||
$index = null;
|
||||
}
|
||||
|
||||
$this->add($element);
|
||||
$this->add($element, $index);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,9 +144,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepends given element (adds given element at the beginning of collection)
|
||||
* Prepends given element (adds given element at the beginning of collection).
|
||||
*
|
||||
* @param mixed $element The element to prepend
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function prepend($element)
|
||||
@@ -156,9 +158,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes given element
|
||||
* Removes given element.
|
||||
*
|
||||
* @param mixed $element The element to remove
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function remove($element)
|
||||
@@ -167,6 +170,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
foreach ($this->elements as $index => $existing) {
|
||||
if ($element === $existing) {
|
||||
unset($this->elements[$index]);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -176,7 +180,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if collection is empty
|
||||
* Returns information if collection is empty.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
@@ -186,9 +190,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given element is first in the collection
|
||||
* Returns information if given element is first in the collection.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isFirst($element)
|
||||
@@ -197,9 +202,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given element is last in the collection
|
||||
* Returns information if given element is last in the collection.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast($element)
|
||||
@@ -208,22 +214,24 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if the collection has given element, iow. if given element exists in the collection
|
||||
* Returns information if the collection has given element, iow. if given element exists in the collection.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function has($element)
|
||||
{
|
||||
$index = Arrays::getIndexOf($this->elements, $element);
|
||||
|
||||
return null !== $index && false !== $index;
|
||||
return $index !== null && $index !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns previous element for given element
|
||||
* Returns previous element for given element.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return mixed|null
|
||||
*/
|
||||
public function getPrevious($element)
|
||||
@@ -232,9 +240,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns next element for given element
|
||||
* Returns next element for given element.
|
||||
*
|
||||
* @param mixed $element The element to verify
|
||||
*
|
||||
* @return mixed|null
|
||||
*/
|
||||
public function getNext($element)
|
||||
@@ -243,7 +252,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first element in the collection
|
||||
* Returns the first element in the collection.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
@@ -253,7 +262,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last element in the collection
|
||||
* Returns the last element in the collection.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
@@ -263,7 +272,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array representation of the collection
|
||||
* Returns an array representation of the collection.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
@@ -273,9 +282,10 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if element with given index/key exists
|
||||
* Returns information if element with given index/key exists.
|
||||
*
|
||||
* @param string|int $index The index/key of element
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function exists($index)
|
||||
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;
|
||||
|
||||
/**
|
||||
* An exception used while name of class or trait cannot be resolved
|
||||
* An exception used while name of class or trait cannot be resolved.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class CannotResolveClassNameException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param array|object|string $source Source of the class's / trait's name. It can be an array of objects,
|
||||
* @param array|object|string $source Source of the class's / trait's name. It cane be an array of objects,
|
||||
* namespaces, object or namespace.
|
||||
* @param bool $forClass (optional) If is set to true, message of this exception for class is
|
||||
* prepared. Otherwise - for trait.
|
||||
* @return CannotResolveClassNameException
|
||||
*/
|
||||
public static function create($source, $forClass = true)
|
||||
public function __construct($source, $forClass = true)
|
||||
{
|
||||
$forWho = 'trait';
|
||||
$value = '';
|
||||
@@ -37,12 +36,12 @@ class CannotResolveClassNameException extends Exception
|
||||
}
|
||||
|
||||
if (is_scalar($source)) {
|
||||
$value = sprintf(' %s', (string)$source);
|
||||
$value = sprintf(' %s', (string) $source);
|
||||
}
|
||||
|
||||
$template = 'Name of %s from given \'%s\'%s cannot be resolved. Is there everything ok?';
|
||||
$message = sprintf($template, $forWho, gettype($source), $value);
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -12,28 +12,27 @@ use Exception;
|
||||
use Meritoo\Common\Utilities\Reflection;
|
||||
|
||||
/**
|
||||
* An exception used while given class has no child classes
|
||||
* An exception used while given class has no child classes.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class MissingChildClassesException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param array|object|string $parentClass Class that hasn't child classes, but it should. An array of objects,
|
||||
* strings, object or string.
|
||||
* @return MissingChildClassesException
|
||||
*/
|
||||
public static function create($parentClass)
|
||||
public function __construct($parentClass)
|
||||
{
|
||||
$template = 'The \'%s\' class requires one child class at least who will extend her (maybe is an abstract'
|
||||
. ' class), but the child classes are missing. Did you forget to extend this class?';
|
||||
.' class), but the child classes are missing. Did you forget to extend this class?';
|
||||
|
||||
$parentClassName = Reflection::getClassName($parentClass);
|
||||
$message = sprintf($template, $parentClassName);
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -12,29 +12,28 @@ use Exception;
|
||||
use Meritoo\Common\Utilities\Reflection;
|
||||
|
||||
/**
|
||||
* An exception used while given class has more than one child class
|
||||
* An exception used while given class has more than one child class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TooManyChildClassesException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param array|object|string $parentClass Class that has more than one child class, but it shouldn't. An array
|
||||
* of objects, strings, object or string.
|
||||
* @param array $childClasses Child classes
|
||||
* @return TooManyChildClassesException
|
||||
*/
|
||||
public static function create($parentClass, array $childClasses)
|
||||
public function __construct($parentClass, array $childClasses)
|
||||
{
|
||||
$template = "The '%s' class requires one child class at most who will extend her, but more than one child"
|
||||
. " class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
|
||||
." class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
|
||||
|
||||
$parentClassName = Reflection::getClassName($parentClass);
|
||||
$message = sprintf($template, $parentClassName, implode("\n- ", $childClasses), $parentClassName);
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -9,26 +9,24 @@
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while length of given hexadecimal value of color is incorrect
|
||||
* An exception used while length of given hexadecimal value of color is incorrect.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class IncorrectColorHexLengthException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string $color Incorrect hexadecimal value of color
|
||||
* @return IncorrectColorHexLengthException
|
||||
*/
|
||||
public static function create($color)
|
||||
public function __construct($color)
|
||||
{
|
||||
$template = 'Length of hexadecimal value of color \'%s\' is incorrect. It\'s %d, but it should be 3 or 6.'
|
||||
. ' Is there everything ok?';
|
||||
.' Is there everything ok?';
|
||||
|
||||
$message = sprintf($template, $color, strlen($color));
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -9,23 +9,21 @@
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while given hexadecimal value of color is invalid
|
||||
* An exception used while given hexadecimal value of color is invalid.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class InvalidColorHexValueException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string $color Invalid hexadecimal value of color
|
||||
* @return InvalidColorHexValueException
|
||||
*/
|
||||
public static function create($color)
|
||||
public function __construct($color)
|
||||
{
|
||||
$message = sprintf('Hexadecimal value of color \'%s\' is invalid. Is there everything ok?', $color);
|
||||
|
||||
return new static($message);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
23
src/Meritoo/Common/Exception/Regex/InvalidUrlException.php
Normal file
23
src/Meritoo/Common/Exception/Regex/InvalidUrlException.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while url is invalid.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class InvalidUrlException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string $url Invalid url
|
||||
*/
|
||||
public function __construct($url)
|
||||
{
|
||||
$message = sprintf('Url \'%s\' is invalid. Is there everything ok?', $url);
|
||||
parent::__construct($message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Meritoo\Common\Exception\Type;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* An exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is unknown.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class UnknownOopVisibilityTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct($unknownType)
|
||||
{
|
||||
parent::__construct($unknownType, new OopVisibilityType(), 'OOP-related visibility');
|
||||
}
|
||||
}
|
||||
@@ -6,34 +6,26 @@
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Traits\Test\Base;
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
use Meritoo\Common\Utilities\Miscellaneous;
|
||||
use PHPUnit_Framework_TestCase;
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* Trait for the base test case
|
||||
* Base test case with common methods and data providers.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
trait BaseTestCaseTrait
|
||||
abstract class BaseTestCase extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* Path of directory with data used by test cases
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private static $testsDataDirPath = 'data/tests';
|
||||
|
||||
/**
|
||||
* Provides an empty value
|
||||
* Provides an empty value.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -48,21 +40,7 @@ trait BaseTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides an empty scalar value
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideEmptyScalarValue()
|
||||
{
|
||||
yield[''];
|
||||
yield[' '];
|
||||
yield[null];
|
||||
yield[0];
|
||||
yield[false];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides boolean value
|
||||
* Provides boolean value.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -73,7 +51,7 @@ trait BaseTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides instance of DateTime class
|
||||
* Provides instance of DateTime class.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -86,7 +64,7 @@ trait BaseTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides relative / compound format of DateTime
|
||||
* Provides relative / compound format of DateTime.
|
||||
*
|
||||
* @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
|
||||
*/
|
||||
@@ -117,50 +95,26 @@ trait BaseTestCaseTrait
|
||||
yield['surprise/me/one/more/time.txt'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides non scalar value, e.g. [] or null
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideNonScalarValue()
|
||||
{
|
||||
yield[
|
||||
[],
|
||||
];
|
||||
|
||||
yield[
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
new stdClass(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns path of file used by tests.
|
||||
* It should be placed in /data/tests directory of this project.
|
||||
*
|
||||
* @param string $fileName Name of file
|
||||
* @param string $directoryPath (optional) Path of directory containing the file
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getFilePathForTesting($fileName, $directoryPath = '')
|
||||
public function getFilePathToTests($fileName, $directoryPath = '')
|
||||
{
|
||||
$rootPath = Miscellaneous::getProjectRootPath();
|
||||
if (!empty($directoryPath)) {
|
||||
$directoryPath = '/'.$directoryPath;
|
||||
}
|
||||
|
||||
$paths = [
|
||||
$rootPath,
|
||||
self::$testsDataDirPath,
|
||||
$directoryPath,
|
||||
$fileName,
|
||||
];
|
||||
|
||||
return Miscellaneous::concatenatePaths($paths);
|
||||
return sprintf('%s/../../../../../data/tests/%s%s', __DIR__, $fileName, $directoryPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies visibility and arguments of method
|
||||
* Verifies visibility and arguments of method.
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains method to verify
|
||||
* @param string|ReflectionMethod $method Name of method or just the method to verify
|
||||
@@ -170,13 +124,14 @@ trait BaseTestCaseTrait
|
||||
* verified method
|
||||
* @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments
|
||||
* of the verified method
|
||||
*
|
||||
* @throws UnknownOopVisibilityTypeException
|
||||
*
|
||||
* Attention. 2nd argument, the $method, may be:
|
||||
* - string - name of the method
|
||||
* - instance of ReflectionMethod - just the method (provided by ReflectionClass::getMethod() method)
|
||||
*/
|
||||
protected static function assertMethodVisibilityAndArguments(
|
||||
protected function verifyMethodVisibilityAndArguments(
|
||||
$classNamespace,
|
||||
$method,
|
||||
$visibilityType,
|
||||
@@ -203,14 +158,17 @@ trait BaseTestCaseTrait
|
||||
switch ($visibilityType) {
|
||||
case OopVisibilityType::IS_PUBLIC:
|
||||
static::assertTrue($method->isPublic());
|
||||
|
||||
break;
|
||||
|
||||
case OopVisibilityType::IS_PROTECTED:
|
||||
static::assertTrue($method->isProtected());
|
||||
|
||||
break;
|
||||
|
||||
case OopVisibilityType::IS_PRIVATE:
|
||||
static::assertTrue($method->isPrivate());
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
* constants.
|
||||
* @param int $argumentsCount (optional) Expected count/amount of arguments of the verified method
|
||||
* @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments of the verified
|
||||
* method
|
||||
*
|
||||
* @throws UnknownOopVisibilityTypeException
|
||||
*/
|
||||
protected static function assertConstructorVisibilityAndArguments(
|
||||
protected function verifyConstructorVisibilityAndArguments(
|
||||
$classNamespace,
|
||||
$visibilityType,
|
||||
$argumentsCount = 0,
|
||||
@@ -240,38 +200,6 @@ trait BaseTestCaseTrait
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
$method = $reflection->getConstructor();
|
||||
|
||||
static::assertMethodVisibilityAndArguments(
|
||||
$classNamespace,
|
||||
$method,
|
||||
$visibilityType,
|
||||
$argumentsCount,
|
||||
$requiredArgumentsCount
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that class with given namespace has no constructor
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains constructor to verify
|
||||
*/
|
||||
protected static function assertHasNoConstructor($classNamespace)
|
||||
{
|
||||
/*
|
||||
* Let's grab the constructor
|
||||
*/
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
$constructor = $reflection->getConstructor();
|
||||
|
||||
static::assertNull($constructor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets path of directory with data used by test cases
|
||||
*
|
||||
* @param string $testsDataDirPath Path of directory with data used by test cases
|
||||
*/
|
||||
protected static function setTestsDataDirPath($testsDataDirPath)
|
||||
{
|
||||
static::$testsDataDirPath = $testsDataDirPath;
|
||||
return $this->verifyMethodVisibilityAndArguments($classNamespace, $method, $visibilityType, $argumentsCount, $requiredArgumentsCount);
|
||||
}
|
||||
}
|
||||
@@ -1,26 +1,20 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Traits\Test\Base;
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
|
||||
/**
|
||||
* Trait for the base test case for the type of something
|
||||
* Base test case for the type of something.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
trait BaseTypeTestCaseTrait
|
||||
abstract class BaseTypeTestCase extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* Verifies availability of all types
|
||||
* Verifies availability of all types.
|
||||
*/
|
||||
public function testAvailabilityOfAllTypes()
|
||||
{
|
||||
@@ -31,7 +25,7 @@ trait BaseTypeTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies whether given type is correct or not
|
||||
* Verifies whether given type is correct or not.
|
||||
*
|
||||
* @param string $type Type to verify
|
||||
* @param bool $expected Information if given type is correct or not
|
||||
@@ -44,21 +38,21 @@ trait BaseTypeTestCaseTrait
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type to verify and information if it's correct
|
||||
* Provides type to verify and information if it's correct.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
abstract public function provideTypeToVerify();
|
||||
|
||||
/**
|
||||
* Returns instance of the tested type
|
||||
* Returns instance of the tested type.
|
||||
*
|
||||
* @return BaseType
|
||||
*/
|
||||
abstract protected function getTestedTypeInstance();
|
||||
|
||||
/**
|
||||
* Returns all expected types of the tested type
|
||||
* Returns all expected types of the tested type.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
@@ -14,26 +14,26 @@ use Meritoo\Common\Utilities\Reflection;
|
||||
* Base / abstract type of something, e.g. type of button, order, date etc.
|
||||
* Child class should contain constants - each of them represent one type.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
abstract class BaseType
|
||||
{
|
||||
/**
|
||||
* All types
|
||||
* All types.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $all;
|
||||
|
||||
/**
|
||||
* Returns all types
|
||||
* Returns all types.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAll()
|
||||
{
|
||||
if (null === $this->all) {
|
||||
if ($this->all === null) {
|
||||
$this->all = Reflection::getConstants($this);
|
||||
}
|
||||
|
||||
@@ -41,9 +41,10 @@ abstract class BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given type is correct
|
||||
* Returns information if given type is correct.
|
||||
*
|
||||
* @param string $type The type to check
|
||||
*
|
||||
* @param mixed $type The type to check
|
||||
* @return bool
|
||||
*/
|
||||
public function isCorrectType($type)
|
||||
@@ -11,50 +11,50 @@ namespace Meritoo\Common\Type;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
|
||||
/**
|
||||
* Type of date part, e.g. "year"
|
||||
* Type of date part, e.g. "year".
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class DatePartType extends BaseType
|
||||
{
|
||||
/**
|
||||
* The "day" date part
|
||||
* The "day" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const DAY = 'day';
|
||||
|
||||
/**
|
||||
* The "hour" date part
|
||||
* The "hour" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const HOUR = 'hour';
|
||||
|
||||
/**
|
||||
* The "minute" date part
|
||||
* The "minute" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const MINUTE = 'minute';
|
||||
|
||||
/**
|
||||
* The "month" date part
|
||||
* The "month" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const MONTH = 'month';
|
||||
|
||||
/**
|
||||
* The "second" date part
|
||||
* The "second" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const SECOND = 'second';
|
||||
|
||||
/**
|
||||
* The "year" date part
|
||||
* The "year" date part.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
@@ -5,31 +5,31 @@ namespace Meritoo\Common\Type;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
|
||||
/**
|
||||
* The visibility of a property, a method or (as of PHP 7.1.0) a constant
|
||||
* The visibility of a property, a method or (as of PHP 7.1.0) a constant.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*
|
||||
* @see http://php.net/manual/en/language.oop5.visibility.php
|
||||
*/
|
||||
class OopVisibilityType extends BaseType
|
||||
{
|
||||
/**
|
||||
* The "private" visibility of OOP
|
||||
* The "private" visibility of OOP.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const IS_PRIVATE = 3;
|
||||
|
||||
/**
|
||||
* The "protected" visibility of OOP
|
||||
* The "protected" visibility of OOP.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const IS_PROTECTED = 2;
|
||||
|
||||
/**
|
||||
* The "public" visibility of OOP
|
||||
* The "public" visibility of OOP.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
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;
|
||||
|
||||
/**
|
||||
* Useful Composer-related methods (only static functions)
|
||||
* Useful Composer-related methods (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Composer
|
||||
{
|
||||
/**
|
||||
* Name of the Composer's main file with configuration in Json format
|
||||
* Name of the Composer's main file with configuration in Json format.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const FILE_NAME_MAIN = 'composer.json';
|
||||
|
||||
/**
|
||||
* Returns value from composer.json file
|
||||
* Returns value from composer.json file.
|
||||
*
|
||||
* @param string $composerJsonPath Path of composer.json file
|
||||
* @param string $nodeName Name of node who value should be returned
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getValue($composerJsonPath, $nodeName)
|
||||
@@ -59,7 +60,7 @@ class Composer
|
||||
* Unknown data from the composer.json file or there is no node with given name?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (null === $data || !isset($data->{$nodeName})) {
|
||||
if ($data === null || !isset($data->{$nodeName})) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -10,16 +10,14 @@ namespace Meritoo\Common\Utilities;
|
||||
|
||||
use DateInterval;
|
||||
use DateTime;
|
||||
use Exception;
|
||||
use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
use Meritoo\Common\Type\DatePeriod;
|
||||
|
||||
/**
|
||||
* Useful date methods
|
||||
* Useful date methods.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Date
|
||||
{
|
||||
@@ -64,125 +62,110 @@ class Date
|
||||
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.
|
||||
* @throws Exception
|
||||
* @return null|DatePeriod
|
||||
*
|
||||
* @return DatePeriod
|
||||
*/
|
||||
public static function getDatesForPeriod($period)
|
||||
{
|
||||
/*
|
||||
* Type of period is incorrect?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!(new DatePeriod())->isCorrectType($period)) {
|
||||
return null;
|
||||
}
|
||||
$datePeriod = null;
|
||||
|
||||
$dateStart = null;
|
||||
$dateEnd = null;
|
||||
if (DatePeriod::isCorrectPeriod($period)) {
|
||||
$dateStart = null;
|
||||
$dateEnd = null;
|
||||
|
||||
switch ($period) {
|
||||
case DatePeriod::LAST_WEEK:
|
||||
$thisWeekStart = new DateTime('this week');
|
||||
switch ($period) {
|
||||
case DatePeriod::LAST_WEEK:
|
||||
$thisWeekStart = new DateTime('this week');
|
||||
|
||||
$dateStart = clone $thisWeekStart;
|
||||
$dateEnd = clone $thisWeekStart;
|
||||
$dateStart = clone $thisWeekStart;
|
||||
$dateEnd = clone $thisWeekStart;
|
||||
|
||||
$dateStart->sub(new DateInterval('P7D'));
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
$dateStart->sub(new DateInterval('P7D'));
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::THIS_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
break;
|
||||
case DatePeriod::THIS_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::NEXT_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
$dateStart->add(new DateInterval('P7D'));
|
||||
break;
|
||||
case DatePeriod::NEXT_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
$dateStart->add(new DateInterval('P7D'));
|
||||
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::LAST_MONTH:
|
||||
$dateStart = new DateTime('first day of last month');
|
||||
$dateEnd = new DateTime('last day of last month');
|
||||
break;
|
||||
case DatePeriod::LAST_MONTH:
|
||||
$dateStart = new DateTime('first day of last month');
|
||||
$dateEnd = new DateTime('last day of last month');
|
||||
|
||||
break;
|
||||
case DatePeriod::THIS_MONTH:
|
||||
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
|
||||
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
|
||||
break;
|
||||
case DatePeriod::THIS_MONTH:
|
||||
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
|
||||
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
|
||||
|
||||
if (null !== $lastMonth) {
|
||||
$dateStart = $lastMonth->getEndDate();
|
||||
$dateStart->add(new DateInterval('P1D'));
|
||||
}
|
||||
|
||||
if (null !== $nextMonth) {
|
||||
$dateEnd = $nextMonth->getStartDate();
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
}
|
||||
|
||||
break;
|
||||
case DatePeriod::NEXT_MONTH:
|
||||
$dateStart = new DateTime('first day of next month');
|
||||
$dateEnd = new DateTime('last day of next month');
|
||||
break;
|
||||
case DatePeriod::NEXT_MONTH:
|
||||
$dateStart = new DateTime('first day of next month');
|
||||
$dateEnd = new DateTime('last day of next month');
|
||||
|
||||
break;
|
||||
case DatePeriod::LAST_YEAR:
|
||||
case DatePeriod::THIS_YEAR:
|
||||
case DatePeriod::NEXT_YEAR:
|
||||
$dateStart = new DateTime();
|
||||
$dateEnd = new DateTime();
|
||||
break;
|
||||
case DatePeriod::LAST_YEAR:
|
||||
case DatePeriod::THIS_YEAR:
|
||||
case DatePeriod::NEXT_YEAR:
|
||||
$dateStart = new DateTime();
|
||||
$dateEnd = new DateTime();
|
||||
|
||||
$yearPeriod = [
|
||||
DatePeriod::LAST_YEAR,
|
||||
DatePeriod::NEXT_YEAR,
|
||||
];
|
||||
if ($period == DatePeriod::LAST_YEAR || $period == DatePeriod::NEXT_YEAR) {
|
||||
$yearDifference = 1;
|
||||
|
||||
if (in_array($period, $yearPeriod, true)) {
|
||||
$yearDifference = 1;
|
||||
if ($period == DatePeriod::LAST_YEAR) {
|
||||
$yearDifference *= -1;
|
||||
}
|
||||
|
||||
if (DatePeriod::LAST_YEAR === $period) {
|
||||
$yearDifference *= -1;
|
||||
$modifyString = sprintf('%s year', $yearDifference);
|
||||
$dateStart->modify($modifyString);
|
||||
$dateEnd->modify($modifyString);
|
||||
}
|
||||
|
||||
$modifyString = sprintf('%s year', $yearDifference);
|
||||
$dateStart->modify($modifyString);
|
||||
$dateEnd->modify($modifyString);
|
||||
}
|
||||
$year = $dateStart->format('Y');
|
||||
$dateStart->setDate($year, 1, 1);
|
||||
$dateEnd->setDate($year, 12, 31);
|
||||
|
||||
$year = $dateStart->format('Y');
|
||||
$dateStart->setDate($year, 1, 1);
|
||||
$dateEnd->setDate($year, 12, 31);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
if ($dateStart !== null && $dateEnd !== null) {
|
||||
$dateStart->setTime(0, 0, 0);
|
||||
$dateEnd->setTime(23, 59, 59);
|
||||
|
||||
$datePeriod = new DatePeriod($dateStart, $dateEnd);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Start or end date is unknown?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (null === $dateStart || null === $dateEnd) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$dateStart->setTime(0, 0);
|
||||
$dateEnd->setTime(23, 59, 59);
|
||||
|
||||
return new DatePeriod($dateStart, $dateEnd);
|
||||
return $datePeriod;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates and returns random time (the hour, minute and second values)
|
||||
* Generates and returns random time (the hour, minute and second values).
|
||||
*
|
||||
* @param string $format (optional) Format of returned value. A string acceptable by the DateTime::format()
|
||||
* method.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function generateRandomTime($format = 'H:i:s')
|
||||
@@ -222,12 +205,11 @@ class Date
|
||||
|
||||
return $dateTime
|
||||
->setTime($hour, $minute, $second)
|
||||
->format($format)
|
||||
;
|
||||
->format($format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns current day of week
|
||||
* Returns current day of week.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
@@ -250,34 +232,35 @@ class Date
|
||||
* @param int $month The month value
|
||||
* @param int $day The day value
|
||||
*
|
||||
* @throws UnknownDatePartTypeException
|
||||
* @return int
|
||||
*
|
||||
* @throws UnknownDatePartTypeException
|
||||
*/
|
||||
public static function getDayOfWeek($year, $month, $day)
|
||||
{
|
||||
$year = (int)$year;
|
||||
$month = (int)$month;
|
||||
$day = (int)$day;
|
||||
$year = (int) $year;
|
||||
$month = (int) $month;
|
||||
$day = (int) $day;
|
||||
|
||||
/*
|
||||
* Oops, incorrect year
|
||||
*/
|
||||
if ($year <= 0) {
|
||||
throw UnknownDatePartTypeException::createException(DatePartType::YEAR, $year);
|
||||
throw new UnknownDatePartTypeException(DatePartType::YEAR, $year);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, incorrect month
|
||||
*/
|
||||
if ($month < 1 || $month > 12) {
|
||||
throw UnknownDatePartTypeException::createException(DatePartType::MONTH, $month);
|
||||
throw new UnknownDatePartTypeException(DatePartType::MONTH, $month);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, incorrect day
|
||||
*/
|
||||
if ($day < 1 || $day > 31) {
|
||||
throw UnknownDatePartTypeException::createException(DatePartType::DAY, $day);
|
||||
throw new UnknownDatePartTypeException(DatePartType::DAY, $day);
|
||||
}
|
||||
|
||||
if ($month < 3) {
|
||||
@@ -297,7 +280,7 @@ class Date
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns based on locale name of current weekday
|
||||
* Returns based on locale name of current weekday.
|
||||
*
|
||||
* @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 $month The month value
|
||||
* @param int $day The day value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getDayOfWeekName($year, $month, $day)
|
||||
@@ -331,7 +315,7 @@ class Date
|
||||
|
||||
$encoding = mb_detect_encoding($name);
|
||||
|
||||
if (false === $encoding) {
|
||||
if ($encoding === false) {
|
||||
$name = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-2');
|
||||
}
|
||||
|
||||
@@ -355,9 +339,10 @@ class Date
|
||||
*
|
||||
* @param string|DateTime $dateStart The start 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
|
||||
* returned in the array.
|
||||
*
|
||||
* @return array|int
|
||||
*/
|
||||
public static function getDateDifference($dateStart, $dateEnd, $differenceUnit = null)
|
||||
@@ -376,11 +361,11 @@ class Date
|
||||
return null;
|
||||
}
|
||||
|
||||
$start = self::getDateTime($dateStart, true);
|
||||
$end = self::getDateTime($dateEnd, true);
|
||||
$dateStart = self::getDateTime($dateStart, true);
|
||||
$dateEnd = self::getDateTime($dateEnd, true);
|
||||
|
||||
$difference = [];
|
||||
$dateDiff = $end->getTimestamp() - $start->getTimestamp();
|
||||
$dateDiff = $dateEnd->getTimestamp() - $dateStart->getTimestamp();
|
||||
|
||||
$daysInSeconds = 0;
|
||||
$hoursInSeconds = 0;
|
||||
@@ -398,46 +383,46 @@ class Date
|
||||
self::DATE_DIFFERENCE_UNIT_MINUTES,
|
||||
];
|
||||
|
||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_YEARS === $differenceUnit) {
|
||||
$diff = $end->diff($start);
|
||||
if ($differenceUnit === null || $differenceUnit == self::DATE_DIFFERENCE_UNIT_YEARS) {
|
||||
$diff = $dateEnd->diff($dateStart);
|
||||
|
||||
/*
|
||||
* Difference between dates in years should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_YEARS === $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_YEARS) {
|
||||
return $diff->y;
|
||||
}
|
||||
|
||||
$difference[self::DATE_DIFFERENCE_UNIT_YEARS] = $diff->y;
|
||||
}
|
||||
|
||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_MONTHS === $differenceUnit) {
|
||||
$diff = $end->diff($start);
|
||||
if ($differenceUnit === null || $differenceUnit == self::DATE_DIFFERENCE_UNIT_MONTHS) {
|
||||
$diff = $dateEnd->diff($dateStart);
|
||||
|
||||
/*
|
||||
* Difference between dates in months should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_MONTHS === $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_MONTHS) {
|
||||
return $diff->m;
|
||||
}
|
||||
|
||||
$difference[self::DATE_DIFFERENCE_UNIT_MONTHS] = $diff->m;
|
||||
}
|
||||
|
||||
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits, true)) {
|
||||
$days = (int)floor($dateDiff / $daySeconds);
|
||||
if ($differenceUnit === null || in_array($differenceUnit, $relatedUnits)) {
|
||||
$days = (int) floor($dateDiff / $daySeconds);
|
||||
|
||||
/*
|
||||
* Difference between dates in days should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_DAYS === $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_DAYS) {
|
||||
return $days;
|
||||
}
|
||||
|
||||
/*
|
||||
* All units should be returned?
|
||||
*/
|
||||
if (null === $differenceUnit) {
|
||||
if ($differenceUnit === null) {
|
||||
$difference[self::DATE_DIFFERENCE_UNIT_DAYS] = $days;
|
||||
}
|
||||
|
||||
@@ -447,20 +432,20 @@ class Date
|
||||
$daysInSeconds = $days * $daySeconds;
|
||||
}
|
||||
|
||||
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits, true)) {
|
||||
$hours = (int)floor(($dateDiff - $daysInSeconds) / $hourSeconds);
|
||||
if ($differenceUnit === null || in_array($differenceUnit, $relatedUnits)) {
|
||||
$hours = (int) floor(($dateDiff - $daysInSeconds) / $hourSeconds);
|
||||
|
||||
/*
|
||||
* Difference between dates in hours should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_HOURS === $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_HOURS) {
|
||||
return $hours;
|
||||
}
|
||||
|
||||
/*
|
||||
* All units should be returned?
|
||||
*/
|
||||
if (null === $differenceUnit) {
|
||||
if ($differenceUnit === null) {
|
||||
$difference[self::DATE_DIFFERENCE_UNIT_HOURS] = $hours;
|
||||
}
|
||||
|
||||
@@ -470,13 +455,13 @@ class Date
|
||||
$hoursInSeconds = $hours * $hourSeconds;
|
||||
}
|
||||
|
||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_MINUTES === $differenceUnit) {
|
||||
$minutes = (int)floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60);
|
||||
if ($differenceUnit === null || $differenceUnit == self::DATE_DIFFERENCE_UNIT_MINUTES) {
|
||||
$minutes = (int) floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60);
|
||||
|
||||
/*
|
||||
* Difference between dates in minutes should be returned only?
|
||||
*/
|
||||
if (self::DATE_DIFFERENCE_UNIT_MINUTES === $differenceUnit) {
|
||||
if ($differenceUnit == self::DATE_DIFFERENCE_UNIT_MINUTES) {
|
||||
return $minutes;
|
||||
}
|
||||
|
||||
@@ -495,7 +480,7 @@ class Date
|
||||
* @param string $intervalTemplate (optional) Template used to build date interval. It should contain "%d" as the
|
||||
* placeholder which is replaced with a number that represents each iteration.
|
||||
* Default: interval for days.
|
||||
* @throws Exception
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getDatesCollection(DateTime $startDate, $datesCount, $intervalTemplate = 'P%dD')
|
||||
@@ -521,7 +506,7 @@ class Date
|
||||
$matchCount = preg_match($intervalPattern, $intervalTemplate, $matches);
|
||||
|
||||
if ($matchCount > 0 && (!empty($matches[1]) || !empty($matches[2]))) {
|
||||
$datesCount = (int)$datesCount;
|
||||
$datesCount = (int) $datesCount;
|
||||
|
||||
for ($index = 1; $index <= $datesCount; ++$index) {
|
||||
$date = clone $startDate;
|
||||
@@ -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
|
||||
* be used (default behaviour).
|
||||
* @param int $start (optional) Start of random partition. If not provided, 1 will be used
|
||||
* (default behaviour).
|
||||
* @param int $end (optional) End of random partition. If not provided, 100 will be used
|
||||
* (default behaviour).
|
||||
* @param DateTime $startDate The start date. Start of the random date.
|
||||
* @param int $start (optional) Start of random partition
|
||||
* @param int $end (optional) End of random partition
|
||||
* @param string $intervalTemplate (optional) Template used to build date interval. The placeholder is replaced
|
||||
* with next, iterated value. If not provided, "P%sD" will be used (default
|
||||
* behaviour).
|
||||
* @throws Exception
|
||||
* with next, iterated value.
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
public static function getRandomDate(DateTime $startDate = null, $start = 1, $end = 100, $intervalTemplate = 'P%sD')
|
||||
{
|
||||
if (null === $startDate) {
|
||||
if ($startDate === null) {
|
||||
$startDate = new DateTime();
|
||||
}
|
||||
|
||||
$start = (int)$start;
|
||||
$end = (int)$end;
|
||||
$start = (int) $start;
|
||||
$end = (int) $end;
|
||||
|
||||
/*
|
||||
* Incorrect end of random partition?
|
||||
@@ -566,7 +547,7 @@ class Date
|
||||
}
|
||||
|
||||
$randomDate = clone $startDate;
|
||||
$randomInterval = new DateInterval(sprintf($intervalTemplate, mt_rand($start, $end)));
|
||||
$randomInterval = new DateInterval(sprintf($intervalTemplate, rand($start, $end)));
|
||||
|
||||
return $randomDate->add($randomInterval);
|
||||
}
|
||||
@@ -578,11 +559,11 @@ class Date
|
||||
* @param mixed $value The value which maybe is a date
|
||||
* @param bool $allowCompoundFormats (optional) If is set to true, the compound formats used to create an
|
||||
* instance of DateTime class are allowed (e.g. "now", "last day of next
|
||||
* month", "yyyy"). Otherwise - not and every incorrect value is refused
|
||||
* (default behaviour).
|
||||
* month", "yyyy"). Otherwise - not and every incorrect value is refused.
|
||||
* @param string $dateFormat (optional) Format of date used to verify if given value is actually a date.
|
||||
* It should be format matched to the given value, e.g. "Y-m-d H:i" for
|
||||
* "2015-01-01 10:00" value. Default: "Y-m-d".
|
||||
* "2015-01-01 10:00" value.
|
||||
*
|
||||
* @return DateTime|bool
|
||||
*/
|
||||
public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d')
|
||||
@@ -617,7 +598,7 @@ class Date
|
||||
*/
|
||||
$dateFromFormat = DateTime::createFromFormat($dateFormat, $value);
|
||||
|
||||
if (false === $dateFromFormat) {
|
||||
if ($dateFromFormat === false) {
|
||||
/*
|
||||
* Nothing to do more, because:
|
||||
* a) instance of the DateTime was created
|
||||
@@ -650,7 +631,7 @@ class Date
|
||||
* 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)
|
||||
*/
|
||||
if (in_array($value, $specialFormats, true)) {
|
||||
if (in_array($value, $specialFormats)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -675,7 +656,7 @@ class Date
|
||||
*/
|
||||
$dateString = (new DateTime())->format($value);
|
||||
|
||||
if ($dateString !== (string)$value) {
|
||||
if ($dateString != $value) {
|
||||
return new DateTime($dateString);
|
||||
}
|
||||
} 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 bool $allowCompoundFormats (optional) If is set to true, the compound formats used to create an
|
||||
* instance of DateTime class are allowed (e.g. "now", "last day of next
|
||||
* month", "yyyy"). Otherwise - not and every incorrect value is refused.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidDate($value, $allowCompoundFormats = false)
|
||||
@@ -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
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidDateFormat($format)
|
||||
@@ -719,7 +702,7 @@ class Date
|
||||
* Formatted date it's the format who is validated?
|
||||
* The format is invalid
|
||||
*/
|
||||
if ($formatted === $format) {
|
||||
if ($formatted == $format) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -6,100 +6,98 @@
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Type;
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use DateTime;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
use Meritoo\Common\Utilities\Date;
|
||||
|
||||
/**
|
||||
* A date's period.
|
||||
* Contains start and end date of the period.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class DatePeriod extends BaseType
|
||||
class DatePeriod
|
||||
{
|
||||
/**
|
||||
* The period constant: last month
|
||||
* The period constant: last month.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const LAST_MONTH = 4;
|
||||
|
||||
/**
|
||||
* The period constant: last week
|
||||
* The period constant: last week.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const LAST_WEEK = 1;
|
||||
|
||||
/**
|
||||
* The period constant: last year
|
||||
* The period constant: last year.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const LAST_YEAR = 7;
|
||||
|
||||
/**
|
||||
* The period constant: next month
|
||||
* The period constant: next month.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const NEXT_MONTH = 6;
|
||||
|
||||
/**
|
||||
* The period constant: next week
|
||||
* The period constant: next week.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const NEXT_WEEK = 3;
|
||||
|
||||
/**
|
||||
* The period constant: next year
|
||||
* The period constant: next year.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const NEXT_YEAR = 9;
|
||||
|
||||
/**
|
||||
* The period constant: this month
|
||||
* The period constant: this month.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const THIS_MONTH = 5;
|
||||
|
||||
/**
|
||||
* The period constant: this week
|
||||
* The period constant: this week.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const THIS_WEEK = 2;
|
||||
|
||||
/**
|
||||
* The period constant: this year
|
||||
* The period constant: this year.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const THIS_YEAR = 8;
|
||||
|
||||
/**
|
||||
* The start date of period
|
||||
* The start date of period.
|
||||
*
|
||||
* @var DateTime
|
||||
*/
|
||||
private $startDate;
|
||||
|
||||
/**
|
||||
* The end date of period
|
||||
* The end date of period.
|
||||
*
|
||||
* @var DateTime
|
||||
*/
|
||||
private $endDate;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
* Class constructor.
|
||||
*
|
||||
* @param DateTime $startDate (optional) The start date of period
|
||||
* @param DateTime $endDate (optional) The end date of period
|
||||
@@ -111,10 +109,23 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns formatted one of the period's date: start date or end date
|
||||
* Returns information if given period is correct.
|
||||
*
|
||||
* @param int $period The period to verify
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isCorrectPeriod($period)
|
||||
{
|
||||
return in_array($period, Reflection::getConstants(__CLASS__));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns formatted one of the period's date: start date or end date.
|
||||
*
|
||||
* @param string $format Format used to format the date
|
||||
* @param bool $startDate (optional) If is set to true, start date is formatted. Otherwise - end date.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getFormattedDate($format, $startDate = true)
|
||||
@@ -131,7 +142,7 @@ class DatePeriod extends BaseType
|
||||
/*
|
||||
* Unknown date or format is invalid?
|
||||
*/
|
||||
if (null === $date || !Date::isValidDateFormat($format)) {
|
||||
if ($date === null || !Date::isValidDateFormat($format)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -139,7 +150,7 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the end date of period
|
||||
* Returns the end date of period.
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
@@ -149,9 +160,10 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the end date of period
|
||||
* Sets the end date of period.
|
||||
*
|
||||
* @param DateTime $endDate (optional) The end date of period
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setEndDate(DateTime $endDate = null)
|
||||
@@ -162,7 +174,7 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the start date of period
|
||||
* Returns the start date of period.
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
@@ -172,9 +184,10 @@ class DatePeriod extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the start date of period
|
||||
* Sets the start date of period.
|
||||
*
|
||||
* @param DateTime $startDate (optional) The start date of period
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setStartDate(DateTime $startDate = null)
|
||||
@@ -11,17 +11,18 @@ namespace Meritoo\Common\Utilities;
|
||||
use Generator;
|
||||
|
||||
/**
|
||||
* Useful methods for the Generator class (only static functions)
|
||||
* Useful methods for the Generator class (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class GeneratorUtility
|
||||
{
|
||||
/**
|
||||
* Returns elements of generator
|
||||
* Returns elements of generator.
|
||||
*
|
||||
* @param Generator $generator The generator who elements should be returned
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getGeneratorElements(Generator $generator)
|
||||
@@ -9,21 +9,22 @@
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
/**
|
||||
* Useful locale methods
|
||||
* Useful locale methods.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Locale
|
||||
{
|
||||
/**
|
||||
* Sets locale for given category using given language and country code
|
||||
* Sets locale for given category using given language and country code.
|
||||
*
|
||||
* @param int $category Named constant specifying the category of the functions affected by the locale
|
||||
* setting. It's the same constant as required by setlocale() function.
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
* @param string $countryCode (optional) Country code, in ISO 3166-1 alpha-2 format, e.g. "FR"
|
||||
* @return false|string
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* Available categories (values of $category argument):
|
||||
* - LC_ALL for all of the below
|
||||
@@ -36,7 +37,7 @@ class Locale
|
||||
*/
|
||||
public static function setLocale($category, $languageCode, $countryCode = '')
|
||||
{
|
||||
$category = (int)$category;
|
||||
$category = (int) $category;
|
||||
|
||||
if (is_string($languageCode)) {
|
||||
$languageCode = trim($languageCode);
|
||||
@@ -52,42 +53,23 @@ class Locale
|
||||
LC_MESSAGES,
|
||||
];
|
||||
|
||||
if (empty($languageCode) || !in_array($category, $availableCategories, true)) {
|
||||
if (empty($languageCode) || !in_array($category, $availableCategories)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$localeLongForm = self::getLongForm($languageCode, $countryCode);
|
||||
setlocale($category, $localeLongForm);
|
||||
|
||||
return setlocale($category, $localeLongForm);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns locale for given category
|
||||
*
|
||||
* @param int $category Named constant specifying the category of the functions affected by the locale setting.
|
||||
* It's the same constant as required by setlocale() function.
|
||||
* @return string
|
||||
*
|
||||
* Available categories (values of $category argument):
|
||||
* - LC_ALL for all of the below
|
||||
* - LC_COLLATE for string comparison, see strcoll()
|
||||
* - LC_CTYPE for character classification and conversion, for example strtoupper()
|
||||
* - LC_MONETARY for localeconv()
|
||||
* - LC_NUMERIC for decimal separator (See also localeconv())
|
||||
* - LC_TIME for date and time formatting with strftime()
|
||||
* - LC_MESSAGES for system responses (available if PHP was compiled with libintl)
|
||||
*/
|
||||
public static function getLocale($category)
|
||||
{
|
||||
return setlocale($category, '0');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns long form of the locale
|
||||
* Returns long form of the locale.
|
||||
*
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
* @param string $countryCode (optional) Country code, in ISO 3166-1 alpha-2 format, e.g. "FR"
|
||||
* @param string $encoding (optional) Encoding of the final locale
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* Example:
|
||||
822
src/Meritoo/Common/Utilities/MimeTypes.php
Normal file
822
src/Meritoo/Common/Utilities/MimeTypes.php
Normal file
@@ -0,0 +1,822 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
/**
|
||||
* Useful methods for mime types of files.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class MimeTypes
|
||||
{
|
||||
/**
|
||||
* Mime types data.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $mimeTypes = [
|
||||
'7z' => 'application/x-7z-compressed',
|
||||
'ez' => 'application/andrew-inset',
|
||||
'atom' => 'application/atom+xml',
|
||||
'atomcat' => 'application/atomcat+xml',
|
||||
'atomsvc' => 'application/atomsvc+xml',
|
||||
'ccxml' => 'application/ccxml+xml',
|
||||
'davmount' => 'application/davmount+xml',
|
||||
'ecma' => 'application/ecmascript',
|
||||
'pfr' => 'application/font-tdpfr',
|
||||
'stk' => 'application/hyperstudio',
|
||||
'js' => 'application/javascript',
|
||||
'json' => 'application/json',
|
||||
'hqx' => 'application/mac-binhex40',
|
||||
'cpt' => 'application/mac-compactpro',
|
||||
'mrc' => 'application/marc',
|
||||
'ma' => 'application/mathematica',
|
||||
'nb' => 'application/mathematica',
|
||||
'mb' => 'application/mathematica',
|
||||
'mathml' => 'application/mathml+xml',
|
||||
'mbox' => 'application/mbox',
|
||||
'mscml' => 'application/mediaservercontrol+xml',
|
||||
'mp4s' => 'application/mp4',
|
||||
'dot' => 'application/msword',
|
||||
'doc' => 'application/msword',
|
||||
/*
|
||||
* MS Office system file format MIME types
|
||||
* http://technet.microsoft.com/en-us/library/ee309278%28office.12%29.aspx
|
||||
*/
|
||||
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
'mxf' => 'application/mxf',
|
||||
'bin' => 'application/octet-stream',
|
||||
'dms' => 'application/octet-stream',
|
||||
'lha' => 'application/octet-stream',
|
||||
'lzh' => 'application/octet-stream',
|
||||
'class' => 'application/octet-stream',
|
||||
'so' => 'application/octet-stream',
|
||||
'iso' => 'application/octet-stream',
|
||||
'dmg' => 'application/octet-stream',
|
||||
'dist' => 'application/octet-stream',
|
||||
'distz' => 'application/octet-stream',
|
||||
'pkg' => 'application/octet-stream',
|
||||
'bpk' => 'application/octet-stream',
|
||||
'dump' => 'application/octet-stream',
|
||||
'elc' => 'application/octet-stream',
|
||||
'scpt' => 'application/octet-stream',
|
||||
'oda' => 'application/oda',
|
||||
'ogg' => 'application/ogg',
|
||||
'pdf' => 'application/pdf',
|
||||
'pgp' => 'application/pgp-encrypted',
|
||||
'asc' => 'application/pgp-signature',
|
||||
'sig' => 'application/pgp-signature',
|
||||
'prf' => 'application/pics-rules',
|
||||
'p10' => 'application/pkcs10',
|
||||
'p7m' => 'application/pkcs7-mime',
|
||||
'p7c' => 'application/pkcs7-mime',
|
||||
'p7s' => 'application/pkcs7-signature',
|
||||
'cer' => 'application/pkix-cert',
|
||||
'crl' => 'application/pkix-crl',
|
||||
'pkipath' => 'application/pkix-pkipath',
|
||||
'pki' => 'application/pkixcmp',
|
||||
'pls' => 'application/pls+xml',
|
||||
'ai' => 'application/postscript',
|
||||
'eps' => 'application/postscript',
|
||||
'ps' => 'application/postscript',
|
||||
'cww' => 'application/prs.cww',
|
||||
'rdf' => 'application/rdf+xml',
|
||||
'rif' => 'application/reginfo+xml',
|
||||
'rnc' => 'application/relax-ng-compact-syntax',
|
||||
'rl' => 'application/resource-lists+xml',
|
||||
'rs' => 'application/rls-services+xml',
|
||||
'rsd' => 'application/rsd+xml',
|
||||
'rss' => 'application/rss+xml',
|
||||
'rtf' => 'application/rtf',
|
||||
'sbml' => 'application/sbml+xml',
|
||||
'sdp' => 'application/sdp',
|
||||
'setpay' => 'application/set-payment-initiation',
|
||||
'setreg' => 'application/set-registration-initiation',
|
||||
'shf' => 'application/shf+xml',
|
||||
'smi' => 'application/smil+xml',
|
||||
'smil' => 'application/smil+xml',
|
||||
'gram' => 'application/srgs',
|
||||
'grxml' => 'application/srgs+xml',
|
||||
'ssml' => 'application/ssml+xml',
|
||||
'plb' => 'application/vnd.3gpp.pic-bw-large',
|
||||
'psb' => 'application/vnd.3gpp.pic-bw-small',
|
||||
'pvb' => 'application/vnd.3gpp.pic-bw-var',
|
||||
'pwn' => 'application/vnd.3m.post-it-notes',
|
||||
'aso' => 'application/vnd.accpac.simply.aso',
|
||||
'imp' => 'application/vnd.accpac.simply.imp',
|
||||
'acu' => 'application/vnd.acucobol',
|
||||
'atc' => 'application/vnd.acucorp',
|
||||
'acutc' => 'application/vnd.acucorp',
|
||||
'xdp' => 'application/vnd.adobe.xdp+xml',
|
||||
'xfdf' => 'application/vnd.adobe.xfdf',
|
||||
'ami' => 'application/vnd.amiga.ami',
|
||||
'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
|
||||
'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
|
||||
'atx' => 'application/vnd.antix.game-component',
|
||||
'mpkg' => 'application/vnd.apple.installer+xml',
|
||||
'aep' => 'application/vnd.audiograph',
|
||||
'mpm' => 'application/vnd.blueice.multipass',
|
||||
'bmi' => 'application/vnd.bmi',
|
||||
'rep' => 'application/vnd.businessobjects',
|
||||
'cdxml' => 'application/vnd.chemdraw+xml',
|
||||
'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
|
||||
'cdy' => 'application/vnd.cinderella',
|
||||
'cla' => 'application/vnd.claymore',
|
||||
'c4g' => 'application/vnd.clonk.c4group',
|
||||
'c4d' => 'application/vnd.clonk.c4group',
|
||||
'c4f' => 'application/vnd.clonk.c4group',
|
||||
'c4p' => 'application/vnd.clonk.c4group',
|
||||
'c4u' => 'application/vnd.clonk.c4group',
|
||||
'csp' => 'application/vnd.commonspace',
|
||||
'cst' => 'application/vnd.commonspace',
|
||||
'cdbcmsg' => 'application/vnd.contact.cmsg',
|
||||
'cmc' => 'application/vnd.cosmocaller',
|
||||
'clkx' => 'application/vnd.crick.clicker',
|
||||
'clkk' => 'application/vnd.crick.clicker.keyboard',
|
||||
'clkp' => 'application/vnd.crick.clicker.palette',
|
||||
'clkt' => 'application/vnd.crick.clicker.template',
|
||||
'clkw' => 'application/vnd.crick.clicker.wordbank',
|
||||
'wbs' => 'application/vnd.criticaltools.wbs+xml',
|
||||
'pml' => 'application/vnd.ctc-posml',
|
||||
'ppd' => 'application/vnd.cups-ppd',
|
||||
'curl' => 'application/vnd.curl',
|
||||
'rdz' => 'application/vnd.data-vision.rdz',
|
||||
'dna' => 'application/vnd.dna',
|
||||
'mlp' => 'application/vnd.dolby.mlp',
|
||||
'dpg' => 'application/vnd.dpgraph',
|
||||
'dfac' => 'application/vnd.dreamfactory',
|
||||
'mag' => 'application/vnd.ecowin.chart',
|
||||
'nml' => 'application/vnd.enliven',
|
||||
'esf' => 'application/vnd.epson.esf',
|
||||
'msf' => 'application/vnd.epson.msf',
|
||||
'qam' => 'application/vnd.epson.quickanime',
|
||||
'slt' => 'application/vnd.epson.salt',
|
||||
'ssf' => 'application/vnd.epson.ssf',
|
||||
'es3' => 'application/vnd.eszigno3+xml',
|
||||
'et3' => 'application/vnd.eszigno3+xml',
|
||||
'ez2' => 'application/vnd.ezpix-album',
|
||||
'ez3' => 'application/vnd.ezpix-package',
|
||||
'fdf' => 'application/vnd.fdf',
|
||||
'gph' => 'application/vnd.flographit',
|
||||
'ftc' => 'application/vnd.fluxtime.clip',
|
||||
'fm' => 'application/vnd.framemaker',
|
||||
'frame' => 'application/vnd.framemaker',
|
||||
'maker' => 'application/vnd.framemaker',
|
||||
'fnc' => 'application/vnd.frogans.fnc',
|
||||
'ltf' => 'application/vnd.frogans.ltf',
|
||||
'fsc' => 'application/vnd.fsc.weblaunch',
|
||||
'oas' => 'application/vnd.fujitsu.oasys',
|
||||
'oa2' => 'application/vnd.fujitsu.oasys2',
|
||||
'oa3' => 'application/vnd.fujitsu.oasys3',
|
||||
'fg5' => 'application/vnd.fujitsu.oasysgp',
|
||||
'bh2' => 'application/vnd.fujitsu.oasysprs',
|
||||
'ddd' => 'application/vnd.fujixerox.ddd',
|
||||
'xdw' => 'application/vnd.fujixerox.docuworks',
|
||||
'xbd' => 'application/vnd.fujixerox.docuworks.binder',
|
||||
'fzs' => 'application/vnd.fuzzysheet',
|
||||
'txd' => 'application/vnd.genomatix.tuxedo',
|
||||
'kml' => 'application/vnd.google-earth.kml+xml',
|
||||
'kmz' => 'application/vnd.google-earth.kmz',
|
||||
'gqf' => 'application/vnd.grafeq',
|
||||
'gqs' => 'application/vnd.grafeq',
|
||||
'gac' => 'application/vnd.groove-account',
|
||||
'ghf' => 'application/vnd.groove-help',
|
||||
'gim' => 'application/vnd.groove-identity-message',
|
||||
'grv' => 'application/vnd.groove-injector',
|
||||
'gtm' => 'application/vnd.groove-tool-message',
|
||||
'tpl' => 'application/vnd.groove-tool-template',
|
||||
'vcg' => 'application/vnd.groove-vcard',
|
||||
'zmm' => 'application/vnd.handheld-entertainment+xml',
|
||||
'hbci' => 'application/vnd.hbci',
|
||||
'les' => 'application/vnd.hhe.lesson-player',
|
||||
'hpgl' => 'application/vnd.hp-hpgl',
|
||||
'hpid' => 'application/vnd.hp-hpid',
|
||||
'hps' => 'application/vnd.hp-hps',
|
||||
'jlt' => 'application/vnd.hp-jlyt',
|
||||
'pcl' => 'application/vnd.hp-pcl',
|
||||
'pclxl' => 'application/vnd.hp-pclxl',
|
||||
'x3d' => 'application/vnd.hzn-3d-crossword',
|
||||
'mpy' => 'application/vnd.ibm.minipay',
|
||||
'afp' => 'application/vnd.ibm.modcap',
|
||||
'listafp' => 'application/vnd.ibm.modcap',
|
||||
'list3820' => 'application/vnd.ibm.modcap',
|
||||
'irm' => 'application/vnd.ibm.rights-management',
|
||||
'sc' => 'application/vnd.ibm.secure-container',
|
||||
'igl' => 'application/vnd.igloader',
|
||||
'ivp' => 'application/vnd.immervision-ivp',
|
||||
'ivu' => 'application/vnd.immervision-ivu',
|
||||
'xpw' => 'application/vnd.intercon.formnet',
|
||||
'xpx' => 'application/vnd.intercon.formnet',
|
||||
'qbo' => 'application/vnd.intu.qbo',
|
||||
'qfx' => 'application/vnd.intu.qfx',
|
||||
'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
|
||||
'irp' => 'application/vnd.irepository.package+xml',
|
||||
'xpr' => 'application/vnd.is-xpr',
|
||||
'jam' => 'application/vnd.jam',
|
||||
'rms' => 'application/vnd.jcp.javame.midlet-rms',
|
||||
'jisp' => 'application/vnd.jisp',
|
||||
'ktz' => 'application/vnd.kahootz',
|
||||
'ktr' => 'application/vnd.kahootz',
|
||||
'karbon' => 'application/vnd.kde.karbon',
|
||||
'chrt' => 'application/vnd.kde.kchart',
|
||||
'kfo' => 'application/vnd.kde.kformula',
|
||||
'flw' => 'application/vnd.kde.kivio',
|
||||
'kon' => 'application/vnd.kde.kontour',
|
||||
'kpr' => 'application/vnd.kde.kpresenter',
|
||||
'kpt' => 'application/vnd.kde.kpresenter',
|
||||
'ksp' => 'application/vnd.kde.kspread',
|
||||
'kwd' => 'application/vnd.kde.kword',
|
||||
'kwt' => 'application/vnd.kde.kword',
|
||||
'htke' => 'application/vnd.kenameaapp',
|
||||
'kia' => 'application/vnd.kidspiration',
|
||||
'kne' => 'application/vnd.kinar',
|
||||
'knp' => 'application/vnd.kinar',
|
||||
'skp' => 'application/vnd.koan',
|
||||
'skd' => 'application/vnd.koan',
|
||||
'skt' => 'application/vnd.koan',
|
||||
'skm' => 'application/vnd.koan',
|
||||
'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
|
||||
'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
|
||||
'123' => 'application/vnd.lotus-1-2-3',
|
||||
'apr' => 'application/vnd.lotus-approach',
|
||||
'pre' => 'application/vnd.lotus-freelance',
|
||||
'nsf' => 'application/vnd.lotus-notes',
|
||||
'org' => 'application/vnd.lotus-organizer',
|
||||
'scm' => 'application/vnd.lotus-screencam',
|
||||
'lwp' => 'application/vnd.lotus-wordpro',
|
||||
'portpkg' => 'application/vnd.macports.portpkg',
|
||||
'mcd' => 'application/vnd.mcd',
|
||||
'mc1' => 'application/vnd.medcalcdata',
|
||||
'cdkey' => 'application/vnd.mediastation.cdkey',
|
||||
'mwf' => 'application/vnd.mfer',
|
||||
'mfm' => 'application/vnd.mfmp',
|
||||
'flo' => 'application/vnd.micrografx.flo',
|
||||
'igx' => 'application/vnd.micrografx.igx',
|
||||
'mif' => 'application/vnd.mif',
|
||||
'daf' => 'application/vnd.mobius.daf',
|
||||
'dis' => 'application/vnd.mobius.dis',
|
||||
'mbk' => 'application/vnd.mobius.mbk',
|
||||
'mqy' => 'application/vnd.mobius.mqy',
|
||||
'msl' => 'application/vnd.mobius.msl',
|
||||
'plc' => 'application/vnd.mobius.plc',
|
||||
'txf' => 'application/vnd.mobius.txf',
|
||||
'mpn' => 'application/vnd.mophun.application',
|
||||
'mpc' => 'application/vnd.mophun.certificate',
|
||||
'xul' => 'application/vnd.mozilla.xul+xml',
|
||||
'cil' => 'application/vnd.ms-artgalry',
|
||||
'asf' => 'application/vnd.ms-asf',
|
||||
'cab' => 'application/vnd.ms-cab-compressed',
|
||||
'xls' => 'application/vnd.ms-excel',
|
||||
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'xlm' => 'application/vnd.ms-excel',
|
||||
'xla' => 'application/vnd.ms-excel',
|
||||
'xlc' => 'application/vnd.ms-excel',
|
||||
'xlt' => 'application/vnd.ms-excel',
|
||||
'xlw' => 'application/vnd.ms-excel',
|
||||
'eot' => 'application/vnd.ms-fontobject',
|
||||
'chm' => 'application/vnd.ms-htmlhelp',
|
||||
'ims' => 'application/vnd.ms-ims',
|
||||
'lrm' => 'application/vnd.ms-lrm',
|
||||
'ppt' => 'application/vnd.ms-powerpoint',
|
||||
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
||||
'pps' => 'application/vnd.ms-powerpoint',
|
||||
'pot' => 'application/vnd.ms-powerpoint',
|
||||
'mpp' => 'application/vnd.ms-project',
|
||||
'mpt' => 'application/vnd.ms-project',
|
||||
'wps' => 'application/vnd.ms-works',
|
||||
'wks' => 'application/vnd.ms-works',
|
||||
'wcm' => 'application/vnd.ms-works',
|
||||
'wdb' => 'application/vnd.ms-works',
|
||||
'wpl' => 'application/vnd.ms-wpl',
|
||||
'xps' => 'application/vnd.ms-xpsdocument',
|
||||
'mseq' => 'application/vnd.mseq',
|
||||
'mus' => 'application/vnd.musician',
|
||||
'nlu' => 'application/vnd.neurolanguage.nlu',
|
||||
'nnd' => 'application/vnd.noblenet-directory',
|
||||
'nns' => 'application/vnd.noblenet-sealer',
|
||||
'nnw' => 'application/vnd.noblenet-web',
|
||||
'ngdat' => 'application/vnd.nokia.n-gage.data',
|
||||
'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
|
||||
'rpst' => 'application/vnd.nokia.radio-preset',
|
||||
'rpss' => 'application/vnd.nokia.radio-presets',
|
||||
'edm' => 'application/vnd.novadigm.edm',
|
||||
'edx' => 'application/vnd.novadigm.edx',
|
||||
'ext' => 'application/vnd.novadigm.ext',
|
||||
'odc' => 'application/vnd.oasis.opendocument.chart',
|
||||
'otc' => 'application/vnd.oasis.opendocument.chart-template',
|
||||
'odf' => 'application/vnd.oasis.opendocument.formula',
|
||||
'otf' => 'application/vnd.oasis.opendocument.formula-template',
|
||||
'odg' => 'application/vnd.oasis.opendocument.graphics',
|
||||
'otg' => 'application/vnd.oasis.opendocument.graphics-template',
|
||||
'odi' => 'application/vnd.oasis.opendocument.image',
|
||||
'oti' => 'application/vnd.oasis.opendocument.image-template',
|
||||
'odp' => 'application/vnd.oasis.opendocument.presentation',
|
||||
'otp' => 'application/vnd.oasis.opendocument.presentation-template',
|
||||
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
|
||||
'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
|
||||
'odt' => 'application/vnd.oasis.opendocument.text',
|
||||
'otm' => 'application/vnd.oasis.opendocument.text-master',
|
||||
'ott' => 'application/vnd.oasis.opendocument.text-template',
|
||||
'oth' => 'application/vnd.oasis.opendocument.text-web',
|
||||
'xo' => 'application/vnd.olpc-sugar',
|
||||
'dd2' => 'application/vnd.oma.dd2+xml',
|
||||
'oxt' => 'application/vnd.openofficeorg.extension',
|
||||
'dp' => 'application/vnd.osgi.dp',
|
||||
'prc' => 'application/vnd.palm',
|
||||
'pdb' => 'application/vnd.palm',
|
||||
'pqa' => 'application/vnd.palm',
|
||||
'oprc' => 'application/vnd.palm',
|
||||
'str' => 'application/vnd.pg.format',
|
||||
'ei6' => 'application/vnd.pg.osasli',
|
||||
'efif' => 'application/vnd.picsel',
|
||||
'plf' => 'application/vnd.pocketlearn',
|
||||
'pbd' => 'application/vnd.powerbuilder6',
|
||||
'box' => 'application/vnd.previewsystems.box',
|
||||
'mgz' => 'application/vnd.proteus.magazine',
|
||||
'qps' => 'application/vnd.publishare-delta-tree',
|
||||
'ptid' => 'application/vnd.pvi.ptid1',
|
||||
'qxd' => 'application/vnd.quark.quarkxpress',
|
||||
'qxt' => 'application/vnd.quark.quarkxpress',
|
||||
'qwd' => 'application/vnd.quark.quarkxpress',
|
||||
'qwt' => 'application/vnd.quark.quarkxpress',
|
||||
'qxl' => 'application/vnd.quark.quarkxpress',
|
||||
'qxb' => 'application/vnd.quark.quarkxpress',
|
||||
'mxl' => 'application/vnd.recordare.musicxml',
|
||||
'rm' => 'application/vnd.rn-realmedia',
|
||||
'see' => 'application/vnd.seemail',
|
||||
'sema' => 'application/vnd.sema',
|
||||
'semd' => 'application/vnd.semd',
|
||||
'semf' => 'application/vnd.semf',
|
||||
'ifm' => 'application/vnd.shana.informed.formdata',
|
||||
'itp' => 'application/vnd.shana.informed.formtemplate',
|
||||
'iif' => 'application/vnd.shana.informed.interchange',
|
||||
'ipk' => 'application/vnd.shana.informed.package',
|
||||
'twd' => 'application/vnd.simtech-mindmapper',
|
||||
'twds' => 'application/vnd.simtech-mindmapper',
|
||||
'mmf' => 'application/vnd.smaf',
|
||||
'sdkm' => 'application/vnd.solent.sdkm+xml',
|
||||
'sdkd' => 'application/vnd.solent.sdkm+xml',
|
||||
'dxp' => 'application/vnd.spotfire.dxp',
|
||||
'sfs' => 'application/vnd.spotfire.sfs',
|
||||
'sus' => 'application/vnd.sus-calendar',
|
||||
'susp' => 'application/vnd.sus-calendar',
|
||||
'svd' => 'application/vnd.svd',
|
||||
'xsm' => 'application/vnd.syncml+xml',
|
||||
'bdm' => 'application/vnd.syncml.dm+wbxml',
|
||||
'xdm' => 'application/vnd.syncml.dm+xml',
|
||||
'tao' => 'application/vnd.tao.intent-module-archive',
|
||||
'tmo' => 'application/vnd.tmobile-livetv',
|
||||
'tpt' => 'application/vnd.trid.tpt',
|
||||
'mxs' => 'application/vnd.triscape.mxs',
|
||||
'tra' => 'application/vnd.trueapp',
|
||||
'ufd' => 'application/vnd.ufdl',
|
||||
'ufdl' => 'application/vnd.ufdl',
|
||||
'utz' => 'application/vnd.uiq.theme',
|
||||
'umj' => 'application/vnd.umajin',
|
||||
'unityweb' => 'application/vnd.unity',
|
||||
'uoml' => 'application/vnd.uoml+xml',
|
||||
'vcx' => 'application/vnd.vcx',
|
||||
'vsd' => 'application/vnd.visio',
|
||||
'vst' => 'application/vnd.visio',
|
||||
'vss' => 'application/vnd.visio',
|
||||
'vsw' => 'application/vnd.visio',
|
||||
'vis' => 'application/vnd.visionary',
|
||||
'vsf' => 'application/vnd.vsf',
|
||||
'wbxml' => 'application/vnd.wap.wbxml',
|
||||
'wmlc' => 'application/vnd.wap.wmlc',
|
||||
'wmlsc' => 'application/vnd.wap.wmlscriptc',
|
||||
'wtb' => 'application/vnd.webturbo',
|
||||
'wpd' => 'application/vnd.wordperfect',
|
||||
'wqd' => 'application/vnd.wqd',
|
||||
'stf' => 'application/vnd.wt.stf',
|
||||
'xar' => 'application/vnd.xara',
|
||||
'xfdl' => 'application/vnd.xfdl',
|
||||
'hvd' => 'application/vnd.yamaha.hv-dic',
|
||||
'hvs' => 'application/vnd.yamaha.hv-script',
|
||||
'hvp' => 'application/vnd.yamaha.hv-voice',
|
||||
'saf' => 'application/vnd.yamaha.smaf-audio',
|
||||
'spf' => 'application/vnd.yamaha.smaf-phrase',
|
||||
'cmp' => 'application/vnd.yellowriver-custom-menu',
|
||||
'zaz' => 'application/vnd.zzazz.deck+xml',
|
||||
'vxml' => 'application/voicexml+xml',
|
||||
'hlp' => 'application/winhlp',
|
||||
'wsdl' => 'application/wsdl+xml',
|
||||
'wspolicy' => 'application/wspolicy+xml',
|
||||
'ace' => 'application/x-ace-compressed',
|
||||
'bcpio' => 'application/x-bcpio',
|
||||
'torrent' => 'application/x-bittorrent',
|
||||
'bz' => 'application/x-bzip',
|
||||
'bz2' => 'application/x-bzip2',
|
||||
'boz' => 'application/x-bzip2',
|
||||
'vcd' => 'application/x-cdlink',
|
||||
'chat' => 'application/x-chat',
|
||||
'pgn' => 'application/x-chess-pgn',
|
||||
'cpio' => 'application/x-cpio',
|
||||
'csh' => 'application/x-csh',
|
||||
'dcr' => 'application/x-director',
|
||||
'dir' => 'application/x-director',
|
||||
'dxr' => 'application/x-director',
|
||||
'fgd' => 'application/x-director',
|
||||
'dvi' => 'application/x-dvi',
|
||||
'spl' => 'application/x-futuresplash',
|
||||
'gtar' => 'application/x-gtar',
|
||||
'hdf' => 'application/x-hdf',
|
||||
'jnlp' => 'application/x-java-jnlp-file',
|
||||
'latex' => 'application/x-latex',
|
||||
'wmd' => 'application/x-ms-wmd',
|
||||
'wmz' => 'application/x-ms-wmz',
|
||||
'mdb' => 'application/x-msaccess',
|
||||
'obd' => 'application/x-msbinder',
|
||||
'crd' => 'application/x-mscardfile',
|
||||
'clp' => 'application/x-msclip',
|
||||
'exe' => 'application/x-msdownload',
|
||||
'dll' => 'application/x-msdownload',
|
||||
'com' => 'application/x-msdownload',
|
||||
'bat' => 'application/x-msdownload',
|
||||
'msi' => 'application/x-msdownload',
|
||||
'mvb' => 'application/x-msmediaview',
|
||||
'm13' => 'application/x-msmediaview',
|
||||
'm14' => 'application/x-msmediaview',
|
||||
'wmf' => 'application/x-msmetafile',
|
||||
'mny' => 'application/x-msmoney',
|
||||
'pub' => 'application/x-mspublisher',
|
||||
'scd' => 'application/x-msschedule',
|
||||
'trm' => 'application/x-msterminal',
|
||||
'wri' => 'application/x-mswrite',
|
||||
'nc' => 'application/x-netcdf',
|
||||
'cdf' => 'application/x-netcdf',
|
||||
'p12' => 'application/x-pkcs12',
|
||||
'pfx' => 'application/x-pkcs12',
|
||||
'p7b' => 'application/x-pkcs7-certificates',
|
||||
'spc' => 'application/x-pkcs7-certificates',
|
||||
'p7r' => 'application/x-pkcs7-certreqresp',
|
||||
'rar' => 'application/x-rar-compressed',
|
||||
'sh' => 'application/x-sh',
|
||||
'shar' => 'application/x-shar',
|
||||
'swf' => 'application/x-shockwave-flash',
|
||||
'sit' => 'application/x-stuffit',
|
||||
'sitx' => 'application/x-stuffitx',
|
||||
'sv4cpio' => 'application/x-sv4cpio',
|
||||
'sv4crc' => 'application/x-sv4crc',
|
||||
'tar' => 'application/x-tar',
|
||||
'tcl' => 'application/x-tcl',
|
||||
'tex' => 'application/x-tex',
|
||||
'texinfo' => 'application/x-texinfo',
|
||||
'texi' => 'application/x-texinfo',
|
||||
'ustar' => 'application/x-ustar',
|
||||
'src' => 'application/x-wais-source',
|
||||
'der' => 'application/x-x509-ca-cert',
|
||||
'crt' => 'application/x-x509-ca-cert',
|
||||
'xenc' => 'application/xenc+xml',
|
||||
'xhtml' => 'application/xhtml+xml',
|
||||
'xht' => 'application/xhtml+xml',
|
||||
'xml' => 'application/xml',
|
||||
'xsl' => 'application/xml',
|
||||
'dtd' => 'application/xml-dtd',
|
||||
'xop' => 'application/xop+xml',
|
||||
'xslt' => 'application/xslt+xml',
|
||||
'xspf' => 'application/xspf+xml',
|
||||
'mxml' => 'application/xv+xml',
|
||||
'xhvml' => 'application/xv+xml',
|
||||
'xvml' => 'application/xv+xml',
|
||||
'xvm' => 'application/xv+xml',
|
||||
'zip' => 'application/zip',
|
||||
'au' => 'audio/basic',
|
||||
'snd' => 'audio/basic',
|
||||
'mid' => 'audio/midi',
|
||||
'midi' => 'audio/midi',
|
||||
'kar' => 'audio/midi',
|
||||
'rmi' => 'audio/midi',
|
||||
'mp4a' => 'audio/mp4',
|
||||
'm4a' => 'audio/mp4a-latm',
|
||||
'm4p' => 'audio/mp4a-latm',
|
||||
'mpga' => 'audio/mpeg',
|
||||
'mp2' => 'audio/mpeg',
|
||||
'mp2a' => 'audio/mpeg',
|
||||
'mp3' => 'audio/mpeg',
|
||||
'm2a' => 'audio/mpeg',
|
||||
'm3a' => 'audio/mpeg',
|
||||
'eol' => 'audio/vnd.digital-winds',
|
||||
'lvp' => 'audio/vnd.lucent.voice',
|
||||
'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
|
||||
'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
|
||||
'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
|
||||
'wav' => 'audio/wav',
|
||||
'aif' => 'audio/x-aiff',
|
||||
'aiff' => 'audio/x-aiff',
|
||||
'aifc' => 'audio/x-aiff',
|
||||
'm3u' => 'audio/x-mpegurl',
|
||||
'wax' => 'audio/x-ms-wax',
|
||||
'wma' => 'audio/x-ms-wma',
|
||||
'ram' => 'audio/x-pn-realaudio',
|
||||
'ra' => 'audio/x-pn-realaudio',
|
||||
'rmp' => 'audio/x-pn-realaudio-plugin',
|
||||
'cdx' => 'chemical/x-cdx',
|
||||
'cif' => 'chemical/x-cif',
|
||||
'cmdf' => 'chemical/x-cmdf',
|
||||
'cml' => 'chemical/x-cml',
|
||||
'csml' => 'chemical/x-csml',
|
||||
'xyz' => 'chemical/x-xyz',
|
||||
'bmp' => 'image/bmp',
|
||||
'cgm' => 'image/cgm',
|
||||
'g3' => 'image/g3fax',
|
||||
'gif' => 'image/gif',
|
||||
'ief' => 'image/ief',
|
||||
'jp2' => 'image/jp2',
|
||||
'jpeg' => 'image/jpeg',
|
||||
'jpe' => 'image/jpeg',
|
||||
'jpg' => 'image/jpeg',
|
||||
'pict' => 'image/pict',
|
||||
'pic' => 'image/pict',
|
||||
'pct' => 'image/pict',
|
||||
'png' => 'image/png',
|
||||
'btif' => 'image/prs.btif',
|
||||
'svg' => 'image/svg+xml',
|
||||
'svgz' => 'image/svg+xml',
|
||||
'tiff' => 'image/tiff',
|
||||
'tif' => 'image/tiff',
|
||||
'psd' => 'image/vnd.adobe.photoshop',
|
||||
'djvu' => 'image/vnd.djvu',
|
||||
'djv' => 'image/vnd.djvu',
|
||||
'dwg' => 'image/vnd.dwg',
|
||||
'dxf' => 'image/vnd.dxf',
|
||||
'fbs' => 'image/vnd.fastbidsheet',
|
||||
'fpx' => 'image/vnd.fpx',
|
||||
'fst' => 'image/vnd.fst',
|
||||
'mmr' => 'image/vnd.fujixerox.edmics-mmr',
|
||||
'rlc' => 'image/vnd.fujixerox.edmics-rlc',
|
||||
'ico' => 'image/vnd.microsoft.icon',
|
||||
'mdi' => 'image/vnd.ms-modi',
|
||||
'npx' => 'image/vnd.net-fpx',
|
||||
'wbmp' => 'image/vnd.wap.wbmp',
|
||||
'xif' => 'image/vnd.xiff',
|
||||
'ras' => 'image/x-cmu-raster',
|
||||
'cmx' => 'image/x-cmx',
|
||||
'pntg' => 'image/x-macpaint',
|
||||
'pnt' => 'image/x-macpaint',
|
||||
'mac' => 'image/x-macpaint',
|
||||
'pcx' => 'image/x-pcx',
|
||||
'pnm' => 'image/x-portable-anymap',
|
||||
'pbm' => 'image/x-portable-bitmap',
|
||||
'pgm' => 'image/x-portable-graymap',
|
||||
'ppm' => 'image/x-portable-pixmap',
|
||||
'qtif' => 'image/x-quicktime',
|
||||
'qti' => 'image/x-quicktime',
|
||||
'rgb' => 'image/x-rgb',
|
||||
'xbm' => 'image/x-xbitmap',
|
||||
'xpm' => 'image/x-xpixmap',
|
||||
'xwd' => 'image/x-xwindowdump',
|
||||
'eml' => 'message/rfc822',
|
||||
'mime' => 'message/rfc822',
|
||||
'igs' => 'model/iges',
|
||||
'iges' => 'model/iges',
|
||||
'msh' => 'model/mesh',
|
||||
'mesh' => 'model/mesh',
|
||||
'silo' => 'model/mesh',
|
||||
'dwf' => 'model/vnd.dwf',
|
||||
'gdl' => 'model/vnd.gdl',
|
||||
'gtw' => 'model/vnd.gtw',
|
||||
'mts' => 'model/vnd.mts',
|
||||
'vtu' => 'model/vnd.vtu',
|
||||
'wrl' => 'model/vrml',
|
||||
'vrml' => 'model/vrml',
|
||||
'ics' => 'text/calendar',
|
||||
'ifb' => 'text/calendar',
|
||||
'css' => 'text/css',
|
||||
'csv' => 'text/csv',
|
||||
'html' => 'text/html',
|
||||
'htm' => 'text/html',
|
||||
'txt' => 'text/plain',
|
||||
'text' => 'text/plain',
|
||||
'conf' => 'text/plain',
|
||||
'def' => 'text/plain',
|
||||
'list' => 'text/plain',
|
||||
'log' => 'text/plain',
|
||||
'in' => 'text/plain',
|
||||
'dsc' => 'text/prs.lines.tag',
|
||||
'rtx' => 'text/richtext',
|
||||
'sgml' => 'text/sgml',
|
||||
'sgm' => 'text/sgml',
|
||||
'tsv' => 'text/tab-separated-values',
|
||||
't' => 'text/troff',
|
||||
'tr' => 'text/troff',
|
||||
'roff' => 'text/troff',
|
||||
'man' => 'text/troff',
|
||||
'me' => 'text/troff',
|
||||
'ms' => 'text/troff',
|
||||
'uri' => 'text/uri-list',
|
||||
'uris' => 'text/uri-list',
|
||||
'urls' => 'text/uri-list',
|
||||
'fly' => 'text/vnd.fly',
|
||||
'flx' => 'text/vnd.fmi.flexstor',
|
||||
'3dml' => 'text/vnd.in3d.3dml',
|
||||
'spot' => 'text/vnd.in3d.spot',
|
||||
'jad' => 'text/vnd.sun.j2me.app-descriptor',
|
||||
'wml' => 'text/vnd.wap.wml',
|
||||
'wmls' => 'text/vnd.wap.wmlscript',
|
||||
's' => 'text/x-asm',
|
||||
'asm' => 'text/x-asm',
|
||||
'c' => 'text/x-c',
|
||||
'cc' => 'text/x-c',
|
||||
'cxx' => 'text/x-c',
|
||||
'cpp' => 'text/x-c',
|
||||
'h' => 'text/x-c',
|
||||
'hh' => 'text/x-c',
|
||||
'dic' => 'text/x-c',
|
||||
'f' => 'text/x-fortran',
|
||||
'for' => 'text/x-fortran',
|
||||
'f77' => 'text/x-fortran',
|
||||
'f90' => 'text/x-fortran',
|
||||
'p' => 'text/x-pascal',
|
||||
'pas' => 'text/x-pascal',
|
||||
'java' => 'text/x-java-source',
|
||||
'etx' => 'text/x-setext',
|
||||
'uu' => 'text/x-uuencode',
|
||||
'vcs' => 'text/x-vcalendar',
|
||||
'vcf' => 'text/x-vcard',
|
||||
'3gp' => 'video/3gpp',
|
||||
'3g2' => 'video/3gpp2',
|
||||
'h261' => 'video/h261',
|
||||
'h263' => 'video/h263',
|
||||
'h264' => 'video/h264',
|
||||
'jpgv' => 'video/jpeg',
|
||||
'jpm' => 'video/jpm',
|
||||
'jpgm' => 'video/jpm',
|
||||
'mj2' => 'video/mj2',
|
||||
'mjp2' => 'video/mj2',
|
||||
'mp4' => 'video/mp4',
|
||||
'mp4v' => 'video/mp4',
|
||||
'mpg4' => 'video/mp4',
|
||||
'm4v' => 'video/mp4',
|
||||
'mpeg' => 'video/mpeg',
|
||||
'mpg' => 'video/mpeg',
|
||||
'mpe' => 'video/mpeg',
|
||||
'm1v' => 'video/mpeg',
|
||||
'm2v' => 'video/mpeg',
|
||||
'qt' => 'video/quicktime',
|
||||
'mov' => 'video/quicktime',
|
||||
'fvt' => 'video/vnd.fvt',
|
||||
'mxu' => 'video/vnd.mpegurl',
|
||||
'm4u' => 'video/vnd.mpegurl',
|
||||
'viv' => 'video/vnd.vivo',
|
||||
'dv' => 'video/x-dv',
|
||||
'dif' => 'video/x-dv',
|
||||
'fli' => 'video/x-fli',
|
||||
'asx' => 'video/x-ms-asf',
|
||||
'wm' => 'video/x-ms-wm',
|
||||
'wmv' => 'video/x-ms-wmv',
|
||||
'wmx' => 'video/x-ms-wmx',
|
||||
'wvx' => 'video/x-ms-wvx',
|
||||
'avi' => 'video/x-msvideo',
|
||||
'movie' => 'video/x-sgi-movie',
|
||||
'ice' => 'x-conference/x-cooltalk',
|
||||
];
|
||||
|
||||
/**
|
||||
* Returns extensions for given mimes types.
|
||||
*
|
||||
* @param array $mimesTypes The mimes types, e.g. ['video/mpeg', 'image/jpeg']
|
||||
* @param bool $asUpperCase (optional) If is set to true, extensions are returned as upper case. Otherwise - lower
|
||||
* case.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getExtensions(array $mimesTypes, $asUpperCase = false)
|
||||
{
|
||||
if (empty($mimesTypes)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$extensions = [];
|
||||
|
||||
foreach ($mimesTypes as $mimeType) {
|
||||
$extension = self::getExtension($mimeType);
|
||||
|
||||
/*
|
||||
* No extension for given mime type?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($extension)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Extensions should be returned as upper case?
|
||||
*/
|
||||
if ($asUpperCase) {
|
||||
if (is_array($extension)) {
|
||||
array_walk($extension, function (&$value) {
|
||||
$value = strtoupper($value);
|
||||
});
|
||||
} else {
|
||||
$extension = strtoupper($extension);
|
||||
}
|
||||
}
|
||||
|
||||
$extensions[$mimeType] = $extension;
|
||||
}
|
||||
|
||||
return $extensions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns extension for given mime type.
|
||||
*
|
||||
* @param string $mimeType The mime type, e.g. "video/mpeg"
|
||||
*
|
||||
* @return string|array
|
||||
*/
|
||||
public static function getExtension($mimeType)
|
||||
{
|
||||
if (is_string($mimeType) && in_array($mimeType, self::$mimeTypes)) {
|
||||
$data = Arrays::setKeysAsValues(self::$mimeTypes, false);
|
||||
|
||||
return $data[$mimeType];
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information whether file with the given path is an image.
|
||||
*
|
||||
* @param string $path Path of the file to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isImagePath($path)
|
||||
{
|
||||
$mimeType = self::getMimeType($path);
|
||||
|
||||
return self::isImage($mimeType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns mime type of given file.
|
||||
*
|
||||
* @param string $filePath Path of the file to check
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public static function getMimeType($filePath)
|
||||
{
|
||||
/*
|
||||
* The file does not exist?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($filePath) || !is_readable($filePath)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
/*
|
||||
* 1st possibility: the finfo class
|
||||
*/
|
||||
if (class_exists('finfo')) {
|
||||
$finfo = new \finfo();
|
||||
|
||||
return $finfo->file($filePath, FILEINFO_MIME_TYPE);
|
||||
}
|
||||
|
||||
/*
|
||||
* 2nd possibility: the mime_content_type function
|
||||
*/
|
||||
if (function_exists('mime_content_type')) {
|
||||
return mime_content_type($filePath);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, there is no possibility to read the mime type
|
||||
*/
|
||||
$template = 'Neither \'finfo\' class nor \'mime_content_type\' function exists. There is no way to read the'
|
||||
.' mime type of file \'%s\'.';
|
||||
|
||||
$message = sprintf($template, $filePath);
|
||||
|
||||
throw new \RuntimeException($message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information whether the given file type is an image.
|
||||
*
|
||||
* @param string $mimeType The mime type of file
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isImage($mimeType)
|
||||
{
|
||||
if (in_array($mimeType, self::$mimeTypes)) {
|
||||
return (bool) preg_match('|^image/.+$|', $mimeType);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -15,10 +15,10 @@ use Doctrine\ORM\Query\Parameter;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
|
||||
/**
|
||||
* Useful methods for query builder (the Doctrine's QueryBuilder class)
|
||||
* Useful methods for query builder (the Doctrine's QueryBuilder class).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class QueryBuilderUtility
|
||||
{
|
||||
@@ -27,16 +27,13 @@ class QueryBuilderUtility
|
||||
* If null is returned, alias was not found.
|
||||
*
|
||||
* @param QueryBuilder $queryBuilder The query builder to retrieve root alias
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public static function getRootAlias(QueryBuilder $queryBuilder)
|
||||
{
|
||||
$aliases = $queryBuilder->getRootAliases();
|
||||
|
||||
/*
|
||||
* No aliases?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($aliases)) {
|
||||
return null;
|
||||
}
|
||||
@@ -46,22 +43,18 @@ class QueryBuilderUtility
|
||||
|
||||
/**
|
||||
* Returns alias of given property joined in given query builder
|
||||
*
|
||||
* If there are no joins or the join does not exist, null is returned.
|
||||
* If the join does not exist, null is returned.
|
||||
* It's also information if given property is already joined in given query builder.
|
||||
*
|
||||
* @param QueryBuilder $queryBuilder The query builder to verify
|
||||
* @param string $property Name of property that maybe is joined
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public static function getJoinedPropertyAlias(QueryBuilder $queryBuilder, $property)
|
||||
{
|
||||
$joins = $queryBuilder->getDQLPart('join');
|
||||
|
||||
/*
|
||||
* No joins?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($joins)) {
|
||||
return null;
|
||||
}
|
||||
@@ -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 array $criteria (optional) The criteria used in WHERE clause. It may simple array with pairs
|
||||
* key-value or an array of arrays where second element of sub-array is the
|
||||
* comparison operator. Example below.
|
||||
* @param string|null $alias (optional) Alias used in the query
|
||||
* @param string $alias (optional) Alias used in the query
|
||||
*
|
||||
* @return QueryBuilder
|
||||
*
|
||||
* Example of the $criteria argument:
|
||||
@@ -106,63 +100,54 @@ class QueryBuilderUtility
|
||||
* 'position' => 5,
|
||||
* ]
|
||||
*/
|
||||
public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = null)
|
||||
public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = '')
|
||||
{
|
||||
/*
|
||||
* No criteria used in WHERE clause?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($criteria)) {
|
||||
return $queryBuilder;
|
||||
}
|
||||
if (!empty($criteria)) {
|
||||
if (empty($alias)) {
|
||||
$alias = self::getRootAlias($queryBuilder);
|
||||
}
|
||||
|
||||
/*
|
||||
* No alias provided?
|
||||
* Let's use root alias
|
||||
*/
|
||||
if (null === $alias || '' === $alias) {
|
||||
$alias = self::getRootAlias($queryBuilder);
|
||||
}
|
||||
foreach ($criteria as $column => $value) {
|
||||
$compareOperator = '=';
|
||||
|
||||
foreach ($criteria as $column => $value) {
|
||||
$compareOperator = '=';
|
||||
if (is_array($value) && !empty($value)) {
|
||||
if (count($value) == 2) {
|
||||
$compareOperator = $value[1];
|
||||
}
|
||||
|
||||
if (is_array($value) && !empty($value)) {
|
||||
if (2 === count($value)) {
|
||||
$compareOperator = $value[1];
|
||||
$value = $value[0];
|
||||
}
|
||||
|
||||
$value = $value[0];
|
||||
$predicate = sprintf('%s.%s %s :%s', $alias, $column, $compareOperator, $column);
|
||||
|
||||
if ($value === null) {
|
||||
$predicate = $queryBuilder->expr()->isNull(sprintf('%s.%s', $alias, $column));
|
||||
unset($criteria[$column]);
|
||||
} else {
|
||||
$queryBuilder->setParameter($column, $value);
|
||||
}
|
||||
|
||||
$queryBuilder = $queryBuilder->andWhere($predicate);
|
||||
}
|
||||
|
||||
$predicate = sprintf('%s.%s %s :%s', $alias, $column, $compareOperator, $column);
|
||||
|
||||
if (null === $value) {
|
||||
$predicate = $queryBuilder->expr()->isNull(sprintf('%s.%s', $alias, $column));
|
||||
unset($criteria[$column]);
|
||||
} else {
|
||||
$queryBuilder->setParameter($column, $value);
|
||||
}
|
||||
|
||||
$queryBuilder = $queryBuilder->andWhere($predicate);
|
||||
}
|
||||
|
||||
return $queryBuilder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes given entities
|
||||
* Deletes given entities.
|
||||
*
|
||||
* @param EntityManager $entityManager The entity manager
|
||||
* @param array|ArrayCollection $entities The entities to delete
|
||||
* @param bool $flushDeleted (optional) If is set to true, flushes the deleted objects (default
|
||||
* behaviour). Otherwise - not.
|
||||
* @param bool $flushDeleted (optional) If is set to true, flushes the deleted objects.
|
||||
* Otherwise - not.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function deleteEntities(EntityManager $entityManager, $entities, $flushDeleted = true)
|
||||
{
|
||||
/*
|
||||
* No entities provided?
|
||||
* No entities found?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($entities)) {
|
||||
@@ -188,30 +173,25 @@ class QueryBuilderUtility
|
||||
* Attention. Existing parameters will be overridden.
|
||||
*
|
||||
* @param QueryBuilder $queryBuilder The query builder
|
||||
* @param array|ArrayCollection $parameters Parameters to add. Collection of Doctrine\ORM\Query\Parameter
|
||||
* instances or an array with key-value pairs.
|
||||
* @param array|ArrayCollection $parameters Parameters to add. Collection of instances of
|
||||
* Doctrine\ORM\Query\Parameter class or an array with key-value pairs.
|
||||
*
|
||||
* @return QueryBuilder
|
||||
*/
|
||||
public static function addParameters(QueryBuilder $queryBuilder, $parameters)
|
||||
{
|
||||
/*
|
||||
* No parameters?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($parameters)) {
|
||||
return $queryBuilder;
|
||||
}
|
||||
if (!empty($parameters)) {
|
||||
foreach ($parameters as $key => $parameter) {
|
||||
$name = $key;
|
||||
$value = $parameter;
|
||||
|
||||
foreach ($parameters as $key => $parameter) {
|
||||
$name = $key;
|
||||
$value = $parameter;
|
||||
if ($parameter instanceof Parameter) {
|
||||
$name = $parameter->getName();
|
||||
$value = $parameter->getValue();
|
||||
}
|
||||
|
||||
if ($parameter instanceof Parameter) {
|
||||
$name = $parameter->getName();
|
||||
$value = $parameter->getValue();
|
||||
$queryBuilder->setParameter($name, $value);
|
||||
}
|
||||
|
||||
$queryBuilder->setParameter($name, $value);
|
||||
}
|
||||
|
||||
return $queryBuilder;
|
||||
@@ -8,42 +8,47 @@
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\Common\Util\ClassUtils;
|
||||
use Doctrine\Common\Util\Inflector;
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
|
||||
use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
|
||||
use Meritoo\Common\Exception\Reflection\NotExistingPropertyException;
|
||||
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>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Reflection
|
||||
{
|
||||
/**
|
||||
* Returns names of methods for given class / object
|
||||
* Returns names of methods for given class / object.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param bool $withoutInheritance (optional) If is set to true, only methods for given class are returned.
|
||||
* Otherwise - all methods, with inherited methods too.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getMethods($class, $withoutInheritance = false)
|
||||
{
|
||||
$effect = [];
|
||||
|
||||
$reflection = new \ReflectionClass($class);
|
||||
$reflection = new ReflectionClass($class);
|
||||
$methods = $reflection->getMethods();
|
||||
|
||||
if (!empty($methods)) {
|
||||
$className = self::getClassName($class);
|
||||
|
||||
foreach ($methods as $method) {
|
||||
if ($method instanceof \ReflectionMethod) {
|
||||
if ($method instanceof ReflectionMethod) {
|
||||
if ($withoutInheritance && $className !== $method->class) {
|
||||
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
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getConstants($class)
|
||||
{
|
||||
$reflection = new \ReflectionClass($class);
|
||||
$reflection = new ReflectionClass($class);
|
||||
|
||||
return $reflection->getConstants();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns maximum integer value of constant of given class / object.
|
||||
* Constants whose values are integers are considered only.
|
||||
* Returns maximum constant from all constants of given class / object.
|
||||
* Values of constants should be integers.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
*
|
||||
* @return int|null
|
||||
*/
|
||||
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 string $method Name of the method to find
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasMethod($class, $method)
|
||||
{
|
||||
$reflection = new \ReflectionClass($class);
|
||||
$reflection = new ReflectionClass($class);
|
||||
|
||||
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 string $property Name of the property to find
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasProperty($class, $property)
|
||||
{
|
||||
$reflection = new \ReflectionClass($class);
|
||||
$reflection = new ReflectionClass($class);
|
||||
|
||||
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 string $constant Name of the constant to find
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasConstant($class, $constant)
|
||||
{
|
||||
$reflection = new \ReflectionClass($class);
|
||||
$reflection = new ReflectionClass($class);
|
||||
|
||||
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 string $constant Name of the constant that contains a value
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getConstantValue($class, $constant)
|
||||
{
|
||||
$reflection = new \ReflectionClass($class);
|
||||
$reflection = new ReflectionClass($class);
|
||||
|
||||
if (self::hasConstant($class, $constant)) {
|
||||
return $reflection->getConstant($constant);
|
||||
@@ -164,6 +175,7 @@ class Reflection
|
||||
* dot-separated, e.g. "invoice.user.email".
|
||||
* @param bool $force (optional) If is set to true, try to retrieve value even if the object doesn't have
|
||||
* property. Otherwise - not.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getPropertyValue($object, $property, $force = false)
|
||||
@@ -185,19 +197,19 @@ class Reflection
|
||||
* Let's dig more and get proper value
|
||||
*
|
||||
* 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)
|
||||
* 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)
|
||||
* and the $project equals null
|
||||
*
|
||||
* Meritoo <github@meritoo.pl>
|
||||
* Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* 2016-11-07
|
||||
*/
|
||||
if (null !== $object) {
|
||||
if ($object !== null) {
|
||||
unset($exploded[0]);
|
||||
|
||||
$property = implode('.', $exploded);
|
||||
@@ -212,58 +224,46 @@ class Reflection
|
||||
* Use \ReflectionObject class
|
||||
*/
|
||||
try {
|
||||
$reflectionProperty = new \ReflectionProperty($className, $property);
|
||||
$reflectionProperty = new ReflectionProperty($className, $property);
|
||||
$value = $reflectionProperty->getValue($object);
|
||||
} catch (\ReflectionException $exception) {
|
||||
} catch (ReflectionException $exception) {
|
||||
/*
|
||||
* 2nd try:
|
||||
* Look for the get / has / is methods
|
||||
*/
|
||||
$class = new \ReflectionObject($object);
|
||||
$class = new ReflectionObject($object);
|
||||
$valueFound = false;
|
||||
|
||||
if ($force || $class->hasProperty($property)) {
|
||||
if ($class->hasProperty($property) || $force) {
|
||||
$property = Inflector::classify($property);
|
||||
|
||||
$getterPrefixes = [
|
||||
$methodPrefixes = [
|
||||
'get',
|
||||
'has',
|
||||
'is',
|
||||
];
|
||||
|
||||
foreach ($getterPrefixes as $prefix) {
|
||||
$getterName = sprintf('%s%s', $prefix, $property);
|
||||
foreach ($methodPrefixes as $prefix) {
|
||||
$method = sprintf('%s%s', $prefix, $property);
|
||||
|
||||
if ($class->hasMethod($getterName)) {
|
||||
$method = new \ReflectionMethod($object, $getterName);
|
||||
|
||||
/*
|
||||
* Getter is not accessible publicly?
|
||||
* I have to skip it, to avoid an error like this:
|
||||
*
|
||||
* Call to protected method My\ExtraClass::getExtraProperty() from context 'My\ExtraClass'
|
||||
*/
|
||||
if ($method->isProtected() || $method->isPrivate()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$value = $object->{$getterName}();
|
||||
if ($class->hasMethod($method)) {
|
||||
$value = $object->{$method}();
|
||||
$valueFound = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$valueFound && null !== $reflectionProperty) {
|
||||
if (!$valueFound && $reflectionProperty !== null) {
|
||||
/*
|
||||
* Oops, value of the property is still unknown
|
||||
* Oops, we have got exception.
|
||||
*
|
||||
* 3rd try:
|
||||
* Let's modify accessibility of the property and try again to get value
|
||||
* Let's try modify accessibility of the property and try again to get value.
|
||||
*/
|
||||
$reflectionProperty->setAccessible(true);
|
||||
$value = $reflectionProperty->getValue($object);
|
||||
$reflectionProperty->setAccessible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -280,18 +280,11 @@ class Reflection
|
||||
* @param string $property Name of the property that contains a value
|
||||
* @param bool $force (optional) If is set to true, try to retrieve value even if the
|
||||
* object does not have property. Otherwise - not.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getPropertyValues($objects, $property, $force = false)
|
||||
{
|
||||
/*
|
||||
* No objects?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($objects)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if ($objects instanceof Collection) {
|
||||
$objects = $objects->toArray();
|
||||
}
|
||||
@@ -302,7 +295,7 @@ class Reflection
|
||||
foreach ($objects as $entity) {
|
||||
$value = self::getPropertyValue($entity, $property, $force);
|
||||
|
||||
if (null !== $value) {
|
||||
if ($value !== null) {
|
||||
$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 bool $withoutNamespace (optional) If is set to true, namespace is omitted. Otherwise -
|
||||
* not, full name of class is returned, with namespace.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getClassName($source, $withoutNamespace = false)
|
||||
@@ -362,7 +356,7 @@ class Reflection
|
||||
if ($withoutNamespace) {
|
||||
$classOnly = Miscellaneous::getLastElementOfString($name, '\\');
|
||||
|
||||
if (null !== $classOnly) {
|
||||
if ($classOnly !== null) {
|
||||
$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
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getClassNamespace($source)
|
||||
{
|
||||
$fullClassName = self::getClassName($source);
|
||||
|
||||
if (null === $fullClassName || '' === $fullClassName) {
|
||||
if (empty($fullClassName)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$className = self::getClassName($source, true);
|
||||
|
||||
if ($className === $fullClassName) {
|
||||
if ($className == $fullClassName) {
|
||||
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 string $interface The interface that should be implemented
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isInterfaceImplemented($source, $interface)
|
||||
@@ -407,14 +403,15 @@ class Reflection
|
||||
$className = self::getClassName($source);
|
||||
$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 $parentClass The parent class. An array of objects, namespaces, object or namespace.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isChildOfClass($childClass, $parentClass)
|
||||
@@ -424,60 +421,48 @@ class Reflection
|
||||
|
||||
$parents = class_parents($childClassName);
|
||||
|
||||
if (is_array($parents) && 0 < count($parents)) {
|
||||
return in_array($parentClassName, $parents, true);
|
||||
if (is_array($parents)) {
|
||||
return in_array($parentClassName, $parents);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns given object properties
|
||||
* Returns given object properties.
|
||||
*
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
* @param int $filter (optional) Filter of properties. Uses \ReflectionProperty class
|
||||
* constants. By default all properties are returned.
|
||||
* @param bool $includeParents (optional) If is set to true, properties of parent classes are
|
||||
* included (recursively). Otherwise - not.
|
||||
* @return array|\ReflectionProperty
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class constants.
|
||||
* By default all properties are returned.
|
||||
*
|
||||
* @return array|ReflectionProperty
|
||||
*/
|
||||
public static function getProperties($source, $filter = null, $includeParents = false)
|
||||
public static function getProperties($source, $filter = null)
|
||||
{
|
||||
$className = self::getClassName($source);
|
||||
$reflection = new \ReflectionClass($className);
|
||||
$reflection = new ReflectionClass($className);
|
||||
|
||||
if (null === $filter) {
|
||||
$filter = \ReflectionProperty::IS_PRIVATE
|
||||
+ \ReflectionProperty::IS_PROTECTED
|
||||
+ \ReflectionProperty::IS_PUBLIC
|
||||
+ \ReflectionProperty::IS_STATIC;
|
||||
if ($filter === null) {
|
||||
$filter = ReflectionProperty::IS_PRIVATE
|
||||
+ ReflectionProperty::IS_PROTECTED
|
||||
+ ReflectionProperty::IS_PUBLIC
|
||||
+ ReflectionProperty::IS_STATIC;
|
||||
}
|
||||
|
||||
$properties = $reflection->getProperties($filter);
|
||||
$parentProperties = [];
|
||||
|
||||
if ($includeParents) {
|
||||
$parent = self::getParentClass($source);
|
||||
|
||||
if (false !== $parent) {
|
||||
$parentClass = $parent->getName();
|
||||
$parentProperties = self::getProperties($parentClass, $filter, $includeParents);
|
||||
}
|
||||
}
|
||||
|
||||
return array_merge($properties, $parentProperties);
|
||||
return $reflection->getProperties($filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a parent class or false if there is no parent class
|
||||
* Returns a parent class.
|
||||
*
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
* @return \ReflectionClass|bool
|
||||
*
|
||||
* @return ReflectionClass
|
||||
*/
|
||||
public static function getParentClass($source)
|
||||
{
|
||||
$className = self::getClassName($source);
|
||||
$reflection = new \ReflectionClass($className);
|
||||
$reflection = new ReflectionClass($className);
|
||||
|
||||
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,
|
||||
* object or string.
|
||||
* @throws CannotResolveClassNameException
|
||||
*
|
||||
* @return array|null
|
||||
*
|
||||
* @throws CannotResolveClassNameException
|
||||
*/
|
||||
public static function getChildClasses($class)
|
||||
{
|
||||
@@ -508,8 +495,8 @@ class Reflection
|
||||
/*
|
||||
* Oops, cannot resolve class
|
||||
*/
|
||||
if (null === $className) {
|
||||
throw CannotResolveClassNameException::create($class);
|
||||
if ($className === null) {
|
||||
throw new CannotResolveClassNameException($class);
|
||||
}
|
||||
|
||||
$childClasses = [];
|
||||
@@ -526,7 +513,7 @@ class Reflection
|
||||
*/
|
||||
$realClass = ClassUtils::getRealClass($oneClass);
|
||||
|
||||
if (in_array($realClass, $childClasses, true)) {
|
||||
if (in_array($realClass, $childClasses)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -543,9 +530,11 @@ class Reflection
|
||||
*
|
||||
* @param array|object|string $parentClass Class who child class should be returned. An array of objects,
|
||||
* namespaces, object or namespace.
|
||||
*
|
||||
* @return mixed
|
||||
*
|
||||
* @throws MissingChildClassesException
|
||||
* @throws TooManyChildClassesException
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getOneChildClass($parentClass)
|
||||
{
|
||||
@@ -556,7 +545,7 @@ class Reflection
|
||||
* Oops, the base / parent class hasn't child class
|
||||
*/
|
||||
if (empty($childClasses)) {
|
||||
throw MissingChildClassesException::create($parentClass);
|
||||
throw new MissingChildClassesException($parentClass);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -564,20 +553,21 @@ class Reflection
|
||||
* Oops, the base / parent class has too many child classes
|
||||
*/
|
||||
if (count($childClasses) > 1) {
|
||||
throw TooManyChildClassesException::create($parentClass, $childClasses);
|
||||
throw new TooManyChildClassesException($parentClass, $childClasses);
|
||||
}
|
||||
|
||||
return trim($childClasses[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns property, the \ReflectionProperty instance, of given object
|
||||
* Returns property, the ReflectionProperty instance, of given object.
|
||||
*
|
||||
* @param array|object|string $class An array of objects, namespaces, object or namespace
|
||||
* @param string $property Name of the property
|
||||
* @param int $filter (optional) Filter of properties. Uses \ReflectionProperty class constants.
|
||||
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class constants.
|
||||
* By default all properties are allowed / processed.
|
||||
* @return null|\ReflectionProperty
|
||||
*
|
||||
* @return null|ReflectionProperty
|
||||
*/
|
||||
public static function getProperty($class, $property, $filter = null)
|
||||
{
|
||||
@@ -585,9 +575,9 @@ class Reflection
|
||||
$properties = self::getProperties($className, $filter);
|
||||
|
||||
if (!empty($properties)) {
|
||||
/* @var $reflectionProperty \ReflectionProperty */
|
||||
/* @var $reflectionProperty ReflectionProperty */
|
||||
foreach ($properties as $reflectionProperty) {
|
||||
if ($reflectionProperty->getName() === $property) {
|
||||
if ($reflectionProperty->getName() == $property) {
|
||||
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|string $trait An array of strings or string
|
||||
* @param bool $verifyParents If is set to true, parent classes are verified if they use given
|
||||
* trait. Otherwise - not.
|
||||
* @throws CannotResolveClassNameException
|
||||
*
|
||||
* @return bool|null
|
||||
*
|
||||
* @throws CannotResolveClassNameException
|
||||
*/
|
||||
public static function usesTrait($class, $trait, $verifyParents = false)
|
||||
{
|
||||
@@ -614,26 +606,26 @@ class Reflection
|
||||
/*
|
||||
* Oops, cannot resolve class
|
||||
*/
|
||||
if (null === $className || '' === $className) {
|
||||
throw CannotResolveClassNameException::create($class);
|
||||
if (empty($className)) {
|
||||
throw new CannotResolveClassNameException($class);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, cannot resolve trait
|
||||
*/
|
||||
if (null === $traitName || '' === $traitName) {
|
||||
if (empty($traitName)) {
|
||||
throw new CannotResolveClassNameException($class, false);
|
||||
}
|
||||
|
||||
$reflection = new \ReflectionClass($className);
|
||||
$reflection = new ReflectionClass($className);
|
||||
$traitsNames = $reflection->getTraitNames();
|
||||
|
||||
$uses = in_array($traitName, $traitsNames, true);
|
||||
$uses = in_array($traitName, $traitsNames);
|
||||
|
||||
if (!$uses && $verifyParents) {
|
||||
$parentClassName = self::getParentClassName($className);
|
||||
|
||||
if (null !== $parentClassName) {
|
||||
if ($parentClassName !== null) {
|
||||
return self::usesTrait($parentClassName, $trait, true);
|
||||
}
|
||||
}
|
||||
@@ -646,71 +638,19 @@ class Reflection
|
||||
* If given class does not extend another, returns null.
|
||||
*
|
||||
* @param array|object|string $class An array of objects, namespaces, object or namespace
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getParentClassName($class)
|
||||
{
|
||||
$className = self::getClassName($class);
|
||||
$reflection = new \ReflectionClass($className);
|
||||
$reflection = new ReflectionClass($className);
|
||||
$parentClass = $reflection->getParentClass();
|
||||
|
||||
if (null === $parentClass || false === $parentClass) {
|
||||
if ($parentClass === null || $parentClass === false) {
|
||||
return null;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
* Useful uri methods (only static functions)
|
||||
* Useful uri methods (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Uri
|
||||
{
|
||||
/**
|
||||
* Returns full uri string
|
||||
* Returns full uri string.
|
||||
*
|
||||
* @param bool $withoutHost (optional) If is set to true, means that host / server name is omitted
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getFullUri($withoutHost = false)
|
||||
{
|
||||
$requestedUrl = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'REQUEST_URI');
|
||||
$effect = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'REQUEST_URI');
|
||||
|
||||
/*
|
||||
* Unknown requested url?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($requestedUrl)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
/*
|
||||
* Without host / server name?
|
||||
* All is done
|
||||
*/
|
||||
if ($withoutHost) {
|
||||
return $requestedUrl;
|
||||
return $effect;
|
||||
}
|
||||
|
||||
return self::getServerNameOrIp(true) . $requestedUrl;
|
||||
return self::getServerNameOrIp(true).$effect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns server name or IP address
|
||||
* Returns server name or IP address.
|
||||
*
|
||||
* @param bool $withProtocol (optional) If is set to true, protocol name is included. Otherwise isn't.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getServerNameOrIp($withProtocol = false)
|
||||
{
|
||||
$host = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_HOST');
|
||||
$protocol = '';
|
||||
|
||||
/*
|
||||
* Unknown host / server?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($host)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
/*
|
||||
* With protocol?
|
||||
* Let's include the protocol
|
||||
*/
|
||||
if ($withProtocol) {
|
||||
return sprintf('%s://%s', self::getProtocolName(), $host);
|
||||
$protocol .= self::getProtocolName().'://';
|
||||
}
|
||||
|
||||
return $host;
|
||||
return $protocol.Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_HOST');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns protocol name
|
||||
* Returns protocol name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getProtocolName()
|
||||
{
|
||||
$effect = '';
|
||||
|
||||
$matches = [];
|
||||
$protocolData = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'SERVER_PROTOCOL'); // e.g. HTTP/1.1
|
||||
$matchCount = preg_match('|(.+)\/(.+)|', $protocolData, $matches);
|
||||
@@ -90,28 +70,31 @@ class Uri
|
||||
* $matches[2] - protocol version, e.g. 1.1
|
||||
*/
|
||||
|
||||
/*
|
||||
* Oops, cannot match protocol
|
||||
*/
|
||||
if (0 === $matchCount) {
|
||||
return '';
|
||||
if ($matchCount > 0) {
|
||||
$effect = strtolower($matches[1]);
|
||||
}
|
||||
|
||||
return strtolower($matches[1]);
|
||||
return $effect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns http referer uri
|
||||
* Returns http referer uri.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getRefererUri()
|
||||
{
|
||||
return Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_REFERER');
|
||||
$effect = '';
|
||||
|
||||
if (filter_has_var(INPUT_SERVER, 'HTTP_REFERER')) {
|
||||
$effect = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_REFERER');
|
||||
}
|
||||
|
||||
return $effect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns user's IP address
|
||||
* Returns user's IP address.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -121,10 +104,11 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns name and version of user's web browser
|
||||
* Returns name and version of user's web browser.
|
||||
*
|
||||
* @param bool $withVersion (optional) If is set to true, version of the browser is returned too. Otherwise -
|
||||
* name only.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getUserWebBrowserName($withVersion = false)
|
||||
@@ -133,9 +117,9 @@ class Uri
|
||||
|
||||
$knownBrowsers = [
|
||||
'Firefox/([\d\.]+)$' => 'Mozilla Firefox',
|
||||
'OPR/([\d\.]+)$' => 'Opera',
|
||||
'Chrome/([\d\.]+)$' => 'Google Chrome',
|
||||
'Safari/([\d\.]+)$' => 'Apple Safari',
|
||||
'OPR/([\d\.]+)$' => 'Opera',
|
||||
'Chrome/([\d\.]+)$' => 'Google Chrome',
|
||||
'Safari/([\d\.]+)$' => 'Apple Safari',
|
||||
];
|
||||
|
||||
foreach ($knownBrowsers as $pattern => $browserName) {
|
||||
@@ -157,7 +141,7 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns user's web browser information
|
||||
* Returns user's web browser information.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
@@ -183,7 +167,7 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns name of user's operating system
|
||||
* Returns name of user's operating system.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@@ -193,8 +177,8 @@ class Uri
|
||||
|
||||
$knownSystems = [
|
||||
'Linux' => 'Linux',
|
||||
'Win' => 'Windows',
|
||||
'Mac' => 'Mac OS',
|
||||
'Win' => 'Windows',
|
||||
'Mac' => 'Mac OS',
|
||||
];
|
||||
|
||||
foreach ($knownSystems as $pattern => $systemName) {
|
||||
@@ -210,7 +194,7 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if running server is localhost
|
||||
* Returns information if running server is localhost.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
@@ -226,50 +210,27 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given url is external, from another server / domain
|
||||
* Returns information if given url is external, from another server / domain.
|
||||
*
|
||||
* @param string $url The url to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isExternalUrl($url)
|
||||
{
|
||||
/*
|
||||
* Unknown url or it's just slash?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($url) || '/' === $url) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$currentUrl = self::getServerNameOrIp(true);
|
||||
$url = self::replenishProtocol($url);
|
||||
|
||||
/*
|
||||
* Let's prepare pattern of current url
|
||||
*/
|
||||
$search = [
|
||||
':',
|
||||
'/',
|
||||
'.',
|
||||
];
|
||||
|
||||
$replace = [
|
||||
'\:',
|
||||
'\/',
|
||||
'\.',
|
||||
];
|
||||
|
||||
$currentUrlPattern = str_replace($search, $replace, $currentUrl);
|
||||
|
||||
return !Regex::contains($url, $currentUrlPattern);
|
||||
return !Regex::contains($currentUrl, $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replenishes protocol in the given url
|
||||
* Replenishes protocol in the given url.
|
||||
*
|
||||
* @param string $url The url to check and replenish
|
||||
* @param string $protocol (optional) The protocol which is replenished. If is empty, protocol of current request
|
||||
* is used.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function replenishProtocol($url, $protocol = '')
|
||||
@@ -308,23 +269,16 @@ class Uri
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns url to resource secured by given htpasswd login and password
|
||||
* Returns url to resource secured by given htpasswd login and password.
|
||||
*
|
||||
* @param string $url A path / url to some resource, e.g. page, image, css file
|
||||
* @param string $user (optional) User name used to log in
|
||||
* @param string $password (optional) User password used to log in
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getSecuredUrl($url, $user = '', $password = '')
|
||||
{
|
||||
/*
|
||||
* Url is not provided?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($url)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$protocol = self::getProtocolName();
|
||||
$host = self::getServerNameOrIp();
|
||||
|
||||
@@ -332,7 +286,7 @@ class Uri
|
||||
$url = sprintf('/%s', $url);
|
||||
}
|
||||
|
||||
$url = $host . $url;
|
||||
$url = $host.$url;
|
||||
|
||||
if (!empty($user) && !empty($password)) {
|
||||
$url = sprintf('%s:%s@%s', $user, $password, $url);
|
||||
@@ -347,13 +301,14 @@ class Uri
|
||||
*
|
||||
* @param string $url Url string
|
||||
* @param string $protocol (optional) Protocol string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function addProtocolToUrl($url, $protocol = 'http')
|
||||
{
|
||||
$pattern = sprintf('/^%s.*/', $protocol);
|
||||
|
||||
if ((bool)preg_match($pattern, $url)) {
|
||||
if ((bool) preg_match($pattern, $url)) {
|
||||
return $url;
|
||||
}
|
||||
|
||||
@@ -13,10 +13,10 @@ use DOMXPath;
|
||||
use SimpleXMLElement;
|
||||
|
||||
/**
|
||||
* Useful XML-related methods (only static functions)
|
||||
* Useful XML-related methods (only static functions).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class Xml
|
||||
{
|
||||
@@ -26,6 +26,7 @@ class Xml
|
||||
*
|
||||
* @param SimpleXMLElement $element1 First element to merge
|
||||
* @param SimpleXMLElement $element2 Second element to merge
|
||||
*
|
||||
* @return SimpleXMLElement
|
||||
*/
|
||||
public static function mergeNodes(SimpleXMLElement $element1, SimpleXMLElement $element2)
|
||||
@@ -40,7 +41,7 @@ class Xml
|
||||
$query = $path->query('/*/*');
|
||||
$nodesCount = $query->length;
|
||||
|
||||
if (0 === $nodesCount) {
|
||||
if ($nodesCount == 0) {
|
||||
return $element1;
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use Meritoo\Common\Traits\Test\Base\BaseTestCaseTrait;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Base test case with common methods and data providers
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
abstract class BaseTestCase extends TestCase
|
||||
{
|
||||
use BaseTestCaseTrait;
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use Meritoo\Common\Traits\Test\Base\BaseTypeTestCaseTrait;
|
||||
|
||||
/**
|
||||
* Base test case for the type of something
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
abstract class BaseTypeTestCase extends BaseTestCase
|
||||
{
|
||||
use BaseTypeTestCaseTrait;
|
||||
}
|
||||
@@ -1,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,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,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
|
||||
*/
|
||||
private $majorPart;
|
||||
|
||||
/**
|
||||
* The "minor" part.
|
||||
* Incremented when you add functionality in a backwards-compatible manner.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $minorPart;
|
||||
|
||||
/**
|
||||
* The "patch" part.
|
||||
* Incremented when you make backwards-compatible bug fixes.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $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 string representation of instance of this class
|
||||
*
|
||||
* @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,71 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Date;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while type of date part, e.g. "year", is unknown
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownDatePartTypeExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(UnknownDatePartTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $unknownDatePart Type of date part, e.g. "year". One of DatePartType class constants.
|
||||
* @param string $value Incorrect value
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideDatePartAndValue
|
||||
*/
|
||||
public function testMessage($unknownDatePart, $value, $expectedMessage)
|
||||
{
|
||||
$exception = UnknownDatePartTypeException::createException($unknownDatePart, $value);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type of date part, incorrect value and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideDatePartAndValue()
|
||||
{
|
||||
$template = 'The \'%s\' type of date part (with value %s) is unknown. Probably doesn\'t exist or there is a'
|
||||
. ' typo. You should use one of these types: day, hour, minute, month, second, year.';
|
||||
|
||||
yield[
|
||||
DatePartType::DAY,
|
||||
'44',
|
||||
sprintf($template, DatePartType::DAY, '44'),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePartType::MONTH,
|
||||
'22',
|
||||
sprintf($template, DatePartType::MONTH, '22'),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePartType::MINUTE,
|
||||
'77',
|
||||
sprintf($template, DatePartType::MINUTE, '77'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\File;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\File\EmptyFileException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while file with given path is empty (has no content)
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFileExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(EmptyFileException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $emptyFilePath Path of the empty file
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider providePathOfFile
|
||||
*/
|
||||
public function testMessage($emptyFilePath, $expectedMessage)
|
||||
{
|
||||
$exception = EmptyFileException::create($emptyFilePath);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of the empty file and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function providePathOfFile()
|
||||
{
|
||||
$template = 'File with path \'%s\' is empty (has no content). Did you provide path of proper file?';
|
||||
|
||||
yield[
|
||||
'aa/bb/cc',
|
||||
sprintf($template, 'aa/bb/cc'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'images/show/car.jpg',
|
||||
sprintf($template, 'images/show/car.jpg'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\File;
|
||||
|
||||
use Meritoo\Common\Exception\File\EmptyFilePathException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while path of given file is empty
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFilePathExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(EmptyFilePathException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
public function testConstructorMessage()
|
||||
{
|
||||
$exception = EmptyFilePathException::create();
|
||||
static::assertEquals('Path of the file is empty. Did you provide path of proper file?', $exception->getMessage());
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\File;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\File\NotExistingFileException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while file with given path does not exist
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class NotExistingFileExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(NotExistingFileException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $notExistingFilePath Path of not existing (or not readable) file
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider providePathOfFile
|
||||
*/
|
||||
public function testConstructorMessage($notExistingFilePath, $expectedMessage)
|
||||
{
|
||||
$exception = NotExistingFileException::create($notExistingFilePath);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of not existing file and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function providePathOfFile()
|
||||
{
|
||||
$template = 'File with path \'%s\' does not exist (or is not readable). Did you provide path of proper file?';
|
||||
|
||||
yield[
|
||||
'aa/bb/cc',
|
||||
sprintf($template, 'aa/bb/cc'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'images/show/car.jpg',
|
||||
sprintf($template, 'images/show/car.jpg'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Method;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Method\DisabledMethodException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while method cannot be called, because is disabled
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DisabledMethodExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(DisabledMethodException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $disabledMethod Name of the disabled method
|
||||
* @param string $alternativeMethod Name of the alternative method
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @internal param string $emptyFilePath Path of the empty file
|
||||
* @dataProvider provideMethodsNames
|
||||
*/
|
||||
public function testConstructorMessage($disabledMethod, $alternativeMethod, $expectedMessage)
|
||||
{
|
||||
$exception = DisabledMethodException::create($disabledMethod, $alternativeMethod);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides name of the disabled method, name of the alternative method and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideMethodsNames()
|
||||
{
|
||||
$templateShort = 'Method %s() cannot be called, because is disabled.';
|
||||
$templateLong = $templateShort . ' Use %s() instead.';
|
||||
|
||||
yield[
|
||||
'FooBar::loremIpsum',
|
||||
'',
|
||||
sprintf($templateShort, 'FooBar::loremIpsum'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'FooBar::loremIpsum',
|
||||
'AnotherClass::alternativeMethod',
|
||||
sprintf($templateLong, 'FooBar::loremIpsum', 'AnotherClass::alternativeMethod'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Reflection;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while name of class or trait cannot be resolved
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class CannotResolveClassNameExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(CannotResolveClassNameException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|object|string $source Source of the class's / trait's name. It can be an array of objects,
|
||||
* namespaces, object or namespace.
|
||||
* @param bool $forClass If is set to true, message of this exception for class is prepared.
|
||||
* Otherwise - for trait.
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideClassName
|
||||
*/
|
||||
public function testConstructorMessage($source, $forClass, $expectedMessage)
|
||||
{
|
||||
$exception = CannotResolveClassNameException::create($source, $forClass);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides source of the class's / trait's name, information if message of this exception should be prepared for
|
||||
* class and the expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideClassName()
|
||||
{
|
||||
yield[
|
||||
'Not\Existing\Class',
|
||||
true,
|
||||
'Name of class from given \'string\' Not\Existing\Class cannot be resolved. Is there everything ok?',
|
||||
];
|
||||
|
||||
yield[
|
||||
'Not\Existing\Trait',
|
||||
false,
|
||||
'Name of trait from given \'string\' Not\Existing\Trait cannot be resolved. Is there everything ok?',
|
||||
];
|
||||
|
||||
yield[
|
||||
[
|
||||
new \stdClass(),
|
||||
new \stdClass(),
|
||||
],
|
||||
true,
|
||||
'Name of class from given \'array\' cannot be resolved. Is there everything ok?',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Reflection;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while given class has no child classes
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class MissingChildClassesExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(MissingChildClassesException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|object|string $parentClass Class that hasn't child classes, but it should. An array of objects,
|
||||
* strings, object or string.
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideParentClass
|
||||
*/
|
||||
public function testConstructorMessage($parentClass, $expectedMessage)
|
||||
{
|
||||
$exception = MissingChildClassesException::create($parentClass);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides name of class that hasn't child classes, but it should, and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideParentClass()
|
||||
{
|
||||
$template = 'The \'%s\' class requires one child class at least who will extend her (maybe is an abstract'
|
||||
. ' class), but the child classes are missing. Did you forget to extend this class?';
|
||||
|
||||
yield[
|
||||
MissingChildClassesException::class,
|
||||
sprintf($template, MissingChildClassesException::class),
|
||||
];
|
||||
|
||||
yield[
|
||||
[
|
||||
new \stdClass(),
|
||||
new \stdClass(),
|
||||
],
|
||||
sprintf($template, \stdClass::class),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Reflection;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Reflection\TooManyChildClassesException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while given class has more than one child class
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class TooManyChildClassesExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(TooManyChildClassesException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|object|string $parentClass Class that has more than one child class, but it shouldn't. An array
|
||||
* of objects, strings, object or string.
|
||||
* @param array $childClasses Child classes
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideParentAndChildClasses
|
||||
*/
|
||||
public function testConstructorMessage($parentClass, array $childClasses, $expectedMessage)
|
||||
{
|
||||
$exception = TooManyChildClassesException::create($parentClass, $childClasses);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides name of class that has more than one child class, but it shouldn't, child classes, and expected
|
||||
* exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideParentAndChildClasses()
|
||||
{
|
||||
$template = "The '%s' class requires one child class at most who will extend her, but more than one child"
|
||||
. " class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
|
||||
|
||||
yield[
|
||||
BaseTestCase::class,
|
||||
[
|
||||
\stdClass::class,
|
||||
OopVisibilityType::class,
|
||||
],
|
||||
sprintf($template, BaseTestCase::class, implode("\n- ", [
|
||||
\stdClass::class,
|
||||
OopVisibilityType::class,
|
||||
]), BaseTestCase::class),
|
||||
];
|
||||
|
||||
yield[
|
||||
TooManyChildClassesException::class,
|
||||
[
|
||||
\stdClass::class,
|
||||
],
|
||||
sprintf($template, TooManyChildClassesException::class, implode("\n- ", [\stdClass::class]), TooManyChildClassesException::class),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Regex;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while length of given hexadecimal value of color is incorrect
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class IncorrectColorHexLengthExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(IncorrectColorHexLengthException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $color Incorrect hexadecimal value of color
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideColor
|
||||
*/
|
||||
public function testConstructorMessage($color, $expectedMessage)
|
||||
{
|
||||
$exception = IncorrectColorHexLengthException::create($color);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides incorrect hexadecimal value of color and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideColor()
|
||||
{
|
||||
$template = 'Length of hexadecimal value of color \'%s\' is incorrect. It\'s %d, but it should be 3 or 6. Is there everything ok?';
|
||||
|
||||
yield[
|
||||
'',
|
||||
sprintf($template, '', strlen('')),
|
||||
];
|
||||
|
||||
yield[
|
||||
'aa-bb-cc',
|
||||
sprintf($template, 'aa-bb-cc', strlen('aa-bb-cc')),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Regex;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while given hexadecimal value of color is invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidColorHexValueExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(InvalidColorHexValueException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $color Invalid hexadecimal value of color
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideColor
|
||||
*/
|
||||
public function testConstructorMessage($color, $expectedMessage)
|
||||
{
|
||||
$exception = InvalidColorHexValueException::create($color);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides invalid hexadecimal value of color and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideColor()
|
||||
{
|
||||
$template = 'Hexadecimal value of color \'%s\' is invalid. Is there everything ok?';
|
||||
|
||||
yield[
|
||||
'',
|
||||
sprintf($template, ''),
|
||||
];
|
||||
|
||||
yield[
|
||||
'aa-bb-cc',
|
||||
sprintf($template, 'aa-bb-cc'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Regex;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Regex\InvalidHtmlAttributesException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while html attributes are invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidHtmlAttributesExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(InvalidHtmlAttributesException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $htmlAttributes Invalid html attributes
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideHtmlAttributes
|
||||
*/
|
||||
public function testConstructorMessage($htmlAttributes, $expectedMessage)
|
||||
{
|
||||
$exception = InvalidHtmlAttributesException::create($htmlAttributes);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides html attributes
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideHtmlAttributes()
|
||||
{
|
||||
$template = 'HTML attributes \'%s\' are invalid. Is there everything ok?';
|
||||
|
||||
yield[
|
||||
'abc = def',
|
||||
sprintf($template, 'abc = def'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'abc = def ghi = jkl',
|
||||
sprintf($template, 'abc = def ghi = jkl'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'abc=def ghi=jkl',
|
||||
sprintf($template, 'abc=def ghi=jkl'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Regex;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Regex\InvalidUrlException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while url is invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidUrlExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(InvalidUrlException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $url Invalid url
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideUrl
|
||||
*/
|
||||
public function testConstructorMessage($url, $expectedMessage)
|
||||
{
|
||||
$exception = InvalidUrlException::create($url);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides invalid url and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideUrl()
|
||||
{
|
||||
$template = 'Url \'%s\' is invalid. Is there everything ok?';
|
||||
|
||||
yield[
|
||||
'aa/bb/cc',
|
||||
sprintf($template, 'aa/bb/cc'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'http:/images\show\car.jpg',
|
||||
sprintf($template, 'http:/images\show\car.jpg'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Type;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is
|
||||
* unknown
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownOopVisibilityTypeExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(UnknownOopVisibilityTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $unknownType Unknown OOP-related visibility
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideUnknownType
|
||||
*/
|
||||
public function testConstructorMessage($unknownType, $expectedMessage)
|
||||
{
|
||||
$exception = UnknownOopVisibilityTypeException::createException($unknownType);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of the empty file and expected exception's message
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideUnknownType()
|
||||
{
|
||||
$allTypes = (new OopVisibilityType())->getAll();
|
||||
|
||||
$template = 'The \'%s\' type of OOP-related visibility is unknown. Probably doesn\'t exist or there is a typo.'
|
||||
. ' You should use one of these types: %s.';
|
||||
|
||||
yield[
|
||||
'',
|
||||
sprintf($template, '', implode(', ', $allTypes)),
|
||||
];
|
||||
|
||||
yield[
|
||||
123,
|
||||
sprintf($template, 123, implode(', ', $allTypes)),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -9,35 +9,34 @@
|
||||
namespace Meritoo\Common\Test\Collection;
|
||||
|
||||
use ArrayIterator;
|
||||
use Generator;
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of the collection of elements
|
||||
* Tests of the collection of elements.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class CollectionTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* An empty collection
|
||||
* An empty collection.
|
||||
*
|
||||
* @var Collection
|
||||
*/
|
||||
private $emptyCollection;
|
||||
|
||||
/**
|
||||
* Simple collection
|
||||
* Simple collection.
|
||||
*
|
||||
* @var Collection
|
||||
*/
|
||||
private $simpleCollection;
|
||||
|
||||
/**
|
||||
* Elements of simple collection
|
||||
* Elements of simple collection.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
@@ -130,39 +129,22 @@ class CollectionTest extends BaseTestCase
|
||||
static::assertInstanceOf(ArrayIterator::class, $this->simpleCollection->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $element The element to add
|
||||
* @param int $expectedCount Expected count of elements in collection
|
||||
* @param int $expectedIndex Expected index of added element in collection
|
||||
* @param Collection $collection The collection
|
||||
*
|
||||
* @dataProvider provideElementToAdd
|
||||
*/
|
||||
public function testAddWithoutIndex($element, $expectedCount, $expectedIndex, Collection $collection)
|
||||
public function testAdd()
|
||||
{
|
||||
$collection->add($element);
|
||||
$this->emptyCollection->add('test1');
|
||||
|
||||
static::assertTrue($collection->has($element));
|
||||
static::assertEquals($expectedCount, $collection->count());
|
||||
static::assertEquals($element, $collection[$expectedIndex]);
|
||||
static::assertTrue($this->emptyCollection->has('test1'));
|
||||
static::assertEquals(1, $this->emptyCollection->count());
|
||||
static::assertEquals('test1', $this->emptyCollection[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $element The element to add
|
||||
* @param mixed $index Index of element to add
|
||||
* @param int $expectedCount Expected count of elements in collection
|
||||
* @param int $expectedIndex Expected index of added element in collection
|
||||
* @param Collection $collection The collection
|
||||
*
|
||||
* @dataProvider provideElementToAddWithIndex
|
||||
*/
|
||||
public function testAddWithIndex($element, $index, $expectedCount, $expectedIndex, Collection $collection)
|
||||
public function testAddWithIndex()
|
||||
{
|
||||
$collection->add($element, $index);
|
||||
$this->emptyCollection->add('test2', 1234);
|
||||
|
||||
static::assertTrue($collection->has($element));
|
||||
static::assertEquals($expectedCount, $collection->count());
|
||||
static::assertEquals($element, $collection[$expectedIndex]);
|
||||
static::assertTrue($this->emptyCollection->has('test2'));
|
||||
static::assertEquals(1, $this->emptyCollection->count());
|
||||
static::assertEquals('test2', $this->emptyCollection[1234]);
|
||||
}
|
||||
|
||||
public function testAddMultipleUsingEmptyArray()
|
||||
@@ -324,88 +306,7 @@ class CollectionTest extends BaseTestCase
|
||||
|
||||
public function testExistsVisibilityAndArguments()
|
||||
{
|
||||
static::assertMethodVisibilityAndArguments(Collection::class, 'exists', OopVisibilityType::IS_PRIVATE, 1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides element to add to collection
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideElementToAdd()
|
||||
{
|
||||
$collection = new Collection();
|
||||
|
||||
yield[
|
||||
'test1',
|
||||
1,
|
||||
0,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test2',
|
||||
2,
|
||||
1,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test3',
|
||||
3,
|
||||
2,
|
||||
$collection,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides element with index to add to collection
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideElementToAddWithIndex()
|
||||
{
|
||||
$collection = new Collection();
|
||||
|
||||
yield[
|
||||
'test1',
|
||||
'aa',
|
||||
1,
|
||||
'aa',
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test2',
|
||||
'oo',
|
||||
2,
|
||||
'oo',
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test3',
|
||||
null,
|
||||
3,
|
||||
0,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test4',
|
||||
'',
|
||||
4,
|
||||
1,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test5',
|
||||
'vv',
|
||||
5,
|
||||
'vv',
|
||||
$collection,
|
||||
];
|
||||
$this->verifyMethodVisibilityAndArguments(Collection::class, 'exists', OopVisibilityType::IS_PRIVATE, 1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -9,23 +9,17 @@
|
||||
namespace Meritoo\Common\Test\Exception\Base;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
use PHPUnit_Framework_TestCase;
|
||||
|
||||
/**
|
||||
* Test case of the exception used while type of something is unknown
|
||||
* Tests of the exception used while type of something is unknown.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class UnknownTypeExceptionTest extends BaseTestCase
|
||||
class UnknownTypeExceptionTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(UnknownTestTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
public function testWithoutException()
|
||||
{
|
||||
self::assertEquals('Test 2', (new TestService())->getTranslatedType('test_2'));
|
||||
@@ -33,16 +27,16 @@ class UnknownTypeExceptionTest extends BaseTestCase
|
||||
|
||||
public function testTheException()
|
||||
{
|
||||
$this->setExpectedException(UnknownTestTypeException::class);
|
||||
$this->expectException(UnknownTestTypeException::class);
|
||||
self::assertEmpty((new TestService())->getTranslatedType('test_3'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Type of something (for testing purposes)
|
||||
* Type of something (for testing purposes).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TestType extends BaseType
|
||||
{
|
||||
@@ -52,42 +46,40 @@ class TestType extends BaseType
|
||||
}
|
||||
|
||||
/**
|
||||
* An exception used while type of something is unknown (for testing purposes)
|
||||
* An exception used while type of something is unknown (for testing purposes).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class UnknownTestTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
* Class constructor.
|
||||
*
|
||||
* @param string $unknownType The unknown type of something (for testing purposes)
|
||||
* @return UnknownTestTypeException
|
||||
* @param int|string $unknownType The unknown type of something (for testing purposes)
|
||||
*/
|
||||
public static function createException($unknownType)
|
||||
public function __construct($unknownType)
|
||||
{
|
||||
/* @var UnknownTestTypeException $exception */
|
||||
$exception = parent::create($unknownType, new TestType(), 'type of something used for testing');
|
||||
|
||||
return $exception;
|
||||
parent::__construct($unknownType, new TestType(), 'type of something used for testing');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Service used together with type of something (for testing purposes)
|
||||
* Service used together with type of something (for testing purposes).
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TestService
|
||||
{
|
||||
/**
|
||||
* Returns translated type (for testing purposes)
|
||||
* Returns translated type (for testing purposes).
|
||||
*
|
||||
* @param string $type Type of something (for testing purposes)
|
||||
* @throws UnknownTestTypeException
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws UnknownTestTypeException
|
||||
*/
|
||||
public function getTranslatedType($type)
|
||||
{
|
||||
@@ -9,22 +9,17 @@
|
||||
namespace Meritoo\Common\Test\Type\Base;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
use PHPUnit_Framework_TestCase;
|
||||
|
||||
/**
|
||||
* Test case of the base / abstract type of something
|
||||
* Tests of the base / abstract type of something.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class BaseTypeTest extends BaseTestCase
|
||||
class BaseTypeTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(BaseType::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param BaseType $type Type of something
|
||||
* @param array $expectedTypes Expected concrete types of given instance of type
|
||||
@@ -50,7 +45,7 @@ class BaseTypeTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type of something for testing the getAll() method
|
||||
* Provides type of something for testing the getAll() method.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -71,7 +66,7 @@ class BaseTypeTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type of something for testing the isCorrectType() method
|
||||
* Provides type of something for testing the isCorrectType() method.
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
@@ -182,20 +177,20 @@ class BaseTypeTest extends BaseTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty type of something used for testing
|
||||
* Empty type of something used for testing.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TestEmptyType extends BaseType
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Type of something used for testing
|
||||
* Type of something used for testing.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class TestType extends BaseType
|
||||
{
|
||||
@@ -12,10 +12,10 @@ use Meritoo\Common\Test\Base\BaseTypeTestCase;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
|
||||
/**
|
||||
* Test case of the type of date part, e.g. "year"
|
||||
* Tests of the type of date part, e.g. "year".
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class DatePartTypeTest extends BaseTypeTestCase
|
||||
{
|
||||
@@ -25,12 +25,12 @@ class DatePartTypeTest extends BaseTypeTestCase
|
||||
protected function getAllExpectedTypes()
|
||||
{
|
||||
return [
|
||||
'DAY' => DatePartType::DAY,
|
||||
'HOUR' => DatePartType::HOUR,
|
||||
'DAY' => DatePartType::DAY,
|
||||
'HOUR' => DatePartType::HOUR,
|
||||
'MINUTE' => DatePartType::MINUTE,
|
||||
'MONTH' => DatePartType::MONTH,
|
||||
'MONTH' => DatePartType::MONTH,
|
||||
'SECOND' => DatePartType::SECOND,
|
||||
'YEAR' => DatePartType::YEAR,
|
||||
'YEAR' => DatePartType::YEAR,
|
||||
];
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user