mirror of
https://github.com/wiosna-dev/common-library.git
synced 2026-03-12 09:31:51 +01:00
Merge pull request #1 from meritoo/master
[UW-2934] Merge official version 1.1.x
This commit is contained in:
2
.coveralls.yml
Normal file
2
.coveralls.yml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
coverage_clover: build/reports/coveralls/clover.xml
|
||||||
|
json_path: build/reports/coveralls/upload.json
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# -----------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
### Docker
|
### Docker
|
||||||
# -----------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
#
|
#
|
||||||
# All containers
|
# All containers
|
||||||
@@ -12,4 +12,4 @@ DOCKER_CONTAINER_PROJECT=common-library
|
|||||||
# PHP configuration:
|
# PHP configuration:
|
||||||
# - timezone
|
# - timezone
|
||||||
#
|
#
|
||||||
TIMEZONE=Europe/Warsaw
|
PHP_DATE_TIMEZONE=Europe/London
|
||||||
207
.gitignore
vendored
207
.gitignore
vendored
@@ -1,59 +1,19 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
### Environment-related parameters
|
### Linux template
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
.env
|
*~
|
||||||
|
|
||||||
|
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||||
|
.fuse_hidden*
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# KDE directory preferences
|
||||||
### Vendors
|
.directory
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
/vendor/
|
|
||||||
|
|
||||||
|
# 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
|
||||||
### Composer
|
.nfs*
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
/composer.lock
|
|
||||||
/composer.phar
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
### Phing
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
/phing/properties
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
### PHPUnit
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
/phpunit.xml
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
### PHP Coding Standards Fixer
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
/.php_cs
|
|
||||||
/.php_cs.cache
|
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
### Build files
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
/build/
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
### Generated databases
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
/data/tmp
|
|
||||||
*.sql
|
|
||||||
*.sqlite
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
### JetBrains template
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
/.idea
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -87,29 +47,12 @@ Temporary Items
|
|||||||
.apdisk
|
.apdisk
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
### Linux template
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
*~
|
|
||||||
|
|
||||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
|
||||||
.fuse_hidden*
|
|
||||||
|
|
||||||
# KDE directory preferences
|
|
||||||
.directory
|
|
||||||
|
|
||||||
# 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 template
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Windows thumbnail cache files
|
# Windows thumbnail cache files
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
ehthumbs.db
|
ehthumbs.db
|
||||||
ehthumbs_vista.db
|
ehthumbs_vista.db
|
||||||
|
|
||||||
@@ -131,3 +74,131 @@ $RECYCLE.BIN/
|
|||||||
|
|
||||||
# Windows shortcuts
|
# Windows shortcuts
|
||||||
*.lnk
|
*.lnk
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
### JetBrains template
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
# *.iml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
.idea/httpRequests
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
### Build files
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
/build/
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
### Phing
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
/phing/properties
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
### Infection
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
/infection.json
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
### Temporary data & databases
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
/data/tmp
|
||||||
|
*.sqlite
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
### Composer & vendors
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
/composer.lock
|
||||||
|
/composer.phar
|
||||||
|
/vendor/
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
### PHPUnit
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
/phpunit.xml
|
||||||
|
/.phpunit.result.cache
|
||||||
|
/tests/Resources/var
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
### PHP Coding Standards Fixer
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
/.php_cs
|
||||||
|
/.php_cs.cache
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
### PHP_CodeSniffer
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
/.phpcs-cache
|
||||||
|
/phpcs.xml
|
||||||
|
|||||||
53
.php_cs.dist
53
.php_cs.dist
@@ -1,27 +1,52 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$finder = PhpCsFixer\Finder::create()
|
$finder = PhpCsFixer\Finder::create()
|
||||||
->in([
|
->in(__DIR__)
|
||||||
__DIR__ . '/src',
|
->exclude([
|
||||||
__DIR__ . '/tests',
|
'build',
|
||||||
|
'vendor',
|
||||||
|
])
|
||||||
|
->notPath([
|
||||||
|
'tests/Resources/var/',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return PhpCsFixer\Config::create()
|
return PhpCsFixer\Config::create()
|
||||||
->setRules([
|
->setRules([
|
||||||
'@Symfony' => true,
|
'@Symfony' => true,
|
||||||
'binary_operator_spaces' => [
|
'@PhpCsFixer' => true,
|
||||||
|
'@PHP71Migration' => true,
|
||||||
|
'array_syntax' => ['syntax' => 'short'],
|
||||||
|
'binary_operator_spaces' => [
|
||||||
'align_double_arrow' => true,
|
'align_double_arrow' => true,
|
||||||
],
|
],
|
||||||
'blank_line_before_return' => false,
|
'blank_line_before_return' => false,
|
||||||
'cast_spaces' => false,
|
'cast_spaces' => false,
|
||||||
'concat_space' => [
|
'concat_space' => [
|
||||||
'spacing' => 'one',
|
'spacing' => 'one',
|
||||||
],
|
],
|
||||||
|
'ordered_class_elements' => [
|
||||||
|
'order' => [
|
||||||
|
'use_trait',
|
||||||
|
'constant_public',
|
||||||
|
'constant_protected',
|
||||||
|
'constant_private',
|
||||||
|
'property_public',
|
||||||
|
'property_protected',
|
||||||
|
'property_private',
|
||||||
|
'construct',
|
||||||
|
'destruct',
|
||||||
|
'magic',
|
||||||
|
'method_public',
|
||||||
|
'method_protected',
|
||||||
|
'method_private',
|
||||||
|
],
|
||||||
|
],
|
||||||
'phpdoc_add_missing_param_annotation' => true,
|
'phpdoc_add_missing_param_annotation' => true,
|
||||||
'phpdoc_align' => false,
|
'phpdoc_align' => false,
|
||||||
'phpdoc_order' => true,
|
'phpdoc_order' => true,
|
||||||
'phpdoc_separation' => false,
|
'phpdoc_separation' => false,
|
||||||
'phpdoc_summary' => false,
|
'phpdoc_summary' => false,
|
||||||
'trim_array_spaces' => false,
|
'trim_array_spaces' => false,
|
||||||
])
|
])
|
||||||
->setFinder($finder);
|
->setFinder($finder)
|
||||||
|
;
|
||||||
|
|||||||
2
.travis-php-config.ini
Normal file
2
.travis-php-config.ini
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
date.timezone = Europe/London
|
||||||
|
memory_limit = 2G
|
||||||
18
.travis.yml
18
.travis.yml
@@ -1,17 +1,23 @@
|
|||||||
language: php
|
language: php
|
||||||
|
|
||||||
php:
|
php:
|
||||||
- 5.6
|
|
||||||
- 7.0
|
|
||||||
- 7.1
|
|
||||||
- 7.2
|
- 7.2
|
||||||
|
- 7.3
|
||||||
|
- 7.4
|
||||||
|
|
||||||
before_install:
|
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
|
- 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
|
- pear channel-discover pear.phing.info
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- travis_wait 30 composer install -v
|
- pear install phing/phing
|
||||||
|
- phpenv rehash
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- phpenv config-add .travis-php-config.ini
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- php ./vendor/bin/phpunit
|
- phing
|
||||||
|
|
||||||
|
after_success:
|
||||||
|
- travis_retry php vendor/bin/php-coveralls -v
|
||||||
|
|||||||
106
CHANGELOG.md
106
CHANGELOG.md
@@ -2,6 +2,106 @@
|
|||||||
|
|
||||||
Common and useful classes, methods, exceptions etc.
|
Common and useful classes, methods, exceptions etc.
|
||||||
|
|
||||||
|
# 1.1.8
|
||||||
|
|
||||||
|
1. [Composer] Upgrade all dev packages (to the latest, stable versions for PHP `7.4`)
|
||||||
|
2. [BaseCollection] Interfaces of different types of collections. May be used to build specific collections.
|
||||||
|
|
||||||
|
# 1.1.7
|
||||||
|
|
||||||
|
1. [Arrays] Allow to define a key of next level elements in a function that returns elements from given level
|
||||||
|
|
||||||
|
# 1.1.6
|
||||||
|
|
||||||
|
1. [Arrays] Function that returns elements from given level
|
||||||
|
|
||||||
|
# 1.1.5
|
||||||
|
|
||||||
|
1. [BaseCollection] Prepare elements while adding them by `addMultiple()` method in the same way as passing them in
|
||||||
|
constructor.
|
||||||
|
|
||||||
|
# 1.1.4
|
||||||
|
|
||||||
|
1. [BaseCollection] Fix incorrectly working limit() method
|
||||||
|
|
||||||
|
# 1.1.3
|
||||||
|
|
||||||
|
1. Move `Renderable` class: `Meritoo\Common` -> `Meritoo\Common\Contract`
|
||||||
|
2. Create and implement `CollectionInterface` as contract of all collections (e.g. based on the `BaseCollection` class)
|
||||||
|
|
||||||
|
# 1.1.2
|
||||||
|
|
||||||
|
1. Change mode of `Xdebug` to `coverage` in Docker's configuration to make it possible to generate code coverage by
|
||||||
|
`PHPUnit`
|
||||||
|
2. Mark PHPUnit test as risky when it does not have a `@covers` annotation
|
||||||
|
|
||||||
|
# 1.1.1
|
||||||
|
|
||||||
|
1. [BaseCollection] Treat the `null` index as "no index" only while adding new element, iow. do not treat empty string
|
||||||
|
as "no index" behaviour.
|
||||||
|
2. [Miscellaneous] [Regex] Use simpler & stronger pattern to match name of file
|
||||||
|
3. Do not install `hirak/prestissimo` package while running Travis CI (incompatible with your PHP version, PHP
|
||||||
|
extensions and Composer version)
|
||||||
|
4. Use PHP `7.4` while running build in Travis CI
|
||||||
|
|
||||||
|
# 1.1.0
|
||||||
|
|
||||||
|
1. Rename Meritoo\Common\Collection\Collection class to Meritoo\Common\Collection\BaseCollection. Add BaseCollection::
|
||||||
|
isValidType() method to validate type of element before add it to collection. Add BaseCollection ::prepareElements()
|
||||||
|
method to allow preparation of elements in custom way.
|
||||||
|
|
||||||
|
# 1.0.6
|
||||||
|
|
||||||
|
1. Use `.env` instead of `.env.dist`
|
||||||
|
2. Docker > use images (instead of Dockerfiles)
|
||||||
|
3. composer > squizlabs/php_codesniffer package > use ^3.4 (instead of ^2.9)
|
||||||
|
4. Do not require name of class by BaseTestCaseTrait::assertMethodVisibilityAndArguments() method
|
||||||
|
5. PHP CS Fixer > configuration > make more readable & remove unnecessary code
|
||||||
|
6. Update .gitignore, docker-compose.yml, phpunit.xml.dist
|
||||||
|
|
||||||
|
# 1.0.5
|
||||||
|
|
||||||
|
1. Collection > trait > return "void" where "self" causes type hinting problem and is not required
|
||||||
|
|
||||||
|
# 1.0.4
|
||||||
|
|
||||||
|
1. PHP Coding Standards Fixer > update configuration
|
||||||
|
2. Phing > tests > add task for Psalm (https://psalm.dev)
|
||||||
|
3. Collection > trait > split into smaller traits (to make it more flexible)
|
||||||
|
|
||||||
|
# 1.0.3
|
||||||
|
|
||||||
|
1. Travis CI > run many tasks using Phing > update configuration
|
||||||
|
2. Template with placeholders > verification of placeholders without values > make stronger and point out which are
|
||||||
|
missing
|
||||||
|
3. Reflection > getPropertyValue() method > look for the property in parent classes
|
||||||
|
|
||||||
|
# 1.0.2
|
||||||
|
|
||||||
|
1. Phing > remove old and unused tools
|
||||||
|
2. Phing > configuration > minor updates
|
||||||
|
3. Implement Mutation Testing Framework (infection/infection package)
|
||||||
|
4. Travis CI > run many tasks using Phing (instead of PHPUnit only)
|
||||||
|
5. Fix integration with [Coveralls](https://www.coveralls.io) (available as the badge in [README.md](README.md))
|
||||||
|
6. Implement [PHPStan](https://github.com/phpstan/phpstan)
|
||||||
|
7. PHPUnit > execute tests in random order
|
||||||
|
8. Implement [Psalm](https://github.com/vimeo/psalm)
|
||||||
|
9. Infection (Mutation Testing Framework) > fix bugs while running (generate proper code coverage, bugs while running
|
||||||
|
tests randomly)
|
||||||
|
10. Phing > php-coveralls > add task
|
||||||
|
|
||||||
|
# 1.0.1
|
||||||
|
|
||||||
|
1. Regex > make compatible with PHP 7.3 Tests > Regex > fix "preg_match(): Compilation failed: invalid range in
|
||||||
|
character class at offset 4" bug
|
||||||
|
2. Collection/storage of templates
|
||||||
|
3. Template with placeholders that may be filled by real data
|
||||||
|
4. RenderableInterface > something that may be rendered
|
||||||
|
|
||||||
|
# 1.0.0
|
||||||
|
|
||||||
|
1. Composer > support/require PHP 7.2+ (instead of 5.6+)
|
||||||
|
|
||||||
# 0.1.8
|
# 0.1.8
|
||||||
|
|
||||||
1. Size, e.g. of image
|
1. Size, e.g. of image
|
||||||
@@ -40,7 +140,8 @@ Common and useful classes, methods, exceptions etc.
|
|||||||
|
|
||||||
1. Tests > refactoring & minor improvements
|
1. Tests > refactoring & minor improvements
|
||||||
2. Utilities > CssSelector > useful methods related to CSS selectors
|
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)
|
3. Utilities > Bootstrap4CssSelector > useful methods related to CSS selectors and the Bootstrap4 (front-end component
|
||||||
|
library)
|
||||||
|
|
||||||
# 0.1.2
|
# 0.1.2
|
||||||
|
|
||||||
@@ -79,5 +180,6 @@ Common and useful classes, methods, exceptions etc.
|
|||||||
4. StyleCI & PHP Coding Standards Fixer: update configuration
|
4. StyleCI & PHP Coding Standards Fixer: update configuration
|
||||||
5. Documentation > Docker > add paragraph for PHP Coding Standards Fixer
|
5. Documentation > Docker > add paragraph for PHP Coding Standards Fixer
|
||||||
6. Coding standard > fix automatically
|
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"
|
7. StyleCI configuration > fix bug "The provided fixer 'binary_operator_spaces' cannot be enabled again because it was
|
||||||
|
already enabled"
|
||||||
8. StyleCI > disable & remove
|
8. StyleCI > disable & remove
|
||||||
|
|||||||
14
README.md
14
README.md
@@ -2,7 +2,12 @@
|
|||||||
|
|
||||||
Common and useful classes, methods, exceptions etc.
|
Common and useful classes, methods, exceptions etc.
|
||||||
|
|
||||||
[](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)
|

|
||||||
|
[](https://travis-ci.com/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)
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
@@ -29,11 +34,12 @@ composer require wiosna-dev/common-library
|
|||||||
# Usage
|
# Usage
|
||||||
|
|
||||||
1. [Base test case (with common methods and data providers)](docs/Base-test-case.md)
|
1. [Base test case (with common methods and data providers)](docs/Base-test-case.md)
|
||||||
2. [Collection of elements](docs/Collection-of-elements.md)
|
2. [Collection of elements](docs/Collection/BaseCollection.md)
|
||||||
3. [Exceptions](docs/Static-methods.md)
|
3. [Exceptions](docs/Static-methods.md)
|
||||||
4. [Static methods](docs/Static-methods.md)
|
4. [Static methods](docs/Static-methods.md)
|
||||||
1. [Arrays](docs/Static-methods/Arrays.md)
|
1. [Arrays](docs/Static-methods/Arrays.md)
|
||||||
2. [Regex](docs/Static-methods/Regex.md)
|
2. [Regex](docs/Static-methods/Regex.md)
|
||||||
|
3. [Uri](docs/Static-methods/Uri.md)
|
||||||
5. [Value Objects](docs/Value-Objects.md)
|
5. [Value Objects](docs/Value-Objects.md)
|
||||||
|
|
||||||
# Development
|
# Development
|
||||||
|
|||||||
10
build.xml
10
build.xml
@@ -3,12 +3,12 @@
|
|||||||
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
|
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
|
||||||
<!-- Properties -->
|
<!-- Properties -->
|
||||||
<if>
|
<if>
|
||||||
<available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
|
<available file="${project.basedir}/phing/properties" property="custom.properties.available" />
|
||||||
<then>
|
<then>
|
||||||
<property file="${project.basedir}/phing/properties"/>
|
<property file="${project.basedir}/phing/properties" />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<property file="${project.basedir}/phing/properties.dist"/>
|
<property file="${project.basedir}/phing/properties.dist" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
@@ -20,11 +20,11 @@
|
|||||||
|
|
||||||
<!-- Build app -->
|
<!-- Build app -->
|
||||||
<target name="build:app">
|
<target name="build:app">
|
||||||
<phing phingfile="${project.basedir}/phing/app.xml" haltonfailure="true"/>
|
<phing phingfile="${project.basedir}/phing/app.xml" haltonfailure="true" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Build tests -->
|
<!-- Build tests -->
|
||||||
<target name="build:tests">
|
<target name="build:tests">
|
||||||
<phing phingfile="${project.basedir}/phing/tests.xml" haltonfailure="true"/>
|
<phing phingfile="${project.basedir}/phing/tests.xml" haltonfailure="true" />
|
||||||
</target>
|
</target>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -10,24 +10,25 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
|
"php": "^7.4",
|
||||||
"ext-dom": "*",
|
"ext-dom": "*",
|
||||||
"ext-fileinfo": "*",
|
"ext-fileinfo": "*",
|
||||||
"ext-json": "*",
|
|
||||||
"ext-simplexml": "*",
|
|
||||||
"php": ">=5.6",
|
|
||||||
"ext-intl": "*",
|
"ext-intl": "*",
|
||||||
|
"ext-json": "*",
|
||||||
"ext-pcre": "*",
|
"ext-pcre": "*",
|
||||||
"doctrine/orm": "^2.5",
|
"ext-simplexml": "*",
|
||||||
"gedmo/doctrine-extensions": "^2.4"
|
"doctrine/orm": "^2.6",
|
||||||
|
"gedmo/doctrine-extensions": "^3.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"friendsofphp/php-cs-fixer": "^2.2",
|
"friendsofphp/php-cs-fixer": "^3.11",
|
||||||
"pdepend/pdepend": "^2.5",
|
"infection/infection": "^0.26",
|
||||||
"phploc/phploc": "^2.1",
|
"php-coveralls/php-coveralls": "^2.5",
|
||||||
"phpmd/phpmd": "^2.6",
|
"phpstan/phpstan": "^1.8",
|
||||||
"phpunit/phpunit": "^4.8",
|
"phpunit/phpunit": "^9",
|
||||||
"sebastian/phpcpd": "^2.0",
|
"sebastian/phpcpd": "^6.0",
|
||||||
"squizlabs/php_codesniffer": "^2.9"
|
"squizlabs/php_codesniffer": "^3.7",
|
||||||
|
"vimeo/psalm": "^4.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
|||||||
@@ -5,29 +5,29 @@ services:
|
|||||||
# Required to run project
|
# Required to run project
|
||||||
#
|
#
|
||||||
php:
|
php:
|
||||||
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
|
image: meritoo/php:7.4
|
||||||
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-php
|
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-php
|
||||||
entrypoint: php
|
entrypoint: php
|
||||||
command: -S 0.0.0.0:9999
|
command: -S 0.0.0.0:9999
|
||||||
build:
|
environment:
|
||||||
context: ./docker/config
|
PHP_DATE_TIMEZONE: ${PHP_DATE_TIMEZONE}
|
||||||
args:
|
|
||||||
- TIMEZONE=${TIMEZONE}
|
|
||||||
volumes:
|
volumes:
|
||||||
- .:/project:cached
|
- .:/var/www/application:cached
|
||||||
composer:
|
composer:
|
||||||
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
|
image: meritoo/php:7.4
|
||||||
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-composer
|
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-composer
|
||||||
entrypoint: php -d memory_limit=-1 /usr/local/bin/composer
|
entrypoint: php -d memory_limit=-1 /usr/local/bin/composer
|
||||||
volumes:
|
volumes:
|
||||||
- .:/project:cached
|
- .:/var/www/application:cached
|
||||||
#
|
#
|
||||||
# Required to run PHPUnit's tests
|
# Required to run PHPUnit's tests
|
||||||
#
|
#
|
||||||
phpunit:
|
phpunit:
|
||||||
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
|
image: meritoo/php:7.4
|
||||||
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-phpunit
|
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-phpunit
|
||||||
entrypoint: ./vendor/bin/phpunit
|
entrypoint: ./vendor/bin/phpunit
|
||||||
command: --version
|
command: --version
|
||||||
volumes:
|
volumes:
|
||||||
- .:/project:cached
|
- .:/var/www/application:cached
|
||||||
|
environment:
|
||||||
|
XDEBUG_MODE: coverage
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -4,7 +4,15 @@ Common and useful classes, methods, exceptions etc.
|
|||||||
|
|
||||||
# Base test case (with common methods and data providers)
|
# 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:
|
Located here: `Meritoo\Common\Test\Base\BaseTestCase`.
|
||||||
|
|
||||||
|
##### Usage
|
||||||
|
|
||||||
|
1. Just extend the `BaseTestCase` class or implement `Meritoo\Common\Traits\Test\Base\BaseTestCaseTrait` trait.
|
||||||
|
2. Use one of available data providers, e.g. `@dataProvider provideEmptyValue`, or asserts,
|
||||||
|
e.g. `static::assertMethodVisibility($method, $visibilityType);`
|
||||||
|
|
||||||
|
##### Examples
|
||||||
|
|
||||||
```php
|
```php
|
||||||
class DateTest extends BaseTestCase
|
class DateTest extends BaseTestCase
|
||||||
@@ -22,8 +30,6 @@ class DateTest extends BaseTestCase
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
or in `Meritoo\Common\Test\Utilities\MimeTypesTest` class:
|
|
||||||
|
|
||||||
```php
|
```php
|
||||||
class MimeTypesTest extends BaseTestCase
|
class MimeTypesTest extends BaseTestCase
|
||||||
{
|
{
|
||||||
@@ -45,11 +51,13 @@ class MimeTypesTest extends BaseTestCase
|
|||||||
# More
|
# More
|
||||||
|
|
||||||
1. [**Base test case (with common methods and data providers)**](Base-test-case.md)
|
1. [**Base test case (with common methods and data providers)**](Base-test-case.md)
|
||||||
2. [Collection of elements](Collection-of-elements.md)
|
2. [Collection of elements](Collection/BaseCollection.md)
|
||||||
3. [Exceptions](Exceptions.md)
|
3. [Templates](Collection/Templates.md)
|
||||||
4. [Static methods](Static-methods.md)
|
4. [Exceptions](Exceptions.md)
|
||||||
1. [Arrays](Static-methods/Arrays.md)
|
5. [Static methods](Static-methods.md)
|
||||||
2. [Regex](Static-methods/Regex.md)
|
1. [Arrays](Static-methods/Arrays.md)
|
||||||
5. [Value Objects](Value-Objects.md)
|
2. [Regex](Static-methods/Regex.md)
|
||||||
|
3. [Uri](Static-methods/Uri.md)
|
||||||
|
6. [Value Objects](Value-Objects.md)
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.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)
|
|
||||||
90
docs/Collection/BaseCollection.md
Normal file
90
docs/Collection/BaseCollection.md
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# Meritoo Common Library
|
||||||
|
|
||||||
|
Common and useful classes, methods, exceptions etc.
|
||||||
|
|
||||||
|
# BaseCollection
|
||||||
|
|
||||||
|
### Namespace
|
||||||
|
|
||||||
|
`Meritoo\Common\Collection\BaseCollection`
|
||||||
|
|
||||||
|
### Info
|
||||||
|
|
||||||
|
It's a set of some elements with the same type, 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
|
||||||
|
|
||||||
|
### Implementation
|
||||||
|
|
||||||
|
You have to implement:
|
||||||
|
|
||||||
|
```php
|
||||||
|
abstract protected function isValidType($element): bool;
|
||||||
|
```
|
||||||
|
|
||||||
|
This method verifies 1 element before it will be added to collection. Returns information if the element has valid,
|
||||||
|
expected type.
|
||||||
|
|
||||||
|
Example (from `Meritoo\Common\Collection\Templates` class):
|
||||||
|
|
||||||
|
```php
|
||||||
|
protected function isValidType($element): bool
|
||||||
|
{
|
||||||
|
return $element instanceof Template;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Methods to overwrite
|
||||||
|
|
||||||
|
You can, if you wish, overwrite these methods:
|
||||||
|
|
||||||
|
1. To prepare elements used to initialize the collection in your own way:
|
||||||
|
|
||||||
|
```php
|
||||||
|
protected function prepareElements(array $elements): array
|
||||||
|
```
|
||||||
|
|
||||||
|
2. To validate type of elements in your own way:
|
||||||
|
|
||||||
|
```php
|
||||||
|
protected function getElementsWithValidType(array $elements): array
|
||||||
|
```
|
||||||
|
|
||||||
|
### Examples of usage
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Meritoo\Common\Collection\StringCollection;
|
||||||
|
|
||||||
|
$emptyCollection = new StringCollection();
|
||||||
|
var_dump($emptyCollection->isEmpty()); // bool(true)
|
||||||
|
|
||||||
|
$elements = [
|
||||||
|
'lorem',
|
||||||
|
'ipsum',
|
||||||
|
123 => 'dolor',
|
||||||
|
345 => 'sit',
|
||||||
|
];
|
||||||
|
|
||||||
|
$simpleCollection = new StringCollection($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**](BaseCollection.md)
|
||||||
|
3. [Templates](Templates.md)
|
||||||
|
4. [Exceptions](../Exceptions.md)
|
||||||
|
5. [Static methods](../Static-methods.md)
|
||||||
|
1. [Arrays](../Static-methods/Arrays.md)
|
||||||
|
2. [Regex](../Static-methods/Regex.md)
|
||||||
|
6. [Value Objects](../Value-Objects.md)
|
||||||
|
|
||||||
|
[‹ Back to `Readme`](../../README.md)
|
||||||
67
docs/Collection/Templates.md
Normal file
67
docs/Collection/Templates.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# Meritoo Common Library
|
||||||
|
|
||||||
|
Common and useful classes, methods, exceptions etc.
|
||||||
|
|
||||||
|
# Templates
|
||||||
|
|
||||||
|
### Namespace
|
||||||
|
|
||||||
|
`Meritoo\Common\Collection\Templates`
|
||||||
|
|
||||||
|
### Info
|
||||||
|
|
||||||
|
Collection/storage of templates, instance of `Meritoo\Common\ValueObject\Template` class.
|
||||||
|
|
||||||
|
##### New instance
|
||||||
|
|
||||||
|
New instance can be created using:
|
||||||
|
|
||||||
|
1. Constructor:
|
||||||
|
|
||||||
|
```php
|
||||||
|
new Templates([
|
||||||
|
'first' => new Template('First name: %first_name%'),
|
||||||
|
'last' => new Template('Last name: %last_name%'),
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Static method `fromArray(array $templates)` - creates and returns the collection from given array
|
||||||
|
|
||||||
|
```php
|
||||||
|
Templates::fromArray([
|
||||||
|
'first' => 'First name: %first_name%',
|
||||||
|
'last' => 'Last name: %last_name%',
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Methods
|
||||||
|
|
||||||
|
Has all methods of parent class `Meritoo\Common\Collection\Collection` + `findTemplate(string $index)` method that finds
|
||||||
|
and returns template with given index.
|
||||||
|
|
||||||
|
Example of usage:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$templates = new Templates([
|
||||||
|
'first' => new Template('First name: %first_name%'),
|
||||||
|
'last' => new Template('Last name: %last_name%'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$template = $templates->findTemplate('first'); // new Template('First name: %first_name%')
|
||||||
|
```
|
||||||
|
|
||||||
|
Throws an `Meritoo\Common\Exception\ValueObject\Template\TemplateNotFoundException` exception if template with given
|
||||||
|
index was not found.
|
||||||
|
|
||||||
|
# More
|
||||||
|
|
||||||
|
1. [Base test case (with common methods and data providers)](../Base-test-case.md)
|
||||||
|
2. [Collection of elements](BaseCollection.md)
|
||||||
|
3. [**Templates**](Templates.md)
|
||||||
|
4. [Exceptions](../Exceptions.md)
|
||||||
|
5. [Static methods](../Static-methods.md)
|
||||||
|
1. [Arrays](../Static-methods/Arrays.md)
|
||||||
|
2. [Regex](../Static-methods/Regex.md)
|
||||||
|
6. [Value Objects](../Value-Objects.md)
|
||||||
|
|
||||||
|
[‹ Back to `Readme`](../../README.md)
|
||||||
@@ -17,9 +17,9 @@ Development-related information
|
|||||||
|
|
||||||
2. Rebuild project by running command (installs packages, prepares required directories and runs tests):
|
2. Rebuild project by running command (installs packages, prepares required directories and runs tests):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker-compose exec php phing
|
docker-compose exec php phing
|
||||||
```
|
```
|
||||||
|
|
||||||
> [What is Docker?](https://www.docker.com/what-docker)
|
> [What is Docker?](https://www.docker.com/what-docker)
|
||||||
|
|
||||||
@@ -105,12 +105,48 @@ docker-compose exec php phing -f phing/tests.xml test:phpunit
|
|||||||
docker-compose run --rm phpunit --verbose --no-coverage
|
docker-compose run --rm phpunit --verbose --no-coverage
|
||||||
```
|
```
|
||||||
|
|
||||||
# Versions of packages
|
# Infection - Mutation Testing
|
||||||
|
|
||||||
### squizlabs/php_codesniffer
|
Served by [Infection — Mutation Testing Framework](https://infection.github.io).
|
||||||
|
|
||||||
I have to use [squizlabs/php_codesniffer](https://packagist.org/packages/squizlabs/php_codesniffer) `^2.9` instead of
|
### Running tests
|
||||||
`^3.3`, because [Phing doesn't support 3.x PHP_CodeSniffer](https://github.com/phingofficial/phing/issues/716).
|
|
||||||
|
```bash
|
||||||
|
$ docker-compose exec php bash
|
||||||
|
root@18f2f0cfaa5d:/var/www/application# XDEBUG_MODE=coverage ./vendor/bin/infection --threads=$(nproc)
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ docker-compose exec php bash
|
||||||
|
root@18f2f0cfaa5d:/var/www/application# XDEBUG_MODE=coverage phing -f phing/tests.xml test:infection
|
||||||
|
```
|
||||||
|
|
||||||
|
### Result of testing
|
||||||
|
|
||||||
|
##### Terminal
|
||||||
|
|
||||||
|
Example of output:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
125 mutations were generated:
|
||||||
|
105 mutants were killed
|
||||||
|
3 mutants were not covered by tests
|
||||||
|
5 covered mutants were not detected
|
||||||
|
0 errors were encountered
|
||||||
|
12 time outs were encountered
|
||||||
|
|
||||||
|
Metrics:
|
||||||
|
Mutation Score Indicator (MSI): 93%
|
||||||
|
Mutation Code Coverage: 97%
|
||||||
|
Covered Code MSI: 95%
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Stored in `build/reports/infection` directory
|
||||||
|
|
||||||
|
* `build/reports/infection/infection-log.txt`
|
||||||
|
* `build/reports/infection/summary-log.txt`
|
||||||
|
|
||||||
# Other
|
# Other
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ Common and useful classes, methods, exceptions etc.
|
|||||||
|
|
||||||
### Create instance of exception
|
### 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:
|
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
|
```php
|
||||||
use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
|
use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
|
||||||
@@ -17,11 +18,14 @@ throw IncorrectBundleNameException::create('RisusIpsum');
|
|||||||
|
|
||||||
##### Short description
|
##### 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.
|
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
|
##### 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.
|
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
|
##### Example
|
||||||
|
|
||||||
@@ -54,11 +58,13 @@ class UnknownSimpleTypeException extends UnknownTypeException
|
|||||||
# More
|
# More
|
||||||
|
|
||||||
1. [Base test case (with common methods and data providers)](Base-test-case.md)
|
1. [Base test case (with common methods and data providers)](Base-test-case.md)
|
||||||
2. [Collection of elements](Collection-of-elements.md)
|
2. [Collection of elements](Collection/BaseCollection.md)
|
||||||
3. [**Exceptions**](Exceptions.md)
|
3. [Templates](Collection/Templates.md)
|
||||||
4. [Static methods](Static-methods.md)
|
4. [**Exceptions**](Exceptions.md)
|
||||||
1. [Arrays](Static-methods/Arrays.md)
|
5. [Static methods](Static-methods.md)
|
||||||
2. [Regex](Static-methods/Regex.md)
|
1. [Arrays](Static-methods/Arrays.md)
|
||||||
5. [Value Objects](Value-Objects.md)
|
2. [Regex](Static-methods/Regex.md)
|
||||||
|
3. [Uri](Static-methods/Uri.md)
|
||||||
|
6. [Value Objects](Value-Objects.md)
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.md)
|
[‹ Back to `Readme`](../README.md)
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ Common and useful classes, methods, exceptions etc.
|
|||||||
|
|
||||||
# Static methods
|
# 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:
|
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
|
```php
|
||||||
use Meritoo\Common\Utilities\Arrays;
|
use Meritoo\Common\Utilities\Arrays;
|
||||||
@@ -16,11 +17,13 @@ var_dump($firstElement); // string(5) "lorem"
|
|||||||
# More
|
# More
|
||||||
|
|
||||||
1. [Base test case (with common methods and data providers)](Base-test-case.md)
|
1. [Base test case (with common methods and data providers)](Base-test-case.md)
|
||||||
2. [Collection of elements](Collection-of-elements.md)
|
2. [Collection of elements](Collection/BaseCollection.md)
|
||||||
3. [Exceptions](Exceptions.md)
|
3. [Templates](Collection/Templates.md)
|
||||||
4. [**Static methods**](Static-methods.md)
|
4. [Exceptions](Exceptions.md)
|
||||||
1. [Arrays](Static-methods/Arrays.md)
|
5. [**Static methods**](Static-methods.md)
|
||||||
2. [Regex](Static-methods/Regex.md)
|
1. [Arrays](Static-methods/Arrays.md)
|
||||||
5. [Value Objects](Value-Objects.md)
|
2. [Regex](Static-methods/Regex.md)
|
||||||
|
3. [Uri](Static-methods/Uri.md)
|
||||||
|
6. [Value Objects](Value-Objects.md)
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.md)
|
[‹ Back to `Readme`](../README.md)
|
||||||
|
|||||||
@@ -9,6 +9,31 @@ Common and useful classes, methods, exceptions etc.
|
|||||||
Class: `Meritoo\Common\Utilities\Arrays`
|
Class: `Meritoo\Common\Utilities\Arrays`
|
||||||
File: `src/Utilities/Arrays.php`
|
File: `src/Utilities/Arrays.php`
|
||||||
|
|
||||||
|
### containsEmptyStringsOnly(array): bool
|
||||||
|
|
||||||
|
> Returns information if given array contains an empty strings only
|
||||||
|
|
||||||
|
##### Arguments
|
||||||
|
|
||||||
|
- `array $array` - The array to verify
|
||||||
|
|
||||||
|
##### Examples
|
||||||
|
|
||||||
|
1)
|
||||||
|
|
||||||
|
- array: `[]` (an empty array)
|
||||||
|
- result: `false`
|
||||||
|
|
||||||
|
2)
|
||||||
|
|
||||||
|
- array: `["", -1]`
|
||||||
|
- result: `false`
|
||||||
|
|
||||||
|
3)
|
||||||
|
|
||||||
|
- array: `["", null, ""]`
|
||||||
|
- result: `true`
|
||||||
|
|
||||||
### getNonEmptyValues(array $values)
|
### getNonEmptyValues(array $values)
|
||||||
|
|
||||||
> Returns non-empty values, e.g. without "" (empty string), null or []
|
> Returns non-empty values, e.g. without "" (empty string), null or []
|
||||||
@@ -17,17 +42,19 @@ File: `src/Utilities/Arrays.php`
|
|||||||
|
|
||||||
- `array $values` - The values to filter
|
- `array $values` - The values to filter
|
||||||
|
|
||||||
##### Example 1
|
##### Examples
|
||||||
|
|
||||||
|
1)
|
||||||
|
|
||||||
- values: `[]` (no values)
|
- values: `[]` (no values)
|
||||||
- result: `[]` (an empty array)
|
- result: `[]` (an empty array)
|
||||||
|
|
||||||
##### Example 2
|
2)
|
||||||
|
|
||||||
- values: `[null, ""]` (all empty values)
|
- values: `[null, ""]` (all empty values)
|
||||||
- result: `[]` (an empty array)
|
- result: `[]` (an empty array)
|
||||||
|
|
||||||
##### Example 3
|
3)
|
||||||
|
|
||||||
- values: `["test 1", "", 123, null, 0]`
|
- values: `["test 1", "", 123, null, 0]`
|
||||||
- result: `["test 1", 123, 0]`
|
- result: `["test 1", 123, 0]`
|
||||||
@@ -41,25 +68,27 @@ File: `src/Utilities/Arrays.php`
|
|||||||
- `array $values` - The values to filter
|
- `array $values` - The values to filter
|
||||||
- `[string $separator]` - (optional) Separator used to implode the values. Default: ", ".
|
- `[string $separator]` - (optional) Separator used to implode the values. Default: ", ".
|
||||||
|
|
||||||
##### Example 1
|
##### Examples
|
||||||
|
|
||||||
|
1)
|
||||||
|
|
||||||
- values: `[]` (no values)
|
- values: `[]` (no values)
|
||||||
- separator: default or any other string
|
- separator: default or any other string
|
||||||
- result: `""` (an empty string)
|
- result: `""` (an empty string)
|
||||||
|
|
||||||
##### Example 2
|
2)
|
||||||
|
|
||||||
- values: `[null, ""]` (all empty values)
|
- values: `[null, ""]` (all empty values)
|
||||||
- separator: default or any other string
|
- separator: default or any other string
|
||||||
- result: `""` (an empty string)
|
- result: `""` (an empty string)
|
||||||
|
|
||||||
##### Example 3
|
3)
|
||||||
|
|
||||||
- values: `["test 1", "", 123, null, 0]`
|
- values: `["test 1", "", 123, null, 0]`
|
||||||
- separator: `", "` (default)
|
- separator: `", "` (default)
|
||||||
- result: `"test 1, 123, 0"`
|
- result: `"test 1, 123, 0"`
|
||||||
|
|
||||||
##### Example 4
|
4)
|
||||||
|
|
||||||
- values: `["test 1", "", 123, null, 0]`
|
- values: `["test 1", "", 123, null, 0]`
|
||||||
- separator: `" | "`
|
- separator: `" | "`
|
||||||
@@ -68,11 +97,13 @@ File: `src/Utilities/Arrays.php`
|
|||||||
# More
|
# More
|
||||||
|
|
||||||
1. [Base test case (with common methods and data providers)](../Base-test-case.md)
|
1. [Base test case (with common methods and data providers)](../Base-test-case.md)
|
||||||
2. [Collection of elements](../Collection-of-elements.md)
|
2. [Collection of elements](../Collection/BaseCollection.md)
|
||||||
3. [Exceptions](../Exceptions.md)
|
3. [Templates](../Collection/Templates.md)
|
||||||
4. [Static methods](../Static-methods.md)
|
4. [Exceptions](../Exceptions.md)
|
||||||
1. [**Arrays**](Arrays.md)
|
5. [Static methods](../Static-methods.md)
|
||||||
2. [Regex](Regex.md)
|
1. [**Arrays**](Arrays.md)
|
||||||
5. [Value Objects](../Value-Objects.md)
|
2. [Regex](Regex.md)
|
||||||
|
3. [Uri](Uri.md)
|
||||||
|
6. [Value Objects](../Value-Objects.md)
|
||||||
|
|
||||||
[‹ Back to `Readme`](../../README.md)
|
[‹ Back to `Readme`](../../README.md)
|
||||||
|
|||||||
@@ -17,29 +17,83 @@ File: `src/Utilities/Regex.php`
|
|||||||
|
|
||||||
- `string $value` - Value that should be transformed to slug
|
- `string $value` - Value that should be transformed to slug
|
||||||
|
|
||||||
##### Example 1
|
##### Examples
|
||||||
|
|
||||||
|
1)
|
||||||
|
|
||||||
- value: non-scalar or `null`
|
- value: non-scalar or `null`
|
||||||
- result: `false`
|
- result: `false`
|
||||||
|
|
||||||
##### Example 2
|
2)
|
||||||
|
|
||||||
- value: `""` (an empty string)
|
- value: `""` (an empty string)
|
||||||
- result: `""` (an empty string)
|
- result: `""` (an empty string)
|
||||||
|
|
||||||
##### Example 3
|
3)
|
||||||
|
|
||||||
- value: `"Lorem ipsum. Dolor sit 12.34 amet."`
|
- value: `"Lorem ipsum. Dolor sit 12.34 amet."`
|
||||||
- result: `"lorem-ipsum-dolor-sit-1234-amet"`
|
- result: `"lorem-ipsum-dolor-sit-1234-amet"`
|
||||||
|
|
||||||
|
### clearBeginningSlash(string): string
|
||||||
|
|
||||||
|
> Clears, removes slash from the beginning of given string
|
||||||
|
|
||||||
|
##### Arguments
|
||||||
|
|
||||||
|
- `string $string` - String that may contains slash as the 1st character
|
||||||
|
|
||||||
|
##### Examples
|
||||||
|
|
||||||
|
1)
|
||||||
|
|
||||||
|
- string: `"lorem ipsum"`
|
||||||
|
- result: `"lorem ipsum"`
|
||||||
|
|
||||||
|
2)
|
||||||
|
|
||||||
|
- string: `"/lorem ipsum"`
|
||||||
|
- result: `"lorem ipsum"`
|
||||||
|
|
||||||
|
3)
|
||||||
|
|
||||||
|
- string: `"/ lorem 123 ipsum"`
|
||||||
|
- result: `" lorem 123 ipsum"`
|
||||||
|
|
||||||
|
### clearEndingSlash(string): string
|
||||||
|
|
||||||
|
> Clears, removes slash from the end of given string
|
||||||
|
|
||||||
|
##### Arguments
|
||||||
|
|
||||||
|
- `string $string` - String that may contains slash as the last character
|
||||||
|
|
||||||
|
##### Examples
|
||||||
|
|
||||||
|
1)
|
||||||
|
|
||||||
|
- string: `"lorem ipsum"`
|
||||||
|
- result: `"lorem ipsum"`
|
||||||
|
|
||||||
|
2)
|
||||||
|
|
||||||
|
- string: `"lorem ipsum/"`
|
||||||
|
- result: `"lorem ipsum"`
|
||||||
|
|
||||||
|
3)
|
||||||
|
|
||||||
|
- string: `"lorem 123 ipsum /"`
|
||||||
|
- result: `"lorem 123 ipsum "`
|
||||||
|
|
||||||
# More
|
# More
|
||||||
|
|
||||||
1. [Base test case (with common methods and data providers)](../Base-test-case.md)
|
1. [Base test case (with common methods and data providers)](../Base-test-case.md)
|
||||||
2. [Collection of elements](../Collection-of-elements.md)
|
2. [Collection of elements](../Collection/BaseCollection.md)
|
||||||
3. [Exceptions](../Exceptions.md)
|
3. [Templates](../Collection/Templates.md)
|
||||||
4. [Static methods](../Static-methods.md)
|
4. [Exceptions](../Exceptions.md)
|
||||||
1. [Arrays](../Static-methods/Arrays.md)
|
5. [Static methods](../Static-methods.md)
|
||||||
2. [**Regex**](Regex.md)
|
1. [Arrays](../Static-methods/Arrays.md)
|
||||||
5. [Value Objects](../Value-Objects.md)
|
2. [**Regex**](Regex.md)
|
||||||
|
3. [Uri](Uri.md)
|
||||||
|
6. [Value Objects](../Value-Objects.md)
|
||||||
|
|
||||||
[‹ Back to `Readme`](../../README.md)
|
[‹ Back to `Readme`](../../README.md)
|
||||||
|
|||||||
47
docs/Static-methods/Uri.md
Normal file
47
docs/Static-methods/Uri.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# Meritoo Common Library
|
||||||
|
|
||||||
|
Common and useful classes, methods, exceptions etc.
|
||||||
|
|
||||||
|
# Uri
|
||||||
|
|
||||||
|
> Useful methods related to uri
|
||||||
|
|
||||||
|
Class: `Meritoo\Common\Utilities\Uri`
|
||||||
|
File: `src/Utilities/Uri.php`
|
||||||
|
|
||||||
|
### buildUrl(string, string ...): string
|
||||||
|
|
||||||
|
> Builds url with given root url and parts of url (concatenates them using "/")
|
||||||
|
|
||||||
|
##### Arguments
|
||||||
|
|
||||||
|
- `string $rootUrl` - Protocol and domain (or domain only)
|
||||||
|
- `string ...$urlParts` - Parts of url that will be concatenated with the rool url by "/"
|
||||||
|
|
||||||
|
##### Examples
|
||||||
|
|
||||||
|
1)
|
||||||
|
|
||||||
|
- rootUrl: `"http://my.example"`
|
||||||
|
- urlParts: `""` (an empty string)
|
||||||
|
- result: `"http://my.example"`
|
||||||
|
|
||||||
|
2)
|
||||||
|
|
||||||
|
- rootUrl: `"http://my.example"`
|
||||||
|
- urlParts: `"/test", "/123"`
|
||||||
|
- result: `"http://my.example/test/123"`
|
||||||
|
|
||||||
|
# More
|
||||||
|
|
||||||
|
1. [Base test case (with common methods and data providers)](../Base-test-case.md)
|
||||||
|
2. [Collection of elements](../Collection/BaseCollection.md)
|
||||||
|
3. [Templates](../Collection/Templates.md)
|
||||||
|
4. [Exceptions](../Exceptions.md)
|
||||||
|
5. [Static methods](../Static-methods.md)
|
||||||
|
1. [Arrays](Arrays.md)
|
||||||
|
2. [Regex](Regex.md)
|
||||||
|
3. [**Uri**](Uri.md)
|
||||||
|
6. [Value Objects](../Value-Objects.md)
|
||||||
|
|
||||||
|
[‹ Back to `Readme`](../../README.md)
|
||||||
@@ -15,6 +15,7 @@ Located in `Meritoo\Common\ValueObject` namespace and in `src/ValueObject/` dire
|
|||||||
##### Info
|
##### Info
|
||||||
|
|
||||||
Represents address of company, institution, user etc. Contains properties:
|
Represents address of company, institution, user etc. Contains properties:
|
||||||
|
|
||||||
1. `$street` - the street
|
1. `$street` - the street
|
||||||
2. `$buildingNumber` - the number of building
|
2. `$buildingNumber` - the number of building
|
||||||
3. `$flatNumber` - the number of flat
|
3. `$flatNumber` - the number of flat
|
||||||
@@ -66,6 +67,7 @@ $asString = (string)$address; // "4th Avenue 10/200, 00123, New York"
|
|||||||
##### Info
|
##### Info
|
||||||
|
|
||||||
Represents bank account. Contains properties:
|
Represents bank account. Contains properties:
|
||||||
|
|
||||||
1. `$bankName` - name of bank
|
1. `$bankName` - name of bank
|
||||||
2. `$accountNumber` - number of bank's account
|
2. `$accountNumber` - number of bank's account
|
||||||
|
|
||||||
@@ -101,6 +103,7 @@ $asString = (string)$bank; // "Bank of America, 1234567890"
|
|||||||
##### Info
|
##### Info
|
||||||
|
|
||||||
Represents a company. Contains properties:
|
Represents a company. Contains properties:
|
||||||
|
|
||||||
1. `$name` - name of company
|
1. `$name` - name of company
|
||||||
2. `$address` - address of company
|
2. `$address` - address of company
|
||||||
3. `$bankAccount` - bank account of company
|
3. `$bankAccount` - bank account of company
|
||||||
@@ -145,7 +148,9 @@ $asString = (string)$company; // "Test 1, 4th Avenue 10/200, 00123, New York, Ba
|
|||||||
|
|
||||||
##### Info
|
##### Info
|
||||||
|
|
||||||
Represents human. Based on `\Meritoo\Common\Traits\ValueObject\HumanTrait` trait. Contains properties same as `HumanTrait` trait:
|
Represents human. Based on `\Meritoo\Common\Traits\ValueObject\HumanTrait` trait. Contains properties same
|
||||||
|
as `HumanTrait` trait:
|
||||||
|
|
||||||
1. `$firstName` - first name
|
1. `$firstName` - first name
|
||||||
2. `$lastName` - last name
|
2. `$lastName` - last name
|
||||||
3. `$email` - email address
|
3. `$email` - email address
|
||||||
@@ -186,6 +191,7 @@ $asString2 = (string)$human2; // "John Scott <john@scott.com>"
|
|||||||
##### Info
|
##### Info
|
||||||
|
|
||||||
Size, e.g. of image. Contains properties:
|
Size, e.g. of image. Contains properties:
|
||||||
|
|
||||||
1. `width` - the width
|
1. `width` - the width
|
||||||
2. `height` - the height
|
2. `height` - the height
|
||||||
3. `unit` - unit used when width or height should be returned with unit, default: `"px"`
|
3. `unit` - unit used when width or height should be returned with unit, default: `"px"`
|
||||||
@@ -218,13 +224,15 @@ New instance can be created using static methods:
|
|||||||
##### Methods
|
##### Methods
|
||||||
|
|
||||||
Has:
|
Has:
|
||||||
|
|
||||||
- getters and setters for `width` and `height` properties.
|
- getters and setters for `width` and `height` properties.
|
||||||
- setter for `separator` property
|
- setter for `separator` property
|
||||||
- `toString()` and `toArray()` methods that returns size represented as string and array
|
- `toString()` and `toArray()` methods that returns size represented as string and array
|
||||||
|
|
||||||
##### Conversion to string (using `__toString()` method)
|
##### Conversion to string (using `__toString()` method)
|
||||||
|
|
||||||
Instance of `Size` may be represented as string that contains width and height separated by separator (default: `" x "`).
|
Instance of `Size` may be represented as string that contains width and height separated by separator (default: `" x "`)
|
||||||
|
.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
@@ -239,6 +247,56 @@ $size->setSeparator('X');
|
|||||||
$asString2 = (string)$size; // "200X100"
|
$asString2 = (string)$size; // "200X100"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Template
|
||||||
|
|
||||||
|
##### Namespace
|
||||||
|
|
||||||
|
`Meritoo\Common\ValueObject\Template`
|
||||||
|
|
||||||
|
##### Info
|
||||||
|
|
||||||
|
Template with placeholders that may be filled by real data. Contains properties:
|
||||||
|
|
||||||
|
1. `$content` - raw string with placeholders (content of the template)
|
||||||
|
|
||||||
|
##### New instance
|
||||||
|
|
||||||
|
New instance can be created using constructor:
|
||||||
|
|
||||||
|
```php
|
||||||
|
new Template('First name: %first_name%');
|
||||||
|
```
|
||||||
|
|
||||||
|
Each placeholder should be wrapped by `%` character, e.g. `%first_name%`. If content of template is an empty string or
|
||||||
|
does not contain 1 placeholder at least, an `Meritoo\Common\Exception\ValueObject\Template\InvalidContentException`
|
||||||
|
exception will be thrown.
|
||||||
|
|
||||||
|
Examples of invalid content of template:
|
||||||
|
|
||||||
|
```php
|
||||||
|
new Template(''); // An empty string
|
||||||
|
new Template('test'); // Without placeholders
|
||||||
|
new Template('This is %test'); // With starting tag only (invalid placeholder)
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Methods
|
||||||
|
|
||||||
|
Has 1 public method: `fill(array $values)`. Returns content of the template filled with given values (by replacing
|
||||||
|
placeholders with their proper values).
|
||||||
|
|
||||||
|
Example of usage:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$template = new Template('My name is %name% and I am %profession%');
|
||||||
|
$result = $template->fill([
|
||||||
|
'name' => 'Jane',
|
||||||
|
'profession' => 'photographer',
|
||||||
|
]); // "My name is Jane and I am photographer"
|
||||||
|
```
|
||||||
|
|
||||||
|
Throws an `Meritoo\Common\Exception\ValueObject\Template\NotEnoughValuesException` exception if there is not enough
|
||||||
|
values (iow. more placeholders than values).
|
||||||
|
|
||||||
### Version
|
### Version
|
||||||
|
|
||||||
##### Namespace
|
##### Namespace
|
||||||
@@ -248,6 +306,7 @@ $asString2 = (string)$size; // "200X100"
|
|||||||
##### Info
|
##### Info
|
||||||
|
|
||||||
Represents version of software. Contains properties:
|
Represents version of software. Contains properties:
|
||||||
|
|
||||||
1. `$majorPart` - the "major" part of version
|
1. `$majorPart` - the "major" part of version
|
||||||
2. `$minorPart` - the "minor" part of version
|
2. `$minorPart` - the "minor" part of version
|
||||||
3. `$patchPart` - the "patch" part of version
|
3. `$patchPart` - the "patch" part of version
|
||||||
@@ -258,22 +317,22 @@ New instance can be created using:
|
|||||||
|
|
||||||
1. Constructor:
|
1. Constructor:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
new Version(1, 0, 2);
|
new Version(1, 0, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Static methods:
|
2. Static methods:
|
||||||
1. `fromArray()` - creates new instance using given version as array
|
1. `fromArray(array $version)` - creates new instance using given version as array
|
||||||
|
|
||||||
```php
|
```php
|
||||||
Version::fromArray([1, 0, 2]);
|
Version::fromArray([1, 0, 2]);
|
||||||
```
|
```
|
||||||
|
|
||||||
2. `fromString()` - creates new instance using given version as string:
|
2. `fromString(string $version)` - creates new instance using given version as string:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
Version::fromString('1.0.2');
|
Version::fromString('1.0.2');
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Methods
|
##### Methods
|
||||||
|
|
||||||
@@ -281,7 +340,8 @@ Has getters for each property: `getMajorPart()`, `getMinorPart()`, `getPatchPart
|
|||||||
|
|
||||||
##### Conversion to string (using `__toString()` method)
|
##### Conversion to string (using `__toString()` method)
|
||||||
|
|
||||||
Instance of `Version` may be represented as string that contains all properties separated by `.` (`$majorPart`.`$minorPart`.`$patchPart`).
|
Instance of `Version` may be represented as string that contains all properties separated by `.` (`$majorPart`
|
||||||
|
.`$minorPart`.`$patchPart`).
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
@@ -293,11 +353,13 @@ $asString = (string)$version; // "1.0.2"
|
|||||||
# More
|
# More
|
||||||
|
|
||||||
1. [Base test case (with common methods and data providers)](Base-test-case.md)
|
1. [Base test case (with common methods and data providers)](Base-test-case.md)
|
||||||
2. [Collection of elements](Collection-of-elements.md)
|
2. [Collection of elements](Collection/BaseCollection.md)
|
||||||
3. [Exceptions](Exceptions.md)
|
3. [Templates](Collection/Templates.md)
|
||||||
4. [Static methods](Static-methods.md)
|
4. [Exceptions](Exceptions.md)
|
||||||
1. [Arrays](Static-methods/Arrays.md)
|
5. [Static methods](Static-methods.md)
|
||||||
2. [Regex](Static-methods/Regex.md)
|
1. [Arrays](Static-methods/Arrays.md)
|
||||||
5. [**Value Objects**](Value-Objects.md)
|
2. [Regex](Static-methods/Regex.md)
|
||||||
|
3. [Uri](Static-methods/Uri.md)
|
||||||
|
6. [**Value Objects**](Value-Objects.md)
|
||||||
|
|
||||||
[‹ Back to `Readme`](../README.md)
|
[‹ Back to `Readme`](../README.md)
|
||||||
|
|||||||
13
infection.json.dist
Normal file
13
infection.json.dist
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"timeout": 10,
|
||||||
|
"source": {
|
||||||
|
"directories": [
|
||||||
|
"src"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"logs": {
|
||||||
|
"text": "build/reports/infection/infection-log.txt",
|
||||||
|
"summary": "build/reports/infection/summary-log.txt",
|
||||||
|
"debug": "build/reports/infection/debug-log.txt"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,17 +3,17 @@
|
|||||||
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.16.0">
|
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.16.0">
|
||||||
<!-- Properties -->
|
<!-- Properties -->
|
||||||
<if>
|
<if>
|
||||||
<available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
|
<available file="${project.basedir}/phing/properties" property="custom.properties.available" />
|
||||||
<then>
|
<then>
|
||||||
<property file="${project.basedir}/phing/properties"/>
|
<property file="${project.basedir}/phing/properties" />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<property file="${project.basedir}/phing/properties.dist"/>
|
<property file="${project.basedir}/phing/properties.dist" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<!-- Filesets -->
|
<!-- Filesets -->
|
||||||
<import file="${project.basedir}/phing/filesets.xml"/>
|
<import file="${project.basedir}/phing/filesets.xml" />
|
||||||
|
|
||||||
<!-- Default / main target -->
|
<!-- Default / main target -->
|
||||||
<target name="build:main"
|
<target name="build:main"
|
||||||
@@ -33,16 +33,16 @@
|
|||||||
<target name="app:composer:self-update">
|
<target name="app:composer:self-update">
|
||||||
<if>
|
<if>
|
||||||
<not>
|
<not>
|
||||||
<available file="${composer.path}" property="composer.local.unavailable"/>
|
<available file="${composer.path}" property="composer.local.unavailable" />
|
||||||
</not>
|
</not>
|
||||||
<then>
|
<then>
|
||||||
<if>
|
<if>
|
||||||
<os family="windows"/>
|
<os family="windows" />
|
||||||
<then>
|
<then>
|
||||||
<fail message="Composer not found! Go to http://getcomposer.org/download and download the Composer."/>
|
<fail message="Composer not found! Go to http://getcomposer.org/download and download the Composer." />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<exec command="${composer.download_command}" checkreturn="true" passthru="true"/>
|
<exec command="${composer.download_command}" checkreturn="true" passthru="true" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
</then>
|
</then>
|
||||||
@@ -50,46 +50,41 @@
|
|||||||
|
|
||||||
<!-- Update Composer -->
|
<!-- Update Composer -->
|
||||||
<composer php="${composer.php}" composer="${composer.path}" command="selfupdate">
|
<composer php="${composer.php}" composer="${composer.path}" command="selfupdate">
|
||||||
<arg value="--ansi"/>
|
<arg value="--ansi" />
|
||||||
</composer>
|
</composer>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Validates composer.* files -->
|
<!-- Validates composer.* files -->
|
||||||
<target name="app:composer:validate" depends="app:composer:install">
|
<target name="app:composer:validate" depends="app:composer:install">
|
||||||
<composer php="${composer.php}" composer="${composer.path}" command="validate">
|
<composer php="${composer.php}" composer="${composer.path}" command="validate">
|
||||||
<arg value="--no-check-all"/>
|
<arg value="--no-check-all" />
|
||||||
<arg value="--strict"/>
|
<arg value="--strict" />
|
||||||
<arg value="--ansi"/>
|
<arg value="--ansi" />
|
||||||
</composer>
|
</composer>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Project clean -->
|
<!-- Project clean -->
|
||||||
<target name="app:clean">
|
<target name="app:clean">
|
||||||
<if>
|
<if>
|
||||||
<equals arg1="${env}" arg2="prod"/>
|
<equals arg1="${env}" arg2="prod" />
|
||||||
<then>
|
<then>
|
||||||
<echo message="[Skipped] Cleaning project (and directories cleanup) -> 'prod' environment"/>
|
<echo message="[Skipped] Cleaning project (and directories cleanup) -> 'prod' environment" />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<foreach list="${directoriesToEmpty}" param="directory" target="app:clean:empty"/>
|
<foreach list="${directoriesToEmpty}" param="directory" target="app:clean:empty" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<foreach list="${directoriesToCheck}" param="directory" target="app:clean:check"/>
|
<foreach list="${directoriesToCheck}" param="directory" target="app:clean:check" />
|
||||||
|
<foreach list="${directoriesToEmpty}" param="directory" target="app:permissions" />
|
||||||
<touch file="${dir.cache}/.gitkeep"/>
|
|
||||||
<touch file="${dir.logs}/.gitkeep"/>
|
|
||||||
<touch file="${dir.sessions}/.gitkeep"/>
|
|
||||||
|
|
||||||
<foreach list="${directoriesToEmpty}" param="directory" target="app:permissions"/>
|
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Cleaning directory (making empty) directory -->
|
<!-- Cleaning directory (making empty) directory -->
|
||||||
<target name="app:clean:empty">
|
<target name="app:clean:empty">
|
||||||
<if>
|
<if>
|
||||||
<available file="${directory}" type="dir" property="dir_is_available"/>
|
<available file="${directory}" type="dir" property="dir_is_available" />
|
||||||
<then>
|
<then>
|
||||||
<delete includeemptydirs="true" dir="${directory}"/>
|
<delete includeemptydirs="true" dir="${directory}" />
|
||||||
</then>
|
</then>
|
||||||
</if>
|
</if>
|
||||||
</target>
|
</target>
|
||||||
@@ -98,20 +93,20 @@
|
|||||||
<target name="app:clean:check">
|
<target name="app:clean:check">
|
||||||
<if>
|
<if>
|
||||||
<not>
|
<not>
|
||||||
<available file="${directory}" type="dir" property="dir_is_available"/>
|
<available file="${directory}" type="dir" property="dir_is_available" />
|
||||||
</not>
|
</not>
|
||||||
<then>
|
<then>
|
||||||
<if>
|
<if>
|
||||||
<or>
|
<or>
|
||||||
<contains string="${directory}" substring="cache"/>
|
<contains string="${directory}" substring="cache" />
|
||||||
<contains string="${directory}" substring="logs"/>
|
<contains string="${directory}" substring="logs" />
|
||||||
<contains string="${directory}" substring="sessions"/>
|
<contains string="${directory}" substring="sessions" />
|
||||||
</or>
|
</or>
|
||||||
<then>
|
<then>
|
||||||
<mkdir dir="${directory}" mode="0777"/>
|
<mkdir dir="${directory}" mode="0777" />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<mkdir dir="${directory}" mode="0775"/>
|
<mkdir dir="${directory}" mode="0775" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
</then>
|
</then>
|
||||||
@@ -121,24 +116,24 @@
|
|||||||
<!-- Installs vendors -->
|
<!-- Installs vendors -->
|
||||||
<target name="app:composer:install" depends="app:composer:self-update">
|
<target name="app:composer:install" depends="app:composer:self-update">
|
||||||
<composer php="${composer.php}" composer="${composer.path}" command="install">
|
<composer php="${composer.php}" composer="${composer.path}" command="install">
|
||||||
<arg value="--optimize-autoloader"/>
|
<arg value="--optimize-autoloader" />
|
||||||
<arg value="--ansi"/>
|
<arg value="--ansi" />
|
||||||
</composer>
|
</composer>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Clearing cache -->
|
<!-- Clearing cache -->
|
||||||
<target name="app:cache">
|
<target name="app:cache">
|
||||||
<if>
|
<if>
|
||||||
<istrue value="${cache.clearWithWarmup}"/>
|
<istrue value="${cache.clearWithWarmup}" />
|
||||||
<then>
|
<then>
|
||||||
<SymfonyConsole console="bin/console" command="cache:clear">
|
<SymfonyConsole console="bin/console" command="cache:clear">
|
||||||
<arg name="env" value="${env}"/>
|
<arg name="env" value="${env}" />
|
||||||
</SymfonyConsole>
|
</SymfonyConsole>
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<SymfonyConsole console="bin/console" command="cache:clear">
|
<SymfonyConsole console="bin/console" command="cache:clear">
|
||||||
<arg name="env" value="${env}"/>
|
<arg name="env" value="${env}" />
|
||||||
<arg name="no-warmup"/>
|
<arg name="no-warmup" />
|
||||||
</SymfonyConsole>
|
</SymfonyConsole>
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
@@ -147,15 +142,15 @@
|
|||||||
<!-- Clearing cache (faster) -->
|
<!-- Clearing cache (faster) -->
|
||||||
<target name="app:cache:faster">
|
<target name="app:cache:faster">
|
||||||
<SymfonyConsole console="bin/console" command="cache:clear">
|
<SymfonyConsole console="bin/console" command="cache:clear">
|
||||||
<arg name="env" value="${env}"/>
|
<arg name="env" value="${env}" />
|
||||||
<arg name="no-optional-warmers"/>
|
<arg name="no-optional-warmers" />
|
||||||
</SymfonyConsole>
|
</SymfonyConsole>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Warming up cache -->
|
<!-- Warming up cache -->
|
||||||
<target name="app:cache:warmup">
|
<target name="app:cache:warmup">
|
||||||
<SymfonyConsole console="bin/console" command="cache:warmup">
|
<SymfonyConsole console="bin/console" command="cache:warmup">
|
||||||
<arg name="env" value="${env}"/>
|
<arg name="env" value="${env}" />
|
||||||
</SymfonyConsole>
|
</SymfonyConsole>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
@@ -163,10 +158,10 @@
|
|||||||
<target name="app:permissions">
|
<target name="app:permissions">
|
||||||
<if>
|
<if>
|
||||||
<not>
|
<not>
|
||||||
<os family="windows"/>
|
<os family="windows" />
|
||||||
</not>
|
</not>
|
||||||
<then>
|
<then>
|
||||||
<exec command="chmod -R 777 ${directory}/*"/>
|
<exec command="chmod -R 777 ${directory}/*" />
|
||||||
</then>
|
</then>
|
||||||
</if>
|
</if>
|
||||||
</target>
|
</target>
|
||||||
@@ -174,11 +169,11 @@
|
|||||||
<!-- Checkout and finalization -->
|
<!-- Checkout and finalization -->
|
||||||
<target name="app:checkout">
|
<target name="app:checkout">
|
||||||
<tstamp>
|
<tstamp>
|
||||||
<format property="date_end" pattern="%Y-%m-%d %H:%M"/>
|
<format property="date_end" pattern="%Y-%m-%d %H:%M" />
|
||||||
</tstamp>
|
</tstamp>
|
||||||
|
|
||||||
<echo msg="------------------------------------"/>
|
<echo msg="------------------------------------" />
|
||||||
<echo msg="Build finished at: ${date_end}"/>
|
<echo msg="Build finished at: ${date_end}" />
|
||||||
<echo msg="------------------------------------"/>
|
<echo msg="------------------------------------" />
|
||||||
</target>
|
</target>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -1,36 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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.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 -->
|
<!-- Directories to check -->
|
||||||
<property name="directoriesToCheck" value="
|
<property name="directoriesToCheck" value="
|
||||||
${dir.cache},
|
|
||||||
${dir.logs},
|
|
||||||
${dir.sessions},
|
|
||||||
${dir.data.tests},
|
${dir.data.tests},
|
||||||
${dir.data.temporary},
|
${dir.data.temporary}"
|
||||||
${dir.docker.data},
|
|
||||||
${dir.docker.logs}"
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- Directories to empty -->
|
<!-- Directories to empty -->
|
||||||
<property name="directoriesToEmpty" value="
|
<property name="directoriesToEmpty" value="
|
||||||
${dir.cache},
|
|
||||||
${dir.logs},
|
|
||||||
${dir.sessions},
|
|
||||||
${dir.data.temporary}"
|
${dir.data.temporary}"
|
||||||
/>
|
/>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ cache.clearWithWarmup = false
|
|||||||
#
|
#
|
||||||
composer.download_command = bash ${project.basedir}/phing/composer-install.sh
|
composer.download_command = bash ${project.basedir}/phing/composer-install.sh
|
||||||
|
|
||||||
# Path to composer executable or downloaded composer.phar file
|
# Path to Composer executable or downloaded composer.phar file
|
||||||
#
|
#
|
||||||
composer.path = ${project.basedir}/composer.phar
|
composer.path = ${project.basedir}/composer.phar
|
||||||
|
|
||||||
# Path to php executable used by composer
|
# Path to PHP executable used by Composer
|
||||||
#
|
#
|
||||||
composer.php = php
|
composer.php = php
|
||||||
|
|
||||||
@@ -39,10 +39,6 @@ composer.php = php
|
|||||||
# System directories
|
# System directories
|
||||||
#
|
#
|
||||||
dir.src = ${project.basedir}/src
|
dir.src = ${project.basedir}/src
|
||||||
dir.var = ${project.basedir}/tests/Resources/var
|
|
||||||
dir.cache = ${dir.var}/cache
|
|
||||||
dir.logs = ${dir.var}/log
|
|
||||||
dir.sessions = ${dir.var}/sessions
|
|
||||||
dir.data = ${project.basedir}/data
|
dir.data = ${project.basedir}/data
|
||||||
dir.tests = ${project.basedir}/tests
|
dir.tests = ${project.basedir}/tests
|
||||||
|
|
||||||
@@ -50,19 +46,24 @@ dir.tests = ${project.basedir}/tests
|
|||||||
#
|
#
|
||||||
dir.build = ${project.basedir}/build
|
dir.build = ${project.basedir}/build
|
||||||
dir.reports = ${dir.build}/reports
|
dir.reports = ${dir.build}/reports
|
||||||
dir.reports.pdepend = ${dir.reports}/pdepend
|
dir.reports.coverage = ${dir.reports}/phpunit-coverage
|
||||||
dir.reports.coverage = ${dir.reports}/phpunit_coverage
|
dir.reports.code_sniffer = ${dir.reports}/code_sniffer
|
||||||
|
|
||||||
# Data directories
|
# Data directories
|
||||||
#
|
#
|
||||||
dir.data.tests = ${dir.data}/tests
|
dir.data.tests = ${dir.data}/tests
|
||||||
dir.data.temporary = ${dir.data}/tmp
|
dir.data.temporary = ${dir.data}/tmp
|
||||||
|
|
||||||
# Docker directories
|
# --------------------------------------------------------------------------------
|
||||||
|
# Static Analysis
|
||||||
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Paths of frameworks used to run analysis:
|
||||||
|
# - PHPStan
|
||||||
#
|
#
|
||||||
dir.docker = ${project.basedir}/docker
|
check.phpstan.command = ./vendor/bin/phpstan analyse
|
||||||
dir.docker.data = ${dir.docker}/data/db
|
check.psalm.command = ./vendor/bin/psalm --report=build/reports/psalm.json
|
||||||
dir.docker.logs = ${dir.docker}/logs/nginx
|
check.php_coveralls.command = ./vendor/bin/php-coveralls --ansi -v
|
||||||
|
|
||||||
# --------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------
|
||||||
# Testing
|
# Testing
|
||||||
@@ -72,11 +73,17 @@ dir.docker.logs = ${dir.docker}/logs/nginx
|
|||||||
#
|
#
|
||||||
tests.cs_fixer.command = ./vendor/bin/php-cs-fixer fix --verbose
|
tests.cs_fixer.command = ./vendor/bin/php-cs-fixer fix --verbose
|
||||||
|
|
||||||
|
# Path of the PHP_CodeSniffer (https://github.com/squizlabs/PHP_CodeSniffer)
|
||||||
|
#
|
||||||
|
tests.code_sniffer.command = ./vendor/bin/phpcs --report-full=${dir.reports.code_sniffer}/full.txt --report-summary=${dir.reports.code_sniffer}/summary.txt --report-checkstyle=${dir.reports.code_sniffer}/checkstyle.xml
|
||||||
|
|
||||||
# Test database path
|
# Test database path
|
||||||
#
|
#
|
||||||
tests.database = ${dir.data.temporary}/database.sqlite
|
tests.database = ${dir.data.temporary}/database.sqlite
|
||||||
|
|
||||||
# Paths of frameworks used to run tests:
|
# Paths of frameworks used to run tests:
|
||||||
# - PHPUnit (unit tests)
|
# - PHPUnit (unit tests)
|
||||||
|
# - Infection (mutation tests)
|
||||||
#
|
#
|
||||||
tests.phpunit.command = ./vendor/bin/phpunit --verbose
|
tests.phpunit.command = ./vendor/bin/phpunit --verbose
|
||||||
|
tests.mutation.command = ./vendor/bin/infection --ansi --threads=$(nproc) --coverage=build/reports/infection
|
||||||
|
|||||||
100
phing/tests.xml
100
phing/tests.xml
@@ -1,30 +1,30 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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.16.0">
|
||||||
<autoloader/>
|
<autoloader />
|
||||||
|
|
||||||
<!-- Properties -->
|
<!-- Properties -->
|
||||||
<if>
|
<if>
|
||||||
<available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
|
<available file="${project.basedir}/phing/properties" property="custom.properties.available" />
|
||||||
<then>
|
<then>
|
||||||
<property file="${project.basedir}/phing/properties"/>
|
<property file="${project.basedir}/phing/properties" />
|
||||||
</then>
|
</then>
|
||||||
<else>
|
<else>
|
||||||
<property file="${project.basedir}/phing/properties.dist"/>
|
<property file="${project.basedir}/phing/properties.dist" />
|
||||||
</else>
|
</else>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<!-- Filesets -->
|
<!-- Filesets -->
|
||||||
<fileset id="sourcecode" dir="${dir.src}">
|
<fileset id="sourcecode" dir="${dir.src}">
|
||||||
<include name="**/*.php"/>
|
<include name="**/*.php" />
|
||||||
<exclude name="*Test.php"/>
|
<exclude name="*Test.php" />
|
||||||
<exclude name="**/*Test.php"/>
|
<exclude name="**/*Test.php" />
|
||||||
<exclude name="**/Resources/**"/>
|
<exclude name="**/Resources/**" />
|
||||||
<exclude name="**/DataFixtures/**"/>
|
<exclude name="**/DataFixtures/**" />
|
||||||
<exclude name="**/Tests/**"/>
|
<exclude name="**/Tests/**" />
|
||||||
</fileset>
|
</fileset>
|
||||||
<fileset id="tests" dir="${dir.tests}">
|
<fileset id="tests" dir="${dir.tests}">
|
||||||
<include name="**/*Test*.php"/>
|
<include name="**/*Test*.php" />
|
||||||
</fileset>
|
</fileset>
|
||||||
|
|
||||||
<!-- Default / main target -->
|
<!-- Default / main target -->
|
||||||
@@ -37,97 +37,87 @@
|
|||||||
|
|
||||||
<!-- Fixing coding standards using the PHP Coding Standards Fixer (http://cs.sensiolabs.org) -->
|
<!-- Fixing coding standards using the PHP Coding Standards Fixer (http://cs.sensiolabs.org) -->
|
||||||
<target name="build:fix-coding-standards">
|
<target name="build:fix-coding-standards">
|
||||||
<exec command="${tests.cs_fixer.command}" passthru="true"/>
|
<exec command="${tests.cs_fixer.command}" passthru="true" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Check target -->
|
<!-- Check target -->
|
||||||
<target name="build:check"
|
<target name="build:check"
|
||||||
depends="check:cs,
|
depends="check:cs,
|
||||||
check:md,
|
|
||||||
check:cpd,
|
check:cpd,
|
||||||
check:depend,
|
check:phpstan,
|
||||||
check:loc"
|
check:psalm,
|
||||||
|
check:coveralls"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- Test target -->
|
<!-- Test target -->
|
||||||
<target name="build:test"
|
<target name="build:test"
|
||||||
depends="test:phpunit"
|
depends="test:phpunit,
|
||||||
|
test:infection"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- Symfony2 code sniffer -->
|
<!-- PHP_CodeSniffer -->
|
||||||
<target name="check:cs" depends="build:prepare">
|
<target name="check:cs" depends="build:prepare">
|
||||||
<phpcodesniffer standard="PSR2" showWarnings="true">
|
<exec command="${tests.code_sniffer.command}" passthru="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"/>
|
|
||||||
</phpcodesniffer>
|
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- copy/paste detector -->
|
<!-- copy/paste detector -->
|
||||||
<target name="check:cpd" depends="build:prepare">
|
<target name="check:cpd" depends="build:prepare">
|
||||||
<phpcpd>
|
<phpcpd>
|
||||||
<fileset refid="sourcecode"/>
|
<fileset refid="sourcecode" />
|
||||||
<formatter type="pmd" outfile="${dir.reports}/pmd-cpd.xml"/>
|
<formatter type="pmd" outfile="${dir.reports}/copy-paste-detector.xml" />
|
||||||
</phpcpd>
|
</phpcpd>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Mess detector -->
|
<!-- Run static analysis -->
|
||||||
<target name="check:md" depends="build:prepare">
|
<target name="check:phpstan" depends="build:prepare">
|
||||||
<phpmd rulesets="codesize,controversial,design,naming,unusedcode">
|
<exec command="${check.phpstan.command}" passthru="true" />
|
||||||
<fileset refid="sourcecode"/>
|
|
||||||
<formatter type="html" outfile="${dir.reports}/phpmd.html"/>
|
|
||||||
<formatter type="text" outfile="${dir.reports}/phpmd.txt"/>
|
|
||||||
</phpmd>
|
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Code dependency -->
|
<!-- Run static analysis -->
|
||||||
<target name="check:depend" depends="build:prepare">
|
<target name="check:psalm" depends="build:prepare">
|
||||||
<phpdepend>
|
<exec command="${check.psalm.command}" passthru="true" />
|
||||||
<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>
|
</target>
|
||||||
|
|
||||||
<!-- Measure the size and analyzing the structure of a project -->
|
<!-- Run analysis of code coverage -->
|
||||||
<target name="check:loc" depends="build:prepare">
|
<target name="check:coveralls" depends="test:phpunit">
|
||||||
<phploc reportType="txt" reportName="phploc" reportDirectory="${dir.reports}">
|
<exec command="${check.php_coveralls.command}" passthru="true" />
|
||||||
<fileset refid="sourcecode"/>
|
|
||||||
</phploc>
|
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- PHPUnit tests -->
|
<!-- PHPUnit tests -->
|
||||||
<target name="test:phpunit" depends="build:prepare">
|
<target name="test:phpunit" depends="build:prepare">
|
||||||
<exec command="${tests.phpunit.command}" passthru="true"/>
|
<exec command="${tests.phpunit.command}" passthru="true" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Run mutation testing -->
|
||||||
|
<target name="test:infection" depends="test:phpunit">
|
||||||
|
<exec command="${tests.mutation.command}" passthru="true" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Project build clean -->
|
<!-- Project build clean -->
|
||||||
<target name="build:clean">
|
<target name="build:clean">
|
||||||
<if>
|
<if>
|
||||||
<available file="${dir.reports}" type="dir" property="dir_is_available"/>
|
<available file="${dir.reports}" type="dir" property="dir_is_available" />
|
||||||
<then>
|
<then>
|
||||||
<delete dir="${dir.reports}"/>
|
<delete dir="${dir.reports}" />
|
||||||
</then>
|
</then>
|
||||||
</if>
|
</if>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Project build prepare -->
|
<!-- Project build prepare -->
|
||||||
<target name="build:prepare" depends="build:clean">
|
<target name="build:prepare" depends="build:clean">
|
||||||
<mkdir dir="${dir.reports}"/>
|
<mkdir dir="${dir.reports}" />
|
||||||
<mkdir dir="${dir.reports.pdepend}"/>
|
<mkdir dir="${dir.reports.coverage}" />
|
||||||
<mkdir dir="${dir.reports.coverage}"/>
|
<mkdir dir="${dir.reports.code_sniffer}" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Checkout and finalization -->
|
<!-- Checkout and finalization -->
|
||||||
<target name="app:checkout">
|
<target name="app:checkout">
|
||||||
<tstamp>
|
<tstamp>
|
||||||
<format property="date_end" pattern="%Y-%m-%d %H:%M"/>
|
<format property="date_end" pattern="%Y-%m-%d %H:%M" />
|
||||||
</tstamp>
|
</tstamp>
|
||||||
|
|
||||||
<echo msg="--------------------------------------------"/>
|
<echo msg="--------------------------------------------" />
|
||||||
<echo msg="Build tests finished at: ${date_end}"/>
|
<echo msg="Build tests finished at: ${date_end}" />
|
||||||
<echo msg="--------------------------------------------"/>
|
<echo msg="--------------------------------------------" />
|
||||||
</target>
|
</target>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
16
phpcs.xml.dist
Normal file
16
phpcs.xml.dist
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="vendor/squizlabs/php_codesniffer/phpcs.xsd">
|
||||||
|
|
||||||
|
<arg name="basepath" value="."/>
|
||||||
|
<arg name="cache" value=".phpcs-cache"/>
|
||||||
|
<arg name="colors"/>
|
||||||
|
<arg name="extensions" value="php"/>
|
||||||
|
|
||||||
|
<rule ref="PSR2"/>
|
||||||
|
|
||||||
|
<file>src/</file>
|
||||||
|
<file>tests/</file>
|
||||||
|
|
||||||
|
</ruleset>
|
||||||
5
phpstan.neon.dist
Normal file
5
phpstan.neon.dist
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
parameters:
|
||||||
|
level: 1
|
||||||
|
paths:
|
||||||
|
- src
|
||||||
|
- tests
|
||||||
@@ -1,30 +1,37 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<!-- https://phpunit.de/manual/4.8/en/appendixes.configuration.html -->
|
<!-- https://phpunit.readthedocs.io/en/8.2/configuration.html -->
|
||||||
<phpunit
|
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
|
||||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/4.8/phpunit.xsd"
|
backupGlobals="false"
|
||||||
bootstrap="vendor/autoload.php"
|
bootstrap="vendor/autoload.php"
|
||||||
colors="true"
|
colors="true"
|
||||||
verbose="true"
|
executionOrder="random"
|
||||||
|
forceCoversAnnotation="true"
|
||||||
|
verbose="true"
|
||||||
>
|
>
|
||||||
|
<coverage>
|
||||||
|
<include>
|
||||||
|
<directory>src</directory>
|
||||||
|
</include>
|
||||||
|
<report>
|
||||||
|
<clover outputFile="build/reports/coveralls/clover.xml" />
|
||||||
|
<html outputDirectory="build/reports/phpunit-coverage/html" />
|
||||||
|
<xml outputDirectory="build/reports/infection/coverage-xml" />
|
||||||
|
</report>
|
||||||
|
</coverage>
|
||||||
<php>
|
<php>
|
||||||
<ini name="error_reporting" value="-1"/>
|
<ini name="error_reporting" value="-1" />
|
||||||
</php>
|
</php>
|
||||||
|
|
||||||
<testsuites>
|
<testsuites>
|
||||||
<testsuite name="Meritoo Package - Main Test Suite">
|
<testsuite name="Meritoo Package - Main Test Suite">
|
||||||
<directory>tests/</directory>
|
<directory>tests</directory>
|
||||||
|
</testsuite>
|
||||||
|
<testsuite name="Collection">
|
||||||
|
<directory>tests/Collection</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
|
|
||||||
<filter>
|
|
||||||
<whitelist>
|
|
||||||
<directory>src/</directory>
|
|
||||||
</whitelist>
|
|
||||||
</filter>
|
|
||||||
|
|
||||||
<logging>
|
<logging>
|
||||||
<log type="coverage-html" target="build/reports/phpunit_coverage/html"/>
|
<junit outputFile="build/reports/infection/phpunit.junit.xml" />
|
||||||
</logging>
|
</logging>
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|||||||
53
psalm.xml
Normal file
53
psalm.xml
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<psalm
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
totallyTyped="false"
|
||||||
|
xmlns="https://getpsalm.org/schema/config"
|
||||||
|
xsi:schemaLocation="https://getpsalm.org/schema/config file:///project/vendor/vimeo/psalm/config.xsd"
|
||||||
|
>
|
||||||
|
<projectFiles>
|
||||||
|
<directory name="src" />
|
||||||
|
<ignoreFiles>
|
||||||
|
<directory name="vendor" />
|
||||||
|
</ignoreFiles>
|
||||||
|
</projectFiles>
|
||||||
|
|
||||||
|
<issueHandlers>
|
||||||
|
<LessSpecificReturnType errorLevel="info" />
|
||||||
|
|
||||||
|
<!-- level 3 issues - slightly lazy code writing, but provably low false-negatives -->
|
||||||
|
|
||||||
|
<DeprecatedMethod errorLevel="info" />
|
||||||
|
<DeprecatedProperty errorLevel="info" />
|
||||||
|
<DeprecatedClass errorLevel="info" />
|
||||||
|
<DeprecatedConstant errorLevel="info" />
|
||||||
|
<DeprecatedInterface errorLevel="info" />
|
||||||
|
<DeprecatedTrait errorLevel="info" />
|
||||||
|
|
||||||
|
<InternalMethod errorLevel="info" />
|
||||||
|
<InternalProperty errorLevel="info" />
|
||||||
|
<InternalClass errorLevel="info" />
|
||||||
|
|
||||||
|
<MissingClosureReturnType errorLevel="info" />
|
||||||
|
<MissingReturnType errorLevel="info" />
|
||||||
|
<MissingPropertyType errorLevel="info" />
|
||||||
|
<InvalidDocblock errorLevel="info" />
|
||||||
|
<MisplacedRequiredParam errorLevel="info" />
|
||||||
|
|
||||||
|
<PropertyNotSetInConstructor errorLevel="info" />
|
||||||
|
<MissingConstructor errorLevel="info" />
|
||||||
|
<MissingClosureParamType errorLevel="info" />
|
||||||
|
<MissingParamType errorLevel="info" />
|
||||||
|
|
||||||
|
<RedundantCondition errorLevel="info" />
|
||||||
|
|
||||||
|
<DocblockTypeContradiction errorLevel="info" />
|
||||||
|
<RedundantConditionGivenDocblockType errorLevel="info" />
|
||||||
|
|
||||||
|
<UnresolvableInclude errorLevel="info" />
|
||||||
|
|
||||||
|
<RawObjectIteration errorLevel="info" />
|
||||||
|
|
||||||
|
<InvalidStringClass errorLevel="info" />
|
||||||
|
</issueHandlers>
|
||||||
|
</psalm>
|
||||||
349
src/Collection/BaseCollection.php
Normal file
349
src/Collection/BaseCollection.php
Normal file
@@ -0,0 +1,349 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Collection;
|
||||||
|
|
||||||
|
use ArrayIterator;
|
||||||
|
use Meritoo\Common\Contract\Collection\CollectionInterface;
|
||||||
|
use Meritoo\Common\Utilities\Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collection of elements with the same type
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
abstract class BaseCollection implements CollectionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The elements of collection
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private array $elements;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class constructor
|
||||||
|
*
|
||||||
|
* @param array $elements (optional) Elements of collection
|
||||||
|
*/
|
||||||
|
public function __construct(array $elements = [])
|
||||||
|
{
|
||||||
|
$validated = $this->getElementsWithValidType($elements);
|
||||||
|
$this->elements = $this->prepareElements($validated);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function add($element, $index = null): void
|
||||||
|
{
|
||||||
|
if (!$this->isValidType($element)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === $index) {
|
||||||
|
$this->elements[] = $element;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->elements[$index] = $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function addMultiple($elements, bool $useIndexes = false): void
|
||||||
|
{
|
||||||
|
if (empty($elements)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$prepared = $this->prepareElements($elements);
|
||||||
|
|
||||||
|
foreach ($prepared as $index => $element) {
|
||||||
|
if ($useIndexes) {
|
||||||
|
$this->add($element, $index);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->add($element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function append($element): void
|
||||||
|
{
|
||||||
|
$this->elements[] = $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function clear(): void
|
||||||
|
{
|
||||||
|
$this->elements = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function count(): int
|
||||||
|
{
|
||||||
|
return count($this->elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getByIndex($index)
|
||||||
|
{
|
||||||
|
return $this->elements[$index] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getFirst()
|
||||||
|
{
|
||||||
|
return Arrays::getFirstElement($this->elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getIterator(): ArrayIterator
|
||||||
|
{
|
||||||
|
return new ArrayIterator($this->elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getLast()
|
||||||
|
{
|
||||||
|
return Arrays::getLastElement($this->elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getNext($element)
|
||||||
|
{
|
||||||
|
return Arrays::getNextElement($this->elements, $element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getPrevious($element)
|
||||||
|
{
|
||||||
|
return Arrays::getPreviousElement($this->elements, $element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function has($element): bool
|
||||||
|
{
|
||||||
|
$index = Arrays::getIndexOf($this->elements, $element);
|
||||||
|
|
||||||
|
return null !== $index && false !== $index;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function isEmpty(): bool
|
||||||
|
{
|
||||||
|
return empty($this->elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function isFirst($element): bool
|
||||||
|
{
|
||||||
|
return reset($this->elements) === $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function isLast($element): bool
|
||||||
|
{
|
||||||
|
return end($this->elements) === $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function limit(int $max, int $offset = 0): self
|
||||||
|
{
|
||||||
|
$result = clone $this;
|
||||||
|
|
||||||
|
$negativeMax = $max <= 0;
|
||||||
|
$exceededMax = $max >= $this->count();
|
||||||
|
|
||||||
|
if ($negativeMax || $exceededMax) {
|
||||||
|
if ($negativeMax) {
|
||||||
|
$result->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
$iteration = -1;
|
||||||
|
|
||||||
|
foreach ($result as $index => $element) {
|
||||||
|
$iteration++;
|
||||||
|
|
||||||
|
if ($iteration >= $offset && $iteration < $offset + $max) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
unset($result[$index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function offsetExists($offset): bool
|
||||||
|
{
|
||||||
|
return $this->exists($offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function offsetGet($offset)
|
||||||
|
{
|
||||||
|
if ($this->exists($offset)) {
|
||||||
|
return $this->elements[$offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function offsetSet($offset, $value): void
|
||||||
|
{
|
||||||
|
$this->elements[$offset] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function offsetUnset($offset): void
|
||||||
|
{
|
||||||
|
if ($this->exists($offset)) {
|
||||||
|
unset($this->elements[$offset]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function prepend($element): void
|
||||||
|
{
|
||||||
|
array_unshift($this->elements, $element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function remove($element): void
|
||||||
|
{
|
||||||
|
if (0 === $this->count()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->elements as $index => $existing) {
|
||||||
|
if ($element === $existing) {
|
||||||
|
unset($this->elements[$index]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function toArray(): array
|
||||||
|
{
|
||||||
|
return $this->elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information if given element has valid type
|
||||||
|
*
|
||||||
|
* @param mixed $element Element of collection
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
abstract protected function isValidType($element): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepares elements to initialize the collection.
|
||||||
|
* Feel free to override and prepare elements in your way.
|
||||||
|
*
|
||||||
|
* @param array $elements The elements of collection to prepare
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function prepareElements(array $elements): array
|
||||||
|
{
|
||||||
|
return $elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information if element with given index/key exists
|
||||||
|
*
|
||||||
|
* @param int|string $index The index/key of element
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function exists($index): bool
|
||||||
|
{
|
||||||
|
return isset($this->elements[$index]) || array_key_exists($index, $this->elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns elements of collection with valid types
|
||||||
|
*
|
||||||
|
* @param array $elements The elements of collection to verify
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getElementsWithValidType(array $elements): array
|
||||||
|
{
|
||||||
|
if (empty($elements)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
foreach ($elements as $index => $element) {
|
||||||
|
if (!$this->isValidType($element)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result[$index] = $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Meritoo\Common\Collection;
|
|
||||||
|
|
||||||
use ArrayAccess;
|
|
||||||
use Countable;
|
|
||||||
use IteratorAggregate;
|
|
||||||
use Meritoo\Common\Traits\CollectionTrait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Collection of elements.
|
|
||||||
* It's a set of some elements, e.g. objects.
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
class Collection implements Countable, ArrayAccess, IteratorAggregate
|
|
||||||
{
|
|
||||||
use CollectionTrait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class constructor
|
|
||||||
*
|
|
||||||
* @param array $elements (optional) The elements of collection
|
|
||||||
*/
|
|
||||||
public function __construct(array $elements = [])
|
|
||||||
{
|
|
||||||
$this->elements = $elements;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
27
src/Collection/DateTimeCollection.php
Normal file
27
src/Collection/DateTimeCollection.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Collection;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collection of DateTime instances
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
class DateTimeCollection extends BaseCollection
|
||||||
|
{
|
||||||
|
protected function isValidType($element): bool
|
||||||
|
{
|
||||||
|
return $element instanceof DateTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,21 +6,20 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Meritoo\Common\Traits\Collection;
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trait for the Collection required by Countable interface
|
* Collection of integers
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
trait CountableTrait
|
class IntegerCollection extends BaseCollection
|
||||||
{
|
{
|
||||||
/**
|
protected function isValidType($element): bool
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function count()
|
|
||||||
{
|
{
|
||||||
return count($this->elements);
|
return is_int($element);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
25
src/Collection/StringCollection.php
Normal file
25
src/Collection/StringCollection.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collection of strings
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
class StringCollection extends BaseCollection
|
||||||
|
{
|
||||||
|
protected function isValidType($element): bool
|
||||||
|
{
|
||||||
|
return is_string($element);
|
||||||
|
}
|
||||||
|
}
|
||||||
72
src/Collection/Templates.php
Normal file
72
src/Collection/Templates.php
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Collection;
|
||||||
|
|
||||||
|
use Meritoo\Common\Exception\ValueObject\Template\TemplateNotFoundException;
|
||||||
|
use Meritoo\Common\ValueObject\Template;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collection/storage of templates
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
class Templates extends BaseCollection
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Finds and returns template with given index
|
||||||
|
*
|
||||||
|
* @param string $index Index that contains required template
|
||||||
|
* @return Template
|
||||||
|
* @throws TemplateNotFoundException
|
||||||
|
*/
|
||||||
|
public function findTemplate(string $index): Template
|
||||||
|
{
|
||||||
|
$template = $this->getByIndex($index);
|
||||||
|
|
||||||
|
if ($template instanceof Template) {
|
||||||
|
return $template;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Oops, template not found
|
||||||
|
throw TemplateNotFoundException::create($index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and returns the collection from given array
|
||||||
|
*
|
||||||
|
* @param array $templates Pairs of key-value where: key - template's index, value - template's content
|
||||||
|
* @return Templates
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $templates): Templates
|
||||||
|
{
|
||||||
|
// No templates. Nothing to do.
|
||||||
|
if (empty($templates)) {
|
||||||
|
return new static();
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = new static();
|
||||||
|
|
||||||
|
foreach ($templates as $index => $template) {
|
||||||
|
$result->add(new Template($template), $index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function isValidType($element): bool
|
||||||
|
{
|
||||||
|
return $element instanceof Template;
|
||||||
|
}
|
||||||
|
}
|
||||||
55
src/Contract/Collection/AddableCollectionInterface.php
Normal file
55
src/Contract/Collection/AddableCollectionInterface.php
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Contract\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contract for collection that may add elements
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
interface AddableCollectionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 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 void
|
||||||
|
*/
|
||||||
|
public function add($element, $index = null): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds given elements (at the end of collection)
|
||||||
|
*
|
||||||
|
* @param array|CollectionInterface $elements The elements to add
|
||||||
|
* @param bool $useIndexes (optional) If is set to true, indexes of given elements will be
|
||||||
|
* used in this collection. Otherwise - not.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function addMultiple(array $elements, bool $useIndexes = false): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends given element (adds given element at the end of collection)
|
||||||
|
*
|
||||||
|
* @param mixed $element The element to add at the end
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function append($element): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepends given element (adds given element at the beginning of collection)
|
||||||
|
*
|
||||||
|
* @param mixed $element The element to add at the beginning
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function prepend($element): void;
|
||||||
|
}
|
||||||
27
src/Contract/Collection/ClearableCollectionInterface.php
Normal file
27
src/Contract/Collection/ClearableCollectionInterface.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Contract\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contract for collection that may be cleared (all its elements may be removed)
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
interface ClearableCollectionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Removes all elements of the collection
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function clear(): void;
|
||||||
|
}
|
||||||
32
src/Contract/Collection/CollectionInterface.php
Normal file
32
src/Contract/Collection/CollectionInterface.php
Normal file
@@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Contract\Collection;
|
||||||
|
|
||||||
|
use ArrayAccess;
|
||||||
|
use IteratorAggregate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contract for collection of elements with the same type
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
interface CollectionInterface extends ArrayAccess, IteratorAggregate, AddableCollectionInterface,
|
||||||
|
RemovableCollectionInterface, CountableCollectionInterface, ClearableCollectionInterface,
|
||||||
|
GettableCollectionInterface, VerifiableCollectionInterface, ReducibleCollectionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns representation of object as array
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray(): array;
|
||||||
|
}
|
||||||
23
src/Contract/Collection/CountableCollectionInterface.php
Normal file
23
src/Contract/Collection/CountableCollectionInterface.php
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Contract\Collection;
|
||||||
|
|
||||||
|
use Countable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contract for collection that may count its elements
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
interface CountableCollectionInterface extends Countable
|
||||||
|
{
|
||||||
|
}
|
||||||
58
src/Contract/Collection/GettableCollectionInterface.php
Normal file
58
src/Contract/Collection/GettableCollectionInterface.php
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Contract\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contract for collection that returns first, last element etc.
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
interface GettableCollectionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns element with given index
|
||||||
|
*
|
||||||
|
* @param mixed $index Index / key of element to return
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getByIndex($index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns first element
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getFirst();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns last element
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getLast();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns element next after given element
|
||||||
|
*
|
||||||
|
* @param mixed $element The element whose next element should be returned
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getNext($element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns element preceding given element
|
||||||
|
*
|
||||||
|
* @param mixed $element The element whose previous element should be returned
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getPrevious($element);
|
||||||
|
}
|
||||||
29
src/Contract/Collection/ReducibleCollectionInterface.php
Normal file
29
src/Contract/Collection/ReducibleCollectionInterface.php
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Contract\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contract for collection that may reduce its elements
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
interface ReducibleCollectionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns new instance of this collection with limited elements
|
||||||
|
*
|
||||||
|
* @param int $max Maximum elements to return
|
||||||
|
* @param int $offset (optional) Position of element from which limitation should start
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function limit(int $max, int $offset = 0): self;
|
||||||
|
}
|
||||||
28
src/Contract/Collection/RemovableCollectionInterface.php
Normal file
28
src/Contract/Collection/RemovableCollectionInterface.php
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Contract\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contract for collection that may remove elements
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
interface RemovableCollectionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Removes given element
|
||||||
|
*
|
||||||
|
* @param mixed $element The element to remove
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function remove($element): void;
|
||||||
|
}
|
||||||
51
src/Contract/Collection/VerifiableCollectionInterface.php
Normal file
51
src/Contract/Collection/VerifiableCollectionInterface.php
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Contract\Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contract for collection that may verify its elements
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
interface VerifiableCollectionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns information if given element exists in collection
|
||||||
|
*
|
||||||
|
* @param mixed $element The element to verify
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function has($element): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information if collection is empty (has not any element)
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isEmpty(): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information if given element is the first element in collection
|
||||||
|
*
|
||||||
|
* @param mixed $element The element to verify
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isFirst($element): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information if given element is the last element in collection
|
||||||
|
*
|
||||||
|
* @param mixed $element The element to verify
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isLast($element): bool;
|
||||||
|
}
|
||||||
31
src/Contract/Renderable/RenderableInterface.php
Normal file
31
src/Contract/Renderable/RenderableInterface.php
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Contract\Renderable;
|
||||||
|
|
||||||
|
use Meritoo\Common\Collection\Templates;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface/Contract of something that may be rendered
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
interface RenderableInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Renders this object using given templates
|
||||||
|
*
|
||||||
|
* @param Templates $templates Collection/storage of templates that will be required while rendering this and
|
||||||
|
* related objects, e.g. children of this object
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function render(Templates $templates): string;
|
||||||
|
}
|
||||||
@@ -28,13 +28,13 @@ abstract class UnknownTypeException extends Exception
|
|||||||
* @param string $typeName Name of the something
|
* @param string $typeName Name of the something
|
||||||
* @return UnknownTypeException
|
* @return UnknownTypeException
|
||||||
*/
|
*/
|
||||||
public static function create($unknownType, BaseType $typeInstance, $typeName)
|
public static function create($unknownType, BaseType $typeInstance, string $typeName): UnknownTypeException
|
||||||
{
|
{
|
||||||
$template = 'The \'%s\' type of %s is unknown. Probably doesn\'t exist or there is a typo. You should use one'
|
$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.';
|
.' of these types: %s.';
|
||||||
|
|
||||||
$allTypes = $typeInstance->getAll();
|
$allTypes = $typeInstance->getAll();
|
||||||
$types = Arrays::values2string($allTypes, '', ', ');
|
$types = Arrays::values2string($allTypes, '', ', ') ?? '[types not found]';
|
||||||
$message = sprintf($template, $unknownType, $typeName, $types);
|
$message = sprintf($template, $unknownType, $typeName, $types);
|
||||||
|
|
||||||
return new static($message);
|
return new static($message);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class IncorrectBundleNameException extends Exception
|
|||||||
public static function create($bundleName)
|
public static function create($bundleName)
|
||||||
{
|
{
|
||||||
$template = 'Name of bundle \'%s\' is incorrect. It should start with big letter and end with "Bundle". Is'
|
$template = 'Name of bundle \'%s\' is incorrect. It should start with big letter and end with "Bundle". Is'
|
||||||
. ' there everything ok?';
|
.' there everything ok?';
|
||||||
|
|
||||||
$message = sprintf($template, $bundleName);
|
$message = sprintf($template, $bundleName);
|
||||||
|
|
||||||
|
|||||||
@@ -8,13 +8,15 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Exception\File;
|
namespace Meritoo\Common\Exception\File;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An exception used while file with given path is empty (has no content)
|
* An exception used while file with given path is empty (has no content)
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class EmptyFileException extends \Exception
|
class EmptyFileException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
|
|||||||
@@ -8,18 +8,22 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Exception\File;
|
namespace Meritoo\Common\Exception\File;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An exception used while path of given file is empty
|
* An exception used while path of given file is empty
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class EmptyFilePathException extends \Exception
|
class EmptyFilePathException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
|
*
|
||||||
|
* @return EmptyFilePathException
|
||||||
*/
|
*/
|
||||||
public static function create()
|
public static function create(): EmptyFilePathException
|
||||||
{
|
{
|
||||||
return new static('Path of the file is empty. Did you provide path of proper file?');
|
return new static('Path of the file is empty. Did you provide path of proper file?');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,13 +8,15 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Exception\File;
|
namespace Meritoo\Common\Exception\File;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An exception used while file with given path does not exist
|
* An exception used while file with given path does not exist
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class NotExistingFileException extends \Exception
|
class NotExistingFileException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
|
|||||||
@@ -21,13 +21,12 @@ class CannotResolveClassNameException extends Exception
|
|||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
*
|
*
|
||||||
* @param array|object|string $source Source of the class's / trait's name. It can be an array of objects,
|
* @param string $source Source of name of the class or trait
|
||||||
* namespaces, object or namespace.
|
* @param bool $forClass (optional) If is set to true, message of this exception for class is prepared. Otherwise
|
||||||
* @param bool $forClass (optional) If is set to true, message of this exception for class is
|
* - for trait.
|
||||||
* prepared. Otherwise - for trait.
|
|
||||||
* @return CannotResolveClassNameException
|
* @return CannotResolveClassNameException
|
||||||
*/
|
*/
|
||||||
public static function create($source, $forClass = true)
|
public static function create(string $source, bool $forClass = true): CannotResolveClassNameException
|
||||||
{
|
{
|
||||||
$forWho = 'trait';
|
$forWho = 'trait';
|
||||||
$value = '';
|
$value = '';
|
||||||
@@ -37,7 +36,7 @@ class CannotResolveClassNameException extends Exception
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_scalar($source)) {
|
if (is_scalar($source)) {
|
||||||
$value = sprintf(' %s', (string)$source);
|
$value = sprintf(' %s', $source);
|
||||||
}
|
}
|
||||||
|
|
||||||
$template = 'Name of %s from given \'%s\'%s cannot be resolved. Is there everything ok?';
|
$template = 'Name of %s from given \'%s\'%s cannot be resolved. Is there everything ok?';
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?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;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception used while given class hasn't constructor
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
class ClassWithoutConstructorException extends Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Creates exception
|
||||||
|
*
|
||||||
|
* @param string $className Fully-qualified name of class that hasn't constructor
|
||||||
|
* @return ClassWithoutConstructorException
|
||||||
|
*/
|
||||||
|
public static function create(string $className): ClassWithoutConstructorException
|
||||||
|
{
|
||||||
|
$template = 'Oops, class \'%s\' hasn\'t constructor. Did you use proper class?';
|
||||||
|
$message = sprintf($template, $className);
|
||||||
|
|
||||||
|
return new static($message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,12 +26,12 @@ class MissingChildClassesException extends Exception
|
|||||||
* strings, object or string.
|
* strings, object or string.
|
||||||
* @return MissingChildClassesException
|
* @return MissingChildClassesException
|
||||||
*/
|
*/
|
||||||
public static function create($parentClass)
|
public static function create($parentClass): MissingChildClassesException
|
||||||
{
|
{
|
||||||
$template = 'The \'%s\' class requires one child class at least who will extend her (maybe is an abstract'
|
$template = 'The \'%s\' class requires one child class at least who will extend her (maybe is an abstract'
|
||||||
. ' class), but the child classes are missing. Did you forget to extend this class?';
|
.' class), but the child classes are missing. Did you forget to extend this class?';
|
||||||
|
|
||||||
$parentClassName = Reflection::getClassName($parentClass);
|
$parentClassName = Reflection::getClassName($parentClass) ?? '[unknown class]';
|
||||||
$message = sprintf($template, $parentClassName);
|
$message = sprintf($template, $parentClassName);
|
||||||
|
|
||||||
return new static($message);
|
return new static($message);
|
||||||
|
|||||||
@@ -8,22 +8,24 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Exception\Reflection;
|
namespace Meritoo\Common\Exception\Reflection;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An exception used while property does not exist in instance of class
|
* An exception used while property does not exist in instance of class
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class NotExistingPropertyException extends \Exception
|
class NotExistingPropertyException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
*
|
*
|
||||||
* @param mixed $object Object that should contains given property
|
* @param mixed $object Object that should contains given property
|
||||||
* @param string $property Name of the property
|
* @param null|string $property Name of the property
|
||||||
* @return NotExistingPropertyException
|
* @return NotExistingPropertyException
|
||||||
*/
|
*/
|
||||||
public static function create($object, $property)
|
public static function create($object, ?string $property): NotExistingPropertyException
|
||||||
{
|
{
|
||||||
$template = 'Property \'%s\' does not exist in instance of class \'%s\'. Did you use proper name of 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));
|
$message = sprintf($template, $property, get_class($object));
|
||||||
|
|||||||
@@ -27,12 +27,12 @@ class TooManyChildClassesException extends Exception
|
|||||||
* @param array $childClasses Child classes
|
* @param array $childClasses Child classes
|
||||||
* @return TooManyChildClassesException
|
* @return TooManyChildClassesException
|
||||||
*/
|
*/
|
||||||
public static function create($parentClass, array $childClasses)
|
public static function create($parentClass, array $childClasses): TooManyChildClassesException
|
||||||
{
|
{
|
||||||
$template = "The '%s' class requires one child class at most who will extend her, but more than one child"
|
$template = "The '%s' class requires one child class at most who will extend her, but more than one child"
|
||||||
. " class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
|
." class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
|
||||||
|
|
||||||
$parentClassName = Reflection::getClassName($parentClass);
|
$parentClassName = Reflection::getClassName($parentClass) ?? '[unknown class]';
|
||||||
$message = sprintf($template, $parentClassName, implode("\n- ", $childClasses), $parentClassName);
|
$message = sprintf($template, $parentClassName, implode("\n- ", $childClasses), $parentClassName);
|
||||||
|
|
||||||
return new static($message);
|
return new static($message);
|
||||||
|
|||||||
@@ -8,13 +8,15 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Exception\Regex;
|
namespace Meritoo\Common\Exception\Regex;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An exception used while length of given hexadecimal value of color is incorrect
|
* An exception used while length of given hexadecimal value of color is incorrect
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class IncorrectColorHexLengthException extends \Exception
|
class IncorrectColorHexLengthException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
@@ -25,7 +27,7 @@ class IncorrectColorHexLengthException extends \Exception
|
|||||||
public static function create($color)
|
public static function create($color)
|
||||||
{
|
{
|
||||||
$template = 'Length of hexadecimal value of color \'%s\' is incorrect. It\'s %d, but it should be 3 or 6.'
|
$template = 'Length of hexadecimal value of color \'%s\' is incorrect. It\'s %d, but it should be 3 or 6.'
|
||||||
. ' Is there everything ok?';
|
.' Is there everything ok?';
|
||||||
|
|
||||||
$message = sprintf($template, $color, strlen($color));
|
$message = sprintf($template, $color, strlen($color));
|
||||||
|
|
||||||
|
|||||||
@@ -8,13 +8,15 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Exception\Regex;
|
namespace Meritoo\Common\Exception\Regex;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An exception used while given hexadecimal value of color is invalid
|
* An exception used while given hexadecimal value of color is invalid
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class InvalidColorHexValueException extends \Exception
|
class InvalidColorHexValueException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
|
|||||||
@@ -8,13 +8,15 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Exception\Regex;
|
namespace Meritoo\Common\Exception\Regex;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An exception used while html attributes are invalid
|
* An exception used while html attributes are invalid
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class InvalidHtmlAttributesException extends \Exception
|
class InvalidHtmlAttributesException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
|
|||||||
@@ -8,13 +8,15 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Exception\Regex;
|
namespace Meritoo\Common\Exception\Regex;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An exception used while url is invalid
|
* An exception used while url is invalid
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class InvalidUrlException extends \Exception
|
class InvalidUrlException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
|
|||||||
@@ -26,11 +26,8 @@ class UnknownDatePartTypeException extends UnknownTypeException
|
|||||||
* @param string $value Incorrect value
|
* @param string $value Incorrect value
|
||||||
* @return UnknownDatePartTypeException
|
* @return UnknownDatePartTypeException
|
||||||
*/
|
*/
|
||||||
public static function createException($unknownDatePart, $value)
|
public static function createException(string $unknownDatePart, string $value): UnknownDatePartTypeException
|
||||||
{
|
{
|
||||||
/* @var UnknownDatePartTypeException $exception */
|
return parent::create($unknownDatePart, new DatePartType(), sprintf('date part (with value %s)', $value));
|
||||||
$exception = parent::create($unknownDatePart, new DatePartType(), sprintf('date part (with value %s)', $value));
|
|
||||||
|
|
||||||
return $exception;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,8 @@ class UnknownOopVisibilityTypeException extends UnknownTypeException
|
|||||||
* @param string $unknownType Unknown visibility of a property, a method or (as of PHP 7.1.0) a constant
|
* @param string $unknownType Unknown visibility of a property, a method or (as of PHP 7.1.0) a constant
|
||||||
* @return UnknownOopVisibilityTypeException
|
* @return UnknownOopVisibilityTypeException
|
||||||
*/
|
*/
|
||||||
public static function createException($unknownType)
|
public static function createException(string $unknownType): UnknownOopVisibilityTypeException
|
||||||
{
|
{
|
||||||
/* @var UnknownOopVisibilityTypeException $exception */
|
return parent::create($unknownType, new OopVisibilityType(), 'OOP-related visibility');
|
||||||
$exception = parent::create($unknownType, new OopVisibilityType(), 'OOP-related visibility');
|
|
||||||
|
|
||||||
return $exception;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,13 +8,15 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Exception\ValueObject;
|
namespace Meritoo\Common\Exception\ValueObject;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An exception used while dimensions of size, passed to the instance of Size class, are invalid
|
* An exception used while dimensions of size, passed to the instance of Size class, are invalid
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class InvalidSizeDimensionsException extends \Exception
|
class InvalidSizeDimensionsException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates exception
|
* Creates exception
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Exception\ValueObject\Template;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception used while content of template is invalid
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
class InvalidContentException extends Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Creates an exception
|
||||||
|
*
|
||||||
|
* @param string $content Invalid content of template
|
||||||
|
* @return InvalidContentException
|
||||||
|
*/
|
||||||
|
public static function create(string $content): InvalidContentException
|
||||||
|
{
|
||||||
|
$template = 'Content of template \'%s\' is invalid. Did you use string with 1 placeholder at least?';
|
||||||
|
$message = sprintf($template, $content);
|
||||||
|
|
||||||
|
return new static($message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Exception\ValueObject\Template;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception used while there are missing values required to fill all placeholders in template
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
class MissingPlaceholdersInValuesException extends Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Creates an exception
|
||||||
|
*
|
||||||
|
* @param string $content Content of template
|
||||||
|
* @param array $missingPlaceholders Missing placeholders in provided values, iow. placeholders without values
|
||||||
|
* @return MissingPlaceholdersInValuesException
|
||||||
|
*/
|
||||||
|
public static function create(string $content, array $missingPlaceholders): MissingPlaceholdersInValuesException
|
||||||
|
{
|
||||||
|
$template = 'Cannot fill template \'%s\', because of missing values for placeholder(s): %s. Did you provide all'
|
||||||
|
.' required values?';
|
||||||
|
$message = sprintf($template, $content, implode(', ', $missingPlaceholders));
|
||||||
|
|
||||||
|
return new static($message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\Exception\ValueObject\Template;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception used while template with given index was not found
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
class TemplateNotFoundException extends Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Creates the exception
|
||||||
|
*
|
||||||
|
* @param string $index Index that should contain template, but it was not found
|
||||||
|
* @return TemplateNotFoundException
|
||||||
|
*/
|
||||||
|
public static function create(string $index): TemplateNotFoundException
|
||||||
|
{
|
||||||
|
$template = 'Template with \'%s\' index was not found. Did you provide all required templates?';
|
||||||
|
$message = sprintf($template, $index);
|
||||||
|
|
||||||
|
return new static($message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Meritoo\Common\Traits\Collection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trait for the Collection required by ArrayAccess interface
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
trait ArrayAccessTrait
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function offsetExists($offset)
|
|
||||||
{
|
|
||||||
return $this->exists($offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function offsetGet($offset)
|
|
||||||
{
|
|
||||||
if ($this->exists($offset)) {
|
|
||||||
return $this->elements[$offset];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function offsetSet($offset, $value)
|
|
||||||
{
|
|
||||||
$this->elements[$offset] = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function offsetUnset($offset)
|
|
||||||
{
|
|
||||||
if ($this->exists($offset)) {
|
|
||||||
unset($this->elements[$offset]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns information if element with given index/key exists
|
|
||||||
*
|
|
||||||
* @param string|int $index The index/key of element
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
private function exists($index)
|
|
||||||
{
|
|
||||||
return isset($this->elements[$index]) || array_key_exists($index, $this->elements);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,215 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Meritoo\Common\Traits\Collection;
|
|
||||||
|
|
||||||
use Meritoo\Common\Collection\Collection;
|
|
||||||
use Meritoo\Common\Utilities\Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Main trait for the Collection
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
trait MainTrait
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The elements of collection
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $elements;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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) {
|
|
||||||
$this->elements[] = $element;
|
|
||||||
} else {
|
|
||||||
$this->elements[$index] = $element;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->add($element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepends given element (adds given element at the beginning of collection)
|
|
||||||
*
|
|
||||||
* @param mixed $element The element to prepend
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function prepend($element)
|
|
||||||
{
|
|
||||||
array_unshift($this->elements, $element);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes given element
|
|
||||||
*
|
|
||||||
* @param mixed $element The element to remove
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function remove($element)
|
|
||||||
{
|
|
||||||
if ($this->count() > 0) {
|
|
||||||
foreach ($this->elements as $index => $existing) {
|
|
||||||
if ($element === $existing) {
|
|
||||||
unset($this->elements[$index]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns information if collection is empty
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isEmpty()
|
|
||||||
{
|
|
||||||
return empty($this->elements);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns information if given element is first in the collection
|
|
||||||
*
|
|
||||||
* @param mixed $element The element to verify
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isFirst($element)
|
|
||||||
{
|
|
||||||
return reset($this->elements) === $element;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns information if given element is last in the collection
|
|
||||||
*
|
|
||||||
* @param mixed $element The element to verify
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isLast($element)
|
|
||||||
{
|
|
||||||
return end($this->elements) === $element;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns previous element for given element
|
|
||||||
*
|
|
||||||
* @param mixed $element The element to verify
|
|
||||||
* @return mixed|null
|
|
||||||
*/
|
|
||||||
public function getPrevious($element)
|
|
||||||
{
|
|
||||||
return Arrays::getPreviousElement($this->elements, $element);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns next element for given element
|
|
||||||
*
|
|
||||||
* @param mixed $element The element to verify
|
|
||||||
* @return mixed|null
|
|
||||||
*/
|
|
||||||
public function getNext($element)
|
|
||||||
{
|
|
||||||
return Arrays::getNextElement($this->elements, $element);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the first element in the collection
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function getFirst()
|
|
||||||
{
|
|
||||||
return Arrays::getFirstElement($this->elements);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the last element in the collection
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function getLast()
|
|
||||||
{
|
|
||||||
return Arrays::getLastElement($this->elements);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns element with given index
|
|
||||||
*
|
|
||||||
* @param mixed $index Index / key of the element
|
|
||||||
* @return mixed|null
|
|
||||||
*/
|
|
||||||
public function getByIndex($index)
|
|
||||||
{
|
|
||||||
if (isset($this->elements[$index])) {
|
|
||||||
return $this->elements[$index];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns representation of object as array
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function toArray()
|
|
||||||
{
|
|
||||||
return $this->elements;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Meritoo\Common\Traits;
|
|
||||||
|
|
||||||
use Meritoo\Common\Traits\Collection\ArrayAccessTrait;
|
|
||||||
use Meritoo\Common\Traits\Collection\CountableTrait;
|
|
||||||
use Meritoo\Common\Traits\Collection\IteratorAggregateTrait;
|
|
||||||
use Meritoo\Common\Traits\Collection\MainTrait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trait for the Collection
|
|
||||||
*
|
|
||||||
* @author Meritoo <github@meritoo.pl>
|
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
|
||||||
*/
|
|
||||||
trait CollectionTrait
|
|
||||||
{
|
|
||||||
use MainTrait;
|
|
||||||
use CountableTrait;
|
|
||||||
use ArrayAccessTrait;
|
|
||||||
use IteratorAggregateTrait;
|
|
||||||
}
|
|
||||||
@@ -16,6 +16,24 @@ namespace Meritoo\Common\Traits\CssSelector;
|
|||||||
*/
|
*/
|
||||||
trait FormCssSelector
|
trait FormCssSelector
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns selector of form based on its name
|
* Returns selector of form based on its name
|
||||||
*
|
*
|
||||||
@@ -33,25 +51,6 @@ trait FormCssSelector
|
|||||||
return sprintf('form[name="%s"]', $formName);
|
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
|
* Returns selector of the input field based on its ID
|
||||||
*
|
*
|
||||||
@@ -71,6 +70,25 @@ trait FormCssSelector
|
|||||||
return sprintf('%s input#%s', $formSelector, $fieldId);
|
return sprintf('%s input#%s', $formSelector, $fieldId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 label
|
* Returns selector of label
|
||||||
*
|
*
|
||||||
@@ -89,22 +107,4 @@ trait FormCssSelector
|
|||||||
|
|
||||||
return sprintf('%s label[for="%s"]', $formSelector, $fieldId);
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,15 +6,19 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Meritoo\Common\Traits\Test\Base;
|
namespace Meritoo\Common\Traits\Test\Base;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use Generator;
|
use Generator;
|
||||||
|
use Meritoo\Common\Exception\Reflection\ClassWithoutConstructorException;
|
||||||
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
||||||
use Meritoo\Common\Type\OopVisibilityType;
|
use Meritoo\Common\Type\OopVisibilityType;
|
||||||
use Meritoo\Common\Utilities\Miscellaneous;
|
use Meritoo\Common\Utilities\Miscellaneous;
|
||||||
use ReflectionClass;
|
use ReflectionClass;
|
||||||
use ReflectionMethod;
|
use ReflectionMethod;
|
||||||
|
use RuntimeException;
|
||||||
use stdClass;
|
use stdClass;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -32,44 +36,15 @@ trait BaseTestCaseTrait
|
|||||||
*/
|
*/
|
||||||
private static $testsDataDirPath = 'data/tests';
|
private static $testsDataDirPath = 'data/tests';
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides an empty value
|
|
||||||
*
|
|
||||||
* @return Generator
|
|
||||||
*/
|
|
||||||
public function provideEmptyValue()
|
|
||||||
{
|
|
||||||
yield[''];
|
|
||||||
yield[' '];
|
|
||||||
yield[null];
|
|
||||||
yield[0];
|
|
||||||
yield[false];
|
|
||||||
yield[[]];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
public function provideBooleanValue()
|
public function provideBooleanValue(): ?Generator
|
||||||
{
|
{
|
||||||
yield[false];
|
yield [false];
|
||||||
yield[true];
|
yield [true];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -77,12 +52,12 @@ trait BaseTestCaseTrait
|
|||||||
*
|
*
|
||||||
* @return Generator
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
public function provideDateTimeInstance()
|
public function provideDateTimeInstance(): ?Generator
|
||||||
{
|
{
|
||||||
yield[new DateTime()];
|
yield [new DateTime()];
|
||||||
yield[new DateTime('yesterday')];
|
yield [new DateTime('yesterday')];
|
||||||
yield[new DateTime('now')];
|
yield [new DateTime('now')];
|
||||||
yield[new DateTime('tomorrow')];
|
yield [new DateTime('tomorrow')];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -90,31 +65,48 @@ trait BaseTestCaseTrait
|
|||||||
*
|
*
|
||||||
* @return Generator
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
public function provideDateTimeRelativeFormat()
|
public function provideDateTimeRelativeFormat(): ?Generator
|
||||||
{
|
{
|
||||||
yield['now'];
|
yield ['now'];
|
||||||
yield['yesterday'];
|
yield ['yesterday'];
|
||||||
yield['tomorrow'];
|
yield ['tomorrow'];
|
||||||
yield['back of 10'];
|
yield ['back of 10'];
|
||||||
yield['front of 10'];
|
yield ['front of 10'];
|
||||||
yield['last day of February'];
|
yield ['last day of February'];
|
||||||
yield['first day of next month'];
|
yield ['first day of next month'];
|
||||||
yield['last day of previous month'];
|
yield ['last day of previous month'];
|
||||||
yield['last day of next month'];
|
yield ['last day of next month'];
|
||||||
yield['Y-m-d'];
|
yield ['Y-m-d'];
|
||||||
yield['Y-m-d 10:00'];
|
yield ['Y-m-d 10:00'];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides path of not existing file, e.g. "lorem/ipsum.jpg"
|
* Provides an empty scalar value
|
||||||
*
|
*
|
||||||
* @return Generator
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
public function provideNotExistingFilePath()
|
public function provideEmptyScalarValue(): ?Generator
|
||||||
{
|
{
|
||||||
yield['lets-test.doc'];
|
yield [''];
|
||||||
yield['lorem/ipsum.jpg'];
|
yield [' '];
|
||||||
yield['surprise/me/one/more/time.txt'];
|
yield [null];
|
||||||
|
yield [0];
|
||||||
|
yield [false];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides an empty value
|
||||||
|
*
|
||||||
|
* @return Generator
|
||||||
|
*/
|
||||||
|
public function provideEmptyValue(): ?Generator
|
||||||
|
{
|
||||||
|
yield [''];
|
||||||
|
yield [' '];
|
||||||
|
yield [null];
|
||||||
|
yield [0];
|
||||||
|
yield [false];
|
||||||
|
yield [[]];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -122,19 +114,114 @@ trait BaseTestCaseTrait
|
|||||||
*
|
*
|
||||||
* @return Generator
|
* @return Generator
|
||||||
*/
|
*/
|
||||||
public function provideNonScalarValue()
|
public function provideNonScalarValue(): ?Generator
|
||||||
{
|
{
|
||||||
yield[
|
yield [[]];
|
||||||
[],
|
yield [null];
|
||||||
];
|
yield [new stdClass()];
|
||||||
|
}
|
||||||
|
|
||||||
yield[
|
/**
|
||||||
null,
|
* Provides path of not existing file, e.g. "lorem/ipsum.jpg"
|
||||||
];
|
*
|
||||||
|
* @return Generator
|
||||||
|
*/
|
||||||
|
public function provideNotExistingFilePath(): ?Generator
|
||||||
|
{
|
||||||
|
yield ['lets-test.doc'];
|
||||||
|
yield ['lorem/ipsum.jpg'];
|
||||||
|
yield ['surprise/me/one/more/time.txt'];
|
||||||
|
}
|
||||||
|
|
||||||
yield[
|
/**
|
||||||
new stdClass(),
|
* Verifies visibility and arguments of class constructor
|
||||||
];
|
*
|
||||||
|
* @param string $className Fully-qualified name of class that contains constructor 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 ClassWithoutConstructorException
|
||||||
|
*/
|
||||||
|
protected static function assertConstructorVisibilityAndArguments(
|
||||||
|
string $className,
|
||||||
|
string $visibilityType,
|
||||||
|
int $argumentsCount = 0,
|
||||||
|
int $requiredArgumentsCount = 0
|
||||||
|
): void {
|
||||||
|
$reflection = new ReflectionClass($className);
|
||||||
|
$method = $reflection->getConstructor();
|
||||||
|
|
||||||
|
if (null === $method) {
|
||||||
|
throw ClassWithoutConstructorException::create($className);
|
||||||
|
}
|
||||||
|
|
||||||
|
static::assertMethodVisibility($method, $visibilityType);
|
||||||
|
static::assertMethodArgumentsCount($method, $argumentsCount, $requiredArgumentsCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that class with given namespace has no constructor
|
||||||
|
*
|
||||||
|
* @param string $className Fully-qualified name of class that contains constructor to verify
|
||||||
|
*/
|
||||||
|
protected static function assertHasNoConstructor(string $className): void
|
||||||
|
{
|
||||||
|
$reflection = new ReflectionClass($className);
|
||||||
|
$constructor = $reflection->getConstructor();
|
||||||
|
|
||||||
|
static::assertNull($constructor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies count of method's arguments
|
||||||
|
*
|
||||||
|
* @param ReflectionMethod $method Name of method or just the method to verify
|
||||||
|
* @param int $argumentsCount (optional) Expected count/amount of arguments of the verified method
|
||||||
|
* @param int $requiredCount (optional) Expected count/amount of required arguments of the verified
|
||||||
|
* method
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
|
protected static function assertMethodArgumentsCount(
|
||||||
|
ReflectionMethod $method,
|
||||||
|
int $argumentsCount = 0,
|
||||||
|
int $requiredCount = 0
|
||||||
|
): void {
|
||||||
|
static::assertSame($argumentsCount, $method->getNumberOfParameters());
|
||||||
|
static::assertSame($requiredCount, $method->getNumberOfRequiredParameters());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies visibility of method
|
||||||
|
*
|
||||||
|
* @param ReflectionMethod $method Name of method or just the method to verify
|
||||||
|
* @param string $visibilityType Expected visibility of verified method. One of OopVisibilityType
|
||||||
|
* class constants.
|
||||||
|
* @throws UnknownOopVisibilityTypeException
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
|
protected static function assertMethodVisibility(ReflectionMethod $method, string $visibilityType): void
|
||||||
|
{
|
||||||
|
// Type of visibility is not correct?
|
||||||
|
if (!OopVisibilityType::isCorrectType($visibilityType)) {
|
||||||
|
throw UnknownOopVisibilityTypeException::createException($visibilityType);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -145,7 +232,7 @@ trait BaseTestCaseTrait
|
|||||||
* @param string $directoryPath (optional) Path of directory containing the file
|
* @param string $directoryPath (optional) Path of directory containing the file
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getFilePathForTesting($fileName, $directoryPath = '')
|
protected function getFilePathForTesting(string $fileName, string $directoryPath = ''): string
|
||||||
{
|
{
|
||||||
$rootPath = Miscellaneous::getProjectRootPath();
|
$rootPath = Miscellaneous::getProjectRootPath();
|
||||||
|
|
||||||
@@ -159,118 +246,12 @@ trait BaseTestCaseTrait
|
|||||||
return Miscellaneous::concatenatePaths($paths);
|
return Miscellaneous::concatenatePaths($paths);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
* @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
|
|
||||||
*
|
|
||||||
* 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(
|
|
||||||
$classNamespace,
|
|
||||||
$method,
|
|
||||||
$visibilityType,
|
|
||||||
$argumentsCount = 0,
|
|
||||||
$requiredArgumentsCount = 0
|
|
||||||
) {
|
|
||||||
/*
|
|
||||||
* Type of visibility is correct?
|
|
||||||
*/
|
|
||||||
if (!(new OopVisibilityType())->isCorrectType($visibilityType)) {
|
|
||||||
throw new UnknownOopVisibilityTypeException($visibilityType);
|
|
||||||
}
|
|
||||||
|
|
||||||
$reflection = new ReflectionClass($classNamespace);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Name of method provided only?
|
|
||||||
* Let's find instance of the method (based on reflection)
|
|
||||||
*/
|
|
||||||
if (!$method instanceof ReflectionMethod) {
|
|
||||||
$method = $reflection->getMethod($method);
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static::assertEquals($argumentsCount, $method->getNumberOfParameters());
|
|
||||||
static::assertEquals($requiredArgumentsCount, $method->getNumberOfRequiredParameters());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Verifies visibility and arguments of class constructor
|
|
||||||
*
|
|
||||||
* @param string $classNamespace Namespace of class that contains constructor 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
|
|
||||||
*/
|
|
||||||
protected static function assertConstructorVisibilityAndArguments(
|
|
||||||
$classNamespace,
|
|
||||||
$visibilityType,
|
|
||||||
$argumentsCount = 0,
|
|
||||||
$requiredArgumentsCount = 0
|
|
||||||
) {
|
|
||||||
/*
|
|
||||||
* Let's grab the constructor
|
|
||||||
*/
|
|
||||||
$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
|
* Sets path of directory with data used by test cases
|
||||||
*
|
*
|
||||||
* @param string $testsDataDirPath 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)
|
protected static function setTestsDataDirPath(string $testsDataDirPath): void
|
||||||
{
|
{
|
||||||
static::$testsDataDirPath = $testsDataDirPath;
|
static::$testsDataDirPath = $testsDataDirPath;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Meritoo\Common\Traits\Test\Base;
|
namespace Meritoo\Common\Traits\Test\Base;
|
||||||
|
|
||||||
use Generator;
|
use Generator;
|
||||||
@@ -19,10 +21,17 @@ use Meritoo\Common\Type\Base\BaseType;
|
|||||||
*/
|
*/
|
||||||
trait BaseTypeTestCaseTrait
|
trait BaseTypeTestCaseTrait
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Provides type to verify and information if it's correct
|
||||||
|
*
|
||||||
|
* @return Generator
|
||||||
|
*/
|
||||||
|
abstract public function provideTypeToVerify(): Generator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verifies availability of all types
|
* Verifies availability of all types
|
||||||
*/
|
*/
|
||||||
public function testAvailabilityOfAllTypes()
|
public function testAvailabilityOfAllTypes(): void
|
||||||
{
|
{
|
||||||
$available = $this->getTestedTypeInstance()->getAll();
|
$available = $this->getTestedTypeInstance()->getAll();
|
||||||
$all = $this->getAllExpectedTypes();
|
$all = $this->getAllExpectedTypes();
|
||||||
@@ -33,34 +42,27 @@ 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 $isCorrect Information if processed type is correct
|
||||||
* @param bool $expected Information if given type is correct or not
|
* @param bool $expected Expected information if processed type is correct
|
||||||
*
|
*
|
||||||
* @dataProvider provideTypeToVerify
|
* @dataProvider provideTypeToVerify
|
||||||
*/
|
*/
|
||||||
public function testIfGivenTypeIsCorrect($type, $expected)
|
public function testIfGivenTypeIsCorrect(bool $isCorrect, bool $expected): void
|
||||||
{
|
{
|
||||||
static::assertEquals($expected, $this->getTestedTypeInstance()->isCorrectType($type));
|
static::assertEquals($expected, $isCorrect);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides type to verify and information if it's correct
|
|
||||||
*
|
|
||||||
* @return Generator
|
|
||||||
*/
|
|
||||||
abstract public function provideTypeToVerify();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
* @return array
|
||||||
*/
|
*/
|
||||||
abstract protected function getAllExpectedTypes();
|
abstract protected function getAllExpectedTypes(): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns instance of the tested type
|
||||||
|
*
|
||||||
|
* @return BaseType
|
||||||
|
*/
|
||||||
|
abstract protected function getTestedTypeInstance(): BaseType;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,12 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Meritoo\Common\Traits\ValueObject;
|
namespace Meritoo\Common\Traits\ValueObject;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Methods and properties related to human
|
* Methods and properties related to human
|
||||||
*
|
*
|
||||||
@@ -33,26 +37,26 @@ trait HumanTrait
|
|||||||
/**
|
/**
|
||||||
* Email address
|
* Email address
|
||||||
*
|
*
|
||||||
* @var string
|
* @var null|string
|
||||||
*/
|
*/
|
||||||
protected $email;
|
protected $email;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Birth date
|
* Birth date
|
||||||
*
|
*
|
||||||
* @var \DateTime
|
* @var null|DateTime
|
||||||
*/
|
*/
|
||||||
protected $birthDate;
|
protected $birthDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
* @param string $firstName First name
|
* @param string $firstName First name
|
||||||
* @param string $lastName Last name
|
* @param string $lastName Last name
|
||||||
* @param string $email (optional) Email address
|
* @param null|string $email (optional) Email address. Default: null.
|
||||||
* @param \DateTime $birthDate (optional) Birth date
|
* @param null|DateTime $birthDate (optional) Birth date. Default: null.
|
||||||
*/
|
*/
|
||||||
public function __construct($firstName, $lastName, $email = null, \DateTime $birthDate = null)
|
public function __construct(string $firstName, string $lastName, ?string $email = null, ?DateTime $birthDate = null)
|
||||||
{
|
{
|
||||||
$this->firstName = $firstName;
|
$this->firstName = $firstName;
|
||||||
$this->lastName = $lastName;
|
$this->lastName = $lastName;
|
||||||
@@ -68,12 +72,34 @@ trait HumanTrait
|
|||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
$template = '%s';
|
$template = '%s';
|
||||||
|
$email = '';
|
||||||
|
|
||||||
if ('' !== $this->email && null !== $this->email) {
|
if ('' !== $this->email && null !== $this->email) {
|
||||||
$template .= ' <%s>';
|
$template .= ' <%s>';
|
||||||
|
$email = $this->email;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sprintf($template, $this->getFullName(), $this->email);
|
return sprintf($template, $this->getFullName(), $email);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns birth date
|
||||||
|
*
|
||||||
|
* @return null|DateTime
|
||||||
|
*/
|
||||||
|
public function getBirthDate(): ?DateTime
|
||||||
|
{
|
||||||
|
return $this->birthDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns email address
|
||||||
|
*
|
||||||
|
* @return null|string
|
||||||
|
*/
|
||||||
|
public function getEmail(): ?string
|
||||||
|
{
|
||||||
|
return $this->email;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -81,48 +107,19 @@ trait HumanTrait
|
|||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getFirstName()
|
public function getFirstName(): string
|
||||||
{
|
{
|
||||||
return $this->firstName;
|
return $this->firstName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns last name
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getLastName()
|
|
||||||
{
|
|
||||||
return $this->lastName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns email address
|
|
||||||
*
|
|
||||||
* @return string|null
|
|
||||||
*/
|
|
||||||
public function getEmail()
|
|
||||||
{
|
|
||||||
return $this->email;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns birth date
|
|
||||||
*
|
|
||||||
* @return \DateTime|null
|
|
||||||
*/
|
|
||||||
public function getBirthDate()
|
|
||||||
{
|
|
||||||
return $this->birthDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the full name
|
* Returns the full name
|
||||||
*
|
*
|
||||||
* @param bool $firstNameFirst (optional) If is set to true, first name is the first part. Otherwise - last name.
|
* @param bool $firstNameFirst (optional) If is set to true, first name is the first part (default behaviour).
|
||||||
|
* Otherwise - name.
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getFullName($firstNameFirst = true)
|
public function getFullName(bool $firstNameFirst = true): string
|
||||||
{
|
{
|
||||||
$beginning = $this->lastName;
|
$beginning = $this->lastName;
|
||||||
$finish = $this->firstName;
|
$finish = $this->firstName;
|
||||||
@@ -134,4 +131,14 @@ trait HumanTrait
|
|||||||
|
|
||||||
return trim(sprintf('%s %s', $beginning, $finish));
|
return trim(sprintf('%s %s', $beginning, $finish));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns last name
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLastName(): string
|
||||||
|
{
|
||||||
|
return $this->lastName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ abstract class BaseType
|
|||||||
/**
|
/**
|
||||||
* All types
|
* All types
|
||||||
*
|
*
|
||||||
* @var array
|
* @var null|array
|
||||||
*/
|
*/
|
||||||
private $all;
|
private $all;
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ abstract class BaseType
|
|||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function getAll()
|
public function getAll(): array
|
||||||
{
|
{
|
||||||
if (null === $this->all) {
|
if (null === $this->all) {
|
||||||
$this->all = Reflection::getConstants($this);
|
$this->all = Reflection::getConstants($this);
|
||||||
@@ -43,11 +43,11 @@ abstract class BaseType
|
|||||||
/**
|
/**
|
||||||
* Returns information if given type is correct
|
* Returns information if given type is correct
|
||||||
*
|
*
|
||||||
* @param mixed $type The type to check
|
* @param null|string $type The type to check
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function isCorrectType($type)
|
public static function isCorrectType(?string $type): bool
|
||||||
{
|
{
|
||||||
return in_array($type, $this->getAll(), true);
|
return in_array($type, (new static())->getAll());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,40 +23,40 @@ class DatePartType extends BaseType
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const DAY = 'day';
|
public const DAY = 'day';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "hour" date part
|
* The "hour" date part
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const HOUR = 'hour';
|
public const HOUR = 'hour';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "minute" date part
|
* The "minute" date part
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const MINUTE = 'minute';
|
public const MINUTE = 'minute';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "month" date part
|
* The "month" date part
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const MONTH = 'month';
|
public const MONTH = 'month';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "second" date part
|
* The "second" date part
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const SECOND = 'second';
|
public const SECOND = 'second';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "year" date part
|
* The "year" date part
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const YEAR = 'year';
|
public const YEAR = 'year';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,113 +24,134 @@ class DatePeriod extends BaseType
|
|||||||
/**
|
/**
|
||||||
* The period constant: last month
|
* The period constant: last month
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const LAST_MONTH = 4;
|
public const LAST_MONTH = '4';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: last week
|
* The period constant: last week
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const LAST_WEEK = 1;
|
public const LAST_WEEK = '1';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: last year
|
* The period constant: last year
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const LAST_YEAR = 7;
|
public const LAST_YEAR = '7';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: next month
|
* The period constant: next month
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const NEXT_MONTH = 6;
|
public const NEXT_MONTH = '6';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: next week
|
* The period constant: next week
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const NEXT_WEEK = 3;
|
public const NEXT_WEEK = '3';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: next year
|
* The period constant: next year
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const NEXT_YEAR = 9;
|
public const NEXT_YEAR = '9';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: this month
|
* The period constant: this month
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const THIS_MONTH = 5;
|
public const THIS_MONTH = '5';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: this week
|
* The period constant: this week
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const THIS_WEEK = 2;
|
public const THIS_WEEK = '2';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The period constant: this year
|
* The period constant: this year
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const THIS_YEAR = 8;
|
public const THIS_YEAR = '8';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The start date of period
|
* The start date of period
|
||||||
*
|
*
|
||||||
* @var DateTime
|
* @var null|DateTime
|
||||||
*/
|
*/
|
||||||
private $startDate;
|
private $startDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The end date of period
|
* The end date of period
|
||||||
*
|
*
|
||||||
* @var DateTime
|
* @var null|DateTime
|
||||||
*/
|
*/
|
||||||
private $endDate;
|
private $endDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
* @param DateTime $startDate (optional) The start date of period
|
* @param null|DateTime $startDate (optional) The start date of period
|
||||||
* @param DateTime $endDate (optional) The end date of period
|
* @param null|DateTime $endDate (optional) The end date of period
|
||||||
*/
|
*/
|
||||||
public function __construct(DateTime $startDate = null, DateTime $endDate = null)
|
public function __construct(?DateTime $startDate = null, ?DateTime $endDate = null)
|
||||||
{
|
{
|
||||||
$this->startDate = $startDate;
|
$this->startDate = $startDate;
|
||||||
$this->endDate = $endDate;
|
$this->endDate = $endDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the end date of period
|
||||||
|
*
|
||||||
|
* @return null|DateTime
|
||||||
|
*/
|
||||||
|
public function getEndDate(): ?DateTime
|
||||||
|
{
|
||||||
|
return $this->endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the end date of period
|
||||||
|
*
|
||||||
|
* @param null|DateTime $endDate (optional) The end date of period. Default: null.
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setEndDate(?DateTime $endDate = null): self
|
||||||
|
{
|
||||||
|
$this->endDate = $endDate;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns formatted one of the period's date: start date or end date
|
* Returns formatted one of the period's date: start date or end date
|
||||||
*
|
*
|
||||||
* @param string $format Format used to format the date
|
* @param string $format Format used to format the date
|
||||||
* @param bool $startDate (optional) If is set to true, start date is formatted. Otherwise - end date.
|
* @param bool $startDate (optional) If is set to true, start date will be formatted (default behaviour).
|
||||||
|
* Otherwise - end date.
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getFormattedDate($format, $startDate = true)
|
public function getFormattedDate(string $format, bool $startDate = true): string
|
||||||
{
|
{
|
||||||
$date = $this->getEndDate();
|
$date = $this->getEndDate();
|
||||||
|
|
||||||
/*
|
// Start date should be formatted?
|
||||||
* Start date should be formatted?
|
|
||||||
*/
|
|
||||||
if ($startDate) {
|
if ($startDate) {
|
||||||
$date = $this->getStartDate();
|
$date = $this->getStartDate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Unknown date or format is invalid?
|
||||||
* Unknown date or format is invalid?
|
// Nothing to do
|
||||||
*/
|
|
||||||
if (null === $date || !Date::isValidDateFormat($format)) {
|
if (null === $date || !Date::isValidDateFormat($format)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
@@ -138,35 +159,12 @@ class DatePeriod extends BaseType
|
|||||||
return $date->format($format);
|
return $date->format($format);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the end date of period
|
|
||||||
*
|
|
||||||
* @return DateTime
|
|
||||||
*/
|
|
||||||
public function getEndDate()
|
|
||||||
{
|
|
||||||
return $this->endDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the end date of period
|
|
||||||
*
|
|
||||||
* @param DateTime $endDate (optional) The end date of period
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setEndDate(DateTime $endDate = null)
|
|
||||||
{
|
|
||||||
$this->endDate = $endDate;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the start date of period
|
* Returns the start date of period
|
||||||
*
|
*
|
||||||
* @return DateTime
|
* @return null|DateTime
|
||||||
*/
|
*/
|
||||||
public function getStartDate()
|
public function getStartDate(): ?DateTime
|
||||||
{
|
{
|
||||||
return $this->startDate;
|
return $this->startDate;
|
||||||
}
|
}
|
||||||
@@ -174,10 +172,10 @@ class DatePeriod extends BaseType
|
|||||||
/**
|
/**
|
||||||
* Sets the start date of period
|
* Sets the start date of period
|
||||||
*
|
*
|
||||||
* @param DateTime $startDate (optional) The start date of period
|
* @param null|DateTime $startDate (optional) The start date of period. Default: null.
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function setStartDate(DateTime $startDate = null)
|
public function setStartDate(?DateTime $startDate = null): self
|
||||||
{
|
{
|
||||||
$this->startDate = $startDate;
|
$this->startDate = $startDate;
|
||||||
|
|
||||||
|
|||||||
@@ -17,21 +17,21 @@ class OopVisibilityType extends BaseType
|
|||||||
/**
|
/**
|
||||||
* The "private" visibility of OOP
|
* The "private" visibility of OOP
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const IS_PRIVATE = 3;
|
public const IS_PRIVATE = '3';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "protected" visibility of OOP
|
* The "protected" visibility of OOP
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const IS_PROTECTED = 2;
|
public const IS_PROTECTED = '2';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "public" visibility of OOP
|
* The "public" visibility of OOP
|
||||||
*
|
*
|
||||||
* @var int
|
* @var string
|
||||||
*/
|
*/
|
||||||
const IS_PUBLIC = 1;
|
public const IS_PUBLIC = '1';
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -46,6 +46,23 @@ class Bootstrap4CssSelector
|
|||||||
return sprintf('%s %s', $labelSelector, $errorContainerSelector);
|
return sprintf('%s %s', $labelSelector, $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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns selector of radio-button's validation error
|
* Returns selector of radio-button's validation error
|
||||||
*
|
*
|
||||||
@@ -65,21 +82,4 @@ class Bootstrap4CssSelector
|
|||||||
|
|
||||||
return sprintf('%s legend.col-form-label %s', $fieldSetSelector, $errorContainerSelector);
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,62 +21,50 @@ class Bundle
|
|||||||
/**
|
/**
|
||||||
* Returns path of given bundle to view / template with given extension
|
* 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 $viewPath Path of the view / template, e.g. "MyDirectory/my-template". Extension is not required.
|
||||||
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
|
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||||
* @param string $extension (optional) Extension of the view / template (default: "html.twig")
|
* @param string $extension (optional) Extension of the view / template (default: "html.twig")
|
||||||
|
* @return null|string
|
||||||
* @throws IncorrectBundleNameException
|
* @throws IncorrectBundleNameException
|
||||||
* @return string|null
|
|
||||||
*/
|
*/
|
||||||
public static function getBundleViewPath($viewPath, $bundleName, $extension = 'html.twig')
|
public static function getBundleViewPath(
|
||||||
{
|
string $viewPath,
|
||||||
/*
|
string $bundleName,
|
||||||
* Unknown path, extension of the view / template or name of the bundle?
|
string $extension = 'html.twig'
|
||||||
* Nothing to do
|
): ?string {
|
||||||
*/
|
// Nothing to do, because at least one unknown argument provided
|
||||||
if (empty($viewPath) || empty($bundleName) || empty($extension)) {
|
if (empty($viewPath) || empty($bundleName) || empty($extension)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Oops, given name of bundle is invalid
|
||||||
* Given name of bundle is invalid?
|
|
||||||
*/
|
|
||||||
if (!Regex::isValidBundleName($bundleName)) {
|
if (!Regex::isValidBundleName($bundleName)) {
|
||||||
throw IncorrectBundleNameException::create($bundleName);
|
throw IncorrectBundleNameException::create($bundleName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Make sure that path of the view / template ends with given extension
|
||||||
* Path of the view / template doesn't end with given extension?
|
|
||||||
*/
|
|
||||||
if (!Regex::endsWith($viewPath, $extension)) {
|
if (!Regex::endsWith($viewPath, $extension)) {
|
||||||
$viewPath = sprintf('%s.%s', $viewPath, $extension);
|
$viewPath = sprintf('%s.%s', $viewPath, $extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Prepare short name of bundle and path of view / template with "/" (instead of ":")
|
||||||
* Prepare short name of bundle and path of view / template with "/" (instead of ":")
|
$shortName = static::getShortBundleName($bundleName);
|
||||||
*/
|
$path = str_replace(':', '/', $viewPath);
|
||||||
$shortBundleName = static::getShortBundleName($bundleName);
|
|
||||||
$viewPath = str_replace(':', '/', $viewPath);
|
|
||||||
|
|
||||||
return sprintf('@%s/%s', $shortBundleName, $viewPath);
|
return sprintf('@%s/%s', $shortName, $path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns short name of bundle (without "Bundle")
|
* Returns short name of bundle (without "Bundle")
|
||||||
*
|
*
|
||||||
* @param string $fullBundleName Full name of the bundle, e.g. "MyExtraBundle"
|
* @param string $fullBundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||||
|
* @return null|string
|
||||||
* @throws IncorrectBundleNameException
|
* @throws IncorrectBundleNameException
|
||||||
* @return string|null
|
|
||||||
*/
|
*/
|
||||||
public static function getShortBundleName($fullBundleName)
|
public static function getShortBundleName(string $fullBundleName): ?string
|
||||||
{
|
{
|
||||||
/*
|
// Oops, given name of bundle is invalid
|
||||||
* Given name of bundle is invalid?
|
|
||||||
*/
|
|
||||||
if (!Regex::isValidBundleName($fullBundleName)) {
|
if (!Regex::isValidBundleName($fullBundleName)) {
|
||||||
if (!is_string($fullBundleName)) {
|
|
||||||
$fullBundleName = gettype($fullBundleName);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new IncorrectBundleNameException($fullBundleName);
|
throw new IncorrectBundleNameException($fullBundleName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
|
|
||||||
namespace Meritoo\Common\Utilities;
|
namespace Meritoo\Common\Utilities;
|
||||||
|
|
||||||
use stdClass;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful Composer-related methods (only static functions)
|
* Useful Composer-related methods (only static functions)
|
||||||
*
|
*
|
||||||
@@ -23,23 +21,18 @@ class Composer
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const FILE_NAME_MAIN = 'composer.json';
|
public const FILE_NAME_MAIN = 'composer.json';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns value from composer.json file
|
* Returns value from composer.json file
|
||||||
*
|
*
|
||||||
* @param string $composerJsonPath Path of composer.json file
|
* @param string $composerJsonPath Path of composer.json file
|
||||||
* @param string $nodeName Name of node who value should be returned
|
* @param string $nodeName Name of node who value should be returned
|
||||||
* @return string|null
|
* @return null|string
|
||||||
*/
|
*/
|
||||||
public static function getValue($composerJsonPath, $nodeName)
|
public static function getValue(string $composerJsonPath, string $nodeName): ?string
|
||||||
{
|
{
|
||||||
$composerJsonString = is_string($composerJsonPath);
|
$composerJsonReadable = is_readable($composerJsonPath);
|
||||||
$composerJsonReadable = false;
|
|
||||||
|
|
||||||
if ($composerJsonString) {
|
|
||||||
$composerJsonReadable = is_readable($composerJsonPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Provided path or name of node are invalid?
|
* Provided path or name of node are invalid?
|
||||||
@@ -48,12 +41,12 @@ class Composer
|
|||||||
*
|
*
|
||||||
* Nothing to do
|
* Nothing to do
|
||||||
*/
|
*/
|
||||||
if (!$composerJsonString || !is_string($nodeName) || !$composerJsonReadable || empty($nodeName)) {
|
if (!$composerJsonReadable || empty($nodeName)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$content = file_get_contents($composerJsonPath);
|
$content = file_get_contents($composerJsonPath);
|
||||||
$data = json_decode($content);
|
$data = json_decode($content, false);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unknown data from the composer.json file or there is no node with given name?
|
* Unknown data from the composer.json file or there is no node with given name?
|
||||||
@@ -63,7 +56,6 @@ class Composer
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @var stdClass $data */
|
|
||||||
return $data->{$nodeName};
|
return $data->{$nodeName};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class Date
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const DATE_DIFFERENCE_UNIT_DAYS = 'days';
|
public const DATE_DIFFERENCE_UNIT_DAYS = 'days';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The 'hours' unit of date difference.
|
* The 'hours' unit of date difference.
|
||||||
@@ -37,7 +37,7 @@ class Date
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const DATE_DIFFERENCE_UNIT_HOURS = 'hours';
|
public const DATE_DIFFERENCE_UNIT_HOURS = 'hours';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The 'minutes' unit of date difference.
|
* The 'minutes' unit of date difference.
|
||||||
@@ -45,7 +45,7 @@ class Date
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const DATE_DIFFERENCE_UNIT_MINUTES = 'minutes';
|
public const DATE_DIFFERENCE_UNIT_MINUTES = 'minutes';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The 'months' unit of date difference.
|
* The 'months' unit of date difference.
|
||||||
@@ -53,7 +53,7 @@ class Date
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const DATE_DIFFERENCE_UNIT_MONTHS = 'months';
|
public const DATE_DIFFERENCE_UNIT_MONTHS = 'months';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The 'years' unit of date difference.
|
* The 'years' unit of date difference.
|
||||||
@@ -61,131 +61,16 @@ class Date
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const DATE_DIFFERENCE_UNIT_YEARS = 'years';
|
public const DATE_DIFFERENCE_UNIT_YEARS = 'years';
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns date's period (that contains start and end date) for given period
|
|
||||||
*
|
|
||||||
* @param int $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK.
|
|
||||||
* @throws Exception
|
|
||||||
* @return null|DatePeriod
|
|
||||||
*/
|
|
||||||
public static function getDatesForPeriod($period)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Type of period is incorrect?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (!(new DatePeriod())->isCorrectType($period)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$dateStart = null;
|
|
||||||
$dateEnd = null;
|
|
||||||
|
|
||||||
switch ($period) {
|
|
||||||
case DatePeriod::LAST_WEEK:
|
|
||||||
$thisWeekStart = new DateTime('this week');
|
|
||||||
|
|
||||||
$dateStart = clone $thisWeekStart;
|
|
||||||
$dateEnd = clone $thisWeekStart;
|
|
||||||
|
|
||||||
$dateStart->sub(new DateInterval('P7D'));
|
|
||||||
$dateEnd->sub(new DateInterval('P1D'));
|
|
||||||
|
|
||||||
break;
|
|
||||||
case DatePeriod::THIS_WEEK:
|
|
||||||
$dateStart = new DateTime('this week');
|
|
||||||
|
|
||||||
$dateEnd = clone $dateStart;
|
|
||||||
$dateEnd->add(new DateInterval('P6D'));
|
|
||||||
|
|
||||||
break;
|
|
||||||
case DatePeriod::NEXT_WEEK:
|
|
||||||
$dateStart = new DateTime('this week');
|
|
||||||
$dateStart->add(new DateInterval('P7D'));
|
|
||||||
|
|
||||||
$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::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::LAST_YEAR:
|
|
||||||
case DatePeriod::THIS_YEAR:
|
|
||||||
case DatePeriod::NEXT_YEAR:
|
|
||||||
$dateStart = new DateTime();
|
|
||||||
$dateEnd = new DateTime();
|
|
||||||
|
|
||||||
$yearPeriod = [
|
|
||||||
DatePeriod::LAST_YEAR,
|
|
||||||
DatePeriod::NEXT_YEAR,
|
|
||||||
];
|
|
||||||
|
|
||||||
if (in_array($period, $yearPeriod, true)) {
|
|
||||||
$yearDifference = 1;
|
|
||||||
|
|
||||||
if (DatePeriod::LAST_YEAR === $period) {
|
|
||||||
$yearDifference *= -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
$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);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Start or end date is unknown?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (null === $dateStart || null === $dateEnd) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$dateStart->setTime(0, 0);
|
|
||||||
$dateEnd->setTime(23, 59, 59);
|
|
||||||
|
|
||||||
return new DatePeriod($dateStart, $dateEnd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates and returns random time (the hour, minute and second values)
|
* Generates and returns random time (the hour, minute and second values)
|
||||||
*
|
*
|
||||||
* @param string $format (optional) Format of returned value. A string acceptable by the DateTime::format()
|
* @param string $format (optional) Format of returned value. A string acceptable by the DateTime::format()
|
||||||
* method.
|
* method.
|
||||||
* @return string|null
|
* @return null|string
|
||||||
*/
|
*/
|
||||||
public static function generateRandomTime($format = 'H:i:s')
|
public static function generateRandomTime($format = 'H:i:s'): ?string
|
||||||
{
|
{
|
||||||
$dateTime = new DateTime();
|
$dateTime = new DateTime();
|
||||||
|
|
||||||
@@ -213,9 +98,7 @@ class Date
|
|||||||
$seconds[] = $i;
|
$seconds[] = $i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Prepare random time (hour, minute and second)
|
||||||
* Prepare random time (hour, minute and second)
|
|
||||||
*/
|
|
||||||
$hour = $hours[array_rand($hours)];
|
$hour = $hours[array_rand($hours)];
|
||||||
$minute = $minutes[array_rand($minutes)];
|
$minute = $minutes[array_rand($minutes)];
|
||||||
$second = $seconds[array_rand($seconds)];
|
$second = $seconds[array_rand($seconds)];
|
||||||
@@ -223,7 +106,7 @@ class Date
|
|||||||
return $dateTime
|
return $dateTime
|
||||||
->setTime($hour, $minute, $second)
|
->setTime($hour, $minute, $second)
|
||||||
->format($format)
|
->format($format)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -231,113 +114,33 @@ class Date
|
|||||||
*
|
*
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public static function getCurrentDayOfWeek()
|
public static function getCurrentDayOfWeek(): int
|
||||||
{
|
{
|
||||||
$now = new DateTime();
|
$now = new DateTime();
|
||||||
|
|
||||||
$year = $now->format('Y');
|
$year = (int) $now->format('Y');
|
||||||
$month = $now->format('m');
|
$month = (int) $now->format('m');
|
||||||
$day = $now->format('d');
|
$day = (int) $now->format('d');
|
||||||
|
|
||||||
return self::getDayOfWeek($year, $month, $day);
|
return self::getDayOfWeek($year, $month, $day);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns day of week (number 0 to 6, 0 - sunday, 6 - saturday).
|
|
||||||
* Based on the Zeller's algorithm (http://pl.wikipedia.org/wiki/Kalendarz_wieczny).
|
|
||||||
*
|
|
||||||
* @param int $year The year value
|
|
||||||
* @param int $month The month value
|
|
||||||
* @param int $day The day value
|
|
||||||
*
|
|
||||||
* @throws UnknownDatePartTypeException
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public static function getDayOfWeek($year, $month, $day)
|
|
||||||
{
|
|
||||||
$year = (int)$year;
|
|
||||||
$month = (int)$month;
|
|
||||||
$day = (int)$day;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Oops, incorrect year
|
|
||||||
*/
|
|
||||||
if ($year <= 0) {
|
|
||||||
throw UnknownDatePartTypeException::createException(DatePartType::YEAR, $year);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Oops, incorrect month
|
|
||||||
*/
|
|
||||||
if ($month < 1 || $month > 12) {
|
|
||||||
throw UnknownDatePartTypeException::createException(DatePartType::MONTH, $month);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Oops, incorrect day
|
|
||||||
*/
|
|
||||||
if ($day < 1 || $day > 31) {
|
|
||||||
throw UnknownDatePartTypeException::createException(DatePartType::DAY, $day);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($month < 3) {
|
|
||||||
$count = 0;
|
|
||||||
$yearValue = $year - 1;
|
|
||||||
} else {
|
|
||||||
$count = 2;
|
|
||||||
$yearValue = $year;
|
|
||||||
}
|
|
||||||
|
|
||||||
$firstPart = floor(23 * $month / 9);
|
|
||||||
$secondPart = floor($yearValue / 4);
|
|
||||||
$thirdPart = floor($yearValue / 100);
|
|
||||||
$fourthPart = floor($yearValue / 400);
|
|
||||||
|
|
||||||
return ($firstPart + $day + 4 + $year + $secondPart - $thirdPart + $fourthPart - $count) % 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns based on locale name of current weekday
|
* Returns based on locale name of current weekday
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getCurrentDayOfWeekName()
|
public static function getCurrentDayOfWeekName(): string
|
||||||
{
|
{
|
||||||
$now = new DateTime();
|
$now = new DateTime();
|
||||||
|
|
||||||
$year = $now->format('Y');
|
$year = (int) $now->format('Y');
|
||||||
$month = $now->format('m');
|
$month = (int) $now->format('m');
|
||||||
$day = $now->format('d');
|
$day = (int) $now->format('d');
|
||||||
|
|
||||||
return self::getDayOfWeekName($year, $month, $day);
|
return self::getDayOfWeekName($year, $month, $day);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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)
|
|
||||||
{
|
|
||||||
$hour = 0;
|
|
||||||
$minute = 0;
|
|
||||||
$second = 0;
|
|
||||||
|
|
||||||
$time = mktime($hour, $minute, $second, $month, $day, $year);
|
|
||||||
$name = strftime('%A', $time);
|
|
||||||
|
|
||||||
$encoding = mb_detect_encoding($name);
|
|
||||||
|
|
||||||
if (false === $encoding) {
|
|
||||||
$name = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-2');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns difference between given dates.
|
* Returns difference between given dates.
|
||||||
*
|
*
|
||||||
@@ -353,8 +156,8 @@ class Date
|
|||||||
* If the unit of date difference is null, all units are returned in array (units are keys of the array).
|
* If the unit of date difference is null, all units are returned in array (units are keys of the array).
|
||||||
* Otherwise - one, integer value is returned.
|
* Otherwise - one, integer value is returned.
|
||||||
*
|
*
|
||||||
* @param string|DateTime $dateStart The start date
|
* @param DateTime|string $dateStart The start date
|
||||||
* @param string|DateTime $dateEnd The end date
|
* @param DateTime|string $dateEnd The end date
|
||||||
* @param string $differenceUnit (optional) Unit of date difference. One of this class
|
* @param string $differenceUnit (optional) Unit of date difference. One of this class
|
||||||
* DATE_DIFFERENCE_UNIT_* constants. If is set to null all units are
|
* DATE_DIFFERENCE_UNIT_* constants. If is set to null all units are
|
||||||
* returned in the array.
|
* returned in the array.
|
||||||
@@ -398,26 +201,26 @@ class Date
|
|||||||
self::DATE_DIFFERENCE_UNIT_MINUTES,
|
self::DATE_DIFFERENCE_UNIT_MINUTES,
|
||||||
];
|
];
|
||||||
|
|
||||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_YEARS === $differenceUnit) {
|
$differenceYear = self::DATE_DIFFERENCE_UNIT_YEARS === $differenceUnit;
|
||||||
|
$differenceMonth = self::DATE_DIFFERENCE_UNIT_MONTHS === $differenceUnit;
|
||||||
|
$differenceMinutes = self::DATE_DIFFERENCE_UNIT_MINUTES === $differenceUnit;
|
||||||
|
|
||||||
|
if (null === $differenceUnit || $differenceYear) {
|
||||||
$diff = $end->diff($start);
|
$diff = $end->diff($start);
|
||||||
|
|
||||||
/*
|
// Difference between dates in years should be returned only?
|
||||||
* Difference between dates in years should be returned only?
|
if ($differenceYear) {
|
||||||
*/
|
|
||||||
if (self::DATE_DIFFERENCE_UNIT_YEARS === $differenceUnit) {
|
|
||||||
return $diff->y;
|
return $diff->y;
|
||||||
}
|
}
|
||||||
|
|
||||||
$difference[self::DATE_DIFFERENCE_UNIT_YEARS] = $diff->y;
|
$difference[self::DATE_DIFFERENCE_UNIT_YEARS] = $diff->y;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_MONTHS === $differenceUnit) {
|
if (null === $differenceUnit || $differenceMonth) {
|
||||||
$diff = $end->diff($start);
|
$diff = $end->diff($start);
|
||||||
|
|
||||||
/*
|
// Difference between dates in months should be returned only?
|
||||||
* Difference between dates in months should be returned only?
|
if ($differenceMonth) {
|
||||||
*/
|
|
||||||
if (self::DATE_DIFFERENCE_UNIT_MONTHS === $differenceUnit) {
|
|
||||||
return $diff->m;
|
return $diff->m;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -425,58 +228,44 @@ class Date
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits, true)) {
|
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits, true)) {
|
||||||
$days = (int)floor($dateDiff / $daySeconds);
|
$days = (int) floor($dateDiff / $daySeconds);
|
||||||
|
|
||||||
/*
|
// Difference between dates in days should be returned only?
|
||||||
* Difference between dates in days should be returned only?
|
|
||||||
*/
|
|
||||||
if (self::DATE_DIFFERENCE_UNIT_DAYS === $differenceUnit) {
|
if (self::DATE_DIFFERENCE_UNIT_DAYS === $differenceUnit) {
|
||||||
return $days;
|
return $days;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// All units should be returned?
|
||||||
* All units should be returned?
|
|
||||||
*/
|
|
||||||
if (null === $differenceUnit) {
|
if (null === $differenceUnit) {
|
||||||
$difference[self::DATE_DIFFERENCE_UNIT_DAYS] = $days;
|
$difference[self::DATE_DIFFERENCE_UNIT_DAYS] = $days;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Calculation for later usage
|
||||||
* Calculation for later usage
|
|
||||||
*/
|
|
||||||
$daysInSeconds = $days * $daySeconds;
|
$daysInSeconds = $days * $daySeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits, true)) {
|
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits, true)) {
|
||||||
$hours = (int)floor(($dateDiff - $daysInSeconds) / $hourSeconds);
|
$hours = (int) floor(($dateDiff - $daysInSeconds) / $hourSeconds);
|
||||||
|
|
||||||
/*
|
// Difference between dates in hours should be returned only?
|
||||||
* Difference between dates in hours should be returned only?
|
|
||||||
*/
|
|
||||||
if (self::DATE_DIFFERENCE_UNIT_HOURS === $differenceUnit) {
|
if (self::DATE_DIFFERENCE_UNIT_HOURS === $differenceUnit) {
|
||||||
return $hours;
|
return $hours;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// All units should be returned?
|
||||||
* All units should be returned?
|
|
||||||
*/
|
|
||||||
if (null === $differenceUnit) {
|
if (null === $differenceUnit) {
|
||||||
$difference[self::DATE_DIFFERENCE_UNIT_HOURS] = $hours;
|
$difference[self::DATE_DIFFERENCE_UNIT_HOURS] = $hours;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Calculation for later usage
|
||||||
* Calculation for later usage
|
|
||||||
*/
|
|
||||||
$hoursInSeconds = $hours * $hourSeconds;
|
$hoursInSeconds = $hours * $hourSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_MINUTES === $differenceUnit) {
|
if (null === $differenceUnit || $differenceMinutes) {
|
||||||
$minutes = (int)floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60);
|
$minutes = (int) floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60);
|
||||||
|
|
||||||
/*
|
// Difference between dates in minutes should be returned only?
|
||||||
* Difference between dates in minutes should be returned only?
|
if ($differenceMinutes) {
|
||||||
*/
|
|
||||||
if (self::DATE_DIFFERENCE_UNIT_MINUTES === $differenceUnit) {
|
|
||||||
return $minutes;
|
return $minutes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,91 +275,6 @@ class Date
|
|||||||
return $difference;
|
return $difference;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns collection / set of dates for given start date and count of dates.
|
|
||||||
* Start from given date, add next, iterated value to given date interval and returns requested count of dates.
|
|
||||||
*
|
|
||||||
* @param DateTime $startDate The start date. Start of the collection / set.
|
|
||||||
* @param int $datesCount Count of dates in resulting collection / set
|
|
||||||
* @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')
|
|
||||||
{
|
|
||||||
$dates = [];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The template used to build date interval have to be string.
|
|
||||||
* Otherwise cannot run preg_match() function and an error occurs.
|
|
||||||
*/
|
|
||||||
if (is_string($intervalTemplate)) {
|
|
||||||
/*
|
|
||||||
* Let's verify the interval template. It should contains the "%d" placeholder and something before and
|
|
||||||
* after it.
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
* - P%dD
|
|
||||||
* - P%dM
|
|
||||||
* - P1Y%dMT1H
|
|
||||||
*/
|
|
||||||
$intervalPattern = '/^(\w*)\%d(\w*)$/';
|
|
||||||
$matches = [];
|
|
||||||
$matchCount = preg_match($intervalPattern, $intervalTemplate, $matches);
|
|
||||||
|
|
||||||
if ($matchCount > 0 && (!empty($matches[1]) || !empty($matches[2]))) {
|
|
||||||
$datesCount = (int)$datesCount;
|
|
||||||
|
|
||||||
for ($index = 1; $index <= $datesCount; ++$index) {
|
|
||||||
$date = clone $startDate;
|
|
||||||
$dates[$index] = $date->add(new DateInterval(sprintf($intervalTemplate, $index)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $dates;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 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
|
|
||||||
* @return DateTime
|
|
||||||
*/
|
|
||||||
public static function getRandomDate(DateTime $startDate = null, $start = 1, $end = 100, $intervalTemplate = 'P%sD')
|
|
||||||
{
|
|
||||||
if (null === $startDate) {
|
|
||||||
$startDate = new DateTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
$start = (int)$start;
|
|
||||||
$end = (int)$end;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Incorrect end of random partition?
|
|
||||||
* Use start as the end of random partition
|
|
||||||
*/
|
|
||||||
if ($end < $start) {
|
|
||||||
$end = $start;
|
|
||||||
}
|
|
||||||
|
|
||||||
$randomDate = clone $startDate;
|
|
||||||
$randomInterval = new DateInterval(sprintf($intervalTemplate, mt_rand($start, $end)));
|
|
||||||
|
|
||||||
return $randomDate->add($randomInterval);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the DateTime object for given value.
|
* Returns the DateTime object for given value.
|
||||||
* If the DateTime object cannot be created, false is returned.
|
* If the DateTime object cannot be created, false is returned.
|
||||||
@@ -583,7 +287,7 @@ class Date
|
|||||||
* @param string $dateFormat (optional) Format of date used to verify if given value is actually a date.
|
* @param string $dateFormat (optional) Format of date used to verify if given value is actually a date.
|
||||||
* It should be format matched to the given value, e.g. "Y-m-d H:i" for
|
* It should be format matched to the given value, e.g. "Y-m-d H:i" for
|
||||||
* "2015-01-01 10:00" value. Default: "Y-m-d".
|
* "2015-01-01 10:00" value. Default: "Y-m-d".
|
||||||
* @return DateTime|bool
|
* @return bool|DateTime
|
||||||
*/
|
*/
|
||||||
public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d')
|
public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d')
|
||||||
{
|
{
|
||||||
@@ -658,12 +362,10 @@ class Date
|
|||||||
* Verify instance of the DateTime created by constructor and by createFromFormat() method.
|
* Verify instance of the DateTime created by constructor and by createFromFormat() method.
|
||||||
* After formatting, these dates should be the same.
|
* After formatting, these dates should be the same.
|
||||||
*/
|
*/
|
||||||
else {
|
elseif ($dateFromFormat->format($dateFormat) === $value) {
|
||||||
if ($dateFromFormat->format($dateFormat) === $value) {
|
return $date;
|
||||||
return $date;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (\Exception $exception) {
|
} catch (Exception $exception) {
|
||||||
if (!$allowCompoundFormats) {
|
if (!$allowCompoundFormats) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -675,15 +377,284 @@ class Date
|
|||||||
*/
|
*/
|
||||||
$dateString = (new DateTime())->format($value);
|
$dateString = (new DateTime())->format($value);
|
||||||
|
|
||||||
if ($dateString !== (string)$value) {
|
if ($dateString !== (string) $value) {
|
||||||
return new DateTime($dateString);
|
return new DateTime($dateString);
|
||||||
}
|
}
|
||||||
} catch (\Exception $exception) {
|
} catch (Exception $exception) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns collection / set of dates for given start date and count of dates.
|
||||||
|
* Start from given date, add next, iterated value to given date interval and returns requested count of dates.
|
||||||
|
*
|
||||||
|
* @param DateTime $startDate The start date. Start of the collection / set.
|
||||||
|
* @param int $datesCount Count of dates in resulting collection / set
|
||||||
|
* @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.
|
||||||
|
* @return array
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static function getDatesCollection(DateTime $startDate, $datesCount, $intervalTemplate = 'P%dD'): array
|
||||||
|
{
|
||||||
|
$dates = [];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The template used to build date interval have to be string.
|
||||||
|
* Otherwise cannot run preg_match() function and an error occurs.
|
||||||
|
*/
|
||||||
|
if (is_string($intervalTemplate)) {
|
||||||
|
/*
|
||||||
|
* Let's verify the interval template. It should contains the "%d" placeholder and something before and
|
||||||
|
* after it.
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
* - P%dD
|
||||||
|
* - P%dM
|
||||||
|
* - P1Y%dMT1H
|
||||||
|
*/
|
||||||
|
$intervalPattern = '/^(\w*)\%d(\w*)$/';
|
||||||
|
$matches = [];
|
||||||
|
$matchCount = preg_match($intervalPattern, $intervalTemplate, $matches);
|
||||||
|
|
||||||
|
if ($matchCount > 0 && (!empty($matches[1]) || !empty($matches[2]))) {
|
||||||
|
$datesCount = (int) $datesCount;
|
||||||
|
|
||||||
|
for ($index = 1; $index <= $datesCount; ++$index) {
|
||||||
|
$date = clone $startDate;
|
||||||
|
$dates[$index] = $date->add(new DateInterval(sprintf($intervalTemplate, $index)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dates;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns date's period (that contains start and end date) for given period
|
||||||
|
*
|
||||||
|
* @param string $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK.
|
||||||
|
* @return null|DatePeriod
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static function getDatesForPeriod(string $period): ?DatePeriod
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Type of period is incorrect?
|
||||||
|
* Nothing to do
|
||||||
|
*/
|
||||||
|
if (!DatePeriod::isCorrectType($period)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dateStart = null;
|
||||||
|
$dateEnd = null;
|
||||||
|
|
||||||
|
switch ($period) {
|
||||||
|
case DatePeriod::LAST_WEEK:
|
||||||
|
$thisWeekStart = new DateTime('this week');
|
||||||
|
|
||||||
|
$dateStart = clone $thisWeekStart;
|
||||||
|
$dateEnd = clone $thisWeekStart;
|
||||||
|
|
||||||
|
$dateStart->sub(new DateInterval('P7D'));
|
||||||
|
$dateEnd->sub(new DateInterval('P1D'));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case DatePeriod::THIS_WEEK:
|
||||||
|
$dateStart = new DateTime('this week');
|
||||||
|
|
||||||
|
$dateEnd = clone $dateStart;
|
||||||
|
$dateEnd->add(new DateInterval('P6D'));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case DatePeriod::NEXT_WEEK:
|
||||||
|
$dateStart = new DateTime('this week');
|
||||||
|
$dateStart->add(new DateInterval('P7D'));
|
||||||
|
|
||||||
|
$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::THIS_MONTH:
|
||||||
|
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
|
||||||
|
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
|
||||||
|
|
||||||
|
if (null !== $lastMonth) {
|
||||||
|
$dateStart = $lastMonth->getEndDate();
|
||||||
|
|
||||||
|
if (null !== $dateStart) {
|
||||||
|
$dateStart->add(new DateInterval('P1D'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null !== $nextMonth) {
|
||||||
|
$dateEnd = $nextMonth->getStartDate();
|
||||||
|
|
||||||
|
if (null !== $dateEnd) {
|
||||||
|
$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::LAST_YEAR:
|
||||||
|
case DatePeriod::THIS_YEAR:
|
||||||
|
case DatePeriod::NEXT_YEAR:
|
||||||
|
$dateStart = new DateTime();
|
||||||
|
$dateEnd = new DateTime();
|
||||||
|
|
||||||
|
$yearPeriod = [
|
||||||
|
DatePeriod::LAST_YEAR,
|
||||||
|
DatePeriod::NEXT_YEAR,
|
||||||
|
];
|
||||||
|
|
||||||
|
if (in_array($period, $yearPeriod, true)) {
|
||||||
|
$yearDifference = 1;
|
||||||
|
|
||||||
|
if (DatePeriod::LAST_YEAR === $period) {
|
||||||
|
$yearDifference *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$modifyString = sprintf('%s year', $yearDifference);
|
||||||
|
$dateStart->modify($modifyString);
|
||||||
|
$dateEnd->modify($modifyString);
|
||||||
|
}
|
||||||
|
|
||||||
|
$year = (int) $dateStart->format('Y');
|
||||||
|
$dateStart->setDate($year, 1, 1);
|
||||||
|
$dateEnd->setDate($year, 12, 31);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns day of week (number 0 to 6, 0 - sunday, 6 - saturday).
|
||||||
|
* Based on the Zeller's algorithm (https://en.wikipedia.org/wiki/Perpetual_calendar).
|
||||||
|
*
|
||||||
|
* @param int $year The year value
|
||||||
|
* @param int $month The month value
|
||||||
|
* @param int $day The day value
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
* @throws UnknownDatePartTypeException
|
||||||
|
*/
|
||||||
|
public static function getDayOfWeek(int $year, int $month, int $day): int
|
||||||
|
{
|
||||||
|
static::validateYear($year);
|
||||||
|
static::validateMonth($month);
|
||||||
|
static::validateDay($day);
|
||||||
|
|
||||||
|
if ($month < 3) {
|
||||||
|
$count = 0;
|
||||||
|
$yearValue = $year - 1;
|
||||||
|
} else {
|
||||||
|
$count = 2;
|
||||||
|
$yearValue = $year;
|
||||||
|
}
|
||||||
|
|
||||||
|
$firstPart = floor(23 * $month / 9);
|
||||||
|
$secondPart = floor($yearValue / 4);
|
||||||
|
$thirdPart = floor($yearValue / 100);
|
||||||
|
$fourthPart = floor($yearValue / 400);
|
||||||
|
|
||||||
|
return ($firstPart + $day + 4 + $year + $secondPart - $thirdPart + $fourthPart - $count) % 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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): string
|
||||||
|
{
|
||||||
|
$hour = 0;
|
||||||
|
$minute = 0;
|
||||||
|
$second = 0;
|
||||||
|
|
||||||
|
$time = mktime($hour, $minute, $second, $month, $day, $year);
|
||||||
|
$name = strftime('%A', $time);
|
||||||
|
|
||||||
|
$encoding = mb_detect_encoding($name);
|
||||||
|
|
||||||
|
if (false === $encoding) {
|
||||||
|
$name = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-2');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 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).
|
||||||
|
* @return DateTime
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static function getRandomDate(
|
||||||
|
DateTime $startDate = null,
|
||||||
|
$start = 1,
|
||||||
|
$end = 100,
|
||||||
|
$intervalTemplate = 'P%sD'
|
||||||
|
): DateTime {
|
||||||
|
if (null === $startDate) {
|
||||||
|
$startDate = new DateTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
$start = (int) $start;
|
||||||
|
$end = (int) $end;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Incorrect end of random partition?
|
||||||
|
* Use start as the end of random partition
|
||||||
|
*/
|
||||||
|
if ($end < $start) {
|
||||||
|
$end = $start;
|
||||||
|
}
|
||||||
|
|
||||||
|
$randomDate = clone $startDate;
|
||||||
|
$randomInterval = new DateInterval(sprintf($intervalTemplate, random_int($start, $end)));
|
||||||
|
|
||||||
|
return $randomDate->add($randomInterval);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns information if given value is valid date
|
* Returns information if given value is valid date
|
||||||
*
|
*
|
||||||
@@ -693,7 +664,7 @@ class Date
|
|||||||
* month", "yyyy"). Otherwise - not and every incorrect value is refused.
|
* month", "yyyy"). Otherwise - not and every incorrect value is refused.
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function isValidDate($value, $allowCompoundFormats = false)
|
public static function isValidDate($value, $allowCompoundFormats = false): bool
|
||||||
{
|
{
|
||||||
return self::getDateTime($value, $allowCompoundFormats) instanceof DateTime;
|
return self::getDateTime($value, $allowCompoundFormats) instanceof DateTime;
|
||||||
}
|
}
|
||||||
@@ -704,38 +675,77 @@ class Date
|
|||||||
* @param string $format The validated format of date
|
* @param string $format The validated format of date
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function isValidDateFormat($format)
|
public static function isValidDateFormat($format): bool
|
||||||
{
|
{
|
||||||
if (empty($format) || !is_string($format)) {
|
if (empty($format) || !is_string($format)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Datetime to string
|
|
||||||
*/
|
|
||||||
$formatted = (new DateTime())->format($format);
|
$formatted = (new DateTime())->format($format);
|
||||||
|
|
||||||
/*
|
// Formatted date it's the format who is validated?
|
||||||
* Formatted date it's the format who is validated?
|
// The format is invalid
|
||||||
* The format is invalid
|
|
||||||
*/
|
|
||||||
if ($formatted === $format) {
|
if ($formatted === $format) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Validate the format used to create the datetime
|
||||||
* Validate the format used to create the datetime
|
|
||||||
*/
|
|
||||||
$fromFormat = DateTime::createFromFormat($format, $formatted);
|
$fromFormat = DateTime::createFromFormat($format, $formatted);
|
||||||
|
|
||||||
/*
|
// It's instance of DateTime?
|
||||||
* It's instance of DateTime?
|
// The format is valid
|
||||||
* The format is valid
|
|
||||||
*/
|
|
||||||
if ($fromFormat instanceof DateTime) {
|
if ($fromFormat instanceof DateTime) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $fromFormat instanceof DateTime;
|
return $fromFormat instanceof DateTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies/validates given day
|
||||||
|
*
|
||||||
|
* @param int $day Day to verify/validate
|
||||||
|
* @throws UnknownDatePartTypeException
|
||||||
|
*/
|
||||||
|
private static function validateDay(int $day): void
|
||||||
|
{
|
||||||
|
// Oops, given day is incorrect
|
||||||
|
if ($day >= 1 && $day <= 31) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw UnknownDatePartTypeException::createException(DatePartType::DAY, $day);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies/validates given month
|
||||||
|
*
|
||||||
|
* @param int $month Month to verify/validate
|
||||||
|
* @throws UnknownDatePartTypeException
|
||||||
|
*/
|
||||||
|
private static function validateMonth(int $month): void
|
||||||
|
{
|
||||||
|
// Oops, given month is incorrect
|
||||||
|
if ($month >= 1 && $month <= 12) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw UnknownDatePartTypeException::createException(DatePartType::MONTH, $month);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies/validates given year
|
||||||
|
*
|
||||||
|
* @param int $year Year to verify/validate
|
||||||
|
* @throws UnknownDatePartTypeException
|
||||||
|
*/
|
||||||
|
private static function validateYear(int $year): void
|
||||||
|
{
|
||||||
|
// Oops, given year is incorrect
|
||||||
|
if ($year >= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw UnknownDatePartTypeException::createException(DatePartType::YEAR, $year);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,51 +16,6 @@ namespace Meritoo\Common\Utilities;
|
|||||||
*/
|
*/
|
||||||
class Locale
|
class Locale
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* 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 setLocale($category, $languageCode, $countryCode = '')
|
|
||||||
{
|
|
||||||
$category = (int)$category;
|
|
||||||
|
|
||||||
if (is_string($languageCode)) {
|
|
||||||
$languageCode = trim($languageCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
$availableCategories = [
|
|
||||||
LC_ALL,
|
|
||||||
LC_COLLATE,
|
|
||||||
LC_CTYPE,
|
|
||||||
LC_MONETARY,
|
|
||||||
LC_NUMERIC,
|
|
||||||
LC_TIME,
|
|
||||||
LC_MESSAGES,
|
|
||||||
];
|
|
||||||
|
|
||||||
if (empty($languageCode) || !in_array($category, $availableCategories, true)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$localeLongForm = self::getLongForm($languageCode, $countryCode);
|
|
||||||
|
|
||||||
return setlocale($category, $localeLongForm);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns locale for given category
|
* Returns locale for given category
|
||||||
*
|
*
|
||||||
@@ -123,4 +78,49 @@ class Locale
|
|||||||
|
|
||||||
return sprintf('%s_%s%s', $languageCode, strtoupper($countryCode), $encoding);
|
return sprintf('%s_%s%s', $languageCode, strtoupper($countryCode), $encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* 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 setLocale($category, $languageCode, $countryCode = '')
|
||||||
|
{
|
||||||
|
$category = (int) $category;
|
||||||
|
|
||||||
|
if (is_string($languageCode)) {
|
||||||
|
$languageCode = trim($languageCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
$availableCategories = [
|
||||||
|
LC_ALL,
|
||||||
|
LC_COLLATE,
|
||||||
|
LC_CTYPE,
|
||||||
|
LC_MONETARY,
|
||||||
|
LC_NUMERIC,
|
||||||
|
LC_TIME,
|
||||||
|
LC_MESSAGES,
|
||||||
|
];
|
||||||
|
|
||||||
|
if (empty($languageCode) || !in_array($category, $availableCategories, true)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$localeLongForm = self::getLongForm($languageCode, $countryCode);
|
||||||
|
|
||||||
|
return setlocale($category, $localeLongForm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -23,25 +23,68 @@ use Doctrine\ORM\QueryBuilder;
|
|||||||
class QueryBuilderUtility
|
class QueryBuilderUtility
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Returns root alias of given query builder.
|
* Adds given parameters to given query builder.
|
||||||
* If null is returned, alias was not found.
|
* Attention. Existing parameters will be overridden.
|
||||||
*
|
*
|
||||||
* @param QueryBuilder $queryBuilder The query builder to retrieve root alias
|
* @param QueryBuilder $queryBuilder The query builder
|
||||||
* @return null|string
|
* @param array|ArrayCollection $parameters Parameters to add. Collection of Doctrine\ORM\Query\Parameter
|
||||||
|
* instances or an array with key-value pairs.
|
||||||
|
* @return QueryBuilder
|
||||||
*/
|
*/
|
||||||
public static function getRootAlias(QueryBuilder $queryBuilder)
|
public static function addParameters(QueryBuilder $queryBuilder, $parameters)
|
||||||
{
|
{
|
||||||
$aliases = $queryBuilder->getRootAliases();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No aliases?
|
* No parameters?
|
||||||
* Nothing to do
|
* Nothing to do
|
||||||
*/
|
*/
|
||||||
if (empty($aliases)) {
|
if (empty($parameters)) {
|
||||||
return null;
|
return $queryBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Arrays::getFirstElement($aliases);
|
foreach ($parameters as $key => $parameter) {
|
||||||
|
$name = $key;
|
||||||
|
$value = $parameter;
|
||||||
|
|
||||||
|
if ($parameter instanceof Parameter) {
|
||||||
|
$name = $parameter->getName();
|
||||||
|
$value = $parameter->getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
$queryBuilder->setParameter($name, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $queryBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function deleteEntities(EntityManager $entityManager, $entities, $flushDeleted = true)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* No entities provided?
|
||||||
|
* Nothing to do
|
||||||
|
*/
|
||||||
|
if (empty($entities)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($entities as $entity) {
|
||||||
|
$entityManager->remove($entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The deleted objects should be flushed?
|
||||||
|
if ($flushDeleted) {
|
||||||
|
$entityManager->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -70,7 +113,7 @@ class QueryBuilderUtility
|
|||||||
$pattern = sprintf($patternTemplate, $property);
|
$pattern = sprintf($patternTemplate, $property);
|
||||||
|
|
||||||
foreach ($joins as $joinExpressions) {
|
foreach ($joins as $joinExpressions) {
|
||||||
/* @var $expression Join */
|
/** @var Join $expression */
|
||||||
foreach ($joinExpressions as $expression) {
|
foreach ($joinExpressions as $expression) {
|
||||||
$joinedProperty = $expression->getJoin();
|
$joinedProperty = $expression->getJoin();
|
||||||
|
|
||||||
@@ -83,6 +126,28 @@ class QueryBuilderUtility
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns root alias of given query builder.
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Arrays::getFirstElement($aliases);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the WHERE criteria in given query builder
|
* Sets the WHERE criteria in given query builder
|
||||||
*
|
*
|
||||||
@@ -90,7 +155,7 @@ class QueryBuilderUtility
|
|||||||
* @param array $criteria (optional) The criteria used in WHERE clause. It may simple array with pairs
|
* @param array $criteria (optional) The criteria used in WHERE clause. It may simple array with pairs
|
||||||
* key-value or an array of arrays where second element of sub-array is the
|
* key-value or an array of arrays where second element of sub-array is the
|
||||||
* comparison operator. Example below.
|
* comparison operator. Example below.
|
||||||
* @param string|null $alias (optional) Alias used in the query
|
* @param null|string $alias (optional) Alias used in the query
|
||||||
* @return QueryBuilder
|
* @return QueryBuilder
|
||||||
*
|
*
|
||||||
* Example of the $criteria argument:
|
* Example of the $criteria argument:
|
||||||
@@ -149,71 +214,4 @@ class QueryBuilderUtility
|
|||||||
|
|
||||||
return $queryBuilder;
|
return $queryBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public static function deleteEntities(EntityManager $entityManager, $entities, $flushDeleted = true)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* No entities provided?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($entities)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($entities as $entity) {
|
|
||||||
$entityManager->remove($entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The deleted objects should be flushed?
|
|
||||||
*/
|
|
||||||
if ($flushDeleted) {
|
|
||||||
$entityManager->flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds given parameters to given query builder.
|
|
||||||
* 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.
|
|
||||||
* @return QueryBuilder
|
|
||||||
*/
|
|
||||||
public static function addParameters(QueryBuilder $queryBuilder, $parameters)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* No parameters?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($parameters)) {
|
|
||||||
return $queryBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($parameters as $key => $parameter) {
|
|
||||||
$name = $key;
|
|
||||||
$value = $parameter;
|
|
||||||
|
|
||||||
if ($parameter instanceof Parameter) {
|
|
||||||
$name = $parameter->getName();
|
|
||||||
$value = $parameter->getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
$queryBuilder->setParameter($name, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $queryBuilder;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -24,7 +24,87 @@ class Repository
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
const POSITION_KEY = 'position';
|
public const POSITION_KEY = 'position';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 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) {
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replenishes positions of given items
|
* Replenishes positions of given items
|
||||||
@@ -57,24 +137,17 @@ class Repository
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($items as &$item) {
|
foreach ($items as &$item) {
|
||||||
/*
|
// Not sortable?
|
||||||
* The item is not sortable?
|
|
||||||
*/
|
|
||||||
if (!self::isSortable($item)) {
|
if (!self::isSortable($item)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Sorted already (position has been set)?
|
||||||
* Position has been set?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (self::isSorted($item)) {
|
if (self::isSorted($item)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Calculate position
|
||||||
* Calculate position
|
|
||||||
*/
|
|
||||||
if ($asLast) {
|
if ($asLast) {
|
||||||
++$position;
|
++$position;
|
||||||
} else {
|
} else {
|
||||||
@@ -87,6 +160,7 @@ class Repository
|
|||||||
*/
|
*/
|
||||||
if (is_object($item)) {
|
if (is_object($item)) {
|
||||||
$item->setPosition($position);
|
$item->setPosition($position);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,94 +172,6 @@ class Repository
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
* Returns information if given item is sortable
|
||||||
*
|
*
|
||||||
@@ -218,18 +204,6 @@ class Repository
|
|||||||
*/
|
*/
|
||||||
private static function isSorted($item)
|
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
|
return
|
||||||
(is_object($item) && null !== $item->getPosition())
|
(is_object($item) && null !== $item->getPosition())
|
||||||
||
|
||
|
||||||
|
|||||||
@@ -9,13 +9,52 @@
|
|||||||
namespace Meritoo\Common\Utilities;
|
namespace Meritoo\Common\Utilities;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful uri methods (only static functions)
|
* Useful methods related to uri
|
||||||
*
|
*
|
||||||
* @author Meritoo <github@meritoo.pl>
|
* @author Meritoo <github@meritoo.pl>
|
||||||
* @copyright Meritoo <http://www.meritoo.pl>
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
*/
|
*/
|
||||||
class Uri
|
class Uri
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Adds protocol to given url, if the url does not contain given protocol.
|
||||||
|
* Returns the new url.
|
||||||
|
*
|
||||||
|
* @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)) {
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sprintf('%s://%s', $protocol, $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function buildUrl(string $rootUrl, string ...$urlParts): string
|
||||||
|
{
|
||||||
|
$rootUrl = Regex::clearEndingSlash($rootUrl);
|
||||||
|
|
||||||
|
if (empty($urlParts) || Arrays::containsEmptyStringsOnly($urlParts)) {
|
||||||
|
return $rootUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
array_walk($urlParts, static function (&$part) {
|
||||||
|
$part = Regex::clearBeginningSlash($part);
|
||||||
|
$part = Regex::clearEndingSlash($part);
|
||||||
|
});
|
||||||
|
|
||||||
|
return sprintf(
|
||||||
|
'%s/%s',
|
||||||
|
$rootUrl,
|
||||||
|
implode('/', $urlParts)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns full uri string
|
* Returns full uri string
|
||||||
*
|
*
|
||||||
@@ -42,7 +81,75 @@ class Uri
|
|||||||
return $requestedUrl;
|
return $requestedUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::getServerNameOrIp(true) . $requestedUrl;
|
return self::getServerNameOrIp(true).$requestedUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns protocol name
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function getProtocolName()
|
||||||
|
{
|
||||||
|
$matches = [];
|
||||||
|
$protocolData = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'SERVER_PROTOCOL'); // e.g. HTTP/1.1
|
||||||
|
$matchCount = preg_match('|(.+)\/(.+)|', $protocolData, $matches);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $matches[1] - protocol name, e.g. HTTP
|
||||||
|
* $matches[2] - protocol version, e.g. 1.1
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Oops, cannot match protocol
|
||||||
|
if (0 === $matchCount) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return strtolower($matches[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns http referer uri
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function getRefererUri()
|
||||||
|
{
|
||||||
|
return Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_REFERER');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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();
|
||||||
|
|
||||||
|
if (!Regex::startsWith($url, '/')) {
|
||||||
|
$url = sprintf('/%s', $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = $host.$url;
|
||||||
|
|
||||||
|
if (!empty($user) && !empty($password)) {
|
||||||
|
$url = sprintf('%s:%s@%s', $user, $password, $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sprintf('%s://%s', $protocol, $url);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -74,42 +181,6 @@ class Uri
|
|||||||
return $host;
|
return $host;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns protocol name
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getProtocolName()
|
|
||||||
{
|
|
||||||
$matches = [];
|
|
||||||
$protocolData = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'SERVER_PROTOCOL'); // e.g. HTTP/1.1
|
|
||||||
$matchCount = preg_match('|(.+)\/(.+)|', $protocolData, $matches);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* $matches[1] - protocol name, e.g. HTTP
|
|
||||||
* $matches[2] - protocol version, e.g. 1.1
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Oops, cannot match protocol
|
|
||||||
*/
|
|
||||||
if (0 === $matchCount) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return strtolower($matches[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns http referer uri
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function getRefererUri()
|
|
||||||
{
|
|
||||||
return Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_REFERER');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns user's IP address
|
* Returns user's IP address
|
||||||
*
|
*
|
||||||
@@ -121,35 +192,26 @@ class Uri
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns name and version of user's web browser
|
* Returns name of user's operating system
|
||||||
*
|
*
|
||||||
* @param bool $withVersion (optional) If is set to true, version of the browser is returned too. Otherwise -
|
|
||||||
* name only.
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getUserWebBrowserName($withVersion = false)
|
public static function getUserOperatingSystemName()
|
||||||
{
|
{
|
||||||
$info = self::getUserWebBrowserInfo();
|
$info = self::getUserWebBrowserInfo();
|
||||||
|
|
||||||
$knownBrowsers = [
|
$knownSystems = [
|
||||||
'Firefox/([\d\.]+)$' => 'Mozilla Firefox',
|
'Linux' => 'Linux',
|
||||||
'OPR/([\d\.]+)$' => 'Opera',
|
'Win' => 'Windows',
|
||||||
'Chrome/([\d\.]+)$' => 'Google Chrome',
|
'Mac' => 'Mac OS',
|
||||||
'Safari/([\d\.]+)$' => 'Apple Safari',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($knownBrowsers as $pattern => $browserName) {
|
foreach ($knownSystems as $pattern => $systemName) {
|
||||||
$matches = [];
|
$matches = [];
|
||||||
$matchCount = preg_match(sprintf('|%s|', $pattern), $info, $matches);
|
$matchCount = preg_match(sprintf('|%s|', $pattern), $info, $matches);
|
||||||
|
|
||||||
if ($matchCount > 0) {
|
if ($matchCount > 0) {
|
||||||
if ($withVersion) {
|
return $systemName;
|
||||||
$version = $matches[1];
|
|
||||||
|
|
||||||
return sprintf('%s %s', $browserName, $version);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $browserName;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,48 +245,41 @@ class Uri
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns name of user's operating system
|
* 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
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getUserOperatingSystemName()
|
public static function getUserWebBrowserName($withVersion = false)
|
||||||
{
|
{
|
||||||
$info = self::getUserWebBrowserInfo();
|
$info = self::getUserWebBrowserInfo();
|
||||||
|
|
||||||
$knownSystems = [
|
$knownBrowsers = [
|
||||||
'Linux' => 'Linux',
|
'Firefox/([\d\.]+)$' => 'Mozilla Firefox',
|
||||||
'Win' => 'Windows',
|
'OPR/([\d\.]+)$' => 'Opera',
|
||||||
'Mac' => 'Mac OS',
|
'Chrome/([\d\.]+)$' => 'Google Chrome',
|
||||||
|
'Safari/([\d\.]+)$' => 'Apple Safari',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($knownSystems as $pattern => $systemName) {
|
foreach ($knownBrowsers as $pattern => $browserName) {
|
||||||
$matches = [];
|
$matches = [];
|
||||||
$matchCount = preg_match(sprintf('|%s|', $pattern), $info, $matches);
|
$matchCount = preg_match(sprintf('|%s|', $pattern), $info, $matches);
|
||||||
|
|
||||||
if ($matchCount > 0) {
|
if ($matchCount > 0) {
|
||||||
return $systemName;
|
if ($withVersion) {
|
||||||
|
$version = $matches[1];
|
||||||
|
|
||||||
|
return sprintf('%s %s', $browserName, $version);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $browserName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns information if running server is localhost
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public static function isServerLocalhost()
|
|
||||||
{
|
|
||||||
$serverNameOrIp = strtolower(self::getServerNameOrIp());
|
|
||||||
|
|
||||||
return in_array($serverNameOrIp, [
|
|
||||||
'localhost',
|
|
||||||
'127.0.0.1',
|
|
||||||
'127.0.1.1',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns information if given url is external, from another server / domain
|
* Returns information if given url is external, from another server / domain
|
||||||
*
|
*
|
||||||
@@ -244,9 +299,7 @@ class Uri
|
|||||||
$currentUrl = self::getServerNameOrIp(true);
|
$currentUrl = self::getServerNameOrIp(true);
|
||||||
$url = self::replenishProtocol($url);
|
$url = self::replenishProtocol($url);
|
||||||
|
|
||||||
/*
|
// Let's prepare pattern of current url
|
||||||
* Let's prepare pattern of current url
|
|
||||||
*/
|
|
||||||
$search = [
|
$search = [
|
||||||
':',
|
':',
|
||||||
'/',
|
'/',
|
||||||
@@ -264,6 +317,22 @@ class Uri
|
|||||||
return !Regex::contains($url, $currentUrlPattern);
|
return !Regex::contains($url, $currentUrlPattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information if running server is localhost
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function isServerLocalhost()
|
||||||
|
{
|
||||||
|
$serverNameOrIp = strtolower(self::getServerNameOrIp());
|
||||||
|
|
||||||
|
return in_array($serverNameOrIp, [
|
||||||
|
'localhost',
|
||||||
|
'127.0.0.1',
|
||||||
|
'127.0.1.1',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replenishes protocol in the given url
|
* Replenishes protocol in the given url
|
||||||
*
|
*
|
||||||
@@ -274,9 +343,7 @@ class Uri
|
|||||||
*/
|
*/
|
||||||
public static function replenishProtocol($url, $protocol = '')
|
public static function replenishProtocol($url, $protocol = '')
|
||||||
{
|
{
|
||||||
/*
|
// Let's trim the url
|
||||||
* Let's trim the url
|
|
||||||
*/
|
|
||||||
if (is_string($url)) {
|
if (is_string($url)) {
|
||||||
$url = trim($url);
|
$url = trim($url);
|
||||||
}
|
}
|
||||||
@@ -297,66 +364,11 @@ class Uri
|
|||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Protocol is not provided?
|
||||||
* Protocol is not provided?
|
|
||||||
*/
|
|
||||||
if (empty($protocol)) {
|
if (empty($protocol)) {
|
||||||
$protocol = self::getProtocolName();
|
$protocol = self::getProtocolName();
|
||||||
}
|
}
|
||||||
|
|
||||||
return sprintf('%s://%s', $protocol, $url);
|
return sprintf('%s://%s', $protocol, $url);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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();
|
|
||||||
|
|
||||||
if (!Regex::startsWith($url, '/')) {
|
|
||||||
$url = sprintf('/%s', $url);
|
|
||||||
}
|
|
||||||
|
|
||||||
$url = $host . $url;
|
|
||||||
|
|
||||||
if (!empty($user) && !empty($password)) {
|
|
||||||
$url = sprintf('%s:%s@%s', $user, $password, $url);
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('%s://%s', $protocol, $url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds protocol to given url, if the url does not contain given protocol.
|
|
||||||
* Returns the new url.
|
|
||||||
*
|
|
||||||
* @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)) {
|
|
||||||
return $url;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('%s://%s', $protocol, $url);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,13 +88,33 @@ class Address
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns street
|
* Returns number of building
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getStreet()
|
public function getBuildingNumber()
|
||||||
{
|
{
|
||||||
return $this->street;
|
return $this->buildingNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns city, location
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCity()
|
||||||
|
{
|
||||||
|
return $this->city;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns number of flat
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFlatNumber()
|
||||||
|
{
|
||||||
|
return $this->flatNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -118,23 +138,13 @@ class Address
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns number of building
|
* Returns street
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getBuildingNumber()
|
public function getStreet()
|
||||||
{
|
{
|
||||||
return $this->buildingNumber;
|
return $this->street;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns number of flat
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getFlatNumber()
|
|
||||||
{
|
|
||||||
return $this->flatNumber;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -146,14 +156,4 @@ class Address
|
|||||||
{
|
{
|
||||||
return $this->zipCode;
|
return $this->zipCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns city, location
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getCity()
|
|
||||||
{
|
|
||||||
return $this->city;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,16 +59,6 @@ class BankAccount
|
|||||||
return Arrays::getNonEmptyValuesAsString($values);
|
return Arrays::getNonEmptyValuesAsString($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns name of bank
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getBankName()
|
|
||||||
{
|
|
||||||
return $this->bankName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns number of bank's account
|
* Returns number of bank's account
|
||||||
*
|
*
|
||||||
@@ -78,4 +68,14 @@ class BankAccount
|
|||||||
{
|
{
|
||||||
return $this->accountNumber;
|
return $this->accountNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns name of bank
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBankName()
|
||||||
|
{
|
||||||
|
return $this->bankName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class Company
|
|||||||
*
|
*
|
||||||
* @param string $name Name of company
|
* @param string $name Name of company
|
||||||
* @param Address $address Address of company
|
* @param Address $address Address of company
|
||||||
* @param BankAccount|null $bankAccount (optional) Bank account of company
|
* @param null|BankAccount $bankAccount (optional) Bank account of company
|
||||||
*/
|
*/
|
||||||
public function __construct($name, Address $address, BankAccount $bankAccount = null)
|
public function __construct($name, Address $address, BankAccount $bankAccount = null)
|
||||||
{
|
{
|
||||||
@@ -69,16 +69,6 @@ class Company
|
|||||||
return Arrays::getNonEmptyValuesAsString($values);
|
return Arrays::getNonEmptyValuesAsString($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns name of company
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return $this->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns address of company
|
* Returns address of company
|
||||||
*
|
*
|
||||||
@@ -92,10 +82,20 @@ class Company
|
|||||||
/**
|
/**
|
||||||
* Returns bank account of company
|
* Returns bank account of company
|
||||||
*
|
*
|
||||||
* @return BankAccount|null
|
* @return null|BankAccount
|
||||||
*/
|
*/
|
||||||
public function getBankAccount()
|
public function getBankAccount()
|
||||||
{
|
{
|
||||||
return $this->bankAccount;
|
return $this->bankAccount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns name of company
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,8 +62,8 @@ class Size
|
|||||||
*/
|
*/
|
||||||
private function __construct($width = null, $height = null, $unit = 'px')
|
private function __construct($width = null, $height = null, $unit = 'px')
|
||||||
{
|
{
|
||||||
$width = (int)$width;
|
$width = (int) $width;
|
||||||
$height = (int)$height;
|
$height = (int) $height;
|
||||||
|
|
||||||
if ($width < 0 || $height < 0) {
|
if ($width < 0 || $height < 0) {
|
||||||
throw new InvalidSizeDimensionsException($width, $height);
|
throw new InvalidSizeDimensionsException($width, $height);
|
||||||
@@ -88,14 +88,84 @@ class Size
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets separator used when converting to string
|
* Creates new instance from given array
|
||||||
*
|
*
|
||||||
* @param string $separator The separator
|
* The array should contain 2 elements: width and height.
|
||||||
|
* Examples: ['800', '600'], [800, 600].
|
||||||
|
*
|
||||||
|
* @param array $array The size represented as array
|
||||||
|
* @param string $unit (optional) Unit used when width or height should be returned with unit. Default: "px".
|
||||||
|
* @return null|Size
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $array, $unit = 'px')
|
||||||
|
{
|
||||||
|
// Requirements for given array:
|
||||||
|
// - indexes "0" and "1"
|
||||||
|
// - should contains exactly 2 elements
|
||||||
|
if (
|
||||||
|
array_key_exists(0, $array)
|
||||||
|
&& array_key_exists(1, $array)
|
||||||
|
&& 2 === count($array)
|
||||||
|
) {
|
||||||
|
[$width, $height] = $array;
|
||||||
|
|
||||||
|
return new self($width, $height, $unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new instance from given string
|
||||||
|
*
|
||||||
|
* @param string $size The size represented as string (width and height separated by given separator)
|
||||||
|
* @param string $unit (optional) Unit used when width or height should be returned with unit. Default: "px".
|
||||||
|
* @param string $separator (optional) Separator used to split width and height. Default: " x ".
|
||||||
|
* @return null|Size
|
||||||
|
*/
|
||||||
|
public static function fromString($size, $unit = 'px', $separator = ' x ')
|
||||||
|
{
|
||||||
|
if (is_string($size)) {
|
||||||
|
$matches = [];
|
||||||
|
$pattern = Regex::getSizePattern($separator);
|
||||||
|
|
||||||
|
if ((bool) preg_match($pattern, $size, $matches)) {
|
||||||
|
$width = (int) $matches[1];
|
||||||
|
$height = (int) $matches[2];
|
||||||
|
$sizeObject = new self($width, $height, $unit);
|
||||||
|
|
||||||
|
return $sizeObject->setSeparator($separator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the height
|
||||||
|
*
|
||||||
|
* @param bool $withUnit (optional) If is set to true, height is returned with unit ("px"). Otherwise - without
|
||||||
|
* (default behaviour).
|
||||||
|
* @return int|string
|
||||||
|
*/
|
||||||
|
public function getHeight($withUnit = false)
|
||||||
|
{
|
||||||
|
if ($withUnit) {
|
||||||
|
return sprintf('%d %s', $this->height, $this->unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the height
|
||||||
|
*
|
||||||
|
* @param int $height The height
|
||||||
* @return Size
|
* @return Size
|
||||||
*/
|
*/
|
||||||
public function setSeparator($separator)
|
public function setHeight($height)
|
||||||
{
|
{
|
||||||
$this->separator = $separator;
|
$this->height = (int) $height;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -124,55 +194,24 @@ class Size
|
|||||||
*/
|
*/
|
||||||
public function setWidth($width)
|
public function setWidth($width)
|
||||||
{
|
{
|
||||||
$this->width = (int)$width;
|
$this->width = (int) $width;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the height
|
* Sets separator used when converting to string
|
||||||
*
|
*
|
||||||
* @param bool $withUnit (optional) If is set to true, height is returned with unit ("px"). Otherwise - without
|
* @param string $separator The separator
|
||||||
* (default behaviour).
|
|
||||||
* @return int|string
|
|
||||||
*/
|
|
||||||
public function getHeight($withUnit = false)
|
|
||||||
{
|
|
||||||
if ($withUnit) {
|
|
||||||
return sprintf('%d %s', $this->height, $this->unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the height
|
|
||||||
*
|
|
||||||
* @param int $height The height
|
|
||||||
* @return Size
|
* @return Size
|
||||||
*/
|
*/
|
||||||
public function setHeight($height)
|
public function setSeparator($separator)
|
||||||
{
|
{
|
||||||
$this->height = (int)$height;
|
$this->separator = $separator;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns string representation of instance of this class, e.g. '200 x 100' or '200x100'
|
|
||||||
*
|
|
||||||
* @param bool $withUnit (optional) If is set to true, width and height are returned with unit ("px"). Otherwise
|
|
||||||
* - without (default behaviour).
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function toString($withUnit = false)
|
|
||||||
{
|
|
||||||
$width = $this->getWidth($withUnit);
|
|
||||||
$height = $this->getHeight($withUnit);
|
|
||||||
|
|
||||||
return sprintf('%s%s%s', $width, $this->separator, $height);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns instance of this class as an array.
|
* Returns instance of this class as an array.
|
||||||
* Values of the array are width and height, eg. [800, 600] or ['800px', '600px'].
|
* Values of the array are width and height, eg. [800, 600] or ['800px', '600px'].
|
||||||
@@ -190,56 +229,17 @@ class Size
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates new instance from given string
|
* Returns string representation of instance of this class, e.g. '200 x 100' or '200x100'
|
||||||
*
|
*
|
||||||
* @param string $size The size represented as string (width and height separated by given separator)
|
* @param bool $withUnit (optional) If is set to true, width and height are returned with unit ("px"). Otherwise
|
||||||
* @param string $unit (optional) Unit used when width or height should be returned with unit. Default: "px".
|
* - without (default behaviour).
|
||||||
* @param string $separator (optional) Separator used to split width and height. Default: " x ".
|
* @return string
|
||||||
* @return Size|null
|
|
||||||
*/
|
*/
|
||||||
public static function fromString($size, $unit = 'px', $separator = ' x ')
|
public function toString($withUnit = false)
|
||||||
{
|
{
|
||||||
if (is_string($size)) {
|
$width = $this->getWidth($withUnit);
|
||||||
$matches = [];
|
$height = $this->getHeight($withUnit);
|
||||||
$pattern = Regex::getSizePattern($separator);
|
|
||||||
|
|
||||||
if ((bool)preg_match($pattern, $size, $matches)) {
|
return sprintf('%s%s%s', $width, $this->separator, $height);
|
||||||
$width = (int)$matches[1];
|
|
||||||
$height = (int)$matches[2];
|
|
||||||
$sizeObject = new self($width, $height, $unit);
|
|
||||||
|
|
||||||
return $sizeObject->setSeparator($separator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates new instance from given array
|
|
||||||
*
|
|
||||||
* The array should contain 2 elements: width and height.
|
|
||||||
* Examples: ['800', '600'], [800, 600].
|
|
||||||
*
|
|
||||||
* @param array $array The size represented as array
|
|
||||||
* @param string $unit (optional) Unit used when width or height should be returned with unit. Default: "px".
|
|
||||||
* @return Size|null
|
|
||||||
*/
|
|
||||||
public static function fromArray(array $array, $unit = 'px')
|
|
||||||
{
|
|
||||||
// Requirements for given array:
|
|
||||||
// - indexes "0" and "1"
|
|
||||||
// - should contains exactly 2 elements
|
|
||||||
if (
|
|
||||||
array_key_exists(0, $array)
|
|
||||||
&& array_key_exists(1, $array)
|
|
||||||
&& 2 === count($array)
|
|
||||||
) {
|
|
||||||
list($width, $height) = $array;
|
|
||||||
|
|
||||||
return new self($width, $height, $unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
151
src/ValueObject/Template.php
Normal file
151
src/ValueObject/Template.php
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Meritoo\Common\ValueObject;
|
||||||
|
|
||||||
|
use Meritoo\Common\Exception\ValueObject\Template\InvalidContentException;
|
||||||
|
use Meritoo\Common\Exception\ValueObject\Template\MissingPlaceholdersInValuesException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Template with placeholders that may be filled by real data
|
||||||
|
*
|
||||||
|
* @author Meritoo <github@meritoo.pl>
|
||||||
|
* @copyright Meritoo <http://www.meritoo.pl>
|
||||||
|
*/
|
||||||
|
class Template
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Tag used at beginning and ending of placeholder
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private const PLACEHOLDER_TAG = '%';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Raw string with placeholders (content of the template)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $content;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class constructor
|
||||||
|
*
|
||||||
|
* @param string $content Raw string with placeholders (content of the template)
|
||||||
|
* @throws InvalidContentException
|
||||||
|
*/
|
||||||
|
public function __construct(string $content)
|
||||||
|
{
|
||||||
|
if (!static::isValid($content)) {
|
||||||
|
throw InvalidContentException::create($content);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->content = $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns content of the template filled with given values (by replacing placeholders with their proper values)
|
||||||
|
*
|
||||||
|
* @param array $values Pairs of key-value where: key - name of placeholder, value - value of the placeholder
|
||||||
|
* @return string
|
||||||
|
* @throws MissingPlaceholdersInValuesException
|
||||||
|
*/
|
||||||
|
public function fill(array $values): string
|
||||||
|
{
|
||||||
|
$placeholders = static::getPlaceholders($this->content);
|
||||||
|
$providedPlaceholders = array_keys($values);
|
||||||
|
$missingPlaceholders = array_diff($placeholders[1], $providedPlaceholders);
|
||||||
|
|
||||||
|
// Oops, there are placeholders without values (iow. provided values are different than placeholders)
|
||||||
|
if (!empty($missingPlaceholders)) {
|
||||||
|
throw MissingPlaceholdersInValuesException::create($this->content, $missingPlaceholders);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->content;
|
||||||
|
|
||||||
|
foreach ($placeholders[0] as $index => $placeholder) {
|
||||||
|
$placeholderName = $placeholders[1][$index];
|
||||||
|
|
||||||
|
if (isset($values[$placeholderName])) {
|
||||||
|
$value = $values[$placeholderName];
|
||||||
|
$result = str_replace($placeholder, (string) $value, $result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns regular expression that defines format of placeholder
|
||||||
|
*
|
||||||
|
* Expectations:
|
||||||
|
* - surrounded by the placeholder's tags (at beginning and at the end)
|
||||||
|
* - at least 1 character
|
||||||
|
* - no placeholder's tag inside name of placeholder
|
||||||
|
*
|
||||||
|
* Invalid placeholders:
|
||||||
|
* - test
|
||||||
|
* - test%
|
||||||
|
* - % test%
|
||||||
|
*
|
||||||
|
* Valid placeholders:
|
||||||
|
* - %test%
|
||||||
|
* - %another_test%
|
||||||
|
* - %another-test%
|
||||||
|
* - %anotherTest%
|
||||||
|
* - %another test%
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function getPlaceholderPattern(): string
|
||||||
|
{
|
||||||
|
return sprintf(
|
||||||
|
'/%s([^%s]+)%s/',
|
||||||
|
static::PLACEHOLDER_TAG,
|
||||||
|
static::PLACEHOLDER_TAG,
|
||||||
|
static::PLACEHOLDER_TAG
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns placeholders of given template
|
||||||
|
*
|
||||||
|
* @param string $content Content of template
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private static function getPlaceholders(string $content): array
|
||||||
|
{
|
||||||
|
$result = [];
|
||||||
|
$matchCount = preg_match_all(static::getPlaceholderPattern(), $content, $result);
|
||||||
|
|
||||||
|
if (false !== $matchCount && 0 < $matchCount) {
|
||||||
|
foreach ($result as $index => $placeholders) {
|
||||||
|
$result[$index] = array_unique($placeholders);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information if given template is valid
|
||||||
|
*
|
||||||
|
* @param string $content Raw string with placeholders to validate (content of the template)
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private static function isValid(string $content): bool
|
||||||
|
{
|
||||||
|
if ('' === $content) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (bool) preg_match_all(static::getPlaceholderPattern(), $content);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -54,6 +54,96 @@ class Version
|
|||||||
$this->patchPart = $patchPart;
|
$this->patchPart = $patchPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns representation of object as string
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __toString()
|
||||||
|
{
|
||||||
|
return sprintf('%d.%d.%d', $this->getMajorPart(), $this->getMinorPart(), $this->getPatchPart());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns new instance based on given version as 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 null|Version
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 null|Version
|
||||||
|
*/
|
||||||
|
public static function fromString(string $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 the "major" part.
|
* Returns the "major" part.
|
||||||
* Incremented when you make incompatible API changes.
|
* Incremented when you make incompatible API changes.
|
||||||
@@ -86,94 +176,4 @@ class Version
|
|||||||
{
|
{
|
||||||
return $this->patchPart;
|
return $this->patchPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns representation of object as string
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('%d.%d.%d', $this->getMajorPart(), $this->getMinorPart(), $this->getPatchPart());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns new instance based on given version as string.
|
|
||||||
* Given version should contain 3 dot-separated integers, 1 per each part ("major", "minor" and "patch").
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
* "1.0.2";
|
|
||||||
* "10.4.0";
|
|
||||||
*
|
|
||||||
* @param string $version The version
|
|
||||||
* @return Version|null
|
|
||||||
*/
|
|
||||||
public static function fromString($version)
|
|
||||||
{
|
|
||||||
$version = trim($version);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* No version provided?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($version)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$matches = [];
|
|
||||||
$pattern = '/^(\d+)\.(\d+)\.(\d+)$/'; // e.g. "1.0.2"
|
|
||||||
$matched = preg_match($pattern, $version, $matches);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Incorrect version?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (0 === $matched || false === $matched) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$majorPart = (int)$matches[1];
|
|
||||||
$minorPart = (int)$matches[2];
|
|
||||||
$patchPart = (int)$matches[3];
|
|
||||||
|
|
||||||
return new static($majorPart, $minorPart, $patchPart);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns new instance based on given version as array.
|
|
||||||
* Given version should contain 3 integers, 1 per each part ("major", "minor" and "patch").
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
* [1, 0, 2];
|
|
||||||
* [10, 4, 0];
|
|
||||||
*
|
|
||||||
* @param array $version The version
|
|
||||||
* @return Version|null
|
|
||||||
*/
|
|
||||||
public static function fromArray(array $version)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* No version provided?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (empty($version)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$count = count($version);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Incorrect version?
|
|
||||||
* Nothing to do
|
|
||||||
*/
|
|
||||||
if (3 !== $count) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$majorPart = (int)$version[0];
|
|
||||||
$minorPart = (int)$version[1];
|
|
||||||
$patchPart = (int)$version[2];
|
|
||||||
|
|
||||||
return new static($majorPart, $minorPart, $patchPart);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user