51 Commits

Author SHA1 Message Date
Meritoo
39ede292d6 Merge branch 'develop' 2018-11-03 09:09:09 +01:00
Meritoo
8e9dcb3206 Reflection > setPropertiesValues() method > sets values of properties in given object 2018-11-03 08:53:01 +01:00
Meritoo
06fbf63e09 Tests > refactoring 2018-11-03 08:50:12 +01:00
Meritoo
4e600ec599 Utilities > Reflection > setPropertyValue() method > fix description and test 2018-11-03 08:16:49 +01:00
Meritoo
b4ccbbac11 Utilities > Date > update descriptions of methods 2018-11-03 08:10:03 +01:00
Meritoo
c82f53219e Phing > PHPUnit > run with code coverage (to get all reports) 2018-10-29 08:31:38 +01:00
Meritoo
c8fc0b14ff Exceptions > UnknownTypeException > remove duplicated and unnecessary sprintf() call > sprintf(sprintf()) 2018-10-28 00:12:18 +02:00
Meritoo
3c3d1b997e Docker > docker-compose.yml > add "phpunit" service > used to run PHPUnit's tests 2018-10-28 00:10:42 +02:00
Meritoo
61209e3f67 Documentation > Development > add commands based on Phing & update whole document 2018-10-28 00:09:29 +02:00
Meritoo
822dbf6830 Phing > tests > remove mutation tests (because Infection requires PHP 7.1+) 2018-10-28 00:06:52 +02:00
Meritoo
870bfe48a2 Docker > Dockerfile > fix installation of Composer 2018-10-28 00:03:35 +02:00
Meritoo
ff416fda69 Phing > update configuration 2018-10-25 11:05:32 +02:00
Meritoo
61676a445e Docker > update docker-compose.yml > composer > fix "allowed memory size of 1610612736 bytes exhausted" bug 2018-10-25 10:31:44 +02:00
Meritoo
1f5106bcf0 Docker > improve performance > fix indentations 2018-10-25 10:31:21 +02:00
Meritoo
971224b2e6 PHPUnit > update configuration 2018-10-25 10:28:00 +02:00
Meritoo
7e4b14a92f Phing > update configuration 2018-10-25 10:27:48 +02:00
Meritoo
38c68b0952 Readme > add badge with required PHP version 2018-10-19 22:54:26 +02:00
Meritoo
ca9c3bd8f1 Utilities > Date > update descriptions of methods 2018-10-19 22:54:11 +02:00
Meritoo
97c6112919 TravisCI > fix indentation 2018-09-20 20:41:48 +02:00
Meritoo
26b136d676 Tests > increase code coverage 2018-09-20 17:30:07 +02:00
Meritoo
4db631223f Phing > tests > PHPUnit > do not use dox format (for output results) 2018-09-08 08:21:50 +02:00
Meritoo
5d6b559108 Phing > tests > missing path of directory with code coverage report 2018-09-07 13:48:44 +02:00
Meritoo
575bb344cd BaseTestCaseTrait > minor refactoring 2018-08-27 22:04:35 +02:00
Meritoo
35b70f53e7 BaseType > minor refactoring 2018-08-26 16:39:45 +02:00
Meritoo
51ff110101 Phing > update configuration 2018-08-26 15:43:34 +02:00
Meritoo
2f9138d093 Merge branch 'develop' 2018-08-08 18:37:09 +02:00
Meritoo
75707a3f76 Utilities > Bootstrap4CssSelector > useful methods related to CSS selectors and the Bootstrap4 (front-end component library) 2018-08-07 23:31:50 +02:00
Meritoo
8ecbefbba6 Utilities > CssSelector > useful methods related to CSS selectors 2018-08-07 23:31:30 +02:00
Meritoo
e850375c19 Tests > refactoring & minor improvements 2018-08-06 21:43:57 +02:00
Meritoo
0bd1e1e158 Merge branch 'develop' 2018-07-29 16:01:31 +02:00
Meritoo
535ae65e5e Utilities > Reflection > setPropertyValue() method > sets value of given property 2018-07-29 16:00:13 +02:00
Meritoo
60d7b03cd7 Utilities > Reflection > refactoring 2018-07-29 15:34:33 +02:00
Meritoo
c20fa5941f Docker > improve performance 2018-07-28 21:01:07 +02:00
Meritoo
a448d592d2 Documentation > Value Objects 2018-07-02 21:24:20 +02:00
Meritoo
e53273fb32 Merge branch 'develop' 2018-07-02 20:20:52 +02:00
Meritoo
cc30ad8d9e Move version of this package to "VERSION" file (from "composer.json" file) 2018-07-02 20:19:29 +02:00
Meritoo
9f08a2aaaf ValueObject > class Version > represents version of software 2018-07-02 20:07:33 +02:00
Meritoo
b49605a26c TravisCI - fix "No output has been received in the last 10m0s" bug (build times out because no output was received) 2018-07-02 10:40:33 +02:00
Meritoo
8441c82356 TravisCI > run using PHP 7.2 too 2018-07-02 09:53:16 +02:00
Meritoo
55dde2e898 Merge branch 'develop' 2018-07-02 09:34:53 +02:00
Meritoo
a32e0c4cca Documentation > Exceptions 2018-07-02 09:31:07 +02:00
Meritoo
834b24f348 Exceptions > create instance of exception using static "create()" method (instead of constructor) 2018-07-02 08:54:24 +02:00
Meritoo
9342f0e87e Docker > rename "php-cli" service to "php" 2018-07-02 08:47:56 +02:00
Meritoo
72fd87e165 Composer > support/require PHP 5.6+ (instead of 5.5.9+) 2018-07-02 08:12:26 +02:00
Meritoo
64499b49d3 Update @author and @copyright in classes' descriptions 2018-07-01 21:07:47 +02:00
Meritoo
848adef015 Arrays > minor refactoring 2018-07-01 17:45:03 +02:00
Meritoo
1431fd9935 Composer > require ext-pcre 2018-07-01 17:37:51 +02:00
Meritoo
3bb7a182c2 Merge branch 'develop' 2018-06-22 08:26:10 +02:00
Meritoo
1a649d35e1 Merge branch 'develop' 2018-06-18 09:37:27 +02:00
Meritoo
0a3955026b Revert "StyleCI > update configuration"
This reverts commit f9fa5f5
2018-06-15 23:00:53 +02:00
Meritoo
f9fa5f5915 StyleCI > update configuration 2018-06-15 23:00:29 +02:00
113 changed files with 3000 additions and 1128 deletions

View File

@@ -4,13 +4,14 @@ php:
- 5.6 - 5.6
- 7.0 - 7.0
- 7.1 - 7.1
- 7.2
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 - composer global require hirak/prestissimo
install: install:
- travis_wait 30 composer install -vvv - travis_wait 30 composer install -v
script: script:
- php ./vendor/bin/phpunit - php ./vendor/bin/phpunit

View File

@@ -1,6 +1,45 @@
# Meritoo Common Library # Meritoo Common Library
Common and useful classes, methods, exceptions etc. Common and useful classes, methods, exceptions etc.
# 0.1.4
1. Phing > update configuration
2. Utilities > Date > update descriptions of methods
3. Docker > docker-compose.yml > add "phpunit" service > used to run PHPUnit's tests
4. Reflection > setPropertiesValues() method > sets values of properties in given object
# 0.1.3
1. Tests > refactoring & minor improvements
2. Utilities > CssSelector > useful methods related to CSS selectors
3. Utilities > Bootstrap4CssSelector > useful methods related to CSS selectors and the Bootstrap4 (front-end component library)
# 0.1.2
1. Documentation > Value Objects
2. Docker > improve performance
3. Utilities > Reflection > setPropertyValue() method > sets value of given property
# 0.1.1
1. TravisCI > run using PHP 7.2 too
2. ValueObject > class Version > represents version of software
3. Move version of this package to `VERSION` file (from `composer.json` file)
# 0.1.0
1. Composer > support/require PHP 5.6+ (instead of 5.5.9+)
2. Docker > rename `php-cli` service to `php`
3. Exceptions > create instance of exception using static `create()` method (instead of constructor)
4. Documentation > Exceptions
# 0.0.21
1. Composer > require ext-pcre
2. Arrays > minor refactoring
3. Update @author and @copyright in classes' descriptions
# 0.0.20 # 0.0.20
1. Collection > add() method > treat empty string as not provided index (same as null) 1. Collection > add() method > treat empty string as not provided index (same as null)

View File

@@ -1,7 +1,8 @@
# Meritoo Common Library # Meritoo Common Library
Common and useful classes, methods, exceptions etc. Common and useful classes, methods, exceptions etc.
[![Travis](https://img.shields.io/travis/rust-lang/rust.svg?style=flat-square)](https://travis-ci.org/meritoo/common-library) [![Packagist](https://img.shields.io/packagist/v/meritoo/common-library.svg?style=flat-square)](https://packagist.org/packages/meritoo/common-library) [![license](https://img.shields.io/github/license/meritoo/common-library.svg?style=flat-square)](https://github.com/meritoo/common-library) [![GitHub commits](https://img.shields.io/github/commits-since/meritoo/common-library/0.0.1.svg?style=flat-square)](https://github.com/meritoo/common-library) [![Coverage Status](https://coveralls.io/repos/github/meritoo/common-library/badge.svg?branch=master)](https://coveralls.io/github/meritoo/common-library?branch=master) [![PHP Version](https://img.shields.io/badge/php-%3E%3D5.6-blue.svg)](https://img.shields.io/badge/php-%3E%3D5.6-blue.svg) [![Travis](https://img.shields.io/travis/rust-lang/rust.svg?style=flat-square)](https://travis-ci.org/meritoo/common-library) [![Packagist](https://img.shields.io/packagist/v/meritoo/common-library.svg?style=flat-square)](https://packagist.org/packages/meritoo/common-library) [![license](https://img.shields.io/github/license/meritoo/common-library.svg?style=flat-square)](https://github.com/meritoo/common-library) [![GitHub commits](https://img.shields.io/github/commits-since/meritoo/common-library/0.0.1.svg?style=flat-square)](https://github.com/meritoo/common-library) [![Coverage Status](https://coveralls.io/repos/github/meritoo/common-library/badge.svg?branch=master)](https://coveralls.io/github/meritoo/common-library?branch=master)
# Installation # Installation
@@ -17,7 +18,9 @@ composer require meritoo/common-library
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-of-elements.md)
3. [Static methods](docs/Static-methods.md) 3. [Exceptions](docs/Static-methods.md)
4. [Static methods](docs/Static-methods.md)
5. [Value Objects](docs/Value-Objects.md)
# Development # Development

1
VERSION Normal file
View File

@@ -0,0 +1 @@
0.1.4

View File

@@ -1,46 +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.14.0"> <project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
<!-- Properties --> <!-- Properties -->
<if> <if>
<available file="phing/properties" property="custom.properties.available"/> <available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
<then> <then>
<property file="phing/properties"/> <property file="${project.basedir}/phing/properties"/>
</then> </then>
<else> <else>
<property file="phing/properties.dist"/> <property file="${project.basedir}/phing/properties.dist"/>
</else> </else>
</if> </if>
<!-- Default / main target --> <!-- Default / main target -->
<target name="build:main" <target name="build:main"
depends="build:app, build:tests" depends="build:app,
description="Builds everything and runs all tests" /> build:tests"
/>
<!-- Build app --> <!-- Build app -->
<target name="build:app" description="Prepares app to build and tests"> <target name="build:app">
<phing phingfile="phing/app.xml" haltonfailure="true"/> <phing phingfile="${project.basedir}/phing/app.xml" haltonfailure="true"/>
</target> </target>
<!-- Build tests --> <!-- Build tests -->
<target name="build:tests" description="Runs all tests, checks and creates docs"> <target name="build:tests">
<phing phingfile="phing/tests.xml" haltonfailure="true"/> <phing phingfile="${project.basedir}/phing/tests.xml" haltonfailure="true"/>
<!--
Conditional running of tests.
Disabled, because not required.
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
2017-02-22
<if>
<equals arg1="${env}" arg2="test" />
<then>
<phing phingfile="phing/tests.xml" haltonfailure="true" />
</then>
<else>
<echo message="[Skipped] Running tests, checks and creating docs, because it's a not 'test' environment..." />
</else>
</if>
-->
</target> </target>
</project> </project>

View File

@@ -2,7 +2,6 @@
"name": "meritoo/common-library", "name": "meritoo/common-library",
"description": "Useful classes, methods, extensions etc.", "description": "Useful classes, methods, extensions etc.",
"license": "MIT", "license": "MIT",
"version": "0.0.20",
"authors": [ "authors": [
{ {
"name": "Meritoo.pl", "name": "Meritoo.pl",
@@ -11,7 +10,9 @@
} }
], ],
"require": { "require": {
"php": ">=5.5.9", "php": ">=5.6",
"ext-intl": "*",
"ext-pcre": "*",
"doctrine/orm": "^2.5", "doctrine/orm": "^2.5",
"gedmo/doctrine-extensions": "^2.4" "gedmo/doctrine-extensions": "^2.4"
}, },

View File

@@ -1,20 +1,33 @@
version: '3' version: '3'
services: services:
php-cli: #
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php-cli # Required to run project
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-php-cli #
php:
image: ${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: build:
context: ./docker/config context: ./docker/config
args: args:
- TIMEZONE=$TIMEZONE - TIMEZONE=${TIMEZONE}
volumes: volumes:
- .:/project - .:/project:cached
composer: composer:
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php-cli image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-composer container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-composer
entrypoint: composer entrypoint: php -d memory_limit=-1 /usr/local/bin/composer
volumes: volumes:
- .:/project - .:/project:cached
#
# Required to run PHPUnit's tests
#
phpunit:
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-phpunit
entrypoint: ./vendor/bin/phpunit
command: --version
volumes:
- .:/project:cached

View File

@@ -1,4 +1,4 @@
FROM php:5.5-cli FROM php:5.6-cli
MAINTAINER Meritoo <github@meritoo.pl> MAINTAINER Meritoo <github@meritoo.pl>
# #
@@ -98,7 +98,7 @@ ENV COMPOSER_ALLOW_SUPERUSER 1
# #
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('SHA384', 'composer-setup.php') === \ && php -r "if (hash_file('SHA384', 'composer-setup.php') === \
'544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo \ '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo \
'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ '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 composer-setup.php --install-dir=/usr/local/bin --filename=composer \
&& php -r "unlink('composer-setup.php');" \ && php -r "unlink('composer-setup.php');" \

View File

@@ -1,4 +1,5 @@
# Meritoo Common Library # Meritoo Common Library
Common and useful classes, methods, exceptions etc. 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)
@@ -45,6 +46,8 @@ class MimeTypesTest extends BaseTestCase
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-of-elements.md)
3. [Static methods](Static-methods.md) 3. [Exceptions](Exceptions.md)
4. [Static methods](Static-methods.md)
5. [Value Objects](Value-Objects.md)
[&lsaquo; Back to `Readme`](../README.md) [&lsaquo; Back to `Readme`](../README.md)

View File

@@ -1,4 +1,5 @@
# Meritoo Common Library # Meritoo Common Library
Common and useful classes, methods, exceptions etc. Common and useful classes, methods, exceptions etc.
# Collection of elements # Collection of elements
@@ -43,6 +44,8 @@ var_dump($simpleCollection->has('dolor')); // bool(true)
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-of-elements.md)
3. [Static methods](Static-methods.md) 3. [Exceptions](Exceptions.md)
4. [Static methods](Static-methods.md)
5. [Value Objects](Value-Objects.md)
[&lsaquo; Back to `Readme`](../README.md) [&lsaquo; Back to `Readme`](../README.md)

View File

@@ -1,4 +1,5 @@
# Meritoo Common Library # Meritoo Common Library
Development-related information Development-related information
# Requirements # Requirements
@@ -14,10 +15,10 @@ Development-related information
docker-compose up -d docker-compose up -d
``` ```
2. Install packages by running command: 2. Rebuild project by running command (installs packages, prepares required directories and runs tests):
```bash ```bash
docker-compose run composer install docker-compose exec php phing
``` ```
> [What is Docker?](https://www.docker.com/what-docker) > [What is Docker?](https://www.docker.com/what-docker)
@@ -27,7 +28,7 @@ Development-related information
Available as `composer` service. You can run any Composer's command using the `composer` service: Available as `composer` service. You can run any Composer's command using the `composer` service:
```bash ```bash
docker-compose run composer <command> docker-compose run --rm composer [command]
``` ```
Examples below. Examples below.
@@ -35,25 +36,25 @@ Examples below.
##### Install packages ##### Install packages
```bash ```bash
docker-compose run composer install docker-compose run --rm composer install
``` ```
##### Update packages ##### Update packages
```bash ```bash
docker-compose run composer update docker-compose run --rm composer update
``` ```
##### Add package ##### Add package
```bash ```bash
docker-compose run composer require <vendor>/<package> docker-compose run --rm composer require [vendor]/[package]
``` ```
##### Remove package ##### Remove package
```bash ```bash
docker-compose run composer remove <vendor>/<package> docker-compose run --rm composer remove [vendor]/[package]
``` ```
# Coding Standards Fixer # Coding Standards Fixer
@@ -61,13 +62,19 @@ docker-compose run composer remove <vendor>/<package>
Fix coding standard by running command: Fix coding standard by running command:
```bash ```bash
docker-compose exec php-cli php-cs-fixer fix docker-compose exec php php-cs-fixer fix
```
or
```bash
docker-compose exec php phing -f phing/tests.xml build:fix-coding-standards
``` ```
Omit cache and run the Fixer from scratch by running command: Omit cache and run the Fixer from scratch by running command:
```bash ```bash
docker-compose exec php-cli rm .php_cs.cache && docker-compose exec php-cli php-cs-fixer fix docker-compose exec php rm .php_cs.cache && docker-compose exec php php-cs-fixer fix
``` ```
> [Want more?](https://cs.sensiolabs.org) > [Want more?](https://cs.sensiolabs.org)
@@ -76,43 +83,41 @@ docker-compose exec php-cli rm .php_cs.cache && docker-compose exec php-cli php-
### Prerequisites ### Prerequisites
Install required packages by running command: `docker-compose run composer install`. Install required packages by running command: `docker-compose run --rm composer install`.
### Running tests ### Running [PHPUnit](https://phpunit.de) tests
#### Simply & quick, without code coverage ##### Easy (with code coverage)
Tests are running using Docker and `php-cli` service defined in `docker-compose.yml`. Example:
```bash ```bash
docker-compose exec php-cli phpunit --no-coverage docker-compose run --rm phpunit --verbose
``` ```
You can also run them in container. In this case you have to run 2 commands: or
1. Enter container:
```bash
docker-compose exec php-cli bash
```
2. Run tests:
```bash
phpunit --no-coverage
```
#### With code coverage
```bash ```bash
docker-compose exec php-cli phpunit docker-compose exec php phing -f phing/tests.xml test:phpunit
``` ```
##### Quick (without code coverage)
```bash
docker-compose run --rm phpunit --verbose --no-coverage
```
# Versions of packages
### squizlabs/php_codesniffer
I have to use [squizlabs/php_codesniffer](https://packagist.org/packages/squizlabs/php_codesniffer) `^2.9` instead of
`^3.3`, because [Phing doesn't support 3.x PHP_CodeSniffer](https://github.com/phingofficial/phing/issues/716).
# Other # Other
Rebuild project and run tests by running command: Rebuild project and run tests by running command:
```bash ```bash
docker-compose exec php-cli phing docker-compose exec php phing
``` ```
[&lsaquo; Back to `Readme`](../README.md) [&lsaquo; Back to `Readme`](../README.md)

62
docs/Exceptions.md Normal file
View File

@@ -0,0 +1,62 @@
# Meritoo Common Library
Common and useful classes, methods, exceptions etc.
# Exceptions
### Create instance of exception
This package contains a lot of exceptions. Each of them contains static method `create()` with proper arguments that is used to create instance of the exception. Example:
```php
use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
throw IncorrectBundleNameException::create('RisusIpsum');
```
### Base exception for unknown type of something
##### Short description
It's a `Meritoo\Common\Exception\Base\UnknownTypeException` class. Related to `Meritoo\Common\Type\Base\BaseType` class that represents type of something, e.g. type of button, order.
##### Usage
You can extend `Meritoo\Common\Exception\Base\UnknownTypeException` class and create your own static method, e.g. `createException()`, which will be used create instance of the exception. Inside the `createException()` method you can call `parent::create()` method.
##### Example
```php
<?php
namespace Your\Package\Exception\Type;
use Meritoo\Common\Exception\Base\UnknownTypeException;
use Your\Package\Type\SimpleType;
class UnknownSimpleTypeException extends UnknownTypeException
{
/**
* Creates exception
*
* @param string $unknownType Unknown and simple type
* @return UnknownSimpleTypeException
*/
public static function createException($unknownType)
{
/* @var UnknownSimpleTypeException $exception */
$exception = parent::create($unknownType, new SimpleType(), 'my simple type of something');
return $exception;
}
}
```
# More
1. [Base test case (with common methods and data providers)](Base-test-case.md)
2. [Collection of elements](Collection-of-elements.md)
3. [**Exceptions**](Exceptions.md)
4. [Static methods](Static-methods.md)
5. [Value Objects](Value-Objects.md)
[&lsaquo; Back to `Readme`](../README.md)

View File

@@ -1,4 +1,5 @@
# Meritoo Common Library # Meritoo Common Library
Common and useful classes, methods, exceptions etc. Common and useful classes, methods, exceptions etc.
# Static methods # Static methods
@@ -16,6 +17,8 @@ var_dump($firstElement); // string(5) "lorem"
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-of-elements.md)
3. [**Static methods**](Static-methods.md) 3. [Exceptions](Exceptions.md)
4. [**Static methods**](Static-methods.md)
5. [Value Objects](Value-Objects.md)
[&lsaquo; Back to `Readme`](../README.md) [&lsaquo; Back to `Readme`](../README.md)

53
docs/Value-Objects.md Normal file
View File

@@ -0,0 +1,53 @@
# Meritoo Common Library
Common and useful classes, methods, exceptions etc.
# Value Objects
Located in `Meritoo\Common\ValueObject` namespace.
### Version
##### Namespace
`Meritoo\Common\ValueObject\Version`
##### Info
Represents version of software. Contains 3 properties:
1. `$majorPart` - the "major" part of version
2. `$minorPart` - the "minor" part of version
3. `$patchPart` - the "patch" part of version
##### New instance
New instance can be created using:
1. Constructor:
```php
new Version(1, 0, 2);
```
2. Static methods:
1. `fromArray()` - creates new instance using given version as array
```php
Version::fromArray([1, 0, 2]);
```
2. `fromString()` - creates new instance using given version as string:
```php
Version::fromString('1.0.2');
```
# More
1. [Base test case (with common methods and data providers)](Base-test-case.md)
2. [Collection of elements](Collection-of-elements.md)
3. [Exceptions](Exceptions.md)
4. [Static methods](Static-methods.md)
5. [**Value Objects**](Value-Objects.md)
[&lsaquo; Back to `Readme`](../README.md)

View File

@@ -1,98 +1,184 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.16.0">
<!-- Properties --> <!-- Properties -->
<if> <if>
<available file="phing/properties" property="custom.properties.available"/> <available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
<then> <then>
<property file="phing/properties"/> <property file="${project.basedir}/phing/properties"/>
</then> </then>
<else> <else>
<property file="phing/properties.dist"/> <property file="${project.basedir}/phing/properties.dist"/>
</else> </else>
</if> </if>
<!-- Filesets -->
<import file="${project.basedir}/phing/filesets.xml"/>
<!-- Default / main target --> <!-- Default / main target -->
<target name="build:main" <target name="build:main"
depends="build:app" depends="build:app"
description="Builds the application" /> />
<!-- App target --> <!-- App target -->
<target name="build:app" <target name="build:app"
depends="app:composer, app:vendors, app:checkout" depends="app:clean,
description="Prepares app to build." /> app:composer:self-update,
app:composer:install,
<!-- Updates Composer and validates composer.* files --> app:composer:validate,
<target name="app:composer" description="Updates Composer and validates composer.* files"> app:checkout"
<echo msg="Updating Composer and validating composer.* files..." /> />
<!-- Updates Composer -->
<target name="app:composer:self-update">
<if> <if>
<available file="composer.phar" /> <not>
<available file="${composer.path}" property="composer.local.unavailable"/>
</not>
<then> <then>
<echo msg="[Skipped] Downloading of Composer skipped, because exist in the project..." /> <if>
<os family="windows"/>
<then>
<fail message="Composer not found! Go to http://getcomposer.org/download and download the Composer."/>
</then> </then>
<else> <else>
<if> <exec command="${composer.download_command}" checkreturn="true" passthru="true"/>
<os family="windows" />
<then>
<fail message="Composer not found! Go to http://getcomposer.org/download and download the Composer." />
</then>
<else>
<exec command="${composer.download_command}" checkreturn="true" />
</else> </else>
</if> </if>
</else> </then>
</if> </if>
<!-- Update Composer --> <!-- Update Composer -->
<composer command="selfupdate" /> <composer php="${composer.php}" composer="${composer.path}" command="selfupdate">
<arg value="--ansi"/>
<!-- Validate Composer -->
<composer command="validate">
<arg line="--no-check-all --strict" />
</composer> </composer>
</target> </target>
<!-- Project Install/update vendors --> <!-- Validates composer.* files -->
<target name="app:vendors" description="Installs / updates vendors"> <target name="app:composer:validate" depends="app:composer:install">
<echo msg="Installing / updating vendors..." /> <composer php="${composer.php}" composer="${composer.path}" command="validate">
<arg value="--no-check-all"/>
<if> <arg value="--strict"/>
<istrue value="${composer.self-update}"/> <arg value="--ansi"/>
<then>
<composer php="${composer.php}" composer="${composer.path}" command="self-update"/>
</then>
</if>
<if>
<istrue value="${composer.validate}"/>
<then>
<composer php="${composer.php}" composer="${composer.path}" command="validate"/>
</then>
</if>
<if>
<equals arg1="${env}" arg2="prod" />
<then>
<composer php="${composer.php}" composer="${composer.path}" command="install">
<arg value="--optimize-autoloader" />
<arg value="--prefer-dist" />
<arg value="--classmap-authoritative" />
</composer> </composer>
</target>
<!-- Project clean -->
<target name="app:clean">
<if>
<equals arg1="${env}" arg2="prod"/>
<then>
<echo message="[Skipped] Cleaning project (and directories cleanup) -> 'prod' environment"/>
</then> </then>
<else> <else>
<composer php="${composer.php}" composer="${composer.path}" command="install" /> <foreach list="${directoriesToEmpty}" param="directory" target="app:clean:empty"/>
</else> </else>
</if> </if>
<foreach list="${directoriesToCheck}" param="directory" target="app:clean:check"/>
<touch file="${dir.cache}/.gitkeep"/>
<touch file="${dir.logs}/.gitkeep"/>
<touch file="${dir.sessions}/.gitkeep"/>
<foreach list="${directoriesToEmpty}" param="directory" target="app:permissions"/>
</target>
<!-- Cleaning directory (making empty) directory -->
<target name="app:clean:empty">
<if>
<available file="${directory}" type="dir" property="dir_is_available"/>
<then>
<delete includeemptydirs="true" dir="${directory}"/>
</then>
</if>
</target>
<!-- Checking if directory exists -->
<target name="app:clean:check">
<if>
<not>
<available file="${directory}" type="dir" property="dir_is_available"/>
</not>
<then>
<if>
<or>
<contains string="${directory}" substring="cache"/>
<contains string="${directory}" substring="logs"/>
<contains string="${directory}" substring="sessions"/>
</or>
<then>
<mkdir dir="${directory}" mode="0777"/>
</then>
<else>
<mkdir dir="${directory}" mode="0775"/>
</else>
</if>
</then>
</if>
</target>
<!-- Installs vendors -->
<target name="app:composer:install" depends="app:composer:self-update">
<composer php="${composer.php}" composer="${composer.path}" command="install">
<arg value="--optimize-autoloader"/>
<arg value="--ansi"/>
</composer>
</target>
<!-- Clearing cache -->
<target name="app:cache">
<if>
<istrue value="${cache.clearWithWarmup}"/>
<then>
<SymfonyConsole console="bin/console" command="cache:clear">
<arg name="env" value="${env}"/>
</SymfonyConsole>
</then>
<else>
<SymfonyConsole console="bin/console" command="cache:clear">
<arg name="env" value="${env}"/>
<arg name="no-warmup"/>
</SymfonyConsole>
</else>
</if>
</target>
<!-- Clearing cache (faster) -->
<target name="app:cache:faster">
<SymfonyConsole console="bin/console" command="cache:clear">
<arg name="env" value="${env}"/>
<arg name="no-optional-warmers"/>
</SymfonyConsole>
</target>
<!-- Warming up cache -->
<target name="app:cache:warmup">
<SymfonyConsole console="bin/console" command="cache:warmup">
<arg name="env" value="${env}"/>
</SymfonyConsole>
</target>
<!-- Setting permissions of given directory -->
<target name="app:permissions">
<if>
<not>
<os family="windows"/>
</not>
<then>
<exec command="chmod -R 777 ${directory}/*"/>
</then>
</if>
</target> </target>
<!-- Checkout and finalization --> <!-- Checkout and finalization -->
<target name="app:checkout"> <target name="app:checkout">
<tstamp> <tstamp>
<format property="date_end" pattern="%Y-%m-%d %H:%M" /> <format property="date_end" pattern="%Y-%m-%d %H:%M"/>
</tstamp> </tstamp>
<echo msg="------------------------------------" /> <echo msg="------------------------------------"/>
<echo msg="Build finished at: ${date_end}" /> <echo msg="Build finished at: ${date_end}"/>
<echo msg="------------------------------------" /> <echo msg="------------------------------------"/>
</target> </target>
</project> </project>

20
phing/composer-install.sh Normal file
View File

@@ -0,0 +1,20 @@
#!/bin/sh
EXPECTED_SIGNATURE="$(curl -L https://composer.github.io/installer.sig)"
# Original line (with wget):
# EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")"
if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]
then
>&2 echo 'ERROR: Invalid installer signature'
rm composer-setup.php
exit 1
fi
php composer-setup.php --quiet
RESULT=$?
rm composer-setup.php
exit $RESULT

36
phing/filesets.xml Normal file
View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.16.0">
<!-- Filesets -->
<fileset id="cache" dir="${dir.cache}">
<include name="**/*"/>
<exclude name=".gitkeep"/>
</fileset>
<fileset id="logs" dir="${dir.logs}">
<include name="**/*"/>
<exclude name=".gitkeep"/>
</fileset>
<fileset id="sessions" dir="${dir.sessions}">
<include name="**/*"/>
<exclude name=".gitkeep"/>
</fileset>
<!-- Directories to check -->
<property name="directoriesToCheck" value="
${dir.cache},
${dir.logs},
${dir.sessions},
${dir.data.tests},
${dir.data.temporary},
${dir.docker.data},
${dir.docker.logs}"
/>
<!-- Directories to empty -->
<property name="directoriesToEmpty" value="
${dir.cache},
${dir.logs},
${dir.sessions},
${dir.data.temporary}"
/>
</project>

View File

@@ -1,19 +1,3 @@
# --------------------------------------------------------------------------------
# Information
# --------------------------------------------------------------------------------
# Property files contain key/value pairs
# key = value
#
# Property keys may contain alphanumeric chars and colons, but
# not special chars. This way you can create pseudo-namespaces
#
# You can refer to values of other properties by enclosing their keys in "${}".
# Example: dir.js = ${dir.web}/js
#
# Everything behind the equal sign is the value, you do
# not have to enclose strings: text=This is some text, Your OS is ${php.os}
# -------------------------------------------------------------------------------- # --------------------------------------------------------------------------------
# Common, e.g. default environment # Common, e.g. default environment
# -------------------------------------------------------------------------------- # --------------------------------------------------------------------------------
@@ -22,16 +6,12 @@
# #
env = dev env = dev
# Install assets using symlinks
#
assets.installWithSymlink = true
# Clear cache with the "warmup" option # Clear cache with the "warmup" option
# #
# The cache:clear command should always be called with the --no-warmup option. Warmup should be done via the cache:warmup command. # The cache:clear command should always be called with the --no-warmup option. Warmup should be done via the cache:warmup command.
# https://github.com/symfony/symfony/blob/master/UPGRADE-3.3.md#frameworkbundle # https://github.com/symfony/symfony/blob/master/UPGRADE-3.3.md#frameworkbundle
# #
# Krzysztof Niziol <krzysztof.niziol@meritoo.pl> # Meritoo <github@meritoo.pl>
# 2017-06-06 # 2017-06-06
# #
cache.clearWithWarmup = false cache.clearWithWarmup = false
@@ -40,67 +20,63 @@ cache.clearWithWarmup = false
# Composer # Composer
# -------------------------------------------------------------------------------- # --------------------------------------------------------------------------------
composer.download_command = php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));" # Command used to download Composer
# Path to composer executable or composer.phar file
# #
composer.path = composer.phar composer.download_command = bash ${project.basedir}/phing/composer-install.sh
#composer.path = /usr/local/bin/composer
# Path to composer executable or downloaded composer.phar file
#
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
# Self update of the composer
#
composer.self-update = false
# Validate the composer.json file
#
composer.validate = false
# -------------------------------------------------------------------------------- # --------------------------------------------------------------------------------
# Directories # Directories
# -------------------------------------------------------------------------------- # --------------------------------------------------------------------------------
# System directories # System directories
# #
dir.data = ${project.basedir}/data
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.tests = ${project.basedir}/tests dir.tests = ${project.basedir}/tests
# --------------------------------------------------------------------------------
# Build directories # Build directories
# -------------------------------------------------------------------------------- #
dir.build = ${project.basedir}/build dir.build = ${project.basedir}/build
dir.reports = ${dir.build}/logs dir.reports = ${dir.build}/reports
dir.reports.pdepend = ${dir.reports}/pdepend dir.reports.pdepend = ${dir.reports}/pdepend
dir.reports.coverage = ${dir.reports}/phpunit_coverage dir.reports.coverage = ${dir.reports}/phpunit_coverage
#
# Disabled, because unnecessary right now
# phpdocumentor/phpdocumentor cannot be installed via Composer
#
# Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
# 2017-02-22
#
#dir.docs = ${dir.build}/docs
#dir.docs.phpdoc2 = ${dir.docs}/phpdoc2
# --------------------------------------------------------------------------------
# Data directories # Data directories
# -------------------------------------------------------------------------------- #
dir.data.tests = ${dir.data}/tests
dir.data.temporary = ${dir.data}/tmp dir.data.temporary = ${dir.data}/tmp
# Docker directories
#
dir.docker = ${project.basedir}/docker
dir.docker.data = ${dir.docker}/data/db
dir.docker.logs = ${dir.docker}/logs/nginx
# -------------------------------------------------------------------------------- # --------------------------------------------------------------------------------
# Testing # Testing
# -------------------------------------------------------------------------------- # --------------------------------------------------------------------------------
# Path of the framework used to run unit tests
#
tests.framework.path = ./vendor/bin/phpunit --verbose --no-coverage --testdox
# Path of the PHP Coding Standards Fixer (http://cs.sensiolabs.org) # Path of the PHP Coding Standards Fixer (http://cs.sensiolabs.org)
# #
phpCsFixer.path = ./vendor/bin/php-cs-fixer tests.cs_fixer.command = ./vendor/bin/php-cs-fixer fix --verbose
# Test database path
#
tests.database = ${dir.data.temporary}/database.sqlite
# Paths of frameworks used to run tests:
# - PHPUnit (unit tests)
#
tests.phpunit.command = ./vendor/bin/phpunit --verbose

View File

@@ -1,230 +1,133 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.14.0">
<!--
The AutoloaderTask is required to load binaries installed by Composer.
The "autoloaderpath" attribute of this task is not required, because it's default value is: vendor/autoload.php.
Krzysztof Niziol <krzysztof.niziol@meritoo.pl> <project name="Meritoo Package" basedir="." default="build:main" phingVersion="2.16.0">
2017-02-23 <autoloader/>
-->
<autoloader />
<!-- Properties --> <!-- Properties -->
<if> <if>
<available file="phing/properties" property="custom.properties.available"/> <available file="${project.basedir}/phing/properties" property="custom.properties.available"/>
<then> <then>
<property file="phing/properties"/> <property file="${project.basedir}/phing/properties"/>
</then> </then>
<else> <else>
<property file="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 -->
<target name="build:main" <target name="build:main"
depends="build:fix-coding-standards, build:clean, build:prepare, build:check, build:test, app:checkout" depends="build:fix-coding-standards,
description="Runs all tests and builds everything" /> build:check,
<!-- build:test,
Before: app:checkout"
depends="build:fix-coding-standards, build:clean, build:prepare, build:check, build:test, build:doc, app:checkout" />
After:
depends="build:fix-coding-standards, build:clean, build:prepare, build:check, build:test, app:checkout"
The "build:doc" task is disabled, because it cannot be installed via Composer:
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
2017-02-22
-->
<!-- Fixing coding standards using the PHP Coding Standards Fixer (http://cs.sensiolabs.org) --> <!-- Fixing coding standards using the PHP Coding Standards Fixer (http://cs.sensiolabs.org) -->
<target name="build:fix-coding-standards" description="Fixes coding standards using the PHP Coding Standards Fixer"> <target name="build:fix-coding-standards">
<echo msg="Fixing coding standards using the PHP Coding Standards Fixer (http://cs.sensiolabs.org)..." /> <exec command="${tests.cs_fixer.command}" passthru="true"/>
<!--
Attention.
Rules for formatting are defined in /.php_cs.dist file.
-->
<exec
passthru="true"
command="${phpCsFixer.path} fix --verbose"
/>
</target> </target>
<!-- Doc target -->
<!--
Disabled, because it cannot be installed via Composer:
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
2017-02-22
-->
<!--<target name="build:doc"-->
<!--depends="build:prepare, doc:phpdoc2"-->
<!--description="Generates API documentation" />-->
<!-- Check target --> <!-- Check target -->
<target name="build:check" <target name="build:check"
depends="check:cs, check:md, check:cpd, check:depend, check:loc" depends="check:cs,
description="Analyzes code" /> check:md,
check:cpd,
check:depend,
check:loc"
/>
<!-- Test target --> <!-- Test target -->
<target name="build:test" <target name="build:test"
depends="test:unit" depends="test:phpunit"
description="Executes all tests" /> />
<!-- Project build clean -->
<target name="build:clean" description="Cleans up build directories">
<echo msg="Cleaning docs and reports directories..." />
<!--<delete dir="${dir.docs}" />-->
<delete dir="${dir.reports}" />
</target>
<!-- Project build prepare -->
<target name="build:prepare" description="Create build directories">
<echo msg="Creating build directories..." />
<!--<mkdir dir="${dir.docs}" />-->
<!--<mkdir dir="${dir.docs.phpdoc2}" />-->
<mkdir dir="${dir.reports}" />
<mkdir dir="${dir.reports.pdepend}" />
<mkdir dir="${dir.reports.coverage}"/>
</target>
<!-- PHPDocumentor2 API documentation target -->
<!--
Disabled, because it cannot be installed via Composer:
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
2017-02-22
<target name="doc:phpdoc2" description="Generates API documentations">
<echo msg="Generating API Documentation with phpDocumentor 2..." />
<phpdoc2 title="${phing.project.name}"
destdir="${dir.docs.phpdoc2}"
template="responsive">
<fileset refid="sourcecode" />
</phpdoc2>
</target>
-->
<!-- Symfony2 code sniffer --> <!-- Symfony2 code sniffer -->
<!-- <target name="check:cs" depends="build:prepare">
Attention 1.
To use Symfony2 standards to check coding you have to:
copy, symlink or check out repo to a folder called Symfony2 inside the phpcs Standards directory.
Example:
$ pear config-show | grep php_dir
$ cd /path/to/pear/PHP/CodeSniffer/Standards
$ git clone git://github.com/opensky/Symfony2-coding-standard.git Symfony2
Attention 2.
PSR2 standard is used instead of Symfony2 standard, because after installation squizlabs/php_codesniffer package
via Composer the Symfony2 standard is not included / available in this package. In this case the PHP Coding
Standards Fixer (http://cs.sensiolabs.org) is used.
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
2017-02-22
-->
<target name="check:cs" description="Checks coding standard">
<echo msg="Checking coding standard..." />
<phpcodesniffer standard="PSR2" showWarnings="true"> <phpcodesniffer standard="PSR2" showWarnings="true">
<fileset refid="sourcecode" /> <fileset refid="sourcecode"/>
<formatter type="checkstyle" outfile="${dir.reports}/checkstyle.xml" /> <formatter type="checkstyle" outfile="${dir.reports}/checkstyle.xml"/>
<formatter type="csv" outfile="${dir.reports}/checkstyle.csv" /> <formatter type="csv" outfile="${dir.reports}/checkstyle.csv"/>
<formatter type="summary" outfile="${dir.reports}/checkstyle_summary.txt" /> <formatter type="summary" outfile="${dir.reports}/checkstyle_summary.txt"/>
</phpcodesniffer> </phpcodesniffer>
</target> </target>
<!-- copy/paste detector --> <!-- copy/paste detector -->
<target name="check:cpd" description="Checks similar code blocks."> <target name="check:cpd" depends="build:prepare">
<echo msg="Checking similar code blocks..." />
<phpcpd> <phpcpd>
<fileset refid="sourcecode" /> <fileset refid="sourcecode"/>
<formatter type="pmd" outfile="${dir.reports}/pmd-cpd.xml" /> <formatter type="pmd" outfile="${dir.reports}/pmd-cpd.xml"/>
</phpcpd> </phpcpd>
<!--
Previous / old version
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
2017-02-22
<exec command="phpcpd \-\-log-pmd=${dir.reports}/pmd-cpd.xml ${dir.src}" />
-->
</target> </target>
<!-- Mess detector --> <!-- Mess detector -->
<target name="check:md" description="Generate code metrics"> <target name="check:md" depends="build:prepare">
<echo msg="Generating code metrics..." />
<phpmd rulesets="codesize,controversial,design,naming,unusedcode"> <phpmd rulesets="codesize,controversial,design,naming,unusedcode">
<fileset refid="sourcecode" /> <fileset refid="sourcecode"/>
<formatter type="html" outfile="${dir.reports}/phpmd.html" /> <formatter type="html" outfile="${dir.reports}/phpmd.html"/>
<formatter type="text" outfile="${dir.reports}/phpmd.txt" /> <formatter type="text" outfile="${dir.reports}/phpmd.txt"/>
</phpmd> </phpmd>
</target> </target>
<!-- Code dependency --> <!-- Code dependency -->
<target name="check:depend" description="Checks coupling and dependency"> <target name="check:depend" depends="build:prepare">
<echo msg="Checking coupling and dependency..." />
<phpdepend> <phpdepend>
<fileset refid="sourcecode" /> <fileset refid="sourcecode"/>
<logger type="jdepend-xml" outfile="${dir.reports.pdepend}/jdepend.xml" /> <logger type="jdepend-xml" outfile="${dir.reports.pdepend}/jdepend.xml"/>
<logger type="jdepend-chart" outfile="${dir.reports.pdepend}/dependencies.svg" /> <logger type="jdepend-chart" outfile="${dir.reports.pdepend}/dependencies.svg"/>
<logger type="overview-pyramid" outfile="${dir.reports.pdepend}/overview-pyramid.svg" /> <logger type="overview-pyramid" outfile="${dir.reports.pdepend}/overview-pyramid.svg"/>
</phpdepend> </phpdepend>
</target> </target>
<!-- Measure the size and analyzing the structure of a project --> <!-- Measure the size and analyzing the structure of a project -->
<target name="check:loc" description="Measures the size and analyzes the structure of a project"> <target name="check:loc" depends="build:prepare">
<echo msg="Measuring the size and analyzing the structure of a project..." />
<phploc reportType="txt" reportName="phploc" reportDirectory="${dir.reports}"> <phploc reportType="txt" reportName="phploc" reportDirectory="${dir.reports}">
<fileset refid="sourcecode" /> <fileset refid="sourcecode"/>
</phploc> </phploc>
<!--
Previous / old version
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
2017-02-22
<exec command="phploc \-\-log-csv=${dir.reports}/phploc.csv ${dir.src}" />
-->
</target> </target>
<!-- Unit tests --> <!-- PHPUnit tests -->
<target name="test:unit" description="Executes unit tests"> <target name="test:phpunit" depends="build:prepare">
<echo msg="Running unit tests..." /> <exec command="${tests.phpunit.command}" passthru="true"/>
<exec command="${tests.framework.path}" passthru="true"/> </target>
<!-- Project build clean -->
<target name="build:clean">
<if>
<available file="${dir.reports}" type="dir" property="dir_is_available"/>
<then>
<delete dir="${dir.reports}"/>
</then>
</if>
</target>
<!-- Project build prepare -->
<target name="build:prepare" depends="build:clean">
<mkdir dir="${dir.reports}"/>
<mkdir dir="${dir.reports.pdepend}"/>
<mkdir dir="${dir.reports.coverage}"/>
</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>

View File

@@ -1,28 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.de/manual/4.8/en/appendixes.configuration.html -->
<phpunit <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/4.8/phpunit.xsd" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/4.8/phpunit.xsd"
backupGlobals="true" bootstrap="vendor/autoload.php"
backupStaticAttributes="false"
bootstrap="./vendor/autoload.php"
cacheTokens="false"
colors="true" colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
forceCoversAnnotation="false"
mapTestClassNameToCoveredClassName="false"
processIsolation="false"
stopOnError="false"
stopOnFailure="false"
stopOnIncomplete="false"
stopOnSkipped="false"
stopOnRisky="false"
testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
timeoutForSmallTests="1"
timeoutForMediumTests="10"
timeoutForLargeTests="60"
verbose="true" verbose="true"
> >
<php> <php>
@@ -31,23 +14,17 @@
<testsuites> <testsuites>
<testsuite name="Meritoo Package - Main Test Suite"> <testsuite name="Meritoo Package - Main Test Suite">
<directory>./tests/</directory> <directory>tests/</directory>
</testsuite> </testsuite>
</testsuites> </testsuites>
<filter> <filter>
<whitelist> <whitelist>
<directory>./src/</directory> <directory>src/</directory>
</whitelist> </whitelist>
</filter> </filter>
<groups>
<exclude>
<group>performance</group>
</exclude>
</groups>
<logging> <logging>
<log type="coverage-html" target="./build/logs/phpunit_coverage/html"/> <log type="coverage-html" target="build/reports/phpunit_coverage/html"/>
</logging> </logging>
</phpunit> </phpunit>

View File

@@ -18,8 +18,8 @@ use Meritoo\Common\Utilities\Arrays;
* Collection of elements. * Collection of elements.
* It's a set of some elements, e.g. objects. * It's a set of some elements, e.g. objects.
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Collection implements Countable, ArrayAccess, IteratorAggregate class Collection implements Countable, ArrayAccess, IteratorAggregate
{ {

View File

@@ -15,27 +15,28 @@ use Meritoo\Common\Utilities\Arrays;
/** /**
* An exception used while type of something is unknown * An exception used while type of something is unknown
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
abstract class UnknownTypeException extends Exception abstract class UnknownTypeException extends Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param string|int $unknownType The unknown type of something (value of constant) * @param mixed $unknownType The unknown type of something (value of constant)
* @param BaseType $typeInstance An instance of class that contains type of the something * @param BaseType $typeInstance An instance of class that contains type of the something
* @param string $typeName Name of the something * @param string $typeName Name of the something
* @return UnknownTypeException
*/ */
public function __construct($unknownType, BaseType $typeInstance, $typeName) public static function create($unknownType, BaseType $typeInstance, $typeName)
{ {
$allTypes = $typeInstance->getAll();
$types = Arrays::values2string($allTypes, '', ', ');
$template = 'The \'%s\' type of %s is unknown. Probably doesn\'t exist or there is a typo. You should use one' $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.';
$message = sprintf(sprintf($template, $unknownType, $typeName, $types)); $allTypes = $typeInstance->getAll();
parent::__construct($message); $types = Arrays::values2string($allTypes, '', ', ');
$message = sprintf($template, $unknownType, $typeName, $types);
return new static($message);
} }
} }

View File

@@ -13,22 +13,24 @@ use Exception;
/** /**
* An exception used while name of bundle is incorrect * An exception used while name of bundle is incorrect
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class IncorrectBundleNameException extends Exception class IncorrectBundleNameException extends Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param string $bundleName Incorrect name of bundle * @param string $bundleName Incorrect name of bundle
* @return IncorrectBundleNameException
*/ */
public function __construct($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);
parent::__construct($message);
return new static($message);
} }
} }

View File

@@ -1,32 +0,0 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Exception\Date;
use Meritoo\Common\Exception\Base\UnknownTypeException;
use Meritoo\Common\Type\DatePartType;
/**
* An exception used while type of date part, e.g. "year", is unknown
*
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
* @copyright Meritoo.pl
*/
class UnknownDatePartTypeException extends UnknownTypeException
{
/**
* Class constructor
*
* @param string $unknownDatePart Type of date part, e.g. "year". One of DatePartType class constants.
* @param string $value Incorrect value
*/
public function __construct($unknownDatePart, $value)
{
parent::__construct($unknownDatePart, new DatePartType(), sprintf('date part (with value %s)', $value));
}
}

View File

@@ -11,21 +11,22 @@ namespace Meritoo\Common\Exception\File;
/** /**
* 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 Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class EmptyFileException extends \Exception class EmptyFileException extends \Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param string $emptyFilePath Path of the empty file * @param string $emptyFilePath Path of the empty file
* @return EmptyFileException
*/ */
public function __construct($emptyFilePath) public static function create($emptyFilePath)
{ {
$template = 'File with path \'%s\' is empty (has no content). Did you provide path of proper file?'; $template = 'File with path \'%s\' is empty (has no content). Did you provide path of proper file?';
$message = sprintf($template, $emptyFilePath); $message = sprintf($template, $emptyFilePath);
parent::__construct($message); return new static($message);
} }
} }

View File

@@ -11,16 +11,16 @@ namespace Meritoo\Common\Exception\File;
/** /**
* An exception used while path of given file is empty * An exception used while path of given file is empty
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class EmptyFilePathException extends \Exception class EmptyFilePathException extends \Exception
{ {
/** /**
* Class constructor * Creates exception
*/ */
public function __construct() public static function create()
{ {
parent::__construct('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?');
} }
} }

View File

@@ -11,21 +11,22 @@ namespace Meritoo\Common\Exception\File;
/** /**
* An exception used while file with given path does not exist * An exception used while file with given path does not exist
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class NotExistingFileException extends \Exception class NotExistingFileException extends \Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param string $notExistingFilePath Path of not existing (or not readable) file * @param string $notExistingFilePath Path of not existing (or not readable) file
* @return NotExistingFileException
*/ */
public function __construct($notExistingFilePath) public static function create($notExistingFilePath)
{ {
$template = 'File with path \'%s\' does not exist (or is not readable). Did you provide path of proper file?'; $template = 'File with path \'%s\' does not exist (or is not readable). Did you provide path of proper file?';
$message = sprintf($template, $notExistingFilePath); $message = sprintf($template, $notExistingFilePath);
parent::__construct($message); return new static($message);
} }
} }

View File

@@ -13,18 +13,19 @@ use Exception;
/** /**
* An exception used while method cannot be called, because is disabled * An exception used while method cannot be called, because is disabled
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class DisabledMethodException extends Exception class DisabledMethodException extends Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param string $disabledMethod Name of the disabled method * @param string $disabledMethod Name of the disabled method
* @param string $alternativeMethod (optional) Name of the alternative method * @param string $alternativeMethod (optional) Name of the alternative method
* @return DisabledMethodException
*/ */
public function __construct($disabledMethod, $alternativeMethod = '') public static function create($disabledMethod, $alternativeMethod = '')
{ {
$template = 'Method %s() cannot be called, because is disabled.'; $template = 'Method %s() cannot be called, because is disabled.';
@@ -33,6 +34,7 @@ class DisabledMethodException extends Exception
} }
$message = sprintf($template, $disabledMethod, $alternativeMethod); $message = sprintf($template, $disabledMethod, $alternativeMethod);
parent::__construct($message);
return new static($message);
} }
} }

View File

@@ -13,20 +13,21 @@ use Exception;
/** /**
* An exception used while name of class or trait cannot be resolved * An exception used while name of class or trait cannot be resolved
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class CannotResolveClassNameException extends Exception class CannotResolveClassNameException extends Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param array|object|string $source Source of the class's / trait's name. It can be an array of objects, * @param array|object|string $source Source of the class's / trait's name. It can be an array of objects,
* namespaces, object or namespace. * namespaces, object or namespace.
* @param bool $forClass (optional) If is set to true, message of this exception for class is * @param bool $forClass (optional) If is set to true, message of this exception for class is
* prepared. Otherwise - for trait. * prepared. Otherwise - for trait.
* @return CannotResolveClassNameException
*/ */
public function __construct($source, $forClass = true) public static function create($source, $forClass = true)
{ {
$forWho = 'trait'; $forWho = 'trait';
$value = ''; $value = '';
@@ -42,6 +43,6 @@ class CannotResolveClassNameException extends Exception
$template = 'Name of %s from given \'%s\'%s cannot be resolved. Is there everything ok?'; $template = 'Name of %s from given \'%s\'%s cannot be resolved. Is there everything ok?';
$message = sprintf($template, $forWho, gettype($source), $value); $message = sprintf($template, $forWho, gettype($source), $value);
parent::__construct($message); return new static($message);
} }
} }

View File

@@ -14,18 +14,19 @@ use Meritoo\Common\Utilities\Reflection;
/** /**
* An exception used while given class has no child classes * An exception used while given class has no child classes
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class MissingChildClassesException extends Exception class MissingChildClassesException extends Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param array|object|string $parentClass Class that hasn't child classes, but it should. An array of objects, * @param array|object|string $parentClass Class that hasn't child classes, but it should. An array of objects,
* strings, object or string. * strings, object or string.
* @return MissingChildClassesException
*/ */
public function __construct($parentClass) public static function create($parentClass)
{ {
$template = 'The \'%s\' class requires one child class at least who will extend her (maybe is an abstract' $template = 'The \'%s\' class requires one child class at least who will extend her (maybe is an abstract'
. ' class), but the child classes are missing. Did you forget to extend this class?'; . ' class), but the child classes are missing. Did you forget to extend this class?';
@@ -33,6 +34,6 @@ class MissingChildClassesException extends Exception
$parentClassName = Reflection::getClassName($parentClass); $parentClassName = Reflection::getClassName($parentClass);
$message = sprintf($template, $parentClassName); $message = sprintf($template, $parentClassName);
parent::__construct($message); return new static($message);
} }
} }

View File

@@ -0,0 +1,33 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Exception\Reflection;
/**
* An exception used while property does not exist in instance of class
*
* @author Meritoo <github@meritoo.pl>
* @copyright Meritoo <http://www.meritoo.pl>
*/
class NotExistingPropertyException extends \Exception
{
/**
* Creates exception
*
* @param mixed $object Object that should contains given property
* @param string $property Name of the property
* @return NotExistingPropertyException
*/
public static function create($object, $property)
{
$template = 'Property \'%s\' does not exist in instance of class \'%s\'. Did you use proper name of property?';
$message = sprintf($template, $property, get_class($object));
return new static($message);
}
}

View File

@@ -14,19 +14,20 @@ use Meritoo\Common\Utilities\Reflection;
/** /**
* An exception used while given class has more than one child class * An exception used while given class has more than one child class
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class TooManyChildClassesException extends Exception class TooManyChildClassesException extends Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param array|object|string $parentClass Class that has more than one child class, but it shouldn't. An array * @param array|object|string $parentClass Class that has more than one child class, but it shouldn't. An array
* of objects, strings, object or string. * of objects, strings, object or string.
* @param array $childClasses Child classes * @param array $childClasses Child classes
* @return TooManyChildClassesException
*/ */
public function __construct($parentClass, array $childClasses) public static function create($parentClass, array $childClasses)
{ {
$template = "The '%s' class requires one child class at most who will extend her, but more than one child" $template = "The '%s' class requires one child class at most who will extend her, but more than one child"
. " class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?"; . " class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
@@ -34,6 +35,6 @@ class TooManyChildClassesException extends Exception
$parentClassName = Reflection::getClassName($parentClass); $parentClassName = Reflection::getClassName($parentClass);
$message = sprintf($template, $parentClassName, implode("\n- ", $childClasses), $parentClassName); $message = sprintf($template, $parentClassName, implode("\n- ", $childClasses), $parentClassName);
parent::__construct($message); return new static($message);
} }
} }

View File

@@ -11,22 +11,24 @@ namespace Meritoo\Common\Exception\Regex;
/** /**
* An exception used while length of given hexadecimal value of color is incorrect * An exception used while length of given hexadecimal value of color is incorrect
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class IncorrectColorHexLengthException extends \Exception class IncorrectColorHexLengthException extends \Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param string $color Incorrect hexadecimal value of color * @param string $color Incorrect hexadecimal value of color
* @return IncorrectColorHexLengthException
*/ */
public function __construct($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));
parent::__construct($message);
return new static($message);
} }
} }

View File

@@ -11,19 +11,21 @@ namespace Meritoo\Common\Exception\Regex;
/** /**
* An exception used while given hexadecimal value of color is invalid * An exception used while given hexadecimal value of color is invalid
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class InvalidColorHexValueException extends \Exception class InvalidColorHexValueException extends \Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param string $color Invalid hexadecimal value of color * @param string $color Invalid hexadecimal value of color
* @return InvalidColorHexValueException
*/ */
public function __construct($color) public static function create($color)
{ {
$message = sprintf('Hexadecimal value of color \'%s\' is invalid. Is there everything ok?', $color); $message = sprintf('Hexadecimal value of color \'%s\' is invalid. Is there everything ok?', $color);
parent::__construct($message);
return new static($message);
} }
} }

View File

@@ -11,19 +11,21 @@ namespace Meritoo\Common\Exception\Regex;
/** /**
* An exception used while html attributes are invalid * An exception used while html attributes are invalid
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class InvalidHtmlAttributesException extends \Exception class InvalidHtmlAttributesException extends \Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param string $htmlAttributes Invalid html attributes * @param string $htmlAttributes Invalid html attributes
* @return InvalidHtmlAttributesException
*/ */
public function __construct($htmlAttributes) public static function create($htmlAttributes)
{ {
$message = sprintf('HTML attributes \'%s\' are invalid. Is there everything ok?', $htmlAttributes); $message = sprintf('HTML attributes \'%s\' are invalid. Is there everything ok?', $htmlAttributes);
parent::__construct($message);
return new static($message);
} }
} }

View File

@@ -1,23 +1,31 @@
<?php <?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Exception\Regex; namespace Meritoo\Common\Exception\Regex;
/** /**
* An exception used while url is invalid * An exception used while url is invalid
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class InvalidUrlException extends \Exception class InvalidUrlException extends \Exception
{ {
/** /**
* Class constructor * Creates exception
* *
* @param string $url Invalid url * @param string $url Invalid url
* @return InvalidUrlException
*/ */
public function __construct($url) public static function create($url)
{ {
$message = sprintf('Url \'%s\' is invalid. Is there everything ok?', $url); $message = sprintf('Url \'%s\' is invalid. Is there everything ok?', $url);
parent::__construct($message);
return new static($message);
} }
} }

View File

@@ -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\Type;
use Meritoo\Common\Exception\Base\UnknownTypeException;
use Meritoo\Common\Type\DatePartType;
/**
* An exception used while type of date part, e.g. "year", is unknown
*
* @author Meritoo <github@meritoo.pl>
* @copyright Meritoo <http://www.meritoo.pl>
*/
class UnknownDatePartTypeException extends UnknownTypeException
{
/**
* Creates exception
*
* @param string $unknownDatePart Unknown type of date part
* @param string $value Incorrect value
* @return UnknownDatePartTypeException
*/
public static function createException($unknownDatePart, $value)
{
/* @var UnknownDatePartTypeException $exception */
$exception = parent::create($unknownDatePart, new DatePartType(), sprintf('date part (with value %s)', $value));
return $exception;
}
}

View File

@@ -1,5 +1,11 @@
<?php <?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Exception\Type; namespace Meritoo\Common\Exception\Type;
use Meritoo\Common\Exception\Base\UnknownTypeException; use Meritoo\Common\Exception\Base\UnknownTypeException;
@@ -8,16 +14,22 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* An exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is unknown * An exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is unknown
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class UnknownOopVisibilityTypeException extends UnknownTypeException class UnknownOopVisibilityTypeException extends UnknownTypeException
{ {
/** /**
* {@inheritdoc} * Creates exception
*
* @param string $unknownType Unknown visibility of a property, a method or (as of PHP 7.1.0) a constant
* @return UnknownOopVisibilityTypeException
*/ */
public function __construct($unknownType) public static function createException($unknownType)
{ {
parent::__construct($unknownType, new OopVisibilityType(), 'OOP-related visibility'); /* @var UnknownOopVisibilityTypeException $exception */
$exception = parent::create($unknownType, new OopVisibilityType(), 'OOP-related visibility');
return $exception;
} }
} }

View File

@@ -14,8 +14,8 @@ use PHPUnit\Framework\TestCase;
/** /**
* Base test case with common methods and data providers * Base test case with common methods and data providers
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
abstract class BaseTestCase extends TestCase abstract class BaseTestCase extends TestCase
{ {

View File

@@ -13,8 +13,8 @@ use Meritoo\Common\Traits\Test\Base\BaseTypeTestCaseTrait;
/** /**
* Base test case for the type of something * Base test case for the type of something
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
abstract class BaseTypeTestCase extends BaseTestCase abstract class BaseTypeTestCase extends BaseTestCase
{ {

View File

@@ -0,0 +1,110 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Traits\CssSelector;
/**
* Useful methods related to CSS selectors of form
*
* @author Meritoo <github@meritoo.pl>
* @copyright Meritoo <http://www.meritoo.pl>
*/
trait FormCssSelector
{
/**
* Returns selector of form based on its name
*
* @param string $formName Name of form (value of the "name" attribute)
* @return string
*/
public static function getFormByNameSelector($formName)
{
$formName = trim($formName);
if (empty($formName)) {
return '';
}
return sprintf('form[name="%s"]', $formName);
}
/**
* Returns selector of the input field based on its name
*
* @param string $formName Name of form (value of the "name" attribute)
* @param string $fieldName Name of field (value of the "name" attribute)
* @return string
*/
public static function getInputByNameSelector($formName, $fieldName)
{
$formSelector = static::getFormByNameSelector($formName);
$fieldName = trim($fieldName);
if (empty($formSelector) || empty($fieldName)) {
return '';
}
return sprintf('%s input[name="%s"]', $formSelector, $fieldName);
}
/**
* Returns selector of the input field based on its ID
*
* @param string $formName Name of form (value of the "name" attribute)
* @param string $fieldId ID of field (value of the "id" attribute)
* @return string
*/
public static function getInputByIdSelector($formName, $fieldId)
{
$formSelector = static::getFormByNameSelector($formName);
$fieldId = trim($fieldId);
if (empty($formSelector) || empty($fieldId)) {
return '';
}
return sprintf('%s input#%s', $formSelector, $fieldId);
}
/**
* Returns selector of label
*
* @param string $formName Name of form (value of the "name" attribute)
* @param string $fieldId ID of field (value of the "id" attribute)
* @return string
*/
public static function getLabelSelector($formName, $fieldId)
{
$formSelector = static::getFormByNameSelector($formName);
$fieldId = trim($fieldId);
if (empty($formSelector) || empty($fieldId)) {
return '';
}
return sprintf('%s label[for="%s"]', $formSelector, $fieldId);
}
/**
* Returns selector of field-set using index/position of the field-set
*
* @param string $formName Name of form (value of the "name" attribute)
* @param int $fieldSetIndex Index/Position of the field-set
* @return string
*/
public static function getFieldSetByIndexSelector($formName, $fieldSetIndex)
{
$formSelector = static::getFormByNameSelector($formName);
if (empty($formSelector) || 0 > $fieldSetIndex) {
return '';
}
return sprintf('%s fieldset:nth-of-type(%d)', $formSelector, $fieldSetIndex);
}
}

View File

@@ -14,16 +14,14 @@ 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 ReflectionException;
use ReflectionMethod; use ReflectionMethod;
use stdClass; use stdClass;
/** /**
* BaseTestCaseTrait * Trait for the base test case
* Created on 2017-11-02
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
trait BaseTestCaseTrait trait BaseTestCaseTrait
{ {
@@ -49,6 +47,20 @@ trait BaseTestCaseTrait
yield[[]]; 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
* *
@@ -159,7 +171,6 @@ trait BaseTestCaseTrait
* @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments * @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments
* of the verified method * of the verified method
* @throws UnknownOopVisibilityTypeException * @throws UnknownOopVisibilityTypeException
* @throws ReflectionException
* *
* Attention. 2nd argument, the $method, may be: * Attention. 2nd argument, the $method, may be:
* - string - name of the method * - string - name of the method
@@ -216,8 +227,6 @@ trait BaseTestCaseTrait
* @param int $argumentsCount (optional) Expected count/amount of arguments of the verified method * @param int $argumentsCount (optional) Expected count/amount of arguments of the verified method
* @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments of the verified * @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments of the verified
* method * method
* @throws ReflectionException
* @throws UnknownOopVisibilityTypeException
*/ */
protected static function assertConstructorVisibilityAndArguments( protected static function assertConstructorVisibilityAndArguments(
$classNamespace, $classNamespace,
@@ -231,14 +240,19 @@ trait BaseTestCaseTrait
$reflection = new ReflectionClass($classNamespace); $reflection = new ReflectionClass($classNamespace);
$method = $reflection->getConstructor(); $method = $reflection->getConstructor();
static::assertMethodVisibilityAndArguments($classNamespace, $method, $visibilityType, $argumentsCount, $requiredArgumentsCount); static::assertMethodVisibilityAndArguments(
$classNamespace,
$method,
$visibilityType,
$argumentsCount,
$requiredArgumentsCount
);
} }
/** /**
* Asserts that class with given namespace has no constructor * Asserts that class with given namespace has no constructor
* *
* @param string $classNamespace Namespace of class that contains constructor to verify * @param string $classNamespace Namespace of class that contains constructor to verify
* @throws ReflectionException
*/ */
protected static function assertHasNoConstructor($classNamespace) protected static function assertHasNoConstructor($classNamespace)
{ {

View File

@@ -14,8 +14,8 @@ use Meritoo\Common\Type\Base\BaseType;
/** /**
* Trait for the base test case for the type of something * Trait for the base test case for the type of something
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
trait BaseTypeTestCaseTrait trait BaseTypeTestCaseTrait
{ {

View File

@@ -14,8 +14,8 @@ use Meritoo\Common\Utilities\Reflection;
* Base / abstract type of something, e.g. type of button, order, date etc. * Base / abstract type of something, e.g. type of button, order, date etc.
* Child class should contain constants - each of them represent one type. * Child class should contain constants - each of them represent one type.
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
abstract class BaseType abstract class BaseType
{ {
@@ -43,7 +43,7 @@ abstract class BaseType
/** /**
* Returns information if given type is correct * Returns information if given type is correct
* *
* @param string $type The type to check * @param mixed $type The type to check
* @return bool * @return bool
*/ */
public function isCorrectType($type) public function isCorrectType($type)

View File

@@ -13,8 +13,8 @@ use Meritoo\Common\Type\Base\BaseType;
/** /**
* Type of date part, e.g. "year" * Type of date part, e.g. "year"
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class DatePartType extends BaseType class DatePartType extends BaseType
{ {

View File

@@ -16,8 +16,8 @@ use Meritoo\Common\Utilities\Date;
* A date's period. * A date's period.
* Contains start and end date of the period. * Contains start and end date of the period.
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class DatePeriod extends BaseType class DatePeriod extends BaseType
{ {

View File

@@ -7,8 +7,8 @@ use Meritoo\Common\Type\Base\BaseType;
/** /**
* The visibility of a property, a method or (as of PHP 7.1.0) a constant * The visibility of a property, a method or (as of PHP 7.1.0) a constant
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
* *
* @see http://php.net/manual/en/language.oop5.visibility.php * @see http://php.net/manual/en/language.oop5.visibility.php
*/ */

View File

@@ -11,8 +11,8 @@ namespace Meritoo\Common\Utilities;
/** /**
* Useful arrays methods * Useful arrays methods
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Arrays class Arrays
{ {
@@ -673,7 +673,7 @@ class Arrays
return null; return null;
} }
$effect = $array; $effect = &$array;
ksort($effect, $sortFlags); ksort($effect, $sortFlags);
foreach ($effect as &$value) { foreach ($effect as &$value) {
@@ -822,13 +822,20 @@ class Arrays
*/ */
public static function getLastElementsPaths(array $array, $separator = '.', $parentPath = '', $stopIfMatchedBy = '') public static function getLastElementsPaths(array $array, $separator = '.', $parentPath = '', $stopIfMatchedBy = '')
{ {
$paths = []; /*
* No elements?
* Nothing to do
*/
if (empty($array)) {
return [];
}
if (!empty($array)) {
if (!empty($stopIfMatchedBy)) { if (!empty($stopIfMatchedBy)) {
$stopIfMatchedBy = self::makeArray($stopIfMatchedBy); $stopIfMatchedBy = self::makeArray($stopIfMatchedBy);
} }
$paths = [];
foreach ($array as $key => $value) { foreach ($array as $key => $value) {
$path = $key; $path = $key;
$stopRecursion = false; $stopRecursion = false;
@@ -877,7 +884,6 @@ class Arrays
$paths += $recursivePaths; $paths += $recursivePaths;
} }
} }
}
return $paths; return $paths;
} }

View File

@@ -0,0 +1,85 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Utilities;
/**
* Useful methods related to CSS selectors and the Bootstrap4 (front-end component library)
*
* @author Meritoo <github@meritoo.pl>
* @copyright Meritoo <http://www.meritoo.pl>
*/
class Bootstrap4CssSelector
{
/**
* Returns selector of container with field's validation error
*
* @return string
*/
public static function getFieldErrorContainerSelector()
{
return '.invalid-feedback .form-error-message';
}
/**
* Returns selector of field's validation error
*
* @param string $formName Name of form (value of the "name" attribute)
* @param string $fieldId ID of field (value of the "id" attribute)
* @return string
*/
public static function getFieldErrorSelector($formName, $fieldId)
{
$labelSelector = CssSelector::getLabelSelector($formName, $fieldId);
if (empty($labelSelector)) {
return '';
}
$errorContainerSelector = static::getFieldErrorContainerSelector();
return sprintf('%s %s', $labelSelector, $errorContainerSelector);
}
/**
* Returns selector of radio-button's validation error
*
* @param string $formName Name of form (value of the "name" attribute)
* @param int $fieldSetIndex Index/Position of the field-set
* @return string
*/
public static function getRadioButtonErrorSelector($formName, $fieldSetIndex)
{
$fieldSetSelector = CssSelector::getFieldSetByIndexSelector($formName, $fieldSetIndex);
if (empty($fieldSetSelector)) {
return '';
}
$errorContainerSelector = static::getFieldErrorContainerSelector();
return sprintf('%s legend.col-form-label %s', $fieldSetSelector, $errorContainerSelector);
}
/**
* Returns selector of field's group
*
* @param string $formName Name of form (value of the "name" attribute)
* @return string
*/
public static function getFieldGroupSelector($formName)
{
$formSelector = CssSelector::getFormByNameSelector($formName);
if (empty($formSelector)) {
return '';
}
return sprintf('%s .form-group', $formSelector);
}
}

View File

@@ -13,8 +13,8 @@ use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
/** /**
* Useful methods for bundle * Useful methods for bundle
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Bundle class Bundle
{ {
@@ -41,7 +41,7 @@ class Bundle
* Given name of bundle is invalid? * Given name of bundle is invalid?
*/ */
if (!Regex::isValidBundleName($bundleName)) { if (!Regex::isValidBundleName($bundleName)) {
throw new IncorrectBundleNameException($bundleName); throw IncorrectBundleNameException::create($bundleName);
} }
/* /*

View File

@@ -13,8 +13,8 @@ use stdClass;
/** /**
* Useful Composer-related methods (only static functions) * Useful Composer-related methods (only static functions)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Composer class Composer
{ {

View File

@@ -0,0 +1,22 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Utilities;
use Meritoo\Common\Traits\CssSelector\FormCssSelector;
/**
* Useful methods related to CSS selectors
*
* @author Meritoo <github@meritoo.pl>
* @copyright Meritoo <http://www.meritoo.pl>
*/
class CssSelector
{
use FormCssSelector;
}

View File

@@ -11,15 +11,15 @@ namespace Meritoo\Common\Utilities;
use DateInterval; use DateInterval;
use DateTime; use DateTime;
use Exception; use Exception;
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException; use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
use Meritoo\Common\Type\DatePartType; use Meritoo\Common\Type\DatePartType;
use Meritoo\Common\Type\DatePeriod; use Meritoo\Common\Type\DatePeriod;
/** /**
* Useful date methods * Useful date methods
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Date class Date
{ {
@@ -64,8 +64,7 @@ class Date
const DATE_DIFFERENCE_UNIT_YEARS = 'years'; const DATE_DIFFERENCE_UNIT_YEARS = 'years';
/** /**
* Returns start and end date for given period. * Returns date's period (that contains start and end date) for given period
* The dates are returned in an array with indexes 'start' and 'end'.
* *
* @param int $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK. * @param int $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK.
* @throws Exception * @throws Exception
@@ -119,11 +118,15 @@ class Date
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH); $lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH); $nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
if (null !== $lastMonth) {
$dateStart = $lastMonth->getEndDate(); $dateStart = $lastMonth->getEndDate();
$dateStart->add(new DateInterval('P1D')); $dateStart->add(new DateInterval('P1D'));
}
if (null !== $nextMonth) {
$dateEnd = $nextMonth->getStartDate(); $dateEnd = $nextMonth->getStartDate();
$dateEnd->sub(new DateInterval('P1D')); $dateEnd->sub(new DateInterval('P1D'));
}
break; break;
case DatePeriod::NEXT_MONTH: case DatePeriod::NEXT_MONTH:
@@ -137,10 +140,10 @@ class Date
$dateStart = new DateTime(); $dateStart = new DateTime();
$dateEnd = new DateTime(); $dateEnd = new DateTime();
if (DatePeriod::LAST_YEAR == $period || DatePeriod::NEXT_YEAR == $period) { if (DatePeriod::LAST_YEAR === $period || DatePeriod::NEXT_YEAR === $period) {
$yearDifference = 1; $yearDifference = 1;
if (DatePeriod::LAST_YEAR == $period) { if (DatePeriod::LAST_YEAR === $period) {
$yearDifference *= -1; $yearDifference *= -1;
} }
@@ -220,7 +223,6 @@ class Date
/** /**
* Returns current day of week * Returns current day of week
* *
* @throws UnknownDatePartTypeException
* @return int * @return int
*/ */
public static function getCurrentDayOfWeek() public static function getCurrentDayOfWeek()
@@ -255,21 +257,21 @@ class Date
* Oops, incorrect year * Oops, incorrect year
*/ */
if ($year <= 0) { if ($year <= 0) {
throw new UnknownDatePartTypeException(DatePartType::YEAR, $year); throw UnknownDatePartTypeException::createException(DatePartType::YEAR, $year);
} }
/* /*
* Oops, incorrect month * Oops, incorrect month
*/ */
if ($month < 1 || $month > 12) { if ($month < 1 || $month > 12) {
throw new UnknownDatePartTypeException(DatePartType::MONTH, $month); throw UnknownDatePartTypeException::createException(DatePartType::MONTH, $month);
} }
/* /*
* Oops, incorrect day * Oops, incorrect day
*/ */
if ($day < 1 || $day > 31) { if ($day < 1 || $day > 31) {
throw new UnknownDatePartTypeException(DatePartType::DAY, $day); throw UnknownDatePartTypeException::createException(DatePartType::DAY, $day);
} }
if ($month < 3) { if ($month < 3) {
@@ -368,11 +370,11 @@ class Date
return null; return null;
} }
$dateStart = self::getDateTime($dateStart, true); $start = self::getDateTime($dateStart, true);
$dateEnd = self::getDateTime($dateEnd, true); $end = self::getDateTime($dateEnd, true);
$difference = []; $difference = [];
$dateDiff = $dateEnd->getTimestamp() - $dateStart->getTimestamp(); $dateDiff = $end->getTimestamp() - $start->getTimestamp();
$daysInSeconds = 0; $daysInSeconds = 0;
$hoursInSeconds = 0; $hoursInSeconds = 0;
@@ -390,39 +392,39 @@ class Date
self::DATE_DIFFERENCE_UNIT_MINUTES, self::DATE_DIFFERENCE_UNIT_MINUTES,
]; ];
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_YEARS == $differenceUnit) { if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_YEARS === $differenceUnit) {
$diff = $dateEnd->diff($dateStart); $diff = $end->diff($start);
/* /*
* Difference between dates in years should be returned only? * Difference between dates in years should be returned only?
*/ */
if (self::DATE_DIFFERENCE_UNIT_YEARS == $differenceUnit) { if (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 || self::DATE_DIFFERENCE_UNIT_MONTHS === $differenceUnit) {
$diff = $dateEnd->diff($dateStart); $diff = $end->diff($start);
/* /*
* Difference between dates in months should be returned only? * Difference between dates in months should be returned only?
*/ */
if (self::DATE_DIFFERENCE_UNIT_MONTHS == $differenceUnit) { if (self::DATE_DIFFERENCE_UNIT_MONTHS === $differenceUnit) {
return $diff->m; return $diff->m;
} }
$difference[self::DATE_DIFFERENCE_UNIT_MONTHS] = $diff->m; $difference[self::DATE_DIFFERENCE_UNIT_MONTHS] = $diff->m;
} }
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits)) { 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;
} }
@@ -439,13 +441,13 @@ class Date
$daysInSeconds = $days * $daySeconds; $daysInSeconds = $days * $daySeconds;
} }
if (null === $differenceUnit || in_array($differenceUnit, $relatedUnits)) { 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;
} }
@@ -462,13 +464,13 @@ class Date
$hoursInSeconds = $hours * $hourSeconds; $hoursInSeconds = $hours * $hourSeconds;
} }
if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_MINUTES == $differenceUnit) { if (null === $differenceUnit || self::DATE_DIFFERENCE_UNIT_MINUTES === $differenceUnit) {
$minutes = (int)floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60); $minutes = (int)floor(($dateDiff - $daysInSeconds - $hoursInSeconds) / 60);
/* /*
* Difference between dates in minutes should be returned only? * Difference between dates in minutes should be returned only?
*/ */
if (self::DATE_DIFFERENCE_UNIT_MINUTES == $differenceUnit) { if (self::DATE_DIFFERENCE_UNIT_MINUTES === $differenceUnit) {
return $minutes; return $minutes;
} }
@@ -528,11 +530,15 @@ class Date
/** /**
* Returns random date based on given start date * Returns random date based on given start date
* *
* @param DateTime $startDate The start date. Start of the random date. * @param DateTime $startDate (optional) Beginning of the random date. If not provided, current date will
* @param int $start (optional) Start of random partition * be used (default behaviour).
* @param int $end (optional) End of random partition * @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 * @param string $intervalTemplate (optional) Template used to build date interval. The placeholder is replaced
* with next, iterated value. * with next, iterated value. If not provided, "P%sD" will be used (default
* behaviour).
* @throws Exception * @throws Exception
* @return DateTime * @return DateTime
*/ */
@@ -554,7 +560,7 @@ class Date
} }
$randomDate = clone $startDate; $randomDate = clone $startDate;
$randomInterval = new DateInterval(sprintf($intervalTemplate, rand($start, $end))); $randomInterval = new DateInterval(sprintf($intervalTemplate, mt_rand($start, $end)));
return $randomDate->add($randomInterval); return $randomDate->add($randomInterval);
} }
@@ -566,10 +572,11 @@ class Date
* @param mixed $value The value which maybe is a date * @param mixed $value The value which maybe is a date
* @param bool $allowCompoundFormats (optional) If is set to true, the compound formats used to create an * @param bool $allowCompoundFormats (optional) If is set to true, the compound formats used to create an
* instance of DateTime class are allowed (e.g. "now", "last day of next * instance of DateTime class are allowed (e.g. "now", "last day of next
* month", "yyyy"). Otherwise - not and every incorrect value is refused. * month", "yyyy"). Otherwise - not and every incorrect value is refused
* (default behaviour).
* @param string $dateFormat (optional) Format of date used to verify if given value is actually a date. * @param string $dateFormat (optional) Format of date used to verify if given value is actually a date.
* It should be format matched to the given value, e.g. "Y-m-d H:i" for * It should be format matched to the given value, e.g. "Y-m-d H:i" for
* "2015-01-01 10:00" value. * "2015-01-01 10:00" value. Default: "Y-m-d".
* @return DateTime|bool * @return DateTime|bool
*/ */
public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d') public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d')
@@ -637,7 +644,7 @@ class Date
* So, I have to refuse those special compound formats if they are not explicitly declared as * So, I have to refuse those special compound formats if they are not explicitly declared as
* compound (2nd argument of this method, set to false by default) * compound (2nd argument of this method, set to false by default)
*/ */
if (in_array($value, $specialFormats)) { if (in_array($value, $specialFormats, true)) {
return false; return false;
} }
} }
@@ -662,7 +669,7 @@ class Date
*/ */
$dateString = (new DateTime())->format($value); $dateString = (new DateTime())->format($value);
if ($dateString != $value) { if ($dateString !== (string)$value) {
return new DateTime($dateString); return new DateTime($dateString);
} }
} catch (\Exception $exception) { } catch (\Exception $exception) {
@@ -706,7 +713,7 @@ class Date
* Formatted date it's the format who is validated? * Formatted date it's the format who is validated?
* The format is invalid * The format is invalid
*/ */
if ($formatted == $format) { if ($formatted === $format) {
return false; return false;
} }

View File

@@ -13,8 +13,8 @@ use Generator;
/** /**
* Useful methods for the Generator class (only static functions) * Useful methods for the Generator class (only static functions)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class GeneratorUtility class GeneratorUtility
{ {

View File

@@ -11,8 +11,8 @@ namespace Meritoo\Common\Utilities;
/** /**
* Useful locale methods * Useful locale methods
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Locale class Locale
{ {

View File

@@ -11,8 +11,8 @@ namespace Meritoo\Common\Utilities;
/** /**
* Useful methods for mime types of files * Useful methods for mime types of files
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class MimeTypes class MimeTypes
{ {

View File

@@ -9,15 +9,13 @@
namespace Meritoo\Common\Utilities; namespace Meritoo\Common\Utilities;
use Gedmo\Sluggable\Util\Urlizer; use Gedmo\Sluggable\Util\Urlizer;
use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException;
use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
use Transliterator; use Transliterator;
/** /**
* Miscellaneous methods (only static functions) * Miscellaneous methods (only static functions)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Miscellaneous class Miscellaneous
{ {
@@ -62,15 +60,15 @@ class Miscellaneous
$startFileName = mb_substr($startFileName, 1); $startFileName = mb_substr($startFileName, 1);
} }
$directoryContent = scandir($directoryPath); $directoryContent = scandir($directoryPath, SCANDIR_SORT_ASCENDING);
if (!empty($directoryContent)) { if (!empty($directoryContent)) {
foreach ($directoryContent as $fileName) { foreach ($directoryContent as $fileName) {
if ('.' != $fileName && '..' != $fileName) { if ('.' !== $fileName && '..' !== $fileName) {
$content = null; $content = null;
if (!empty($startFileName) && !$startFileFound) { if (!empty($startFileName) && !$startFileFound) {
if ($fileName == $startFileName) { if ($fileName === $startFileName) {
$startFileFound = true; $startFileFound = true;
} }
@@ -84,18 +82,18 @@ class Miscellaneous
if (null !== $content) { if (null !== $content) {
$files[$fileName] = $content; $files[$fileName] = $content;
if (!empty($maxFilesCount)) { if (null !== $maxFilesCount) {
$count += Arrays::getNonArrayElementsCount($content); $count += Arrays::getNonArrayElementsCount($content);
} }
} else { } else {
$files[] = $fileName; $files[] = $fileName;
if (!empty($maxFilesCount)) { if (null !== $maxFilesCount) {
++$count; ++$count;
} }
} }
if (!empty($maxFilesCount) && $count >= $maxFilesCount) { if (null !== $maxFilesCount && $count >= $maxFilesCount) {
break; break;
} }
} }
@@ -160,11 +158,17 @@ class Miscellaneous
*/ */
public static function includeFileExtension($fileName, $extension) public static function includeFileExtension($fileName, $extension)
{ {
if (self::getFileExtension($fileName, true) != strtolower($extension)) { $fileExtension = self::getFileExtension($fileName, true);
return sprintf('%s.%s', $fileName, $extension);
/*
* File has given extension?
* Nothing to do
*/
if ($fileExtension === strtolower($extension)) {
return $fileName;
} }
return $fileName; return sprintf('%s.%s', $fileName, $extension);
} }
/** /**
@@ -229,31 +233,28 @@ class Miscellaneous
/* /*
* Let's clear name of file * Let's clear name of file
* *
* Attention. The name without extension may be cleared / urlized only * Attention.
* to avoid incorrect name by replacing "." with "-". * The name without extension may be cleared / urlized only to avoid incorrect name by replacing "." with "-".
*/ */
$withoutExtension = Urlizer::urlize($withoutExtension); $withoutExtension = Urlizer::urlize($withoutExtension);
/* /*
* Now I have to complete the template used to build / generate unique name * Now I have to complete the template used to build / generate unique name
*/ */
$template = '%s-%s'; // file's name and unique key $template = '%s-%s.%s'; // [file's name]-[unique key].[file's extension]
if ($objectId > 0) {
$template .= '-%s'; // object ID
}
$template .= '.%s'; // file's extension
/* /*
* Add some uniqueness * Add some uniqueness
*/ */
$unique = uniqid(mt_rand(), true); $unique = self::getUniqueString(mt_rand());
/* /*
* Finally build and return the unique name * Finally build and return the unique name
*/ */
if ($objectId > 0) { if ($objectId > 0) {
$template = '%s-%s-%s.%s'; // [file's name]-[unique key]-[object ID].[file's extension]
return sprintf($template, $withoutExtension, $unique, $objectId, $extension); return sprintf($template, $withoutExtension, $unique, $objectId, $extension);
} }
@@ -333,7 +334,7 @@ class Miscellaneous
{ {
$phpModulesArray = get_loaded_extensions(); $phpModulesArray = get_loaded_extensions();
return in_array($phpModuleName, $phpModulesArray); return in_array($phpModuleName, $phpModulesArray, false);
} }
/** /**
@@ -461,7 +462,7 @@ class Miscellaneous
* Value to find is neither a string nor an array OR it's an empty string? * Value to find is neither a string nor an array OR it's an empty string?
* Nothing to do * Nothing to do
*/ */
if ((!$searchIsString && !$searchIsArray) || ($searchIsString && 0 == strlen($search))) { if ((!$searchIsString && !$searchIsArray) || ($searchIsString && '' === $search)) {
return $effect; return $effect;
} }
@@ -486,7 +487,7 @@ class Miscellaneous
* Second step: replace with regular expressions. * Second step: replace with regular expressions.
* Attention. Searched and replacement value should be the same type: strings or arrays. * Attention. Searched and replacement value should be the same type: strings or arrays.
*/ */
if ($effect == $subject && ($bothAreStrings || $bothAreArrays)) { if ($effect === $subject && ($bothAreStrings || $bothAreArrays)) {
if ($quoteStrings && $replacementIsString) { if ($quoteStrings && $replacementIsString) {
$replacement = '\'' . $replacement . '\''; $replacement = '\'' . $replacement . '\'';
} }
@@ -504,7 +505,7 @@ class Miscellaneous
* Third step: complex replace of the replacement defined as an array. * Third step: complex replace of the replacement defined as an array.
* It may be useful when you want to search for a one string and replace the string with multiple values. * It may be useful when you want to search for a one string and replace the string with multiple values.
*/ */
if ($effect == $subject && $searchIsString && $replacementIsArray) { if ($effect === $subject && $searchIsString && $replacementIsArray) {
$subjectIsArray = is_array($subject); $subjectIsArray = is_array($subject);
$effect = ''; $effect = '';
@@ -589,7 +590,12 @@ class Miscellaneous
*/ */
public static function getOperatingSystemNameServer() public static function getOperatingSystemNameServer()
{ {
return php_uname('s'); return PHP_OS;
/*
* Previous version:
* return php_uname('s');
*/
} }
/** /**
@@ -681,7 +687,8 @@ class Miscellaneous
$spacePosition = mb_strrpos($lineWithAberration, ' ', 0, $encoding); $spacePosition = mb_strrpos($lineWithAberration, ' ', 0, $encoding);
if ($spacePosition > 0) { if (false !== $spacePosition && 0 < $spacePosition) {
/* @var int $spacePosition */
$perLine = $spacePosition; $perLine = $spacePosition;
$insertSeparator = true; $insertSeparator = true;
} }
@@ -738,8 +745,8 @@ class Miscellaneous
return unlink($directoryPath); return unlink($directoryPath);
} }
foreach (scandir($directoryPath) as $item) { foreach (scandir($directoryPath, SCANDIR_SORT_ASCENDING) as $item) {
if ('.' == $item || '..' == $item) { if ('.' === $item || '..' === $item) {
continue; continue;
} }
@@ -788,7 +795,7 @@ class Miscellaneous
foreach ($members as $key => $value) { foreach ($members as $key => $value) {
$value = mb_strtolower($value); $value = mb_strtolower($value);
if (0 == $key) { if (0 === $key) {
$effect .= self::lowercaseFirst($value); $effect .= self::lowercaseFirst($value);
} else { } else {
$effect .= self::uppercaseFirst($value); $effect .= self::uppercaseFirst($value);
@@ -809,10 +816,6 @@ class Miscellaneous
* - null (default): nothing is done with the string * - null (default): nothing is done with the string
* - true: the rest of string is lowercased * - true: the rest of string is lowercased
* - false: the rest of string is uppercased * - false: the rest of string is uppercased
*
* Some explanation:
* Function lcfirst() is available for PHP >= 5.30, so I wrote my own function that lowercases first character of
* the string.
*/ */
public static function lowercaseFirst($text, $restLowercase = null) public static function lowercaseFirst($text, $restLowercase = null)
{ {
@@ -828,16 +831,7 @@ class Miscellaneous
$effect = mb_strtoupper($effect); $effect = mb_strtoupper($effect);
} }
if (function_exists('lcfirst')) { return lcfirst($effect);
$effect = lcfirst($effect);
} else {
$first = mb_strtolower($effect[0]);
$rest = mb_substr($effect, 1);
$effect = $first . $rest;
}
return $effect;
} }
/** /**
@@ -866,16 +860,7 @@ class Miscellaneous
$effect = mb_strtoupper($effect); $effect = mb_strtoupper($effect);
} }
if (function_exists('ucfirst')) { return ucfirst($effect);
$effect = ucfirst($effect);
} else {
$first = mb_strtoupper($effect[0]);
$rest = mb_substr($effect, 1);
$effect = $first . $rest;
}
return $effect;
} }
/** /**
@@ -916,9 +901,9 @@ class Miscellaneous
'TB', 'TB',
'PB', 'PB',
]; ];
$index = floor(log($sizeInBytes, 1024));
$size = round($sizeInBytes / pow(1024, $index), 2); $index = floor(log($sizeInBytes, 1024));
$size = round($sizeInBytes / (1024 ** $index), 2);
$unit = $units[(int)$index]; $unit = $units[(int)$index];
return sprintf('%s %s', $size, $unit); return sprintf('%s %s', $size, $unit);
@@ -1194,10 +1179,6 @@ class Miscellaneous
if (null !== $globalSource && isset($globalSource[$variableName])) { if (null !== $globalSource && isset($globalSource[$variableName])) {
$value = $globalSource[$variableName]; $value = $globalSource[$variableName];
if (!ini_get('magic_quotes_gpc')) {
$value = addslashes($value);
}
} }
} }
@@ -1243,7 +1224,7 @@ class Miscellaneous
continue; continue;
} }
$text = $text . '0'; $text .= '0';
} }
return $text; return $text;
@@ -1298,8 +1279,8 @@ class Miscellaneous
if ($asHexadecimal) { if ($asHexadecimal) {
$hexadecimal = dechex($colorComponent); $hexadecimal = dechex($colorComponent);
if (1 == strlen($hexadecimal)) { if (1 === strlen($hexadecimal)) {
return sprintf('0%s', $hexadecimal, $hexadecimal); return sprintf('0%s', $hexadecimal);
} }
return $hexadecimal; return $hexadecimal;
@@ -1312,8 +1293,6 @@ class Miscellaneous
* Returns inverted value of color for given color * Returns inverted value of color for given color
* *
* @param string $color Hexadecimal value of color to invert (with or without hash), e.g. "dd244c" or "#22a5fe" * @param string $color Hexadecimal value of color to invert (with or without hash), e.g. "dd244c" or "#22a5fe"
* @throws IncorrectColorHexLengthException
* @throws InvalidColorHexValueException
* @return string * @return string
*/ */
public static function getInvertedColor($color) public static function getInvertedColor($color)
@@ -1328,14 +1307,14 @@ class Miscellaneous
* Verify and get valid value of color. * Verify and get valid value of color.
* An exception will be thrown if the value is not a color. * An exception will be thrown if the value is not a color.
*/ */
$color = Regex::getValidColorHexValue($color); $validColor = Regex::getValidColorHexValue($color);
/* /*
* Grab color's components * Grab color's components
*/ */
$red = hexdec(substr($color, 0, 2)); $red = hexdec(substr($validColor, 0, 2));
$green = hexdec(substr($color, 2, 2)); $green = hexdec(substr($validColor, 2, 2));
$blue = hexdec(substr($color, 4, 2)); $blue = hexdec(substr($validColor, 4, 2));
/* /*
* Calculate inverted color's components * Calculate inverted color's components

View File

@@ -18,8 +18,8 @@ use Doctrine\ORM\QueryBuilder;
/** /**
* Useful methods for query builder (the Doctrine's QueryBuilder class) * Useful methods for query builder (the Doctrine's QueryBuilder class)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class QueryBuilderUtility class QueryBuilderUtility
{ {

View File

@@ -13,18 +13,14 @@ use Doctrine\Common\Util\Inflector;
use Meritoo\Common\Collection\Collection; use Meritoo\Common\Collection\Collection;
use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException; use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException;
use Meritoo\Common\Exception\Reflection\MissingChildClassesException; use Meritoo\Common\Exception\Reflection\MissingChildClassesException;
use Meritoo\Common\Exception\Reflection\NotExistingPropertyException;
use Meritoo\Common\Exception\Reflection\TooManyChildClassesException; use Meritoo\Common\Exception\Reflection\TooManyChildClassesException;
use ReflectionClass;
use ReflectionException;
use ReflectionMethod;
use ReflectionObject;
use ReflectionProperty;
/** /**
* Useful reflection methods * Useful reflection methods
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Reflection class Reflection
{ {
@@ -34,21 +30,20 @@ class Reflection
* @param object|string $class The object or name of object's class * @param object|string $class The object or name of object's class
* @param bool $withoutInheritance (optional) If is set to true, only methods for given class are returned. * @param bool $withoutInheritance (optional) If is set to true, only methods for given class are returned.
* Otherwise - all methods, with inherited methods too. * Otherwise - all methods, with inherited methods too.
* @throws ReflectionException
* @return array * @return array
*/ */
public static function getMethods($class, $withoutInheritance = false) public static function getMethods($class, $withoutInheritance = false)
{ {
$effect = []; $effect = [];
$reflection = new ReflectionClass($class); $reflection = new \ReflectionClass($class);
$methods = $reflection->getMethods(); $methods = $reflection->getMethods();
if (!empty($methods)) { if (!empty($methods)) {
$className = self::getClassName($class); $className = self::getClassName($class);
foreach ($methods as $method) { foreach ($methods as $method) {
if ($method instanceof ReflectionMethod) { if ($method instanceof \ReflectionMethod) {
if ($withoutInheritance && $className !== $method->class) { if ($withoutInheritance && $className !== $method->class) {
continue; continue;
} }
@@ -65,12 +60,11 @@ class Reflection
* Returns constants of given class / object * Returns constants of given class / object
* *
* @param object|string $class The object or name of object's class * @param object|string $class The object or name of object's class
* @throws ReflectionException
* @return array * @return array
*/ */
public static function getConstants($class) public static function getConstants($class)
{ {
$reflection = new ReflectionClass($class); $reflection = new \ReflectionClass($class);
return $reflection->getConstants(); return $reflection->getConstants();
} }
@@ -80,7 +74,6 @@ class Reflection
* Constants whose values are integers are considered only. * Constants whose values are integers are considered only.
* *
* @param object|string $class The object or name of object's class * @param object|string $class The object or name of object's class
* @throws ReflectionException
* @return int|null * @return int|null
*/ */
public static function getMaxNumberConstant($class) public static function getMaxNumberConstant($class)
@@ -107,12 +100,11 @@ class Reflection
* *
* @param object|string $class The object or name of object's class * @param object|string $class The object or name of object's class
* @param string $method Name of the method to find * @param string $method Name of the method to find
* @throws ReflectionException
* @return bool * @return bool
*/ */
public static function hasMethod($class, $method) public static function hasMethod($class, $method)
{ {
$reflection = new ReflectionClass($class); $reflection = new \ReflectionClass($class);
return $reflection->hasMethod($method); return $reflection->hasMethod($method);
} }
@@ -122,12 +114,11 @@ class Reflection
* *
* @param object|string $class The object or name of object's class * @param object|string $class The object or name of object's class
* @param string $property Name of the property to find * @param string $property Name of the property to find
* @throws ReflectionException
* @return bool * @return bool
*/ */
public static function hasProperty($class, $property) public static function hasProperty($class, $property)
{ {
$reflection = new ReflectionClass($class); $reflection = new \ReflectionClass($class);
return $reflection->hasProperty($property); return $reflection->hasProperty($property);
} }
@@ -137,12 +128,11 @@ class Reflection
* *
* @param object|string $class The object or name of object's class * @param object|string $class The object or name of object's class
* @param string $constant Name of the constant to find * @param string $constant Name of the constant to find
* @throws ReflectionException
* @return bool * @return bool
*/ */
public static function hasConstant($class, $constant) public static function hasConstant($class, $constant)
{ {
$reflection = new ReflectionClass($class); $reflection = new \ReflectionClass($class);
return $reflection->hasConstant($constant); return $reflection->hasConstant($constant);
} }
@@ -152,12 +142,11 @@ class Reflection
* *
* @param object|string $class The object or name of object's class * @param object|string $class The object or name of object's class
* @param string $constant Name of the constant that contains a value * @param string $constant Name of the constant that contains a value
* @throws ReflectionException
* @return mixed * @return mixed
*/ */
public static function getConstantValue($class, $constant) public static function getConstantValue($class, $constant)
{ {
$reflection = new ReflectionClass($class); $reflection = new \ReflectionClass($class);
if (self::hasConstant($class, $constant)) { if (self::hasConstant($class, $constant)) {
return $reflection->getConstant($constant); return $reflection->getConstant($constant);
@@ -175,7 +164,6 @@ class Reflection
* dot-separated, e.g. "invoice.user.email". * dot-separated, e.g. "invoice.user.email".
* @param bool $force (optional) If is set to true, try to retrieve value even if the object doesn't have * @param bool $force (optional) If is set to true, try to retrieve value even if the object doesn't have
* property. Otherwise - not. * property. Otherwise - not.
* @throws ReflectionException
* @return mixed * @return mixed
*/ */
public static function getPropertyValue($object, $property, $force = false) public static function getPropertyValue($object, $property, $force = false)
@@ -197,16 +185,16 @@ class Reflection
* Let's dig more and get proper value * Let's dig more and get proper value
* *
* Required to avoid bug: * Required to avoid bug:
* ReflectionObject::__construct() expects parameter 1 to be object, null given * \ReflectionObject::__construct() expects parameter 1 to be object, null given
* (...) * (...)
* 4. at ReflectionObject->__construct (null) * 4. at \ReflectionObject->__construct (null)
* 5. at Reflection ::getPropertyValue (null, 'name', true) * 5. at Reflection ::getPropertyValue (null, 'name', true)
* 6. at ListService->getItemValue (object(Deal), 'project.name', '0') * 6. at ListService->getItemValue (object(Deal), 'project.name', '0')
* *
* while using "project.name" as property - $project has $name property ($project exists in the Deal class) * while using "project.name" as property - $project has $name property ($project exists in the Deal class)
* and the $project equals null * and the $project equals null
* *
* Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * Meritoo <github@meritoo.pl>
* 2016-11-07 * 2016-11-07
*/ */
if (null !== $object) { if (null !== $object) {
@@ -224,17 +212,17 @@ class Reflection
* Use \ReflectionObject class * Use \ReflectionObject class
*/ */
try { try {
$reflectionProperty = new ReflectionProperty($className, $property); $reflectionProperty = new \ReflectionProperty($className, $property);
$value = $reflectionProperty->getValue($object); $value = $reflectionProperty->getValue($object);
} catch (ReflectionException $exception) { } catch (\ReflectionException $exception) {
/* /*
* 2nd try: * 2nd try:
* Look for the get / has / is methods * Look for the get / has / is methods
*/ */
$class = new ReflectionObject($object); $class = new \ReflectionObject($object);
$valueFound = false; $valueFound = false;
if ($class->hasProperty($property) || $force) { if ($force || $class->hasProperty($property)) {
$property = Inflector::classify($property); $property = Inflector::classify($property);
$getterPrefixes = [ $getterPrefixes = [
@@ -247,7 +235,7 @@ class Reflection
$getterName = sprintf('%s%s', $prefix, $property); $getterName = sprintf('%s%s', $prefix, $property);
if ($class->hasMethod($getterName)) { if ($class->hasMethod($getterName)) {
$method = new ReflectionMethod($object, $getterName); $method = new \ReflectionMethod($object, $getterName);
/* /*
* Getter is not accessible publicly? * Getter is not accessible publicly?
@@ -292,7 +280,6 @@ class Reflection
* @param string $property Name of the property that contains a value * @param string $property Name of the property that contains a value
* @param bool $force (optional) If is set to true, try to retrieve value even if the * @param bool $force (optional) If is set to true, try to retrieve value even if the
* object does not have property. Otherwise - not. * object does not have property. Otherwise - not.
* @throws ReflectionException
* @return array * @return array
*/ */
public static function getPropertyValues($objects, $property, $force = false) public static function getPropertyValues($objects, $property, $force = false)
@@ -395,13 +382,13 @@ class Reflection
{ {
$fullClassName = self::getClassName($source); $fullClassName = self::getClassName($source);
if (empty($fullClassName)) { if (null === $fullClassName || '' === $fullClassName) {
return ''; return '';
} }
$className = self::getClassName($source, true); $className = self::getClassName($source, true);
if ($className == $fullClassName) { if ($className === $fullClassName) {
return $className; return $className;
} }
@@ -420,7 +407,7 @@ class Reflection
$className = self::getClassName($source); $className = self::getClassName($source);
$interfaces = class_implements($className); $interfaces = class_implements($className);
return in_array($interface, $interfaces); return in_array($interface, $interfaces, true);
} }
/** /**
@@ -438,7 +425,7 @@ class Reflection
$parents = class_parents($childClassName); $parents = class_parents($childClassName);
if (is_array($parents) && 0 < count($parents)) { if (is_array($parents) && 0 < count($parents)) {
return in_array($parentClassName, $parents); return in_array($parentClassName, $parents, true);
} }
return false; return false;
@@ -448,23 +435,22 @@ class Reflection
* Returns given object properties * Returns given object properties
* *
* @param array|object|string $source An array of objects, namespaces, object or namespace * @param array|object|string $source An array of objects, namespaces, object or namespace
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class * @param int $filter (optional) Filter of properties. Uses \ReflectionProperty class
* constants. By default all properties are returned. * constants. By default all properties are returned.
* @param bool $includeParents (optional) If is set to true, properties of parent classes are * @param bool $includeParents (optional) If is set to true, properties of parent classes are
* included (recursively). Otherwise - not. * included (recursively). Otherwise - not.
* @throws ReflectionException * @return array|\ReflectionProperty
* @return array|ReflectionProperty
*/ */
public static function getProperties($source, $filter = null, $includeParents = false) public static function getProperties($source, $filter = null, $includeParents = false)
{ {
$className = self::getClassName($source); $className = self::getClassName($source);
$reflection = new ReflectionClass($className); $reflection = new \ReflectionClass($className);
if (null === $filter) { if (null === $filter) {
$filter = ReflectionProperty::IS_PRIVATE $filter = \ReflectionProperty::IS_PRIVATE
+ ReflectionProperty::IS_PROTECTED + \ReflectionProperty::IS_PROTECTED
+ ReflectionProperty::IS_PUBLIC + \ReflectionProperty::IS_PUBLIC
+ ReflectionProperty::IS_STATIC; + \ReflectionProperty::IS_STATIC;
} }
$properties = $reflection->getProperties($filter); $properties = $reflection->getProperties($filter);
@@ -486,13 +472,12 @@ class Reflection
* Returns a parent class or false if there is no parent class * Returns a parent class or false if there is no parent class
* *
* @param array|object|string $source An array of objects, namespaces, object or namespace * @param array|object|string $source An array of objects, namespaces, object or namespace
* @throws ReflectionException * @return \ReflectionClass|bool
* @return ReflectionClass|bool
*/ */
public static function getParentClass($source) public static function getParentClass($source)
{ {
$className = self::getClassName($source); $className = self::getClassName($source);
$reflection = new ReflectionClass($className); $reflection = new \ReflectionClass($className);
return $reflection->getParentClass(); return $reflection->getParentClass();
} }
@@ -524,7 +509,7 @@ class Reflection
* Oops, cannot resolve class * Oops, cannot resolve class
*/ */
if (null === $className) { if (null === $className) {
throw new CannotResolveClassNameException($class); throw CannotResolveClassNameException::create($class);
} }
$childClasses = []; $childClasses = [];
@@ -541,7 +526,7 @@ class Reflection
*/ */
$realClass = ClassUtils::getRealClass($oneClass); $realClass = ClassUtils::getRealClass($oneClass);
if (in_array($realClass, $childClasses)) { if (in_array($realClass, $childClasses, true)) {
continue; continue;
} }
@@ -558,7 +543,6 @@ class Reflection
* *
* @param array|object|string $parentClass Class who child class should be returned. An array of objects, * @param array|object|string $parentClass Class who child class should be returned. An array of objects,
* namespaces, object or namespace. * namespaces, object or namespace.
* @throws CannotResolveClassNameException
* @throws MissingChildClassesException * @throws MissingChildClassesException
* @throws TooManyChildClassesException * @throws TooManyChildClassesException
* @return mixed * @return mixed
@@ -572,7 +556,7 @@ class Reflection
* Oops, the base / parent class hasn't child class * Oops, the base / parent class hasn't child class
*/ */
if (empty($childClasses)) { if (empty($childClasses)) {
throw new MissingChildClassesException($parentClass); throw MissingChildClassesException::create($parentClass);
} }
/* /*
@@ -580,21 +564,20 @@ class Reflection
* Oops, the base / parent class has too many child classes * Oops, the base / parent class has too many child classes
*/ */
if (count($childClasses) > 1) { if (count($childClasses) > 1) {
throw new TooManyChildClassesException($parentClass, $childClasses); throw TooManyChildClassesException::create($parentClass, $childClasses);
} }
return trim($childClasses[0]); return trim($childClasses[0]);
} }
/** /**
* Returns property, the ReflectionProperty instance, of given object * Returns property, the \ReflectionProperty instance, of given object
* *
* @param array|object|string $class An array of objects, namespaces, object or namespace * @param array|object|string $class An array of objects, namespaces, object or namespace
* @param string $property Name of the property * @param string $property Name of the property
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class constants. * @param int $filter (optional) Filter of properties. Uses \ReflectionProperty class constants.
* By default all properties are allowed / processed. * By default all properties are allowed / processed.
* @throws ReflectionException * @return null|\ReflectionProperty
* @return null|ReflectionProperty
*/ */
public static function getProperty($class, $property, $filter = null) public static function getProperty($class, $property, $filter = null)
{ {
@@ -602,9 +585,9 @@ class Reflection
$properties = self::getProperties($className, $filter); $properties = self::getProperties($className, $filter);
if (!empty($properties)) { if (!empty($properties)) {
/* @var $reflectionProperty ReflectionProperty */ /* @var $reflectionProperty \ReflectionProperty */
foreach ($properties as $reflectionProperty) { foreach ($properties as $reflectionProperty) {
if ($reflectionProperty->getName() == $property) { if ($reflectionProperty->getName() === $property) {
return $reflectionProperty; return $reflectionProperty;
} }
} }
@@ -621,7 +604,6 @@ class Reflection
* @param bool $verifyParents If is set to true, parent classes are verified if they use given * @param bool $verifyParents If is set to true, parent classes are verified if they use given
* trait. Otherwise - not. * trait. Otherwise - not.
* @throws CannotResolveClassNameException * @throws CannotResolveClassNameException
* @throws ReflectionException
* @return bool|null * @return bool|null
*/ */
public static function usesTrait($class, $trait, $verifyParents = false) public static function usesTrait($class, $trait, $verifyParents = false)
@@ -632,21 +614,21 @@ class Reflection
/* /*
* Oops, cannot resolve class * Oops, cannot resolve class
*/ */
if (empty($className)) { if (null === $className || '' === $className) {
throw new CannotResolveClassNameException($class); throw CannotResolveClassNameException::create($class);
} }
/* /*
* Oops, cannot resolve trait * Oops, cannot resolve trait
*/ */
if (empty($traitName)) { if (null === $traitName || '' === $traitName) {
throw new CannotResolveClassNameException($class, false); throw new CannotResolveClassNameException($class, false);
} }
$reflection = new ReflectionClass($className); $reflection = new \ReflectionClass($className);
$traitsNames = $reflection->getTraitNames(); $traitsNames = $reflection->getTraitNames();
$uses = in_array($traitName, $traitsNames); $uses = in_array($traitName, $traitsNames, true);
if (!$uses && $verifyParents) { if (!$uses && $verifyParents) {
$parentClassName = self::getParentClassName($className); $parentClassName = self::getParentClassName($className);
@@ -664,13 +646,12 @@ class Reflection
* If given class does not extend another, returns null. * If given class does not extend another, returns null.
* *
* @param array|object|string $class An array of objects, namespaces, object or namespace * @param array|object|string $class An array of objects, namespaces, object or namespace
* @throws ReflectionException
* @return string|null * @return string|null
*/ */
public static function getParentClassName($class) public static function getParentClassName($class)
{ {
$className = self::getClassName($class); $className = self::getClassName($class);
$reflection = new ReflectionClass($className); $reflection = new \ReflectionClass($className);
$parentClass = $reflection->getParentClass(); $parentClass = $reflection->getParentClass();
if (null === $parentClass || false === $parentClass) { if (null === $parentClass || false === $parentClass) {
@@ -679,4 +660,57 @@ class Reflection
return $parentClass->getName(); return $parentClass->getName();
} }
/**
* Sets value of given property in given object
*
* @param mixed $object Object that should contains given property
* @param string $property Name of the property
* @param mixed $value Value of the property
* @throws NotExistingPropertyException
*/
public static function setPropertyValue($object, $property, $value)
{
$reflectionProperty = self::getProperty($object, $property);
/*
* Oops, property does not exist
*/
if (null === $reflectionProperty) {
throw NotExistingPropertyException::create($object, $property);
}
$notAccessible = $reflectionProperty->isPrivate() || $reflectionProperty->isProtected();
if ($notAccessible) {
$reflectionProperty->setAccessible(true);
}
$reflectionProperty->setValue($object, $value);
if ($notAccessible) {
$reflectionProperty->setAccessible(false);
}
}
/**
* Sets values of properties in given object
*
* @param mixed $object Object that should contains given property
* @param array $propertiesValues Key-value pairs, where key - name of the property, value - value of the property
*/
public static function setPropertiesValues($object, array $propertiesValues)
{
/*
* No properties?
* Nothing to do
*/
if (empty($propertiesValues)) {
return;
}
foreach ($propertiesValues as $property => $value) {
static::setPropertyValue($object, $property, $value);
}
}
} }

View File

@@ -14,8 +14,8 @@ use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
/** /**
* Useful regular expressions methods * Useful regular expressions methods
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Regex class Regex
{ {

View File

@@ -14,8 +14,8 @@ use Doctrine\ORM\QueryBuilder;
/** /**
* Useful methods for repository * Useful methods for repository
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Repository class Repository
{ {
@@ -177,10 +177,13 @@ class Repository
$direction = 'ASC' $direction = 'ASC'
) { ) {
$alias = 'qb'; $alias = 'qb';
$queryBuilder = $repository->createQueryBuilder($alias);
return $repository if (empty($property)) {
->createQueryBuilder($alias) return $queryBuilder;
->orderBy(sprintf('%s.%s', $alias, $property), $direction); }
return $queryBuilder->orderBy(sprintf('%s.%s', $alias, $property), $direction);
} }
/** /**

View File

@@ -11,8 +11,8 @@ namespace Meritoo\Common\Utilities;
/** /**
* Useful uri methods (only static functions) * Useful uri methods (only static functions)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Uri class Uri
{ {

View File

@@ -15,8 +15,8 @@ use SimpleXMLElement;
/** /**
* Useful XML-related methods (only static functions) * Useful XML-related methods (only static functions)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class Xml class Xml
{ {

179
src/ValueObject/Version.php Normal file
View File

@@ -0,0 +1,179 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\ValueObject;
/**
* Version of software
*
* @author Meritoo <github@meritoo.pl>
* @copyright Meritoo <http://www.meritoo.pl>
*/
class Version
{
/**
* The "major" part.
* Incremented when you make incompatible API changes.
*
* @var int
*/
private $majorPart;
/**
* The "minor" part.
* Incremented when you add functionality in a backwards-compatible manner.
*
* @var int
*/
private $minorPart;
/**
* The "patch" part.
* Incremented when you make backwards-compatible bug fixes.
*
* @var int
*/
private $patchPart;
/**
* Class constructor
*
* @param int $majorPart The "major" part. Incremented when you make incompatible API changes.
* @param int $minorPart The "minor" part. Incremented when you add functionality in a backwards-compatible manner.
* @param int $patchPart The "patch" part. Incremented when you make backwards-compatible bug fixes.
*/
public function __construct($majorPart, $minorPart, $patchPart)
{
$this->majorPart = $majorPart;
$this->minorPart = $minorPart;
$this->patchPart = $patchPart;
}
/**
* Returns the "major" part.
* Incremented when you make incompatible API changes.
*
* @return int
*/
public function getMajorPart()
{
return $this->majorPart;
}
/**
* Returns the "minor" part.
* Incremented when you add functionality in a backwards-compatible manner.
*
* @return int
*/
public function getMinorPart()
{
return $this->minorPart;
}
/**
* Returns the "patch" part.
* Incremented when you make backwards-compatible bug fixes.
*
* @return int
*/
public function getPatchPart()
{
return $this->patchPart;
}
/**
* Returns string representation of instance of this class
*
* @return string
*/
public function __toString()
{
return sprintf('%d.%d.%d', $this->getMajorPart(), $this->getMinorPart(), $this->getPatchPart());
}
/**
* Returns new instance based on given version as string.
* Given version should contain 3 dot-separated integers, 1 per each part ("major", "minor" and "patch").
*
* Examples:
* "1.0.2";
* "10.4.0";
*
* @param string $version The version
* @return Version|null
*/
public static function fromString($version)
{
$version = trim($version);
/*
* No version provided?
* Nothing to do
*/
if (empty($version)) {
return null;
}
$matches = [];
$pattern = '/^(\d+)\.(\d+)\.(\d+)$/'; // e.g. "1.0.2"
$matched = preg_match($pattern, $version, $matches);
/*
* Incorrect version?
* Nothing to do
*/
if (0 === $matched || false === $matched) {
return null;
}
$majorPart = (int)$matches[1];
$minorPart = (int)$matches[2];
$patchPart = (int)$matches[3];
return new static($majorPart, $minorPart, $patchPart);
}
/**
* Returns new instance based on given version as array.
* Given version should contain 3 integers, 1 per each part ("major", "minor" and "patch").
*
* Examples:
* [1, 0, 2];
* [10, 4, 0];
*
* @param array $version The version
* @return Version|null
*/
public static function fromArray(array $version)
{
/*
* No version provided?
* Nothing to do
*/
if (empty($version)) {
return null;
}
$count = count($version);
/*
* Incorrect version?
* Nothing to do
*/
if (3 !== $count) {
return null;
}
$majorPart = (int)$version[0];
$minorPart = (int)$version[1];
$patchPart = (int)$version[2];
return new static($majorPart, $minorPart, $patchPart);
}
}

View File

@@ -17,8 +17,8 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of the collection of elements * Test case of the collection of elements
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class CollectionTest extends BaseTestCase class CollectionTest extends BaseTestCase
{ {

View File

@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of the exception used while type of something is unknown * Test case of the exception used while type of something is unknown
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class UnknownTypeExceptionTest extends BaseTestCase class UnknownTypeExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(UnknownTestTypeException::class, OopVisibilityType::IS_PUBLIC, 1, 1); static::assertConstructorVisibilityAndArguments(UnknownTestTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
public function testWithoutException() public function testWithoutException()
@@ -41,8 +41,8 @@ class UnknownTypeExceptionTest extends BaseTestCase
/** /**
* Type of something (for testing purposes) * Type of something (for testing purposes)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class TestType extends BaseType class TestType extends BaseType
{ {
@@ -54,27 +54,31 @@ class TestType extends BaseType
/** /**
* An exception used while type of something is unknown (for testing purposes) * An exception used while type of something is unknown (for testing purposes)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class UnknownTestTypeException extends UnknownTypeException class UnknownTestTypeException extends UnknownTypeException
{ {
/** /**
* Class constructor * Creates exception
* *
* @param int|string $unknownType The unknown type of something (for testing purposes) * @param string $unknownType The unknown type of something (for testing purposes)
* @return UnknownTestTypeException
*/ */
public function __construct($unknownType) public static function createException($unknownType)
{ {
parent::__construct($unknownType, new TestType(), 'type of something used for testing'); /* @var UnknownTestTypeException $exception */
$exception = parent::create($unknownType, new TestType(), 'type of something used for testing');
return $exception;
} }
} }
/** /**
* Service used together with type of something (for testing purposes) * Service used together with type of something (for testing purposes)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class TestService class TestService
{ {

View File

@@ -9,7 +9,7 @@
namespace Meritoo\Common\Test\Exception\Date; namespace Meritoo\Common\Test\Exception\Date;
use Generator; use Generator;
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException; use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
use Meritoo\Common\Test\Base\BaseTestCase; use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Type\DatePartType; use Meritoo\Common\Type\DatePartType;
use Meritoo\Common\Type\OopVisibilityType; use Meritoo\Common\Type\OopVisibilityType;
@@ -17,14 +17,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while type of date part, e.g. "year", is unknown * Test case of an exception used while type of date part, e.g. "year", is unknown
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class UnknownDatePartTypeExceptionTest extends BaseTestCase class UnknownDatePartTypeExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(UnknownDatePartTypeException::class, OopVisibilityType::IS_PUBLIC, 2, 2); static::assertConstructorVisibilityAndArguments(UnknownDatePartTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -34,9 +34,9 @@ class UnknownDatePartTypeExceptionTest extends BaseTestCase
* *
* @dataProvider provideDatePartAndValue * @dataProvider provideDatePartAndValue
*/ */
public function testConstructorMessage($unknownDatePart, $value, $expectedMessage) public function testMessage($unknownDatePart, $value, $expectedMessage)
{ {
$exception = new UnknownDatePartTypeException($unknownDatePart, $value); $exception = UnknownDatePartTypeException::createException($unknownDatePart, $value);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while file with given path is empty (has no content) * Test case of an exception used while file with given path is empty (has no content)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class EmptyFileExceptionTest extends BaseTestCase class EmptyFileExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(EmptyFileException::class, OopVisibilityType::IS_PUBLIC, 1, 1); static::assertConstructorVisibilityAndArguments(EmptyFileException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -32,9 +32,9 @@ class EmptyFileExceptionTest extends BaseTestCase
* *
* @dataProvider providePathOfFile * @dataProvider providePathOfFile
*/ */
public function testConstructorMessage($emptyFilePath, $expectedMessage) public function testMessage($emptyFilePath, $expectedMessage)
{ {
$exception = new EmptyFileException($emptyFilePath); $exception = EmptyFileException::create($emptyFilePath);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -15,19 +15,19 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while path of given file is empty * Test case of an exception used while path of given file is empty
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class EmptyFilePathExceptionTest extends BaseTestCase class EmptyFilePathExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(EmptyFilePathException::class, OopVisibilityType::IS_PUBLIC); static::assertConstructorVisibilityAndArguments(EmptyFilePathException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
public function testConstructorMessage() public function testConstructorMessage()
{ {
$exception = new EmptyFilePathException(); $exception = EmptyFilePathException::create();
static::assertEquals('Path of the file is empty. Did you provide path of proper file?', $exception->getMessage()); static::assertEquals('Path of the file is empty. Did you provide path of proper file?', $exception->getMessage());
} }
} }

View File

@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while file with given path does not exist * Test case of an exception used while file with given path does not exist
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class NotExistingFileExceptionTest extends BaseTestCase class NotExistingFileExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(NotExistingFileException::class, OopVisibilityType::IS_PUBLIC, 1, 1); static::assertConstructorVisibilityAndArguments(NotExistingFileException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -34,7 +34,7 @@ class NotExistingFileExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($notExistingFilePath, $expectedMessage) public function testConstructorMessage($notExistingFilePath, $expectedMessage)
{ {
$exception = new NotExistingFileException($notExistingFilePath); $exception = NotExistingFileException::create($notExistingFilePath);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while method cannot be called, because is disabled * Test case of an exception used while method cannot be called, because is disabled
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class DisabledMethodExceptionTest extends BaseTestCase class DisabledMethodExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(DisabledMethodException::class, OopVisibilityType::IS_PUBLIC, 2, 1); static::assertConstructorVisibilityAndArguments(DisabledMethodException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -36,7 +36,7 @@ class DisabledMethodExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($disabledMethod, $alternativeMethod, $expectedMessage) public function testConstructorMessage($disabledMethod, $alternativeMethod, $expectedMessage)
{ {
$exception = new DisabledMethodException($disabledMethod, $alternativeMethod); $exception = DisabledMethodException::create($disabledMethod, $alternativeMethod);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while name of class or trait cannot be resolved * Test case of an exception used while name of class or trait cannot be resolved
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class CannotResolveClassNameExceptionTest extends BaseTestCase class CannotResolveClassNameExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(CannotResolveClassNameException::class, OopVisibilityType::IS_PUBLIC, 2, 1); static::assertConstructorVisibilityAndArguments(CannotResolveClassNameException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -37,7 +37,7 @@ class CannotResolveClassNameExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($source, $forClass, $expectedMessage) public function testConstructorMessage($source, $forClass, $expectedMessage)
{ {
$exception = new CannotResolveClassNameException($source, $forClass); $exception = CannotResolveClassNameException::create($source, $forClass);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while given class has no child classes * Test case of an exception used while given class has no child classes
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class MissingChildClassesExceptionTest extends BaseTestCase class MissingChildClassesExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(MissingChildClassesException::class, OopVisibilityType::IS_PUBLIC, 1, 1); static::assertConstructorVisibilityAndArguments(MissingChildClassesException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -35,7 +35,7 @@ class MissingChildClassesExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($parentClass, $expectedMessage) public function testConstructorMessage($parentClass, $expectedMessage)
{ {
$exception = new MissingChildClassesException($parentClass); $exception = MissingChildClassesException::create($parentClass);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while given class has more than one child class * Test case of an exception used while given class has more than one child class
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class TooManyChildClassesExceptionTest extends BaseTestCase class TooManyChildClassesExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(TooManyChildClassesException::class, OopVisibilityType::IS_PUBLIC, 2, 2); static::assertConstructorVisibilityAndArguments(TooManyChildClassesException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -36,7 +36,7 @@ class TooManyChildClassesExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($parentClass, array $childClasses, $expectedMessage) public function testConstructorMessage($parentClass, array $childClasses, $expectedMessage)
{ {
$exception = new TooManyChildClassesException($parentClass, $childClasses); $exception = TooManyChildClassesException::create($parentClass, $childClasses);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while length of given hexadecimal value of color is incorrect * Test case of an exception used while length of given hexadecimal value of color is incorrect
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class IncorrectColorHexLengthExceptionTest extends BaseTestCase class IncorrectColorHexLengthExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(IncorrectColorHexLengthException::class, OopVisibilityType::IS_PUBLIC, 1, 1); static::assertConstructorVisibilityAndArguments(IncorrectColorHexLengthException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -34,7 +34,7 @@ class IncorrectColorHexLengthExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($color, $expectedMessage) public function testConstructorMessage($color, $expectedMessage)
{ {
$exception = new IncorrectColorHexLengthException($color); $exception = IncorrectColorHexLengthException::create($color);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -10,24 +10,20 @@ namespace Meritoo\Common\Test\Exception\Regex;
use Generator; use Generator;
use Meritoo\Common\Exception\Regex\InvalidColorHexValueException; use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
use Meritoo\Common\Test\Base\BaseTestCase; use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Type\OopVisibilityType; use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while given hexadecimal value of color is invalid * Test case of an exception used while given hexadecimal value of color is invalid
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class InvalidColorHexValueExceptionTest extends BaseTestCase class InvalidColorHexValueExceptionTest extends BaseTestCase
{ {
/**
* @throws UnknownOopVisibilityTypeException
*/
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(InvalidColorHexValueException::class, OopVisibilityType::IS_PUBLIC, 1, 1); static::assertConstructorVisibilityAndArguments(InvalidColorHexValueException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -38,7 +34,7 @@ class InvalidColorHexValueExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($color, $expectedMessage) public function testConstructorMessage($color, $expectedMessage)
{ {
$exception = new InvalidColorHexValueException($color); $exception = InvalidColorHexValueException::create($color);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -10,24 +10,20 @@ namespace Meritoo\Common\Test\Exception\Regex;
use Generator; use Generator;
use Meritoo\Common\Exception\Regex\InvalidHtmlAttributesException; use Meritoo\Common\Exception\Regex\InvalidHtmlAttributesException;
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
use Meritoo\Common\Test\Base\BaseTestCase; use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Type\OopVisibilityType; use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while html attributes are invalid * Test case of an exception used while html attributes are invalid
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class InvalidHtmlAttributesExceptionTest extends BaseTestCase class InvalidHtmlAttributesExceptionTest extends BaseTestCase
{ {
/**
* @throws UnknownOopVisibilityTypeException
*/
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(InvalidHtmlAttributesException::class, OopVisibilityType::IS_PUBLIC, 1, 1); static::assertConstructorVisibilityAndArguments(InvalidHtmlAttributesException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -38,7 +34,7 @@ class InvalidHtmlAttributesExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($htmlAttributes, $expectedMessage) public function testConstructorMessage($htmlAttributes, $expectedMessage)
{ {
$exception = new InvalidHtmlAttributesException($htmlAttributes); $exception = InvalidHtmlAttributesException::create($htmlAttributes);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of an exception used while url is invalid * Test case of an exception used while url is invalid
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class InvalidUrlExceptionTest extends BaseTestCase class InvalidUrlExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(InvalidUrlException::class, OopVisibilityType::IS_PUBLIC, 1, 1); static::assertConstructorVisibilityAndArguments(InvalidUrlException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -34,7 +34,7 @@ class InvalidUrlExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($url, $expectedMessage) public function testConstructorMessage($url, $expectedMessage)
{ {
$exception = new InvalidUrlException($url); $exception = InvalidUrlException::create($url);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

View File

@@ -17,14 +17,14 @@ use Meritoo\Common\Type\OopVisibilityType;
* Test case of an exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is * Test case of an exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is
* unknown * unknown
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class UnknownOopVisibilityTypeExceptionTest extends BaseTestCase class UnknownOopVisibilityTypeExceptionTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
static::assertConstructorVisibilityAndArguments(UnknownOopVisibilityTypeException::class, OopVisibilityType::IS_PUBLIC, 1, 1); static::assertConstructorVisibilityAndArguments(UnknownOopVisibilityTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
} }
/** /**
@@ -35,7 +35,7 @@ class UnknownOopVisibilityTypeExceptionTest extends BaseTestCase
*/ */
public function testConstructorMessage($unknownType, $expectedMessage) public function testConstructorMessage($unknownType, $expectedMessage)
{ {
$exception = new UnknownOopVisibilityTypeException($unknownType); $exception = UnknownOopVisibilityTypeException::createException($unknownType);
static::assertEquals($expectedMessage, $exception->getMessage()); static::assertEquals($expectedMessage, $exception->getMessage());
} }

0
tests/Resources/var/cache/.gitkeep vendored Normal file
View File

View File

View File

View File

@@ -17,8 +17,8 @@ use Meritoo\Common\Utilities\GeneratorUtility;
/** /**
* Test case of the base test case with common methods and data providers * Test case of the base test case with common methods and data providers
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class BaseTestCaseTest extends BaseTestCase class BaseTestCaseTest extends BaseTestCase
{ {
@@ -168,8 +168,8 @@ class BaseTestCaseTest extends BaseTestCase
/** /**
* Simple test case * Simple test case
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class SimpleTestCase extends BaseTestCase class SimpleTestCase extends BaseTestCase
{ {

View File

@@ -15,8 +15,8 @@ use Meritoo\Common\Type\Base\BaseType;
/** /**
* Test case of the base / abstract type of something * Test case of the base / abstract type of something
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class BaseTypeTest extends BaseTestCase class BaseTypeTest extends BaseTestCase
{ {
@@ -184,8 +184,8 @@ class BaseTypeTest extends BaseTestCase
/** /**
* Empty type of something used for testing * Empty type of something used for testing
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class TestEmptyType extends BaseType class TestEmptyType extends BaseType
{ {
@@ -194,8 +194,8 @@ class TestEmptyType extends BaseType
/** /**
* Type of something used for testing * Type of something used for testing
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class TestType extends BaseType class TestType extends BaseType
{ {

View File

@@ -14,8 +14,8 @@ use Meritoo\Common\Type\DatePartType;
/** /**
* Test case of the type of date part, e.g. "year" * Test case of the type of date part, e.g. "year"
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class DatePartTypeTest extends BaseTypeTestCase class DatePartTypeTest extends BaseTypeTestCase
{ {

View File

@@ -17,8 +17,8 @@ use Meritoo\Common\Type\OopVisibilityType;
/** /**
* Test case of date's period * Test case of date's period
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class DatePeriodTest extends BaseTypeTestCase class DatePeriodTest extends BaseTypeTestCase
{ {

View File

@@ -14,8 +14,8 @@ use Meritoo\Common\Utilities\Arrays;
/** /**
* Test case of the useful arrays methods * Test case of the useful arrays methods
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class ArraysTest extends BaseTestCase class ArraysTest extends BaseTestCase
{ {
@@ -517,7 +517,12 @@ letsTest[2] = value_2;';
self::assertTrue(Arrays::areKeysInArray($keys17, $this->complexArray, false)); self::assertTrue(Arrays::areKeysInArray($keys17, $this->complexArray, false));
} }
public function testGetLastElementsPaths() public function testGetLastElementsPathsUsingEmptyArray()
{
self::assertSame([], Arrays::getLastElementsPaths([]));
}
public function testGetLastElementsPathsUsingDefaults()
{ {
/* /*
* Using default separator and other default arguments * Using default separator and other default arguments
@@ -536,7 +541,10 @@ letsTest[2] = value_2;';
]; ];
self::assertEquals($expected, Arrays::getLastElementsPaths($this->complexArray)); self::assertEquals($expected, Arrays::getLastElementsPaths($this->complexArray));
}
public function testGetLastElementsPathsUsingCustomSeparator()
{
/* /*
* Using custom separator * Using custom separator
*/ */
@@ -555,204 +563,20 @@ letsTest[2] = value_2;';
]; ];
self::assertEquals($expected, Arrays::getLastElementsPaths($this->complexArray, $separator)); self::assertEquals($expected, Arrays::getLastElementsPaths($this->complexArray, $separator));
}
/* /**
* Special exception: do not use, stop recursive on the "diam" key * @param string|array $stopIfMatchedBy Patterns of keys or paths that matched will stop the process of path
* building and including children of those keys or paths (recursive will
* not be used for keys in lower level of given array)
* @param string $separator Separator used in resultant strings. Default: ".".
* @param array $expected Expected array
*
* @dataProvider provideStopIfMatchedByForGetLastElementsPaths
*/ */
$expected = [ public function testGetLastElementsPathsUsingStopIfMatchedBy($stopIfMatchedBy, $separator, array $expected)
'lorem.ipsum.dolor' => 'sit', {
'consectetur' => 'adipiscing', self::assertEquals($expected, Arrays::getLastElementsPaths($this->superComplexArray, $separator, '', $stopIfMatchedBy));
'mollis' => 1234,
2 => [],
'sit.nullam' => 'donec',
'sit.aliquet.vitae.ligula' => 'quis',
'sit.0' => 'elit',
'amet.0' => 'iaculis',
'amet.1' => 'primis',
'lorem.ipsum.diam' => [
'non' => 'egestas',
],
];
$stopIfMatchedBy = 'diam';
self::assertEquals($expected, Arrays::getLastElementsPaths($this->complexArray, '.', '', $stopIfMatchedBy));
/*
* Stop building of paths on these keys:
* - "diam"
* - "aliquet"
*/
$expected = [
'lorem . ipsum . dolor' => 'sit',
'consectetur' => 'adipiscing',
'mollis' => 1234,
2 => [],
'sit . nullam' => 'donec',
'sit . 0' => 'elit',
'amet . 0' => 'iaculis',
'amet . 1' => 'primis',
'lorem . ipsum . diam' => [
'non' => 'egestas',
],
'sit . aliquet' => [
'vitae' => [
'ligula' => 'quis',
],
],
];
$stopIfMatchedBy = [
'diam',
'aliquet',
];
self::assertEquals($expected, Arrays::getLastElementsPaths($this->complexArray, ' . ', '', $stopIfMatchedBy));
$expected = [
'ipsum > quis > vestibulum > porta-1' => [
'turpis',
'urna',
],
'ipsum > quis > vestibulum > porta-2' => [
'tortor' => [
'in' => [
'dui',
'dolor' => [
'aliquam',
],
],
],
],
'ipsum > quis > vestibulum > porta-3' => [
1,
2,
3,
],
'primis > 0' => [
'in',
'faucibus',
'orci',
],
'primis > 1' => [
'luctus',
'et',
'ultrices',
],
];
/*
* Stop building of paths on more sophisticated keys
*/
$stopIfMatchedBy = [
'porta\-\d+',
'^\d+$',
];
self::assertEquals($expected, Arrays::getLastElementsPaths($this->superComplexArray, ' > ', '', $stopIfMatchedBy));
/*
* Stop building of paths on these:
* - keys
* and
* - paths (verify paths too)
*/
$expected = [
'lorem > ipsum > dolor' => 'sit',
'consectetur' => 'adipiscing',
'mollis' => 1234,
2 => [],
'sit > nullam' => 'donec',
'sit > 0' => 'elit',
'amet > 0' => 'iaculis',
'amet > 1' => 'primis',
'lorem > ipsum > diam' => [
'non' => 'egestas',
],
'sit > aliquet > vitae' => [
'ligula' => 'quis',
],
];
$stopIfMatchedBy = [
'diam',
'sit > aliquet > vitae',
];
self::assertEquals($expected, Arrays::getLastElementsPaths($this->complexArray, ' > ', '', $stopIfMatchedBy));
/*
* Stop building of paths on these paths (verify paths only)
*/
$expected = [
'ipsum > quis > vestibulum > porta-1' => [
'turpis',
'urna',
],
'ipsum > quis > vestibulum > porta-2 > tortor' => [
'in' => [
'dui',
'dolor' => [
'aliquam',
],
],
],
'ipsum > quis > vestibulum > porta-3 > 0' => 1,
'ipsum > quis > vestibulum > porta-3 > 1' => 2,
'ipsum > quis > vestibulum > porta-3 > 2' => 3,
'primis > 0 > 0' => 'in',
'primis > 0 > 1' => 'faucibus',
'primis > 0 > 2' => 'orci',
'primis > 1' => [
'luctus',
'et',
'ultrices',
],
];
$stopIfMatchedBy = [
'ipsum > quis > vestibulum > porta-1',
'ipsum > quis > vestibulum > porta-2 > tortor',
'primis > 1',
];
self::assertEquals($expected, Arrays::getLastElementsPaths($this->superComplexArray, ' > ', '', $stopIfMatchedBy));
/*
* Stop building of paths if path contains any of these part (verify part of paths only)
*/
$expected = [
'ipsum > quis > vestibulum > porta-1' => [
'turpis',
'urna',
],
'ipsum > quis > vestibulum > porta-2 > tortor > in' => [
'dui',
'dolor' => [
'aliquam',
],
],
'ipsum > quis > vestibulum > porta-3 > 0' => 1,
'ipsum > quis > vestibulum > porta-3 > 1' => 2,
'ipsum > quis > vestibulum > porta-3 > 2' => 3,
'primis > 0' => [
'in',
'faucibus',
'orci',
],
'primis > 1' => [
'luctus',
'et',
'ultrices',
],
];
$stopIfMatchedBy = [
'vestibulum > porta-1',
'tortor > in',
'[a-z]+ > \d+',
];
self::assertEquals($expected, Arrays::getLastElementsPaths($this->superComplexArray, ' > ', '', $stopIfMatchedBy));
} }
public function testAreAllKeysMatchedByPattern() public function testAreAllKeysMatchedByPattern()
@@ -1760,6 +1584,229 @@ letsTest[2] = value_2;';
]; ];
} }
/**
* Provides patterns of keys or paths that matched will stop the process and the expected array for the
* getLastElementsPaths() method
*
* @return \Generator
*/
public function provideStopIfMatchedByForGetLastElementsPaths()
{
/*
* Special exception: do not use, stop recursive on the "diam" key
*/
yield[
'diam',
'.',
[
'ipsum.quis.vestibulum.porta-1.0' => 'turpis',
'ipsum.quis.vestibulum.porta-1.1' => 'urna',
'ipsum.quis.vestibulum.porta-2.tortor.in.0' => 'dui',
'ipsum.quis.vestibulum.porta-2.tortor.in.dolor.0' => 'aliquam',
'ipsum.quis.vestibulum.porta-3.0' => 1,
'ipsum.quis.vestibulum.porta-3.1' => 2,
'ipsum.quis.vestibulum.porta-3.2' => 3,
'primis.0.0' => 'in',
'primis.0.1' => 'faucibus',
'primis.0.2' => 'orci',
'primis.1.0' => 'luctus',
'primis.1.1' => 'et',
'primis.1.2' => 'ultrices',
],
];
/*
* Stop building of paths on these keys:
* - "tortor"
* - "primis"
*/
yield[
[
'tortor',
'primis',
],
' . ',
[
'ipsum . quis . vestibulum . porta-1 . 0' => 'turpis',
'ipsum . quis . vestibulum . porta-1 . 1' => 'urna',
'ipsum . quis . vestibulum . porta-2 . tortor' => [
'in' => [
'dui',
'dolor' => [
'aliquam',
],
],
],
'ipsum . quis . vestibulum . porta-3 . 0' => 1,
'ipsum . quis . vestibulum . porta-3 . 1' => 2,
'ipsum . quis . vestibulum . porta-3 . 2' => 3,
'primis' => [
[
'in',
'faucibus',
'orci',
],
[
'luctus',
'et',
'ultrices',
],
],
],
];
/*
* Stop building of paths on more sophisticated keys
*/
yield[
[
'porta\-\d+',
'^\d+$',
],
' > ',
[
'ipsum > quis > vestibulum > porta-1' => [
'turpis',
'urna',
],
'ipsum > quis > vestibulum > porta-2' => [
'tortor' => [
'in' => [
'dui',
'dolor' => [
'aliquam',
],
],
],
],
'ipsum > quis > vestibulum > porta-3' => [
1,
2,
3,
],
'primis > 0' => [
'in',
'faucibus',
'orci',
],
'primis > 1' => [
'luctus',
'et',
'ultrices',
],
],
];
/*
* Stop building of paths on these:
* - keys
* and
* - paths (verify paths too)
*/
yield[
[
'porta-1',
'porta-2 > tortor > in',
],
' > ',
[
'ipsum > quis > vestibulum > porta-1' => [
'turpis',
'urna',
],
'ipsum > quis > vestibulum > porta-2 > tortor > in' => [
'dui',
'dolor' => [
'aliquam',
],
],
'ipsum > quis > vestibulum > porta-3 > 0' => 1,
'ipsum > quis > vestibulum > porta-3 > 1' => 2,
'ipsum > quis > vestibulum > porta-3 > 2' => 3,
'primis > 0 > 0' => 'in',
'primis > 0 > 1' => 'faucibus',
'primis > 0 > 2' => 'orci',
'primis > 1 > 0' => 'luctus',
'primis > 1 > 1' => 'et',
'primis > 1 > 2' => 'ultrices',
],
];
/*
* Stop building of paths on these paths (verify paths only)
*/
yield[
[
'ipsum > quis > vestibulum > porta-1',
'ipsum > quis > vestibulum > porta-2 > tortor',
'primis > 1',
],
' > ',
[
'ipsum > quis > vestibulum > porta-1' => [
'turpis',
'urna',
],
'ipsum > quis > vestibulum > porta-2 > tortor' => [
'in' => [
'dui',
'dolor' => [
'aliquam',
],
],
],
'ipsum > quis > vestibulum > porta-3 > 0' => 1,
'ipsum > quis > vestibulum > porta-3 > 1' => 2,
'ipsum > quis > vestibulum > porta-3 > 2' => 3,
'primis > 0 > 0' => 'in',
'primis > 0 > 1' => 'faucibus',
'primis > 0 > 2' => 'orci',
'primis > 1' => [
'luctus',
'et',
'ultrices',
],
],
];
/*
* Stop building of paths if path contains any of these part (verify part of paths only)
*/
yield[
[
'vestibulum > porta-1',
'tortor > in',
'[a-z]+ > \d+',
],
' > ',
[
'ipsum > quis > vestibulum > porta-1' => [
'turpis',
'urna',
],
'ipsum > quis > vestibulum > porta-2 > tortor > in' => [
'dui',
'dolor' => [
'aliquam',
],
],
'ipsum > quis > vestibulum > porta-3 > 0' => 1,
'ipsum > quis > vestibulum > porta-3 > 1' => 2,
'ipsum > quis > vestibulum > porta-3 > 2' => 3,
'primis > 0' => [
'in',
'faucibus',
'orci',
],
'primis > 1' => [
'luctus',
'et',
'ultrices',
],
],
];
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
@@ -1877,10 +1924,12 @@ letsTest[2] = value_2;';
{ {
parent::tearDown(); parent::tearDown();
unset($this->simpleArray); unset(
unset($this->simpleArrayWithKeys); $this->simpleArray,
unset($this->twoDimensionsArray); $this->simpleArrayWithKeys,
unset($this->complexArray); $this->twoDimensionsArray,
unset($this->superComplexArray); $this->complexArray,
$this->superComplexArray
);
} }
} }

View File

@@ -0,0 +1,185 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Test\Utilities;
use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Utilities\Bootstrap4CssSelector;
/**
* Test case of the useful methods related to CSS selectors and the Bootstrap4 (front-end component library)
*
* @author Meritoo <github@meritoo.pl>
* @copyright Meritoo <http://www.meritoo.pl>
*/
class Bootstrap4CssSelectorTest extends BaseTestCase
{
public function testConstructor()
{
static::assertHasNoConstructor(Bootstrap4CssSelector::class);
}
/**
* @param string $emptyValue Name of form (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetRadioButtonErrorSelectorUsingEmptyFormName($emptyValue)
{
$fieldSetIndex = 1;
static::assertSame('', Bootstrap4CssSelector::getRadioButtonErrorSelector($emptyValue, $fieldSetIndex));
}
public function testGetRadioButtonErrorSelectorUsingNegativeFieldSetIndex()
{
static::assertSame('', Bootstrap4CssSelector::getRadioButtonErrorSelector('test-test', -1));
}
/**
* @param string $formName Name of form (value of the "name" attribute)
* @param int $fieldSetIndex Index/Position of the field-set
* @param string $expected Expected selector
*
* @dataProvider provideFormNameFieldSetIndexAndSelector
*/
public function testGetRadioButtonErrorSelector($formName, $fieldSetIndex, $expected)
{
static::assertSame($expected, Bootstrap4CssSelector::getRadioButtonErrorSelector($formName, $fieldSetIndex));
}
/**
* @param string $emptyValue Name of form (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetFieldErrorSelectorUsingEmptyFormName($emptyValue)
{
$fieldName = 'test';
static::assertSame('', Bootstrap4CssSelector::getFieldErrorSelector($emptyValue, $fieldName));
}
/**
* @param string $emptyValue Name of field (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetFieldErrorSelectorUsingEmptyFieldName($emptyValue)
{
$formName = 'test';
static::assertSame('', Bootstrap4CssSelector::getFieldErrorSelector($formName, $emptyValue));
}
/**
* @param string $formName Name of form (value of the "name" attribute)
* @param string $fieldName Name of field (value of the "name" attribute)
* @param string $expected Expected selector
*
* @dataProvider provideFormNameFieldNameAndSelector
*/
public function testGetFieldErrorSelector($formName, $fieldName, $expected)
{
static::assertSame($expected, Bootstrap4CssSelector::getFieldErrorSelector($formName, $fieldName));
}
/**
* @param string $emptyValue Name of form (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetFieldGroupSelectorUsingEmptyFormName($emptyValue)
{
static::assertSame('', Bootstrap4CssSelector::getFieldGroupSelector($emptyValue));
}
/**
* @param string $formName Name of form (value of the "name" attribute)
* @param string $expected Expected selector
*
* @dataProvider provideFormNameAndSelector
*/
public function testGetFieldGroupSelector($formName, $expected)
{
static::assertSame($expected, Bootstrap4CssSelector::getFieldGroupSelector($formName));
}
public function testGetFieldErrorContainerSelector()
{
static::assertSame('.invalid-feedback .form-error-message', Bootstrap4CssSelector::getFieldErrorContainerSelector());
}
/**
* Provides name of form, index/position of the field-set and expected selector
*
* @return \Generator
*/
public function provideFormNameFieldSetIndexAndSelector()
{
yield[
'test',
0,
'form[name="test"] fieldset:nth-of-type(0) legend.col-form-label .invalid-feedback .form-error-message',
];
yield[
'test-123-test-456',
1,
'form[name="test-123-test-456"] fieldset:nth-of-type(1) legend.col-form-label .invalid-feedback .form-error-message',
];
yield[
'test_something_098_different',
1245,
'form[name="test_something_098_different"] fieldset:nth-of-type(1245) legend.col-form-label .invalid-feedback .form-error-message',
];
}
/**
* Provides name of form, name of field and expected selector
*
* @return \Generator
*/
public function provideFormNameFieldNameAndSelector()
{
yield[
'test',
'test',
'form[name="test"] label[for="test"] .invalid-feedback .form-error-message',
];
yield[
'test-123-test-456',
'great-000-field',
'form[name="test-123-test-456"] label[for="great-000-field"] .invalid-feedback .form-error-message',
];
yield[
'test_something_098_different',
'this-is-the-123789-field',
'form[name="test_something_098_different"] label[for="this-is-the-123789-field"] .invalid-feedback .form-error-message',
];
}
/**
* Provides name of form and expected selector
*
* @return \Generator
*/
public function provideFormNameAndSelector()
{
yield[
'test',
'form[name="test"] .form-group',
];
yield[
'test-123-test-456',
'form[name="test-123-test-456"] .form-group',
];
yield[
'test_something_098_different',
'form[name="test_something_098_different"] .form-group',
];
}
}

View File

@@ -16,8 +16,8 @@ use Meritoo\Common\Utilities\Bundle;
/** /**
* Test case of the useful methods for bundle * Test case of the useful methods for bundle
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class BundleTest extends BaseTestCase class BundleTest extends BaseTestCase
{ {
@@ -42,7 +42,6 @@ class BundleTest extends BaseTestCase
* @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"
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle" * @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
* *
* @throws IncorrectBundleNameException
* @dataProvider provideViewPathAndIncorrectBundleName * @dataProvider provideViewPathAndIncorrectBundleName
*/ */
public function testGetBundleViewPathUsingIncorrectBundleName($viewPath, $bundleName) public function testGetBundleViewPathUsingIncorrectBundleName($viewPath, $bundleName)

View File

@@ -15,8 +15,8 @@ use Meritoo\Common\Utilities\Composer;
/** /**
* Test case of the useful Composer-related methods * Test case of the useful Composer-related methods
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class ComposerTest extends BaseTestCase class ComposerTest extends BaseTestCase
{ {

View File

@@ -0,0 +1,296 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Test\Utilities;
use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Utilities\CssSelector;
/**
* Test case of the useful methods related to CSS selectors
*
* @author Meritoo <github@meritoo.pl>
* @copyright Meritoo <http://www.meritoo.pl>
*/
class CssSelectorTest extends BaseTestCase
{
public function testConstructor()
{
static::assertHasNoConstructor(CssSelector::class);
}
/**
* @param string $emptyValue Name of form (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetFormByNameSelectorUsingEmptyName($emptyValue)
{
static::assertSame('', CssSelector::getFormByNameSelector($emptyValue));
}
/**
* @param string $formName Name of form (value of the "name" attribute)
* @param string $expected Expected selector
*
* @dataProvider provideFormNameAndSelector
*/
public function testGetFormByNameSelector($formName, $expected)
{
static::assertSame($expected, CssSelector::getFormByNameSelector($formName));
}
/**
* @param string $emptyValue Name of form (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetInputByNameSelectorUsingEmptyFormName($emptyValue)
{
$fieldName = 'test-test';
static::assertSame('', CssSelector::getInputByNameSelector($emptyValue, $fieldName));
}
/**
* @param string $emptyValue Name of field (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetInputByNameSelectorUsingEmptyFieldName($emptyValue)
{
$formName = 'test-test';
static::assertSame('', CssSelector::getInputByNameSelector($formName, $emptyValue));
}
/**
* @param string $formName Name of form (value of the "name" attribute)
* @param string $fieldName Name of field (value of the "name" attribute)
* @param string $expected Expected selector
*
* @dataProvider provideFormNameFieldNameAndSelector
*/
public function testGetInputByNameSelector($formName, $fieldName, $expected)
{
static::assertSame($expected, CssSelector::getInputByNameSelector($formName, $fieldName));
}
/**
* @param string $emptyValue Name of form (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetInputByIdSelectorUsingEmptyFormName($emptyValue)
{
$fieldId = 'test-test';
static::assertSame('', CssSelector::getInputByIdSelector($emptyValue, $fieldId));
}
/**
* @param string $emptyValue ID of field (value of the "id" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetInputByIdSelectorUsingEmptyFieldName($emptyValue)
{
$formName = 'test-test';
static::assertSame('', CssSelector::getInputByIdSelector($formName, $emptyValue));
}
/**
* @param string $formName Name of form (value of the "name" attribute)
* @param string $fieldId ID of field (value of the "id" attribute)
* @param string $expected Expected selector
*
* @dataProvider provideFormNameFieldIdAndSelector
*/
public function testGetInputByIdSelector($formName, $fieldId, $expected)
{
static::assertSame($expected, CssSelector::getInputByIdSelector($formName, $fieldId));
}
/**
* @param string $emptyValue Name of form (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetLabelSelectorUsingEmptyFormName($emptyValue)
{
$fieldId = 'test-test';
static::assertSame('', CssSelector::getLabelSelector($emptyValue, $fieldId));
}
/**
* @param string $emptyValue ID of field (value of the "id" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetLabelSelectorUsingEmptyFieldId($emptyValue)
{
$formName = 'test-test';
static::assertSame('', CssSelector::getLabelSelector($formName, $emptyValue));
}
/**
* @param string $formName Name of form (value of the "name" attribute)
* @param string $fieldId ID of field (value of the "id" attribute)
* @param string $expected Expected selector
*
* @dataProvider provideFormNameFieldIdAndLabelSelector
*/
public function testGetLabelSelector($formName, $fieldId, $expected)
{
static::assertSame($expected, CssSelector::getLabelSelector($formName, $fieldId));
}
/**
* @param string $emptyValue Name of form (value of the "name" attribute)
* @dataProvider provideEmptyScalarValue
*/
public function testGetFieldSetByIndexSelectorUsingEmptyFormName($emptyValue)
{
$fieldSetIndex = 1;
static::assertSame('', CssSelector::getFieldSetByIndexSelector($emptyValue, $fieldSetIndex));
}
public function testGetFieldSetByIndexSelectorUsingNegativeFieldSetIndex()
{
static::assertSame('', CssSelector::getFieldSetByIndexSelector('test-test', -1));
}
/**
* @param string $formName Name of form (value of the "name" attribute)
* @param int $fieldSetIndex Index/Position of the field-set
* @param string $expected Expected selector
*
* @dataProvider provideFormNameFieldSetIndexAndSelector
*/
public function testGetFieldSetByIndexSelector($formName, $fieldSetIndex, $expected)
{
static::assertSame($expected, CssSelector::getFieldSetByIndexSelector($formName, $fieldSetIndex));
}
/**
* Provides name of form and selector of the form
*
* @return \Generator
*/
public function provideFormNameAndSelector()
{
yield[
'test',
'form[name="test"]',
];
yield[
'test-123-test-456',
'form[name="test-123-test-456"]',
];
yield[
'test_something_098_different',
'form[name="test_something_098_different"]',
];
}
/**
* Provides name of form, name of field and expected selector
*
* @return \Generator
*/
public function provideFormNameFieldNameAndSelector()
{
yield[
'test',
'test',
'form[name="test"] input[name="test"]',
];
yield[
'test-123-test-456',
'great-000-field',
'form[name="test-123-test-456"] input[name="great-000-field"]',
];
yield[
'test_something_098_different',
'this-is-the-123789-field',
'form[name="test_something_098_different"] input[name="this-is-the-123789-field"]',
];
}
/**
* Provides name of form, ID of field and expected selector of label
*
* @return \Generator
*/
public function provideFormNameFieldIdAndLabelSelector()
{
yield[
'test',
'test',
'form[name="test"] label[for="test"]',
];
yield[
'test-123-test-456',
'great-000-field',
'form[name="test-123-test-456"] label[for="great-000-field"]',
];
yield[
'test_something_098_different',
'this-is-the-123789-field',
'form[name="test_something_098_different"] label[for="this-is-the-123789-field"]',
];
}
/**
* Provides name of form, index/position of the field-set and expected selector
*
* @return \Generator
*/
public function provideFormNameFieldSetIndexAndSelector()
{
yield[
'test',
0,
'form[name="test"] fieldset:nth-of-type(0)',
];
yield[
'test-123-test-456',
1,
'form[name="test-123-test-456"] fieldset:nth-of-type(1)',
];
yield[
'test_something_098_different',
1245,
'form[name="test_something_098_different"] fieldset:nth-of-type(1245)',
];
}
/**
* Provides name of form, ID of field and expected selector
*
* @return \Generator
*/
public function provideFormNameFieldIdAndSelector()
{
yield[
'test',
'test',
'form[name="test"] input#test',
];
yield[
'test-123-test-456',
'great-000-field',
'form[name="test-123-test-456"] input#great-000-field',
];
yield[
'test_something_098_different',
'this-is-the-123789-field',
'form[name="test_something_098_different"] input#this-is-the-123789-field',
];
}
}

View File

@@ -11,7 +11,7 @@ namespace Meritoo\Common\Test\Utilities;
use DateInterval; use DateInterval;
use DateTime; use DateTime;
use Generator; use Generator;
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException; use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
use Meritoo\Common\Test\Base\BaseTestCase; use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Type\DatePeriod; use Meritoo\Common\Type\DatePeriod;
use Meritoo\Common\Utilities\Date; use Meritoo\Common\Utilities\Date;
@@ -19,8 +19,8 @@ use Meritoo\Common\Utilities\Date;
/** /**
* Test case of the Date methods (only static functions) * Test case of the Date methods (only static functions)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class DateTest extends BaseTestCase class DateTest extends BaseTestCase
{ {

View File

@@ -14,8 +14,8 @@ use Meritoo\Common\Utilities\GeneratorUtility;
/** /**
* Test case of the useful methods for the Generator class * Test case of the useful methods for the Generator class
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class GeneratorUtilityTest extends BaseTestCase class GeneratorUtilityTest extends BaseTestCase
{ {

View File

@@ -16,8 +16,8 @@ use ReflectionException;
/** /**
* Test case of the useful locale methods * Test case of the useful locale methods
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class LocaleTest extends BaseTestCase class LocaleTest extends BaseTestCase
{ {

View File

@@ -15,8 +15,8 @@ use Meritoo\Common\Utilities\MimeTypes;
/** /**
* Test case of the useful methods for mime types of files * Test case of the useful methods for mime types of files
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class MimeTypesTest extends BaseTestCase class MimeTypesTest extends BaseTestCase
{ {

View File

@@ -20,8 +20,8 @@ use stdClass;
/** /**
* Test case of the Miscellaneous methods (only static functions) * Test case of the Miscellaneous methods (only static functions)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class MiscellaneousTest extends BaseTestCase class MiscellaneousTest extends BaseTestCase
{ {
@@ -164,7 +164,7 @@ class MiscellaneousTest extends BaseTestCase
$expected = "int(123)\n"; $expected = "int(123)\n";
if ($xdebugLoaded) { if ($xdebugLoaded) {
$libraryPath = realpath(sprintf('%s%s', dirname(__FILE__), '/../..')); $libraryPath = realpath(sprintf('%s%s', __DIR__, '/../..'));
$filePath = sprintf('%s%s', $libraryPath, '/src/Utilities/Miscellaneous.php:'); $filePath = sprintf('%s%s', $libraryPath, '/src/Utilities/Miscellaneous.php:');
/* /*
@@ -348,7 +348,10 @@ class MiscellaneousTest extends BaseTestCase
public function testGetOperatingSystemNameServer() public function testGetOperatingSystemNameServer()
{ {
self::assertEquals(php_uname('s'), Miscellaneous::getOperatingSystemNameServer()); /*
* While running Docker OS is a Linux
*/
self::assertEquals('Linux', Miscellaneous::getOperatingSystemNameServer());
} }
public function testSubstringToWord() public function testSubstringToWord()

View File

@@ -21,8 +21,8 @@ use Meritoo\Common\Utilities\QueryBuilderUtility;
/** /**
* Test case of the useful methods for query builder (the Doctrine's QueryBuilder class) * Test case of the useful methods for query builder (the Doctrine's QueryBuilder class)
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class QueryBuilderUtilityTest extends BaseTestCase class QueryBuilderUtilityTest extends BaseTestCase
{ {

View File

@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
* The A class. * The A class.
* Used for testing the Reflection class. * Used for testing the Reflection class.
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class A class A
{ {

View File

@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
* The B class. * The B class.
* Used for testing the Reflection class. * Used for testing the Reflection class.
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class B extends A implements I class B extends A implements I
{ {

View File

@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
* The C class. * The C class.
* Used for testing the Reflection class. * Used for testing the Reflection class.
* *
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Meritoo <github@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo <http://www.meritoo.pl>
*/ */
class C extends B class C extends B
{ {

Some files were not shown because too many files have changed in this diff Show More