diff --git a/.env.dist b/.env.dist new file mode 100644 index 0000000..163c9a3 --- /dev/null +++ b/.env.dist @@ -0,0 +1,3 @@ +MG_BOT_URL="" +MG_BOT_KEY="" +MG_BOT_DBG="" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a9004ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,186 @@ +# Created by .ignore support plugin (hsz.mobi) +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride +.env +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/dictionaries +.idea/**/shelf + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ +cmake-build-release/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests +### NetBeans template +nbproject/private/ +nbbuild/ +/dist/ +nbdist/ +.nb-gradle/ +### Eclipse template + +.metadata +bin/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# CDT- autotools +.autotools + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet +### Composer template +composer.phar +/vendor/ + +# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control +# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file +# composer.lock +### Linux template +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* +### Windows template +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk +/.php_cs.cache diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..fe2315f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,16 @@ +language: php + +cache: + directories: + - $HOME/.composer/cache + +php: + - '7.0' + - '7.1' + - '7.2' + +before_script: + - flags="-o" + - composer install $flags + +script: make test diff --git a/LICENSE b/LICENSE index c31da9c..16ce40d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 retailCRM +Copyright (c) 2018-2019 RetailDriver LLC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..79babc0 --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +ROOT_DIR=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) +SRC_DIR=$(ROOT_DIR)/src +BIN_DIR=$(ROOT_DIR)/bin + +deps: + @echo "==> Installing dependencies" + @curl -L https://getcomposer.org/composer.phar -o $(BIN_DIR)/composer + @COMPOSER_HOME=/tmp php -d memory_limit=-1 $(BIN_DIR)/composer install + +test: + @echo "==> Running tests" + @cd $(ROOT_DIR) + @php -d memory_limit=-1 $(BIN_DIR)/phpunit -c phpunit.xml.dist --log-junit $(ROOT_DIR)/test-report.xml + @echo "==> Testing complete" + +stan: + @echo "==> Running analysis" + @php $(BIN_DIR)/phpstan analyse -l 4 -c $(ROOT_DIR)/phpstan.neon $(SRC_DIR) + @echo "==> Analysis complete" diff --git a/apigen.neon b/apigen.neon new file mode 100644 index 0000000..5c74aed --- /dev/null +++ b/apigen.neon @@ -0,0 +1,32 @@ +extensions: + - php + +source: + - src + +exclude: + - tests/ + - vendor/ + - bin/ + - docs/ + +charset: + - auto + - UTF-8 + - Windows-1251 + +title: retailCRM PHP MG Bot API client +templateTheme: bootstrap +groups: auto + +accessLevels: + - public + - protected + +internal: true +php: false +tree: true +deprecated: true +todo: true +destination: ../mg-bot-api-client-php.pages/ +download: false diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..13565df --- /dev/null +++ b/composer.json @@ -0,0 +1,50 @@ +{ + "name": "retailcrm/mg-bot-api-client-php", + "description": "PHP client for retailCRM MG Bot API", + "type": "library", + "keywords": ["API", "retailCRM", "REST", "bot"], + "homepage": "http://www.retailcrm.ru/", + "license": "MIT", + "authors": [ + { + "name": "retailCRM", + "email": "support@retailcrm.ru" + } + ], + "require": { + "php": ">=7.0", + "ext-curl": "*", + "ext-json": "*", + "jms/serializer": "1.13.*", + "symfony/validator": "^4.2", + "doctrine/annotations": "^1.6", + "doctrine/cache": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "6.5.*", + "phpmd/phpmd": "2.6.*", + "phpstan/phpstan": "0.9.*", + "squizlabs/php_codesniffer": "3.4.*", + "symfony/dotenv": "^4.2", + "friendsofphp/php-cs-fixer": "^2.14" + }, + "support": { + "email": "support@retailcrm.ru" + }, + "autoload": { + "psr-4": { + "RetailCrm\\Mg\\": ["src/", "tests/"], + "RetailCrm\\Common\\": "src/" + }, + "files": ["extra/autoloader.php"] + }, + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "config": { + "bin-dir": "bin", + "process-timeout": 600 + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..3553733 --- /dev/null +++ b/composer.lock @@ -0,0 +1,4251 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "e2dc59137064db9a4933e3049f8e0c34", + "packages": [ + { + "name": "doctrine/annotations", + "version": "v1.6.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "53120e0eb10355388d6ccbe462f1fea34ddadb24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/53120e0eb10355388d6ccbe462f1fea34ddadb24", + "reference": "53120e0eb10355388d6ccbe462f1fea34ddadb24", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2019-03-25T19:12:02+00:00" + }, + { + "name": "doctrine/cache", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57", + "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57", + "shasum": "" + }, + "require": { + "php": "~7.1" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^4.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2018-08-21T18:01:43+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "a2c590166b2133a4633738648b6b064edae0814a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", + "reference": "a2c590166b2133a4633738648b6b064edae0814a", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2019-03-17T17:37:11+00:00" + }, + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09T13:34:57+00:00" + }, + { + "name": "jms/metadata", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/e5854ab1aa643623dc64adde718a8eec32b957a8", + "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "doctrine/cache": "~1.0", + "symfony/cache": "~3.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "Metadata\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + }, + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "metadata", + "xml", + "yaml" + ], + "time": "2018-10-26T12:40:10+00:00" + }, + { + "name": "jms/parser-lib", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/parser-lib.git", + "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d", + "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d", + "shasum": "" + }, + "require": { + "phpoption/phpoption": ">=0.9,<2.0-dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "description": "A library for easily creating recursive-descent parsers.", + "time": "2012-11-18T18:08:43+00:00" + }, + { + "name": "jms/serializer", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/serializer.git", + "reference": "00863e1d55b411cc33ad3e1de09a4c8d3aae793c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/00863e1d55b411cc33ad3e1de09a4c8d3aae793c", + "reference": "00863e1d55b411cc33ad3e1de09a4c8d3aae793c", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/instantiator": "^1.0.3", + "jms/metadata": "^1.3", + "jms/parser-lib": "1.*", + "php": "^5.5|^7.0", + "phpcollection/phpcollection": "~0.1", + "phpoption/phpoption": "^1.1" + }, + "conflict": { + "twig/twig": "<1.12" + }, + "require-dev": { + "doctrine/orm": "~2.1", + "doctrine/phpcr-odm": "^1.3|^2.0", + "ext-pdo_sqlite": "*", + "jackalope/jackalope-doctrine-dbal": "^1.1.5", + "phpunit/phpunit": "^4.8|^5.0", + "propel/propel1": "~1.7", + "psr/container": "^1.0", + "symfony/dependency-injection": "^2.7|^3.3|^4.0", + "symfony/expression-language": "^2.6|^3.0", + "symfony/filesystem": "^2.1", + "symfony/form": "~2.1|^3.0", + "symfony/translation": "^2.1|^3.0", + "symfony/validator": "^2.2|^3.0", + "symfony/yaml": "^2.1|^3.0", + "twig/twig": "~1.12|~2.0" + }, + "suggest": { + "doctrine/cache": "Required if you like to use cache functionality.", + "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", + "symfony/yaml": "Required if you'd like to serialize data to YAML format." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.13-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\Serializer": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + }, + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", + "homepage": "http://jmsyst.com/libs/serializer", + "keywords": [ + "deserialization", + "jaxb", + "json", + "serialization", + "xml" + ], + "time": "2018-07-25T13:58:54+00:00" + }, + { + "name": "phpcollection/phpcollection", + "version": "0.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-collection.git", + "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", + "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", + "shasum": "" + }, + "require": { + "phpoption/phpoption": "1.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.4-dev" + } + }, + "autoload": { + "psr-0": { + "PhpCollection": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "General-Purpose Collection Library for PHP", + "keywords": [ + "collection", + "list", + "map", + "sequence", + "set" + ], + "time": "2015-05-17T12:39:23+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-0": { + "PhpOption\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2015-07-25T16:39:46+00:00" + }, + { + "name": "symfony/contracts", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/contracts.git", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\": "" + }, + "exclude-from-classmap": [ + "**/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A set of abstractions extracted out of the Symfony components", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2018-12-05T08:06:11+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "82ebae02209c21113908c229e9883c419720738a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", + "reference": "82ebae02209c21113908c229e9883c419720738a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "backendtea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/validator", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "db5457ed88aacc1a040d4961ee52cddad3e5a4aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/db5457ed88aacc1a040d4961ee52cddad3e5a4aa", + "reference": "db5457ed88aacc1a040d4961ee52cddad3e5a4aa", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.4", + "symfony/http-kernel": "<3.4", + "symfony/intl": "<4.1", + "symfony/translation": "<4.2", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "egulias/email-validator": "^1.2.8|~2.0", + "symfony/cache": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~4.1", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/intl": "~4.1", + "symfony/property-access": "~3.4|~4.0", + "symfony/translation": "~4.2", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "egulias/email-validator": "Strict (RFC compliant) email validation", + "psr/cache-implementation": "For using the metadata cache.", + "symfony/config": "", + "symfony/expression-language": "For using the Expression validator", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For accessing properties within comparison constraints", + "symfony/translation": "For translating validation errors.", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "https://symfony.com", + "time": "2019-03-30T15:58:42+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/semver", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e", + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2019-03-19T17:25:45+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "d17708133b6c276d6e42ef887a877866b909d892" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/d17708133b6c276d6e42ef887a877866b909d892", + "reference": "d17708133b6c276d6e42ef887a877866b909d892", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "time": "2019-01-28T20:25:53+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v2.14.2", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "ff401e58261ffc5934a58f795b3f95b355e276cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/ff401e58261ffc5934a58f795b3f95b355e276cb", + "reference": "ff401e58261ffc5934a58f795b3f95b355e276cb", + "shasum": "" + }, + "require": { + "composer/semver": "^1.4", + "composer/xdebug-handler": "^1.2", + "doctrine/annotations": "^1.2", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^5.6 || ^7.0", + "php-cs-fixer/diff": "^1.3", + "symfony/console": "^3.4.17 || ^4.1.6", + "symfony/event-dispatcher": "^3.0 || ^4.0", + "symfony/filesystem": "^3.0 || ^4.0", + "symfony/finder": "^3.0 || ^4.0", + "symfony/options-resolver": "^3.0 || ^4.0", + "symfony/polyfill-php70": "^1.0", + "symfony/polyfill-php72": "^1.4", + "symfony/process": "^3.0 || ^4.0", + "symfony/stopwatch": "^3.0 || ^4.0" + }, + "require-dev": { + "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", + "justinrainbow/json-schema": "^5.0", + "keradus/cli-executor": "^1.2", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.1", + "php-cs-fixer/accessible-object": "^1.0", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.0.1", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.0.1", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1", + "phpunitgoodpractices/traits": "^1.5.1", + "symfony/phpunit-bridge": "^4.0" + }, + "suggest": { + "ext-mbstring": "For handling non-UTF8 characters in cache signature.", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", + "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "classmap": [ + "tests/Test/AbstractFixerTestCase.php", + "tests/Test/AbstractIntegrationCaseFactory.php", + "tests/Test/AbstractIntegrationTestCase.php", + "tests/Test/Assert/AssertTokensTrait.php", + "tests/Test/IntegrationCase.php", + "tests/Test/IntegrationCaseFactory.php", + "tests/Test/IntegrationCaseFactoryInterface.php", + "tests/Test/InternalIntegrationCaseFactory.php", + "tests/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "time": "2019-02-17T17:44:13+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "1.2", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/75c7effcf3f77501d0e0caa75111aff4daa0dd48", + "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48", + "shasum": "" + }, + "require": { + "ocramius/package-versions": "^1.2.0", + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A wrapper for ocramius/package-versions to get pretty versions strings", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "time": "2018-06-13T13:22:40+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2018-06-11T23:09:50+00:00" + }, + { + "name": "nette/bootstrap", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/nette/bootstrap.git", + "reference": "e1075af05c211915e03e0c86542f3ba5433df4a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/bootstrap/zipball/e1075af05c211915e03e0c86542f3ba5433df4a3", + "reference": "e1075af05c211915e03e0c86542f3ba5433df4a3", + "shasum": "" + }, + "require": { + "nette/di": "^3.0", + "nette/utils": "^3.0", + "php": ">=7.1" + }, + "require-dev": { + "latte/latte": "^2.2", + "nette/application": "^3.0", + "nette/caching": "^3.0", + "nette/database": "^3.0", + "nette/forms": "^3.0", + "nette/http": "^3.0", + "nette/mail": "^3.0", + "nette/robot-loader": "^3.0", + "nette/safe-stream": "^2.2", + "nette/security": "^3.0", + "nette/tester": "^2.0", + "tracy/tracy": "^2.6" + }, + "suggest": { + "nette/robot-loader": "to use Configurator::createRobotLoader()", + "tracy/tracy": "to use Configurator::enableTracy()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.", + "homepage": "https://nette.org", + "keywords": [ + "bootstrapping", + "configurator", + "nette" + ], + "time": "2019-03-26T12:59:07+00:00" + }, + { + "name": "nette/di", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/nette/di.git", + "reference": "19d83539245aaacb59470828919182411061841f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/di/zipball/19d83539245aaacb59470828919182411061841f", + "reference": "19d83539245aaacb59470828919182411061841f", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "nette/neon": "^3.0", + "nette/php-generator": "^3.2.2", + "nette/robot-loader": "^3.2", + "nette/schema": "^1.0", + "nette/utils": "^3.0", + "php": ">=7.1" + }, + "conflict": { + "nette/bootstrap": "<3.0" + }, + "require-dev": { + "nette/tester": "^2.2", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ], + "files": [ + "src/compatibility.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.", + "homepage": "https://nette.org", + "keywords": [ + "compiled", + "di", + "dic", + "factory", + "ioc", + "nette", + "static" + ], + "time": "2019-04-03T19:35:46+00:00" + }, + { + "name": "nette/finder", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/nette/finder.git", + "reference": "6be1b83ea68ac558aff189d640abe242e0306fe2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/finder/zipball/6be1b83ea68ac558aff189d640abe242e0306fe2", + "reference": "6be1b83ea68ac558aff189d640abe242e0306fe2", + "shasum": "" + }, + "require": { + "nette/utils": "^2.4 || ~3.0.0", + "php": ">=7.1" + }, + "conflict": { + "nette/nette": "<2.2" + }, + "require-dev": { + "nette/tester": "^2.0", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "? Nette Finder: find files and directories with an intuitive API.", + "homepage": "https://nette.org", + "keywords": [ + "filesystem", + "glob", + "iterator", + "nette" + ], + "time": "2019-02-28T18:13:25+00:00" + }, + { + "name": "nette/neon", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/nette/neon.git", + "reference": "cbff32059cbdd8720deccf9e9eace6ee516f02eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/neon/zipball/cbff32059cbdd8720deccf9e9eace6ee516f02eb", + "reference": "cbff32059cbdd8720deccf9e9eace6ee516f02eb", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "ext-json": "*", + "php": ">=7.0" + }, + "require-dev": { + "nette/tester": "^2.0", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "? Nette NEON: encodes and decodes NEON file format.", + "homepage": "http://ne-on.org", + "keywords": [ + "export", + "import", + "neon", + "nette", + "yaml" + ], + "time": "2019-02-05T21:30:40+00:00" + }, + { + "name": "nette/php-generator", + "version": "v3.2.2", + "source": { + "type": "git", + "url": "https://github.com/nette/php-generator.git", + "reference": "acff8b136fad84b860a626d133e791f95781f9f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/php-generator/zipball/acff8b136fad84b860a626d133e791f95781f9f5", + "reference": "acff8b136fad84b860a626d133e791f95781f9f5", + "shasum": "" + }, + "require": { + "nette/utils": "^2.4.2 || ~3.0.0", + "php": ">=7.1" + }, + "require-dev": { + "nette/tester": "^2.0", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.3 features.", + "homepage": "https://nette.org", + "keywords": [ + "code", + "nette", + "php", + "scaffolding" + ], + "time": "2019-03-15T03:41:13+00:00" + }, + { + "name": "nette/robot-loader", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/nette/robot-loader.git", + "reference": "0712a0e39ae7956d6a94c0ab6ad41aa842544b5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/robot-loader/zipball/0712a0e39ae7956d6a94c0ab6ad41aa842544b5c", + "reference": "0712a0e39ae7956d6a94c0ab6ad41aa842544b5c", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "nette/finder": "^2.5", + "nette/utils": "^3.0", + "php": ">=7.1" + }, + "require-dev": { + "nette/tester": "^2.0", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "? Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", + "homepage": "https://nette.org", + "keywords": [ + "autoload", + "class", + "interface", + "nette", + "trait" + ], + "time": "2019-03-08T21:57:24+00:00" + }, + { + "name": "nette/schema", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "6241d8d4da39e825dd6cb5bfbe4242912f4d7e4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/6241d8d4da39e825dd6cb5bfbe4242912f4d7e4d", + "reference": "6241d8d4da39e825dd6cb5bfbe4242912f4d7e4d", + "shasum": "" + }, + "require": { + "nette/utils": "^3.0.1", + "php": ">=7.1" + }, + "require-dev": { + "nette/tester": "^2.2", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "time": "2019-04-03T15:53:25+00:00" + }, + { + "name": "nette/utils", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "bd961f49b211997202bda1d0fbc410905be370d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/bd961f49b211997202bda1d0fbc410905be370d4", + "reference": "bd961f49b211997202bda1d0fbc410905be370d4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "nette/tester": "~2.0", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize() and toAscii()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "time": "2019-03-22T01:00:30+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v3.1.5", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", + "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2018-02-28T20:30:58+00:00" + }, + { + "name": "ocramius/package-versions", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/PackageVersions.git", + "reference": "a4d4b60d0e60da2487bd21a2c6ac089f85570dbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/a4d4b60d0e60da2487bd21a2c6ac089f85570dbb", + "reference": "a4d4b60d0e60da2487bd21a2c6ac089f85570dbb", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0.0", + "php": "^7.1.0" + }, + "require-dev": { + "composer/composer": "^1.6.3", + "doctrine/coding-standard": "^5.0.1", + "ext-zip": "*", + "infection/infection": "^0.7.1", + "phpunit/phpunit": "^7.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "time": "2019-02-21T12:16:21+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "time": "2018-07-02T15:55:56+00:00" + }, + { + "name": "pdepend/pdepend", + "version": "2.5.2", + "source": { + "type": "git", + "url": "https://github.com/pdepend/pdepend.git", + "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", + "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", + "shasum": "" + }, + "require": { + "php": ">=5.3.7", + "symfony/config": "^2.3.0|^3|^4", + "symfony/dependency-injection": "^2.3.0|^3|^4", + "symfony/filesystem": "^2.3.0|^3|^4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "squizlabs/php_codesniffer": "^2.0.0" + }, + "bin": [ + "src/bin/pdepend" + ], + "type": "library", + "autoload": { + "psr-4": { + "PDepend\\": "src/main/php/PDepend" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Official version of pdepend to be handled with Composer", + "time": "2017-12-13T13:21:38+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^1.0.1", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2017-03-05T18:14:27+00:00" + }, + { + "name": "phar-io/version", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2017-03-05T17:38:23+00:00" + }, + { + "name": "php-cs-fixer/diff", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756", + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "SpacePossum" + } + ], + "description": "sebastian/diff v2 backport support for PHP5.6", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "time": "2018-02-15T16:58:55+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2017-09-11T18:02:19+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "~1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2017-11-30T07:14:17+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2017-07-14T14:27:02+00:00" + }, + { + "name": "phpmd/phpmd", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/phpmd/phpmd.git", + "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/4e9924b2c157a3eb64395460fcf56b31badc8374", + "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "pdepend/pdepend": "^2.5", + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.0", + "squizlabs/php_codesniffer": "^2.0" + }, + "bin": [ + "src/bin/phpmd" + ], + "type": "project", + "autoload": { + "psr-0": { + "PHPMD\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Manuel Pichler", + "email": "github@manuel-pichler.de", + "homepage": "https://github.com/manuelpichler", + "role": "Project Founder" + }, + { + "name": "Other contributors", + "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", + "role": "Contributors" + }, + { + "name": "Marc Würth", + "email": "ravage@bluewin.ch", + "homepage": "https://github.com/ravage84", + "role": "Project Maintainer" + } + ], + "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", + "homepage": "http://phpmd.org/", + "keywords": [ + "mess detection", + "mess detector", + "pdepend", + "phpmd", + "pmd" + ], + "time": "2017-01-20T14:41:10+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2018-08-05T17:53:17+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "0.2", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "02f909f134fe06f0cd4790d8627ee24efbe84d6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/02f909f134fe06f0cd4790d8627ee24efbe84d6a", + "reference": "02f909f134fe06f0cd4790d8627ee24efbe84d6a", + "shasum": "" + }, + "require": { + "php": "~7.0" + }, + "require-dev": { + "consistence/coding-standard": "^2.0.0", + "jakub-onderka/php-parallel-lint": "^0.9.2", + "phing/phing": "^2.16.0", + "phpstan/phpstan": "^0.9", + "phpunit/phpunit": "^6.3", + "slevomat/coding-standard": "^3.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.1-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "time": "2018-01-13T18:19:41+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "0.9.2", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "e59541bcc7cac9b35ca54db6365bf377baf4a488" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e59541bcc7cac9b35ca54db6365bf377baf4a488", + "reference": "e59541bcc7cac9b35ca54db6365bf377baf4a488", + "shasum": "" + }, + "require": { + "jean85/pretty-package-versions": "^1.0.3", + "nette/bootstrap": "^2.4 || ^3.0", + "nette/di": "^2.4.7 || ^3.0", + "nette/robot-loader": "^3.0.1", + "nette/utils": "^2.4.5 || ^3.0", + "nikic/php-parser": "^3.1", + "php": "~7.0", + "phpstan/phpdoc-parser": "^0.2", + "symfony/console": "~3.2 || ~4.0", + "symfony/finder": "~3.2 || ~4.0" + }, + "require-dev": { + "consistence/coding-standard": "2.2.1", + "ext-gd": "*", + "ext-intl": "*", + "ext-mysqli": "*", + "jakub-onderka/php-parallel-lint": "^0.9.2", + "phing/phing": "^2.16.0", + "phpstan/phpstan-php-parser": "^0.9", + "phpstan/phpstan-phpunit": "^0.9.3", + "phpstan/phpstan-strict-rules": "^0.9", + "phpunit/phpunit": "^6.5.4", + "slevomat/coding-standard": "4.0.0" + }, + "bin": [ + "bin/phpstan" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": [ + "src/", + "build/PHPStan" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "time": "2018-01-28T13:22:19+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "5.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.0", + "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^2.0.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-xdebug": "^2.5.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2018-04-06T15:36:58+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2017-11-27T13:52:08+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2017-02-26T11:10:40+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "791198a2c6254db10131eecfe8c06670700904db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", + "reference": "791198a2c6254db10131eecfe8c06670700904db", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2017-11-27T05:48:46+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "6.5.14", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bac23fe7ff13dbdb461481f706f0e9fe746334b7", + "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.6.1", + "phar-io/manifest": "^1.0.1", + "phar-io/version": "^1.0", + "php": "^7.0", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^5.3", + "phpunit/php-file-iterator": "^1.4.3", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^1.0.9", + "phpunit/phpunit-mock-objects": "^5.0.9", + "sebastian/comparator": "^2.1", + "sebastian/diff": "^2.0", + "sebastian/environment": "^3.1", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^1.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2", + "phpunit/dbunit": "<3.0" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-xdebug": "*", + "phpunit/php-invoker": "^1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2019-02-01T05:22:47+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "5.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f", + "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.5", + "php": "^7.0", + "phpunit/php-text-template": "^1.2.1", + "sebastian/exporter": "^3.1" + }, + "conflict": { + "phpunit/phpunit": "<6.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.11" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "abandoned": true, + "time": "2018-08-09T05:50:03+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/log", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2018-11-20T15:27:04+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/diff": "^2.0 || ^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-02-01T13:46:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2017-08-03T08:09:46+00:00" + }, + { + "name": "sebastian/environment", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2017-07-01T08:51:00+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2017-04-03T13:19:02+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28T20:34:47+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.4.1", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "5b4333b4010625d29580eb4a41f1e53251be6baa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5b4333b4010625d29580eb4a41f1e53251be6baa", + "reference": "5b4333b4010625d29580eb4a41f1e53251be6baa", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2019-03-19T03:22:27+00:00" + }, + { + "name": "symfony/config", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "0e745ead307d5dcd4e163e94a47ec04b1428943f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/0e745ead307d5dcd4e163e94a47ec04b1428943f", + "reference": "0e745ead307d5dcd4e163e94a47ec04b1428943f", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/filesystem": "~3.4|~4.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<3.4" + }, + "require-dev": { + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2019-04-01T14:03:25+00:00" + }, + { + "name": "symfony/console", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "24206aff3efe6962593297e57ef697ebb220e384" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/24206aff3efe6962593297e57ef697ebb220e384", + "reference": "24206aff3efe6962593297e57ef697ebb220e384", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2019-04-01T07:32:59+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "1806e43ff6bff57398d33b326cd753a12d9f434f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1806e43ff6bff57398d33b326cd753a12d9f434f", + "reference": "1806e43ff6bff57398d33b326cd753a12d9f434f", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0", + "symfony/contracts": "^1.0" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/finder": "<3.4", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-contracts-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "~4.2", + "symfony/expression-language": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2019-03-30T15:58:42+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "b541d63b83532be55a020db8ed2e50598385a583" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/b541d63b83532be55a020db8ed2e50598385a583", + "reference": "b541d63b83532be55a020db8ed2e50598385a583", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "symfony/process": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2019-04-01T07:32:59+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "ca5af306fbc37f3cf597e91bc9cfa0c7d3f33544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ca5af306fbc37f3cf597e91bc9cfa0c7d3f33544", + "reference": "ca5af306fbc37f3cf597e91bc9cfa0c7d3f33544", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2019-03-30T15:58:42+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "e16b9e471703b2c60b95f14d31c1239f68f11601" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e16b9e471703b2c60b95f14d31c1239f68f11601", + "reference": "e16b9e471703b2c60b95f14d31c1239f68f11601", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2019-02-07T11:40:08+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "267b7002c1b70ea80db0833c3afe05f0fbde580a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/267b7002c1b70ea80db0833c3afe05f0fbde580a", + "reference": "267b7002c1b70ea80db0833c3afe05f0fbde580a", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2019-02-23T15:42:05+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "3896e5a7d06fd15fa4947694c8dcdd371ff147d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/3896e5a7d06fd15fa4947694c8dcdd371ff147d1", + "reference": "3896e5a7d06fd15fa4947694c8dcdd371ff147d1", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony OptionsResolver Component", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "time": "2019-02-23T15:17:42+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "bc4858fb611bda58719124ca079baff854149c89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89", + "reference": "bc4858fb611bda58719124ca079baff854149c89", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/process", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "1e6cbb41dadcaf29e0db034d6ad0d039a9df06e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/1e6cbb41dadcaf29e0db034d6ad0d039a9df06e6", + "reference": "1e6cbb41dadcaf29e0db034d6ad0d039a9df06e6", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2019-03-10T20:07:02+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v4.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "b1a5f646d56a3290230dbc8edf2a0d62cda23f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b1a5f646d56a3290230dbc8edf2a0d62cda23f67", + "reference": "b1a5f646d56a3290230dbc8edf2a0d62cda23f67", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "time": "2019-01-16T20:31:39+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/1c42705be2b6c1de5904f8afacef5895cab44bf8", + "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2019-04-04T09:56:43+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2018-12-25T11:19:39+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.0", + "ext-curl": "*", + "ext-json": "*" + }, + "platform-dev": [] +} diff --git a/extra/autoloader.php b/extra/autoloader.php new file mode 100644 index 0000000..8fc5a70 --- /dev/null +++ b/extra/autoloader.php @@ -0,0 +1,19 @@ + + + + + + tests/Bot/Tests + + + + + + ./src/Bot + + + diff --git a/phpunit.xsd b/phpunit.xsd new file mode 100644 index 0000000..ec86b23 --- /dev/null +++ b/phpunit.xsd @@ -0,0 +1,251 @@ + + + + + This Schema file defines the rules by which the XML configuration file of PHPUnit 3.7 may be structured. + + + + + + Root Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The main type specifying the document structure + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Bot/Client.php b/src/Bot/Client.php new file mode 100644 index 0000000..59b9827 --- /dev/null +++ b/src/Bot/Client.php @@ -0,0 +1,345 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot; + +use RetailCrm\Common\Exception\CurlException; +use RetailCrm\Common\Exception\InvalidJsonException; +use RetailCrm\Common\Url; +use RetailCrm\Common\Serializer; +use RetailCrm\Mg\Bot\Model; +use Exception; +use InvalidArgumentException; + +/** + * PHP version 7.0 + * + * Client class + * + * @package RetailCrm\Mg\Bot + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Client +{ + const VERSION = 'v1'; + + protected $client; + + /** + * Init + * + * @param string $url api url + * @param string $token api key + * @param bool $debug debug flag + */ + public function __construct($url, $token, $debug = false) + { + $url = sprintf("%sapi/bot/%s", Url::normalizeUrl($url), self::VERSION); + $this->client = new Request($url, $token, $debug); + } + + /** + * Returns filtered bots list + * + * @param Model\Request\BotsRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function bots(Model\Request\BotsRequest $request) + { + return $this->client->makeRequest('/bots', Request::METHOD_GET, $request, Serializer::S_ARRAY); + } + + /** + * Edit bot info + * + * @param Model\Request\InfoRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws CurlException + * @throws Exception + * + * @return Response + */ + public function info(Model\Request\InfoRequest $request) + { + return $this->client->makeRequest('/my/info', Request::METHOD_PATCH, $request); + } + + /** + * Returns filtered channels list + * + * @param Model\Request\ChannelsRequest $request + * + * @return Response + * @throws \Exception + */ + public function channels(Model\Request\ChannelsRequest $request) + { + return $this->client->makeRequest('/channels', Request::METHOD_GET, $request, Serializer::S_ARRAY); + } + + /** + * Returns filtered chats list + * + * @param Model\Request\ChatsRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function chats(Model\Request\ChatsRequest $request) + { + return $this->client->makeRequest('/chats', Request::METHOD_GET, $request, Serializer::S_ARRAY); + } + + /** + * Returns filtered commands list + * + * @param Model\Request\CommandsRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function commands(Model\Request\CommandsRequest $request) + { + return $this->client->makeRequest('/my/commands', Request::METHOD_GET, $request, Serializer::S_ARRAY); + } + + /** + * Edit commands for exact bot + * + * @param Model\Request\CommandEditRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function commandEdit(Model\Request\CommandEditRequest $request) + { + return $this->client->makeRequest( + sprintf("/my/commands/%s", $request->getName()), + Request::METHOD_PUT, + $request + ); + } + + /** + * Delete command for exact bot + * + * @param string $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function commandDelete(string $request) + { + return $this->client->makeRequest(sprintf("/my/commands/%s", $request), Request::METHOD_DELETE); + } + + /** + * Returns filtered customers list + * + * @param Model\Request\CustomersRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function customers(Model\Request\CustomersRequest $request) + { + return $this->client->makeRequest('/customers', Request::METHOD_GET, $request, Serializer::S_ARRAY); + } + + /** + * Returns filtered dialogs list + * + * @param Model\Request\DialogsRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function dialogs(Model\Request\DialogsRequest $request) + { + return $this->client->makeRequest('/dialogs', Request::METHOD_GET, $request, Serializer::S_ARRAY); + } + + /** + * Assign dialog to exact user + * + * @param Model\Request\DialogAssignRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function dialogAssign(Model\Request\DialogAssignRequest $request) + { + return $this->client->makeRequest( + sprintf("/dialogs/%d/assign", $request->getDialogId()), + Request::METHOD_PATCH, + $request + ); + } + + /** + * Close exact dialog + * + * @param string $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function dialogClose(string $request) + { + return $this->client->makeRequest(sprintf("/dialogs/%d/close", $request), Request::METHOD_DELETE); + } + + /** + * Returns filtered members list + * + * @param Model\Request\MembersRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function members(Model\Request\MembersRequest $request) + { + return $this->client->makeRequest('/members', Request::METHOD_GET, $request, Serializer::S_ARRAY); + } + + /** + * Returns filtered messages list + * + * @param Model\Request\MessagesRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function messages(Model\Request\MessagesRequest $request) + { + return $this->client->makeRequest('/messages', Request::METHOD_GET, $request, Serializer::S_ARRAY); + } + + /** + * Send a message + * + * @param Model\Request\MessageSendRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function messageSend(Model\Request\MessageSendRequest $request) + { + return $this->client->makeRequest('/messages', Request::METHOD_POST, $request); + } + + /** + * Edit a message + * + * @param Model\Request\MessageEditRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function messageEdit(Model\Request\MessageEditRequest $request) + { + return $this->client->makeRequest('/messages/%d', Request::METHOD_PATCH, $request->getId()); + } + + /** + * Delete a message + * + * @param string $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function messageDelete(string $request) + { + return $this->client->makeRequest(sprintf("/messages/%d", $request), Request::METHOD_DELETE); + } + + /** + * Returns filtered users list + * + * @param Model\Request\UsersRequest $request + * + * @throws InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * @throws Exception + * + * @return Response + */ + public function users(Model\Request\UsersRequest $request) + { + return $this->client->makeRequest('/users', Request::METHOD_GET, $request, Serializer::S_ARRAY); + } +} diff --git a/src/Bot/Model/Constants.php b/src/Bot/Model/Constants.php new file mode 100644 index 0000000..7571533 --- /dev/null +++ b/src/Bot/Model/Constants.php @@ -0,0 +1,85 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model; + +/** + * PHP version 7.0 + * + * Constants class + * + * @package RetailCrm\Mg\Bot\Model + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Constants +{ + const CHANNEL_TYPE_TELEGRAM = "telegram"; + const CHANNEL_TYPE_FACEBOOK = "fbmessenger"; + const CHANNEL_TYPE_VIBER = "viber"; + const CHANNEL_TYPE_WHATSAPP = "whatsapp"; + const CHANNEL_TYPE_SKYPE = "skype"; + const CHANNEL_TYPE_VK = "vk"; + const CHANNEL_TYPE_INSTAGRAM = "instagram"; + const CHANNEL_TYPE_CONSULTANT = "consultant"; + const CHANNEL_TYPE_CUSTOM = "custom"; + + const CHAT_MEMBER_STATE_ACTIVE = "active"; + const CHAT_MEMBER_STATE_KICKED = "kicked"; + const CHAT_MEMBER_STATE_LEAVED = "leaved"; + + const CHANNEL_FEATURE_NONE = "none"; + const CHANNEL_FEATURE_RECEIVE = "receive"; + const CHANNEL_FEATURE_SEND = "send"; + const CHANNEL_FEATURE_BOTH = "both"; + + const BOT_ROLE_DISTRIBUTOR = "distributor"; + const BOT_ROLE_RESPONSIBLE = "responsible"; + + const MESSAGE_SCOPE_PUBLIC = "public"; + const MESSAGE_SCOPE_PRIVATE = "private"; + + const MESSAGE_TYPE_TEXT = "text"; + const MESSAGE_TYPE_SYSTEM = "system"; + const MESSAGE_TYPE_COMMAND = "command"; + const MESSAGE_TYPE_ORDER = "order"; + const MESSAGE_TYPE_PRODUCT = "product"; + const MESSAGE_TYPE_FILE = "file"; + const MESSAGE_TYPE_IMAGE = "image"; + + const MESSAGE_ORDER_STATUS_CODE_NEW = "new"; + const MESSAGE_ORDER_STATUS_CODE_APPROVAL = "approval"; + const MESSAGE_ORDER_STATUS_CODE_ASSEMBLING = "assembling"; + const MESSAGE_ORDER_STATUS_CODE_DELIVERY = "delivery"; + const MESSAGE_ORDER_STATUS_CODE_COMPLETE = "complete"; + const MESSAGE_ORDER_STATUS_CODE_CANCEL = "cancel"; + + const WS_EVENT_MESSAGE_NEW = "message_new"; + const WS_EVENT_MESSAGE_UPDATED = "message_updated"; + const WS_EVENT_MESSAGE_DELETED = "message_deleted"; + const WS_EVENT_DIALOG_OPENED = "dialog_opened"; + const WS_EVENT_DIALOG_CLOSED = "dialog_closed"; + const WS_EVENT_DIALOG_ASSIGN = "dialog_assign"; + const WS_EVENT_CHAT_CREATED = "chat_created"; + const WS_EVENT_CHAT_UPDATED = "chat_updated"; + const WS_EVENT_CHAT_UNREAD_UPDATED = "chat_unread_updated"; + const WS_EVENT_USER_ONLINE_UPDATED = "user_online_updated"; + const WS_EVENT_USER_JOINED = "user_joined_chat"; + const WS_EVENT_USER_LEAVE = "user_left_chat"; + const WS_EVENT_USER_UPDATED = "user_updated"; + const WS_EVENT_CUSTOMER_UPDATED = "customer_updated"; + const WS_EVENT_BOT_UPDATED = "bot_updated"; + const WS_EVENT_CHANNEL_UPDATED = "channel_updated"; + const WS_EVENT_SETTINGS_UPDATED = "settings_updated"; +} diff --git a/src/Bot/Model/Entity/Cost.php b/src/Bot/Model/Entity/Cost.php new file mode 100644 index 0000000..2727732 --- /dev/null +++ b/src/Bot/Model/Entity/Cost.php @@ -0,0 +1,82 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * Cost class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Cost +{ + /** + * @var float $value + * + * @Type("float") + * @Accessor(getter="getValue",setter="setValue") + * @SkipWhenEmpty() + */ + private $value; + + /** + * @var string $currency + * + * @Type("string") + * @Accessor(getter="getCurrency",setter="setCurrency") + * + * @Assert\Currency + */ + private $currency; + + /** + * @return float + */ + public function getValue() + { + return $this->value; + } + + /** + * @param float $value + */ + public function setValue(float $value) + { + $this->value = $value; + } + + /** + * @return string + */ + public function getCurrency() + { + return $this->currency; + } + + /** + * @param string $currency + */ + public function setCurrency(string $currency) + { + $this->currency = $currency; + } +} diff --git a/src/Bot/Model/Entity/Delivery.php b/src/Bot/Model/Entity/Delivery.php new file mode 100644 index 0000000..2de1bbc --- /dev/null +++ b/src/Bot/Model/Entity/Delivery.php @@ -0,0 +1,133 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * Delivery class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Delivery +{ + /** + * @var string $name + * + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * + * @Assert\NotBlank + */ + private $name; + + /** + * @var Cost $price + * + * @Type("Cost") + * @Accessor(getter="getPrice",setter="setPrice") + * + * @Assert\Currency + */ + private $price; + + /** + * @var string $address + * + * @Type("string") + * @Accessor(getter="getAddress",setter="setAddress") + * @SkipWhenEmpty() + */ + private $address; + + /** + * @var string $comment + * + * @Type("string") + * @Accessor(getter="getComment",setter="setComment") + * @SkipWhenEmpty() + */ + private $comment; + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * @return Cost + */ + public function getPrice() + { + return $this->price; + } + + /** + * @param Cost $price + */ + public function setPrice(Cost $price) + { + $this->price = $price; + } + + /** + * @return string + */ + public function getAddress() + { + return $this->address; + } + + /** + * @param string $address + */ + public function setAddress(string $address) + { + $this->address = $address; + } + + /** + * @return string + */ + public function getComment() + { + return $this->comment; + } + + /** + * @param string $comment + */ + public function setComment(string $comment) + { + $this->comment = $comment; + } +} diff --git a/src/Bot/Model/Entity/Item.php b/src/Bot/Model/Entity/Item.php new file mode 100644 index 0000000..9e6ad82 --- /dev/null +++ b/src/Bot/Model/Entity/Item.php @@ -0,0 +1,81 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * Item class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Item +{ + /** + * @var string $id + * + * @Type("string") + * @Accessor(getter="getId",setter="setId") + * @SkipWhenEmpty() + */ + private $id; + + /** + * @var string $caption + * + * @Type("string") + * @Accessor(getter="getCaption",setter="setCaption") + * @SkipWhenEmpty() + */ + private $caption; + + /** + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * @param string $id + */ + public function setId(string $id) + { + $this->id = $id; + } + + /** + * @return string + */ + public function getCaption() + { + return $this->caption; + } + + /** + * @param string $caption + */ + public function setCaption(string $caption) + { + $this->caption = $caption; + } +} diff --git a/src/Bot/Model/Entity/Order.php b/src/Bot/Model/Entity/Order.php new file mode 100644 index 0000000..ffa27de --- /dev/null +++ b/src/Bot/Model/Entity/Order.php @@ -0,0 +1,231 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * Order class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Order +{ + /** + * @var string $number + * + * @Type("string") + * @Accessor(getter="getNumber",setter="setNumber") + * @SkipWhenEmpty() + */ + private $number; + + /** + * @var string $url + * + * @Type("string") + * @Accessor(getter="getUrl",setter="setUrl") + * @SkipWhenEmpty() + */ + private $url; + + /** + * @var string $date + * + * @Type("string") + * @Accessor(getter="getDate",setter="setDate") + * @SkipWhenEmpty() + */ + private $date; + + /** + * @var Cost $cost + * + * @Type("Cost") + * @Accessor(getter="getCost",setter="setCost") + * @SkipWhenEmpty() + */ + private $cost; + + /** + * @var Status $status + * + * @Type("Status") + * @Accessor(getter="getStatus",setter="setStatus") + * @SkipWhenEmpty() + */ + private $status; + + /** + * @var Delivery $delivery + * + * @Type("Delivery") + * @Accessor(getter="getDelivery",setter="setDelivery") + * @SkipWhenEmpty() + */ + private $delivery; + + /** + * @var array $items + * + * @Type("array") + * @Accessor(getter="getItems",setter="setItems") + * @SkipWhenEmpty() + */ + private $items; + + /** + * @var array $payments + * + * @Type("array") + * @Accessor(getter="getPayments",setter="setPayments") + * @SkipWhenEmpty() + */ + private $payments; + + /** + * @return string + */ + public function getNumber() + { + return $this->number; + } + + /** + * @param string $number + */ + public function setNumber(string $number) + { + $this->number = $number; + } + + /** + * @return string + */ + public function getUrl() + { + return $this->url; + } + + /** + * @param string $url + */ + public function setUrl(string $url) + { + $this->url = $url; + } + + /** + * @return string + */ + public function getDate() + { + return $this->date; + } + + /** + * @param string $date + */ + public function setDate(string $date) + { + $this->date = $date; + } + + /** + * @return Cost + */ + public function getCost() + { + return $this->cost; + } + + /** + * @param Cost $cost + */ + public function setCost(Cost $cost) + { + $this->cost = $cost; + } + + /** + * @return Status + */ + public function getStatus() + { + return $this->status; + } + + /** + * @param Status $status + */ + public function setStatus(Status $status) + { + $this->status = $status; + } + + /** + * @return Delivery + */ + public function getDelivery() + { + return $this->delivery; + } + + /** + * @param Delivery $delivery + */ + public function setDelivery(Delivery $delivery) + { + $this->delivery = $delivery; + } + + /** + * @return array + */ + public function getItems() + { + return $this->items; + } + + /** + * @param array $items + */ + public function setItems(array $items) + { + $this->items = $items; + } + + /** + * @return array + */ + public function getPayments() + { + return $this->payments; + } + + /** + * @param array $payments + */ + public function setPayments(array $payments) + { + $this->payments = $payments; + } +} diff --git a/src/Bot/Model/Entity/OrderItem.php b/src/Bot/Model/Entity/OrderItem.php new file mode 100644 index 0000000..dba54ce --- /dev/null +++ b/src/Bot/Model/Entity/OrderItem.php @@ -0,0 +1,156 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * OrderItem class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class OrderItem +{ + /** + * @var string $name + * + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * @SkipWhenEmpty() + */ + private $name; + + /** + * @var string $url + * + * @Type("string") + * @Accessor(getter="getUrl",setter="setUrl") + * @SkipWhenEmpty() + */ + private $url; + + /** + * @var string $img + * + * @Type("string") + * @Accessor(getter="getImg",setter="setImg") + * @SkipWhenEmpty() + */ + private $img; + + /** + * @var Cost $price + * + * @Type("Cost") + * @Accessor(getter="getPrice",setter="setPrice") + * @SkipWhenEmpty() + */ + private $price; + + /** + * @var Quantity $quantity + * + * @Type("Quantity") + * @Accessor(getter="getQuantity",setter="setQuantity) + * @SkipWhenEmpty() + */ + private $quantity; + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * @return string + */ + public function getUrl() + { + return $this->url; + } + + /** + * @param string $url + */ + public function setUrl(string $url) + { + $this->url = $url; + } + + /** + * @return string + */ + public function getImg() + { + return $this->img; + } + + /** + * @param string $img + */ + public function setImg(string $img) + { + $this->img = $img; + } + + /** + * @return Cost + */ + public function getPrice() + { + return $this->price; + } + + /** + * @param Cost $price + */ + public function setPrice(Cost $price) + { + $this->price = $price; + } + + /** + * @return Quantity + */ + public function getQuantity() + { + return $this->quantity; + } + + /** + * @param Quantity $quantity + */ + public function setQuantity(Quantity $quantity) + { + $this->quantity = $quantity; + } +} diff --git a/src/Bot/Model/Entity/Payment.php b/src/Bot/Model/Entity/Payment.php new file mode 100644 index 0000000..b5709c9 --- /dev/null +++ b/src/Bot/Model/Entity/Payment.php @@ -0,0 +1,106 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * Payment class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Payment +{ + /** + * @var string $name + * + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * @SkipWhenEmpty() + */ + private $name; + + /** + * @var PaymentStatus $status + * + * @Type("PaymentStatus") + * @Accessor(getter="getStatus",setter="setStatus") + * @SkipWhenEmpty() + */ + private $status; + + /** + * @var Cost $amount + * + * @Type("Cost") + * @Accessor(getter="getAmount",setter="setAmount") + * @SkipWhenEmpty() + */ + private $amount; + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * @return PaymentStatus + */ + public function getStatus() + { + return $this->status; + } + + /** + * @param PaymentStatus $status + */ + public function setStatus(PaymentStatus $status) + { + $this->status = $status; + } + + /** + * @return Cost + */ + public function getAmount() + { + return $this->amount; + } + + /** + * @param Cost $amount + */ + public function setAmount(Cost $amount) + { + $this->amount = $amount; + } +} diff --git a/src/Bot/Model/Entity/PaymentStatus.php b/src/Bot/Model/Entity/PaymentStatus.php new file mode 100644 index 0000000..7a20f46 --- /dev/null +++ b/src/Bot/Model/Entity/PaymentStatus.php @@ -0,0 +1,81 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * PaymentStatus class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class PaymentStatus +{ + /** + * @var string $name + * + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * @SkipWhenEmpty() + */ + private $name; + + /** + * @var bool $payed + * + * @Type("bool") + * @Accessor(getter="getPayed",setter="setPayed") + * @SkipWhenEmpty() + */ + private $payed; + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * @return bool + */ + public function isPayed() + { + return $this->payed; + } + + /** + * @param bool $payed + */ + public function setPayed(bool $payed) + { + $this->payed = $payed; + } +} diff --git a/src/Bot/Model/Entity/Product.php b/src/Bot/Model/Entity/Product.php new file mode 100644 index 0000000..5c9c9f4 --- /dev/null +++ b/src/Bot/Model/Entity/Product.php @@ -0,0 +1,206 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * Product class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Product +{ + /** + * @var int $id + * + * @Type("int") + * @Accessor(getter="getId",setter="setId") + * @SkipWhenEmpty() + */ + private $id; + + /** + * @var string $name + * + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * @SkipWhenEmpty() + */ + private $name; + + /** + * @var string $article + * + * @Type("string") + * @Accessor(getter="getArticle",setter="setArticle") + * @SkipWhenEmpty() + */ + private $article; + + /** + * @var string $url + * + * @Type("string") + * @Accessor(getter="getUrl",setter="setUrl") + * @SkipWhenEmpty() + */ + private $url; + + /** + * @var string $img + * + * @Type("string") + * @Accessor(getter="getImg",setter="setImg") + * @SkipWhenEmpty() + */ + private $img; + + /** + * @var Cost $cost + * + * @Type("Cost") + * @Accessor(getter="getCost",setter="setCost") + * @SkipWhenEmpty() + */ + private $cost; + + /** + * @var Quantity $quantity + * + * @Type("Quantity") + * @Accessor(getter="getQuantity",setter="setQuantity) + * @SkipWhenEmpty() + */ + private $quantity; + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + + /** + * @param int $id + */ + public function setId(int $id) + { + $this->id = $id; + } + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * @return string + */ + public function getArticle() + { + return $this->article; + } + + /** + * @param string $article + */ + public function setArticle(string $article) + { + $this->article = $article; + } + + /** + * @return string + */ + public function getUrl() + { + return $this->url; + } + + /** + * @param string $url + */ + public function setUrl(string $url) + { + $this->url = $url; + } + + /** + * @return string + */ + public function getImg() + { + return $this->img; + } + + /** + * @param string $img + */ + public function setImg(string $img) + { + $this->img = $img; + } + + /** + * @return Cost + */ + public function getCost() + { + return $this->cost; + } + + /** + * @param Cost $cost + */ + public function setCost(Cost $cost) + { + $this->cost = $cost; + } + + /** + * @return Quantity + */ + public function getQuantity() + { + return $this->quantity; + } + + /** + * @param Quantity $quantity + */ + public function setQuantity(Quantity $quantity) + { + $this->quantity = $quantity; + } +} diff --git a/src/Bot/Model/Entity/Quantity.php b/src/Bot/Model/Entity/Quantity.php new file mode 100644 index 0000000..d74d4c4 --- /dev/null +++ b/src/Bot/Model/Entity/Quantity.php @@ -0,0 +1,82 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * Quantity class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Quantity +{ + /** + * @var float $value + * + * @Type("float") + * @Accessor(getter="getValue",setter="setValue") + * @SkipWhenEmpty() + */ + private $value; + + /** + * @var string $unit + * + * @Type("string") + * @Accessor(getter="getUnit",setter="setUnit") + * + * @Assert\Currency + */ + private $unit; + + /** + * @return float + */ + public function getValue() + { + return $this->value; + } + + /** + * @param float $value + */ + public function setValue(float $value) + { + $this->value = $value; + } + + /** + * @return string + */ + public function getUnit() + { + return $this->unit; + } + + /** + * @param string $unit + */ + public function setUnit(string $unit) + { + $this->unit = $unit; + } +} diff --git a/src/Bot/Model/Entity/Status.php b/src/Bot/Model/Entity/Status.php new file mode 100644 index 0000000..4564290 --- /dev/null +++ b/src/Bot/Model/Entity/Status.php @@ -0,0 +1,81 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Entity; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * Status class + * + * @package RetailCrm\Mg\Bot\Model\Entity + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Status +{ + /** + * @var string $code + * + * @Type("string") + * @Accessor(getter="getCode",setter="setCode") + * @SkipWhenEmpty() + */ + private $code; + + /** + * @var string $name + * + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * @SkipWhenEmpty() + */ + private $name; + + /** + * @return string + */ + public function getCode() + { + return $this->code; + } + + /** + * @param string $code + */ + public function setCode(string $code) + { + $this->code = $code; + } + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } +} diff --git a/src/Bot/Model/Request/BotsRequest.php b/src/Bot/Model/Request/BotsRequest.php new file mode 100644 index 0000000..6625f1a --- /dev/null +++ b/src/Bot/Model/Request/BotsRequest.php @@ -0,0 +1,102 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * BotsRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class BotsRequest +{ + use CommonFields; + + /** + * @Type("int") + * @Accessor(getter="getActive",setter="setActive") + * @SkipWhenEmpty + */ + private $active; + + /** + * @Type("int") + * @Accessor(getter="getSelf",setter="setSelf") + * @SkipWhenEmpty + */ + private $self; + + /** + * @Type("array") + * @Accessor(getter="getRoles",setter="setRoles") + * @SkipWhenEmpty + */ + private $roles; + + /** + * @return int + */ + public function getSelf() + { + return $this->self; + } + + /** + * @param int $self + */ + public function setSelf($self) + { + $this->self = $self; + } + + /** + * @return int + */ + public function getActive() + { + return $this->active; + } + + /** + * @param int $active + */ + public function setActive($active) + { + $this->active = $active; + } + + /** + * @return array + */ + public function getRoles() + { + return $this->roles; + } + + /** + * @param array $roles + */ + public function setRoles($roles) + { + $this->roles = $roles; + } +} diff --git a/src/Bot/Model/Request/ChannelsRequest.php b/src/Bot/Model/Request/ChannelsRequest.php new file mode 100644 index 0000000..738f0a4 --- /dev/null +++ b/src/Bot/Model/Request/ChannelsRequest.php @@ -0,0 +1,79 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * ChannelsRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class ChannelsRequest +{ + use CommonFields; + + /** + * @Type("array") + * @Accessor(getter="getTypes",setter="setTypes") + * @SkipWhenEmpty + */ + private $types; + + /** + * @Type("int") + * @Accessor(getter="getActive",setter="setActive") + * @SkipWhenEmpty + */ + private $active; + + /** + * @return array + */ + public function getTypes() + { + return $this->types; + } + + /** + * @param array $types + */ + public function setTypes($types) + { + $this->types = $types; + } + + /** + * @return int + */ + public function getActive() + { + return $this->active; + } + + /** + * @param int $active + */ + public function setActive($active) + { + $this->active = $active; + } +} diff --git a/src/Bot/Model/Request/ChatsRequest.php b/src/Bot/Model/Request/ChatsRequest.php new file mode 100644 index 0000000..91f1396 --- /dev/null +++ b/src/Bot/Model/Request/ChatsRequest.php @@ -0,0 +1,79 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * ChatsRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class ChatsRequest +{ + use CommonFields; + + /** + * @Type("int") + * @Accessor(getter="getChannelId",setter="setChannelId") + * @SkipWhenEmpty() + */ + private $channelId; + + /** + * @Type("string") + * @Accessor(getter="getChannelType",setter="setChannelType") + * @SkipWhenEmpty() + */ + private $channelType; + + /** + * @return int + */ + public function getChannelId() + { + return $this->channelId; + } + + /** + * @param int $channelId + */ + public function setChannelId($channelId) + { + $this->channelId = $channelId; + } + + /** + * @return string + */ + public function getChannelType() + { + return $this->channelType; + } + + /** + * @param string $channelType + */ + public function setChannelType($channelType) + { + $this->channelType = $channelType; + } +} diff --git a/src/Bot/Model/Request/CommandEditRequest.php b/src/Bot/Model/Request/CommandEditRequest.php new file mode 100644 index 0000000..e95161d --- /dev/null +++ b/src/Bot/Model/Request/CommandEditRequest.php @@ -0,0 +1,109 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; +use Symfony\Component\Validator\Constraints as Assert; + +/** + * PHP version 7.0 + * + * CommandEditRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class CommandEditRequest +{ + /** + * @var int $botId + * + * @Type("int") + * @Accessor(getter="getBotId",setter="setBotId") + * + * @Assert\NotBlank + */ + private $botId; + + /** + * @var string $name + * + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * + * @Assert\NotBlank + */ + private $name; + + /** + * @var string $description + * + * @Type("string") + * @Accessor(getter="getDescription",setter="setDescription") + * @SkipWhenEmpty + */ + private $description; + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * @param string $description + */ + public function setDescription(string $description) + { + $this->description = $description; + } + + /** + * @return int + */ + public function getBotId() + { + return $this->botId; + } + + /** + * @param int $botId + */ + public function setBotId(int $botId) + { + $this->botId = $botId; + } +} diff --git a/src/Bot/Model/Request/CommandsRequest.php b/src/Bot/Model/Request/CommandsRequest.php new file mode 100644 index 0000000..0a718e7 --- /dev/null +++ b/src/Bot/Model/Request/CommandsRequest.php @@ -0,0 +1,56 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * CommandsRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class CommandsRequest +{ + use CommonFields; + + /** + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * @SkipWhenEmpty + */ + private $name; + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName($name) + { + $this->name = $name; + } +} diff --git a/src/Bot/Model/Request/CommonFields.php b/src/Bot/Model/Request/CommonFields.php new file mode 100644 index 0000000..5ade7d0 --- /dev/null +++ b/src/Bot/Model/Request/CommonFields.php @@ -0,0 +1,100 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * CommonFields trait + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +trait CommonFields +{ + /** + * @Type("int") + * @Accessor(getter="getId",setter="setId") + * @SkipWhenEmpty + */ + private $id; + + /** + * @Type("string") + * @Accessor(getter="getSince",setter="setSince") + * @SkipWhenEmpty + */ + private $since; + + /** + * @Type("string") + * @Accessor(getter="getUntil",setter="setUntil") + * @SkipWhenEmpty + */ + private $until; + + /** + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * @param int $id + */ + public function setId($id) + { + $this->id = $id; + } + + /** + * @return string + */ + public function getSince() + { + return $this->since; + } + + /** + * @param string $since + */ + public function setSince($since) + { + $this->since = $since; + } + + /** + * @return string + */ + public function getUntil() + { + return $this->until; + } + + /** + * @param string $until + */ + public function setUntil($until) + { + $this->until = $until; + } +} diff --git a/src/Bot/Model/Request/CustomersRequest.php b/src/Bot/Model/Request/CustomersRequest.php new file mode 100644 index 0000000..d15604d --- /dev/null +++ b/src/Bot/Model/Request/CustomersRequest.php @@ -0,0 +1,56 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * CustomersRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class CustomersRequest +{ + use CommonFields; + + /** + * @Type("string") + * @Accessor(getter="getExternalId",setter="setExternalId") + * @SkipWhenEmpty + */ + private $externalId; + + /** + * @return string + */ + public function getExternalId() + { + return $this->externalId; + } + + /** + * @param string $externalId + */ + public function setExternalId($externalId) + { + $this->externalId = $externalId; + } +} diff --git a/src/Bot/Model/Request/DialogAssignRequest.php b/src/Bot/Model/Request/DialogAssignRequest.php new file mode 100644 index 0000000..3837ee1 --- /dev/null +++ b/src/Bot/Model/Request/DialogAssignRequest.php @@ -0,0 +1,106 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * DialogAssignRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class DialogAssignRequest +{ + /** + * @var int $dialogId + * + * @Type("int") + * @Accessor(getter="getDialogId,setter="setDialogId") + * @SkipWhenEmpty + */ + private $dialogId; + + /** + * @var int $userId + * + * @Type("int") + * @Accessor(getter="getUserId",setter="setUserId") + * @SkipWhenEmpty + */ + private $userId; + + /** + * @var int $botId + * + * @Type("int") + * @Accessor(getter="getBotId",setter="setBotId") + * @SkipWhenEmpty() + */ + private $botId; + + /** + * @return int + */ + public function getDialogId() + { + return $this->dialogId; + } + + /** + * @param int $dialogId + */ + public function setDialogId(int $dialogId) + { + $this->dialogId = $dialogId; + } + + /** + * @return int + */ + public function getUserId() + { + return $this->userId; + } + + /** + * @param int $userId + */ + public function setUserId(int $userId) + { + $this->userId = $userId; + } + + /** + * @return int + */ + public function getBotId() + { + return $this->botId; + } + + /** + * @param int $botId + */ + public function setBotId(int $botId) + { + $this->botId = $botId; + } +} diff --git a/src/Bot/Model/Request/DialogsRequest.php b/src/Bot/Model/Request/DialogsRequest.php new file mode 100644 index 0000000..e2a6a8b --- /dev/null +++ b/src/Bot/Model/Request/DialogsRequest.php @@ -0,0 +1,158 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * DialogsRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class DialogsRequest +{ + use CommonFields; + + /** + * @var int $chatId + * + * @Type("int") + * @Accessor(getter="getChatId",setter="setChatId") + * @SkipWhenEmpty + */ + private $chatId; + + /** + * @var int $userId + * + * @Type("int") + * @Accessor(getter="getUserId",setter="setUserId") + * @SkipWhenEmpty + */ + private $userId; + + /** + * @var int $botId + * + * @Type("int") + * @Accessor(getter="getBotId",setter="setBotId") + * @SkipWhenEmpty() + */ + private $botId; + + /** + * @var int $active + * + * @Type("int") + * @Accessor(getter="getActive",setter="setActive") + * @SkipWhenEmpty + */ + private $active; + + /** + * @var int $assign + * + * @Type("int") + * @Accessor(getter="getAssign",setter="setAssign") + * @SkipWhenEmpty + */ + private $assign; + + /** + * @return int + */ + public function getChatId() + { + return $this->chatId; + } + + /** + * @param int $chatId + */ + public function setChatId(int $chatId) + { + $this->chatId = $chatId; + } + + /** + * @return int + */ + public function getUserId() + { + return $this->userId; + } + + /** + * @param int $userId + */ + public function setUserId(int $userId) + { + $this->userId = $userId; + } + + /** + * @return int + */ + public function getBotId() + { + return $this->botId; + } + + /** + * @param int $botId + */ + public function setBotId(int $botId) + { + $this->botId = $botId; + } + + /** + * @return int + */ + public function getActive() + { + return $this->active; + } + + /** + * @param int $active + */ + public function setActive(int $active) + { + $this->active = $active; + } + + /** + * @return int + */ + public function getAssign() + { + return $this->assign; + } + + /** + * @param int $assign + */ + public function setAssign(int $assign) + { + $this->assign = $assign; + } +} diff --git a/src/Bot/Model/Request/InfoRequest.php b/src/Bot/Model/Request/InfoRequest.php new file mode 100644 index 0000000..d4a5d43 --- /dev/null +++ b/src/Bot/Model/Request/InfoRequest.php @@ -0,0 +1,106 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * InfoRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class InfoRequest +{ + /** + * @var string $name + * + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * @SkipWhenEmpty() + */ + private $name; + + /** + * @var string $avatarUrl + * + * @Type("string") + * @Accessor(getter="getAvatarUrl",setter="setAvatarUrl") + * @SkipWhenEmpty() + */ + private $avatarUrl; + + /** + * @var array $roles + * + * @Type("array") + * @Accessor(getter="getRoles",setter="setRoles") + * @SkipWhenEmpty() + */ + private $roles; + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * @return string + */ + public function getAvatarUrl() + { + return $this->avatarUrl; + } + + /** + * @param string $avatarUrl + */ + public function setAvatarUrl(string $avatarUrl) + { + $this->avatarUrl = $avatarUrl; + } + + /** + * @return array + */ + public function getRoles() + { + return $this->roles; + } + + /** + * @param array $roles + */ + public function setRoles(array $roles) + { + $this->roles = $roles; + } +} diff --git a/src/Bot/Model/Request/MembersRequest.php b/src/Bot/Model/Request/MembersRequest.php new file mode 100644 index 0000000..ea4050b --- /dev/null +++ b/src/Bot/Model/Request/MembersRequest.php @@ -0,0 +1,156 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * MembersRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class MembersRequest +{ + /** + * @var int $chatId + * + * @Type("int") + * @Accessor(getter="getChatId",setter="setChatId") + * @SkipWhenEmpty + */ + private $chatId; + + /** + * @var int $userId + * + * @Type("int") + * @Accessor(getter="getUserId",setter="setUserId") + * @SkipWhenEmpty + */ + private $userId; + + /** + * @var string $state + * + * @Type("string") + * @Accessor(getter="getState",setter="setState") + * @SkipWhenEmpty + */ + private $state; + + /** + * @var string $since + * + * @Type("string") + * @Accessor(getter="getSince",setter="setSince") + * @SkipWhenEmpty + */ + private $since; + + /** + * @var string $until + * + * @Type("string") + * @Accessor(getter="getUntil",setter="setUntil") + * @SkipWhenEmpty + */ + private $until; + + /** + * @return int + */ + public function getChatId() + { + return $this->chatId; + } + + /** + * @param int $chatId + */ + public function setChatId(int $chatId) + { + $this->chatId = $chatId; + } + + /** + * @return int + */ + public function getUserId() + { + return $this->userId; + } + + /** + * @param int $userId + */ + public function setUserId(int $userId) + { + $this->userId = $userId; + } + + /** + * @return string + */ + public function getState() + { + return $this->state; + } + + /** + * @param string $state + */ + public function setState(string $state) + { + $this->state = $state; + } + + /** + * @return string + */ + public function getSince() + { + return $this->since; + } + + /** + * @param string $since + */ + public function setSince(string $since) + { + $this->since = $since; + } + + /** + * @return string + */ + public function getUntil() + { + return $this->until; + } + + /** + * @param string $until + */ + public function setUntil(string $until) + { + $this->until = $until; + } +} diff --git a/src/Bot/Model/Request/MessageEditRequest.php b/src/Bot/Model/Request/MessageEditRequest.php new file mode 100644 index 0000000..4cf9baa --- /dev/null +++ b/src/Bot/Model/Request/MessageEditRequest.php @@ -0,0 +1,81 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * MessageEditRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class MessageEditRequest +{ + /** + * @var int $id + * + * @Type("int") + * @Accessor(getter="getId",setter="setId") + * @SkipWhenEmpty() + */ + private $id; + + /** + * @var string $content + * + * @Type("string") + * @Accessor(getter="getContent",setter="setContent") + * @SkipWhenEmpty() + */ + private $content; + + /** + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * @param int $id + */ + public function setId(int $id) + { + $this->id = $id; + } + + /** + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * @param string $content + */ + public function setContent(string $content) + { + $this->content = $content; + } +} diff --git a/src/Bot/Model/Request/MessageSendRequest.php b/src/Bot/Model/Request/MessageSendRequest.php new file mode 100644 index 0000000..254134f --- /dev/null +++ b/src/Bot/Model/Request/MessageSendRequest.php @@ -0,0 +1,239 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; +use Symfony\Component\Validator\Constraints as Assert; +use RetailCrm\Mg\Bot\Model\Entity\Order; +use RetailCrm\Mg\Bot\Model\Entity\Product; + +/** + * PHP version 7.0 + * + * MessageSendRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class MessageSendRequest +{ + /** + * @var string $type + * + * @Type("string") + * @Accessor(getter="getType",setter="setType") + * @SkipWhenEmpty() + */ + private $type; + + /** + * @var string $content + * + * @Type("string") + * @Accessor(getter="getContent",setter="setContent") + * + * @Assert\NotBlank + */ + private $content; + + /** + * @var Product $product + * + * @Type("Product") + * @Accessor(getter="getProduct",setter="setProduct") + * @SkipWhenEmpty() + */ + private $product; + + /** + * @var Order $order + * + * @Type("Order") + * @Accessor(getter="getOrder",setter="setOrder") + * @SkipWhenEmpty() + */ + private $order; + + /** + * @var array $items + * + * @Type("array") + * @Accessor(getter="getItems",setter="setItems") + * @SkipWhenEmpty() + */ + private $items; + + /** + * @var string $scope + * + * @Type("string") + * @Accessor(getter="getScope",setter="setScope") + * + * @Assert\NotBlank + */ + private $scope; + + /** + * @var int $chatId + * + * @Type("int") + * @Accessor(getter="getChatId",setter="setChatId") + * + * @Assert\NotBlank + */ + private $chatId; + + + /** + * @var int $quoteMessageId + * + * @Type("int") + * @Accessor(getter="getQuoteMessageId",setter="setQuoteMessageId") + * @SkipWhenEmpty + */ + private $quoteMessageId; + + + /** + * @return int + */ + public function getChatId() + { + return $this->chatId; + } + + /** + * @param int $chatId + */ + public function setChatId(int $chatId) + { + $this->chatId = $chatId; + } + + /** + * @return string + */ + public function getScope() + { + return $this->scope; + } + + /** + * @param string $scope + */ + public function setScope(string $scope) + { + $this->scope = $scope; + } + + /** + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * @param string $type + */ + public function setType(string $type) + { + $this->type = $type; + } + + /** + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * @param string $content + */ + public function setContent(string $content) + { + $this->content = $content; + } + + /** + * @return Product + */ + public function getProduct() + { + return $this->product; + } + + /** + * @param Product $product + */ + public function setProduct(Product $product) + { + $this->product = $product; + } + + /** + * @return Order + */ + public function getOrder() + { + return $this->order; + } + + /** + * @param Order $order + */ + public function setOrder(Order $order) + { + $this->order = $order; + } + + /** + * @return array + */ + public function getItems() + { + return $this->items; + } + + /** + * @param array $items + */ + public function setItems(array $items) + { + $this->items = $items; + } + + /** + * @return int + */ + public function getQuoteMessageId() + { + return $this->quoteMessageId; + } + + /** + * @param int $quoteMessageId + */ + public function setQuoteMessageId(int $quoteMessageId) + { + $this->quoteMessageId = $quoteMessageId; + } +} diff --git a/src/Bot/Model/Request/MessagesRequest.php b/src/Bot/Model/Request/MessagesRequest.php new file mode 100644 index 0000000..a32e243 --- /dev/null +++ b/src/Bot/Model/Request/MessagesRequest.php @@ -0,0 +1,258 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * MessagesRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class MessagesRequest +{ + use CommonFields; + + /** + * @var int $chatId + * + * @Type("int") + * @Accessor(getter="getChatId",setter="setChatId") + * @SkipWhenEmpty + */ + private $chatId; + + /** + * @var int $dialogId + * + * @Type("int") + * @Accessor(getter="getDialogId",setter="setDialogId") + * @SkipWhenEmpty + */ + private $dialogId; + + /** + * @var int $userId + * + * @Type("int") + * @Accessor(getter="getUserId",setter="setUserId") + * @SkipWhenEmpty + */ + private $userId; + + /** + * @var int $customerId + * + * @Type("int") + * @Accessor(getter="getCustomerId",setter="setCustomerId") + * @SkipWhenEmpty() + */ + private $customerId; + + /** + * @var int $botId + * + * @Type("int") + * @Accessor(getter="getBotId",setter="setBotId") + * @SkipWhenEmpty() + */ + private $botId; + + /** + * @var int $channelId + * + * @Type("int") + * @Accessor(getter="getChannelId",setter="setChannelId") + * @SkipWhenEmpty() + */ + private $channelId; + + /** + * @var string $channelType + * + * @Type("string") + * @Accessor(getter="getChannelType",setter="setChannelType") + * @SkipWhenEmpty() + */ + private $channelType; + + /** + * @var string $scope + * + * @Type("string") + * @Accessor(getter="getScope",setter="setScope") + * @SkipWhenEmpty() + */ + private $scope; + + /** + * @var string $type + * + * @Type("string") + * @Accessor(getter="getType",setter="setType") + * @SkipWhenEmpty() + */ + private $type; + + /** + * @return int + */ + public function getChatId() + { + return $this->chatId; + } + + /** + * @param int $chatId + */ + public function setChatId(int $chatId) + { + $this->chatId = $chatId; + } + + /** + * @return int + */ + public function getDialogId() + { + return $this->dialogId; + } + + /** + * @param int $dialogId + */ + public function setDialogId(int $dialogId) + { + $this->dialogId = $dialogId; + } + + /** + * @return int + */ + public function getUserId() + { + return $this->userId; + } + + /** + * @param int $userId + */ + public function setUserId(int $userId) + { + $this->userId = $userId; + } + + /** + * @return int + */ + public function getCustomerId() + { + return $this->customerId; + } + + /** + * @param int $customerId + */ + public function setCustomerId(int $customerId) + { + $this->customerId = $customerId; + } + + /** + * @return int + */ + public function getBotId() + { + return $this->botId; + } + + /** + * @param int $botId + */ + public function setBotId(int $botId) + { + $this->botId = $botId; + } + + /** + * @return int + */ + public function getChannelId() + { + return $this->channelId; + } + + /** + * @param int $channelId + */ + public function setChannelId(int $channelId) + { + $this->channelId = $channelId; + } + + /** + * @return string + */ + public function getChannelType() + { + return $this->channelType; + } + + /** + * @param string $channelType + */ + public function setChannelType(string $channelType) + { + $this->channelType = $channelType; + } + + /** + * @return string + */ + public function getScope() + { + return $this->scope; + } + + /** + * @param string $scope + */ + public function setScope(string $scope) + { + $this->scope = $scope; + } + + /** + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * @param string $type + */ + public function setType(string $type) + { + $this->type = $type; + } +} diff --git a/src/Bot/Model/Request/UsersRequest.php b/src/Bot/Model/Request/UsersRequest.php new file mode 100644 index 0000000..3bd40fd --- /dev/null +++ b/src/Bot/Model/Request/UsersRequest.php @@ -0,0 +1,102 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Model\Request; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; + +/** + * PHP version 7.0 + * + * UsersRequest class + * + * @package RetailCrm\Mg\Bot\Model\Request + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class UsersRequest +{ + use CommonFields; + + /** + * @Type("string") + * @Accessor(getter="getExternalId",setter="setExternalId") + * @SkipWhenEmpty + */ + private $externalId; + + /** + * @Type("int") + * @Accessor(getter="getActive",setter="setActive") + * @SkipWhenEmpty + */ + private $active; + + /** + * @Type("int") + * @Accessor(getter="getOnline",setter="setOnline") + * @SkipWhenEmpty + */ + private $online; + + /** + * @return string + */ + public function getExternalId() + { + return $this->externalId; + } + + /** + * @param string $externalId + */ + public function setExternalId($externalId) + { + $this->externalId = $externalId; + } + + /** + * @return int + */ + public function getActive() + { + return $this->active; + } + + /** + * @param int $active + */ + public function setActive($active) + { + $this->active = $active; + } + + /** + * @return int + */ + public function getOnline() + { + return $this->online; + } + + /** + * @param int $online + */ + public function setOnline($online) + { + $this->online = $online; + } +} diff --git a/src/Bot/Model/Response/.gitkeep b/src/Bot/Model/Response/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Bot/Request.php b/src/Bot/Request.php new file mode 100644 index 0000000..ea0b340 --- /dev/null +++ b/src/Bot/Request.php @@ -0,0 +1,205 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot; + +use RetailCrm\Common\Exception\CurlException; +use RetailCrm\Common\Exception\LimitException; +use Exception; +use InvalidArgumentException; +use RetailCrm\Common\Serializer; +use RetailCrm\Common\Url; +use Symfony\Component\Validator\Validation; + +/** + * PHP version 7.0 + * + * Request class + * + * @package RetailCrm\Mg\Bot + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Request +{ + const METHOD_GET = 'GET'; + const METHOD_POST = 'POST'; + const METHOD_PUT = 'PUT'; + const METHOD_PATCH = 'PATCH'; + const METHOD_DELETE = 'DELETE'; + + protected $url; + protected $token; + private $debug; + private $allowedMethods; + private $stdout; + + /** + * Client constructor. + * + * @param string $url api url + * @param string $token api token + * @param bool $debug make request verbose + * @param bool|resource $stdout default output for debug + */ + public function __construct($url, $token, $debug, $stdout = STDOUT) + { + if (false === stripos($url, 'https://')) { + throw new InvalidArgumentException('API schema requires HTTPS protocol'); + } + + $this->url = $url; + $this->token = $token; + $this->debug = $debug; + $this->stdout = $stdout; + $this->allowedMethods = [ + self::METHOD_GET, + self::METHOD_POST, + self::METHOD_PUT, + self::METHOD_PATCH, + self::METHOD_DELETE + ]; + } + + /** + * Make HTTP request + * + * @param string $path request url + * @param string $method (default: 'GET') + * @param mixed $request (default: null) + * @param int $serializeTo + * + * @return Response + * @throws \Exception + */ + public function makeRequest($path, $method, $request = null, $serializeTo = Serializer::S_JSON) + { + $this->validateMethod($method); + + if (!is_null($request)) { + $this->validateRequest($request); + } + + $urlBuilder = new Url(); + + $parameters = is_null($request) ? null : Serializer::serialize($request, $serializeTo); + $url = $method == self::METHOD_GET + ? $this->url . $urlBuilder->buildUrl($path, $parameters, Url::RFC_CUSTOM) + : $this->url . $path + ; + + $curlHandler = curl_init(); + curl_setopt($curlHandler, CURLOPT_URL, $url); + curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curlHandler, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($curlHandler, CURLOPT_FAILONERROR, false); + curl_setopt($curlHandler, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curlHandler, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curlHandler, CURLOPT_TIMEOUT, 60); + curl_setopt($curlHandler, CURLOPT_CONNECTTIMEOUT, 60); + curl_setopt($curlHandler, CURLOPT_VERBOSE, $this->debug); + curl_setopt($curlHandler, CURLOPT_STDERR, $this->stdout); + + curl_setopt($curlHandler, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', + sprintf("X-Bot-Token: %s", $this->token) + ]); + + if (in_array($method, [self::METHOD_POST, self::METHOD_PUT, self::METHOD_PATCH, self::METHOD_DELETE])) { + curl_setopt($curlHandler, CURLOPT_CUSTOMREQUEST, $method); + curl_setopt($curlHandler, CURLOPT_POSTFIELDS, $parameters); + } + + $responseBody = curl_exec($curlHandler); + $statusCode = curl_getinfo($curlHandler, CURLINFO_HTTP_CODE); + + $response = Response::parseJSON($responseBody); + $errorMessage = !empty($response['errorMsg']) ? $response['errorMsg'] : ''; + $errorMessage = !empty($response['errors']) ? $this->getErrors($response['errors']) : $errorMessage; + + /** + * responses with 400 & 460 http codes contains extended error data + * therefore they are not handled as exceptions + */ + + if (in_array($statusCode, [403, 404, 500])) { + throw new Exception($errorMessage); + } + + if ($statusCode == 503) { + throw new LimitException($errorMessage); + } + + $errno = curl_errno($curlHandler); + $error = curl_error($curlHandler); + + curl_close($curlHandler); + + if ($errno) { + throw new CurlException($error, $errno); + } + + return new Response($statusCode, $responseBody); + } + + /** + * Validate HTTP method + * + * @param string $method + */ + private function validateMethod($method) + { + if (!in_array($method, $this->allowedMethods, false)) { + throw new InvalidArgumentException( + sprintf( + 'Method "%s" is not valid. Allowed methods are %s', + $method, + implode(', ', $this->allowedMethods) + ) + ); + } + } + + /** + * Validate given class + * + * @param string $class + * + * @return void + */ + private function validateRequest($class) + { + $validator = Validation::createValidatorBuilder() + ->enableAnnotationMapping() + ->getValidator(); + + $errors = $validator->validate($class); + + if ($errors->count() > 0) { + $message = (string) $errors; + throw new InvalidArgumentException($message); + } + } + + private function getErrors(array $errors) + { + $errorString = ''; + + foreach ($errors as $error) { + $errorString .= $error . " "; + } + + return $errorString; + } +} diff --git a/src/Bot/Response.php b/src/Bot/Response.php new file mode 100644 index 0000000..daf4088 --- /dev/null +++ b/src/Bot/Response.php @@ -0,0 +1,229 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot; + +use ArrayAccess; +use BadMethodCallException; +use InvalidArgumentException; +use RetailCrm\Common\Exception\InvalidJsonException; + +/** + * PHP version 7.0 + * + * Request class + * + * @package RetailCrm\Mg\Bot + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Response implements ArrayAccess +{ + // HTTP response status code + protected $statusCode; + + // response assoc array + protected $response; + + // response body + protected $raw; + + /** + * ApiResponse constructor. + * + * @param int $statusCode HTTP status code + * @param mixed $responseBody HTTP body + * + * @throws InvalidJsonException + */ + public function __construct($statusCode, $responseBody = null) + { + $this->statusCode = $statusCode; + $this->raw = $responseBody; + $this->response = self::parseJSON($responseBody); + } + + /** + * Return raw HTTP response + * + * @return string|null + */ + public function getRawResponse() + { + return $this->raw; + } + + /** + * Return HTTP response + * + * @return array + */ + public function getResponse() + { + return $this->response; + } + + /** + * Return HTTP response status code + * + * @return int + */ + public function getStatusCode() + { + return $this->statusCode; + } + + /** + * HTTP request was successful + * + * @return bool + */ + public function isSuccessful() + { + return $this->statusCode < 400; + } + + /** + * Allow to access for the property throw class method + * + * @param string $name method name + * @param mixed $arguments method parameters + * + * @throws \InvalidArgumentException + * + * @return mixed + */ + public function __call($name, $arguments) + { + // convert getSomeProperty to someProperty + $propertyName = strtolower(substr($name, 3, 1)) . substr($name, 4); + + if (!isset($this->response[$propertyName])) { + throw new InvalidArgumentException("Method \"$name\" not found"); + } + + return $this->response[$propertyName]; + } + + /** + * Allow to access for the property throw object property + * + * @param string $name property name + * + * @throws \InvalidArgumentException + * + * @return mixed + */ + public function __get($name) + { + if (!isset($this->response[$name])) { + throw new InvalidArgumentException("Property \"$name\" not found"); + } + + return $this->response[$name]; + } + + /** + * Allow to check if the property exists through object property + * + * @param string $name property name + * + * @return bool + */ + public function __isset($name) + { + return isset($this->response[$name]); + } + + /** + * Offset set + * + * @param mixed $offset offset + * @param mixed $value value + * + * @throws BadMethodCallException + * @return void + */ + public function offsetSet($offset, $value) + { + $message = sprintf("This call not allowed. Offset given: %s. Value given: %s", $offset, $value); + throw new BadMethodCallException($message); + } + + /** + * Offset unset + * + * @param mixed $offset offset + * + * @throws BadMethodCallException + * @return void + */ + public function offsetUnset($offset) + { + $message = sprintf("This call not allowed. Offset given: %s", $offset); + throw new BadMethodCallException($message); + } + + /** + * Check offset + * + * @param mixed $offset offset + * + * @return bool + */ + public function offsetExists($offset) + { + return isset($this->response[$offset]); + } + + /** + * Get offset + * + * @param mixed $offset offset + * + * @throws \InvalidArgumentException + * + * @return mixed + */ + public function offsetGet($offset) + { + if (!isset($this->response[$offset])) { + throw new InvalidArgumentException("Property \"$offset\" not found"); + } + + return $this->response[$offset]; + } + + /** + * @param string $responseBody + * + * @return array + */ + public static function parseJSON($responseBody): array + { + $result = []; + + if (!empty($responseBody)) { + $response = json_decode($responseBody, true); + + if (!$response && JSON_ERROR_NONE !== ($error = json_last_error())) { + throw new InvalidJsonException("Invalid JSON in the API response body. Error code #$error", $error); + } + + $result = $response; + } + + return $result; + } +} diff --git a/src/Exception/CurlException.php b/src/Exception/CurlException.php new file mode 100644 index 0000000..8412b22 --- /dev/null +++ b/src/Exception/CurlException.php @@ -0,0 +1,30 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Common\Exception; + +use RuntimeException; + +/** + * PHP version 7.0 + * + * Class CurlException + * + * @package RetailCrm\Common\Exception + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class CurlException extends RuntimeException +{ +} diff --git a/src/Exception/InvalidJsonException.php b/src/Exception/InvalidJsonException.php new file mode 100644 index 0000000..dc43f3f --- /dev/null +++ b/src/Exception/InvalidJsonException.php @@ -0,0 +1,30 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Common\Exception; + +use DomainException; + +/** + * PHP version 7.0 + * + * Class InvalidJsonException + * + * @package RetailCrm\Common\Exception + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class InvalidJsonException extends DomainException +{ +} diff --git a/src/Exception/LimitException.php b/src/Exception/LimitException.php new file mode 100644 index 0000000..f79084c --- /dev/null +++ b/src/Exception/LimitException.php @@ -0,0 +1,30 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Common\Exception; + +use DomainException; + +/** + * PHP version 7.0 + * + * Class CurlException + * + * @package RetailCrm\Common\Exception + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class LimitException extends DomainException +{ +} diff --git a/src/Register.php b/src/Register.php new file mode 100644 index 0000000..27d36a1 --- /dev/null +++ b/src/Register.php @@ -0,0 +1,346 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Common; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\Type; +use Symfony\Component\Validator\Constraints as Assert; + +/** + * PHP version 7.0 + * + * RequestHelper class + * + * @package RetailCrm\Common + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Register +{ + /** + * @var string $code + * + * @Type("string") + * @Accessor(getter="getCode",setter="setCode") + * + * @Assert\NotBlank + */ + private $code; + + /** + * @var string $integrationCode + * + * @Type("string") + * @Accessor(getter="getIntegrationCode",setter="setIntegrationCode") + * + * @Assert\NotBlank + */ + private $integrationCode; + + /** + * @var string $active + * @Type("string") + * @Accessor(getter="getActive",setter="setActive") + * @SkipWhenEmpty + */ + private $active; + + /** + * @var string $name + * + * @Type("string") + * @Accessor(getter="getName",setter="setName") + * @SkipWhenEmpty + */ + private $name; + + /** + * @var string $logo + * + * @Type("string") + * @Accessor(getter="getLogo",setter="setLogo") + * @SkipWhenEmpty + * + * @Assert\Url( + * message = "The logo url is not a valid url", + * protocols = {"http", "https"} + * ) + */ + private $logo; + + /** + * @var string $clientId + * + * @Type("string") + * @Accessor(getter="getClientId",setter="setClientId") + * + * @Assert\NotBlank + */ + private $clientId; + + /** + * @var string $baseUrl + * + * @Type("string") + * @Accessor(getter="getBaseUrl",setter="setBaseUrl") + * + * @Assert\NotBlank + * @Assert\Url( + * message = "The baseUrl is not a valid url", + * protocols = {"http", "https"} + * ) + */ + private $baseUrl; + + /** + * @var string $accountUrl + * + * @Type("string") + * @Accessor(getter="getAccountUrl",setter="setAccountUrl") + * + * @Assert\NotBlank + * @Assert\Url( + * message = "The baseUrl is not a valid url", + * protocols = {"http", "https"} + * ) + */ + private $accountUrl; + + /** + * @var array $actions + * + * @Type("array") + * @Accessor(getter="getActions",setter="setActions") + * + * @Assert\NotBlank + */ + private $actions; + + /** + * @var array $availableCountries + * + * @Type("array") + * @Accessor(getter="getAvailableCountries",setter="setAvailableCountries") + * @SkipWhenEmpty + */ + private $availableCountries; + + /** + * @var array $integrations + * + * @Type("array") + * @Accessor(getter="getIntegrations",setter="setIntegrations") + * + * @Assert\NotBlank + */ + private $integrations; + + /** + * @return string + */ + public function getCode() + { + return $this->code; + } + + /** + * @param string $code + */ + public function setCode(string $code) + { + $this->code = $code; + } + + /** + * @return string + */ + public function getIntegrationCode() + { + return $this->integrationCode; + } + + /** + * @param string $integrationCode + */ + public function setIntegrationCode(string $integrationCode) + { + $this->integrationCode = $integrationCode; + } + + /** + * @return string + */ + public function getActive() + { + return $this->active; + } + + /** + * @param string $active + */ + public function setActive(string $active) + { + $this->active = $active; + } + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * @return string + */ + public function getLogo() + { + return $this->logo; + } + + /** + * @param string $logo + */ + public function setLogo(string $logo) + { + $this->logo = $logo; + } + + /** + * @return string + */ + public function getClientId() + { + return $this->clientId; + } + + /** + * @param string $clientId + */ + public function setClientId(string $clientId) + { + $this->clientId = $clientId; + } + + /** + * @return string + */ + public function getBaseUrl() + { + return $this->baseUrl; + } + + /** + * @param string $baseUrl + */ + public function setBaseUrl(string $baseUrl) + { + $this->baseUrl = $baseUrl; + } + + /** + * @return string + */ + public function getAccountUrl() + { + return $this->accountUrl; + } + + /** + * @param string $accountUrl + */ + public function setAccountUrl(string $accountUrl) + { + $this->accountUrl = $accountUrl; + } + + /** + * @return array + */ + public function getActions() + { + return $this->actions; + } + + /** + * @param array $actions + */ + public function setActions(array $actions) + { + $this->actions = $actions; + } + + /** + * @return array + */ + public function getAvailableCountries() + { + return $this->availableCountries; + } + + /** + * @param array $availableCountries + */ + public function setAvailableCountries(array $availableCountries) + { + $this->availableCountries = $availableCountries; + } + + /** + * @return array + */ + public function getIntegrations() + { + return $this->integrations; + } + + /** + * @param array $integrations + */ + public function setIntegrations(array $integrations) + { + $this->integrations = $integrations; + } + + /** + * Get configuration as JSON + * + * @return array|string + */ + public function getJsonConfiguration() + { + return Serializer::serialize($this); + } + + /** + * Get configuration as array + * + * @return array|string + */ + public function getArrayConfiguration() + { + return Serializer::serialize($this, Serializer::S_ARRAY); + } +} diff --git a/src/Serializer.php b/src/Serializer.php new file mode 100644 index 0000000..85f46fb --- /dev/null +++ b/src/Serializer.php @@ -0,0 +1,58 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Common; + +use JMS\Serializer\SerializerBuilder; + +/** + * PHP version 7.0 + * + * Serializer class + * + * @package RetailCrm\Common + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Serializer +{ + const S_ARRAY = 0; + const S_JSON = 1; + + /** + * Serialize given object to JSON or Array + * + * @param object $request + * @param int $serialize + * + * @return array|string + */ + public static function serialize($request, $serialize = self::S_JSON) + { + $serialized = null; + $serializer = SerializerBuilder::create()->build(); + + switch ($serialize) { + case self::S_ARRAY: + $serialized = $serializer->toArray($request); + break; + case self::S_JSON: + default: + $serialized = $serializer->serialize($request, 'json'); + break; + } + + return $serialized; + } +} diff --git a/src/Url.php b/src/Url.php new file mode 100644 index 0000000..983c30d --- /dev/null +++ b/src/Url.php @@ -0,0 +1,126 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Common; + +/** + * PHP version 7.0 + * + * Url class + * + * @package RetailCrm\Common + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class Url +{ + const RFC_DEFAULT = 1; + const RFC_CUSTOM = 2; + + private $parts = []; + + public function __toString() + { + return $this->build(); + } + + /** + * Check trailing slash into url + * + * @param string $url + * + * @return string + */ + public static function normalizeUrl($url) + { + if ('/' !== $url[strlen($url) - 1]) { + $url .= '/'; + } + + return $url; + } + + /** + * Build request url + * + * @param string $path + * @param array $parameters + * @param int $rfc + * + * @return string + */ + public function buildUrl($path, $parameters, $rfc = self::RFC_DEFAULT) + { + $url = $path; + + switch ($rfc) { + case self::RFC_CUSTOM: + foreach ($parameters as $key => $value) { + if (is_array($value)) { + foreach ($value as $element) { + $this->add($key, $element); + } + } else { + $this->add($key, $value); + } + } + + $url = sprintf("%s?%s", $url, $this->build()); + break; + case self::RFC_DEFAULT: + default: + $queryString = http_build_query($parameters, '', '&'); + $url = sprintf("%s?%s", $path, $queryString); + break; + } + + return $url; + } + + /** + * Add each key valued element of parameters array + * to internal structure before build + * + * @param string $key + * @param mixed $value + * + * @return void + */ + private function add($key, $value) + { + $this->parts[] = array( + 'key' => $key, + 'value' => $value + ); + } + + /** + * Build query string with same keys if needed + * + * @param string $separator + * @param string $equals + * + * @return string + */ + private function build($separator = '&', $equals = '=') + { + $queryString = array(); + + foreach ($this->parts as $part) { + $queryString[] = urlencode($part['key']) . $equals . urlencode($part['value']); + } + + return implode($separator, $queryString); + } +} diff --git a/tests/Bot/Test/TestCase.php b/tests/Bot/Test/TestCase.php new file mode 100644 index 0000000..52a455c --- /dev/null +++ b/tests/Bot/Test/TestCase.php @@ -0,0 +1,54 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://www.retailcrm.ru/docs/Developers/ApiVersion5 + */ + +namespace RetailCrm\Mg\Bot\Test; + +use PHPUnit\Framework\TestCase as BaseCase; +use RetailCrm\Mg\Bot\Client; + +/** + * Class TestCase + * + * @category RetailCrm + * @package Test + * @author RetailCrm + * @license https://opensource.org/licenses/MIT MIT License + * @link http://www.retailcrm.ru/docs/Developers/ApiVersion5 + */ +class TestCase extends BaseCase +{ + /** + * Return bot api client object + * + * @param string $url (default: null) + * @param string $key (default: null) + * @param bool $debug (default: false) + * + * @return \RetailCrm\Mg\Bot\Client + */ + public static function getApiClient( + $url = null, + $key = null, + $debug = false + ) { + $configUrl = getenv('MG_BOT_URL'); + $configKey = getenv('MG_BOT_KEY'); + $configDbg = getenv('MG_BOT_DBG'); + + return new Client( + $url ?: $configUrl, + $key ?: $configKey, + $debug ?: $configDbg + ); + } +} diff --git a/tests/Bot/Tests/ClientListTest.php b/tests/Bot/Tests/ClientListTest.php new file mode 100644 index 0000000..dea988a --- /dev/null +++ b/tests/Bot/Tests/ClientListTest.php @@ -0,0 +1,178 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Tests; + +use RetailCrm\Mg\Bot\Model\Constants; +use RetailCrm\Mg\Bot\Model\Request; +use RetailCrm\Mg\Bot\Test\TestCase; + +/** + * PHP version 7.0 + * + * Class ClientListTest + * + * @package RetailCrm\Mg\Bot\Tests + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class ClientListTest extends TestCase +{ + + /** + * @group("list") + * @throws \Exception + */ + public function testChannels() + { + $client = self::getApiClient(); + + $request = new Request\ChannelsRequest(); + $request->setActive(true); + $request->setTypes([Constants::CHANNEL_TYPE_FACEBOOK, Constants::CHANNEL_TYPE_INSTAGRAM]); + + $response = $client->channels($request); + + self::assertTrue($response->isSuccessful() == true); + } + + /** + * @group("list") + * @throws \Exception + */ + public function testChats() + { + $client = self::getApiClient(); + + $request = new Request\ChatsRequest(); + $request->setChannelType(Constants::CHANNEL_TYPE_FACEBOOK); + + $response = $client->chats($request); + + self::assertTrue($response->isSuccessful() == true); + } + + /** + * @group("list") + * @throws \Exception + */ + public function testMembers() + { + $client = self::getApiClient(); + + $request = new Request\MembersRequest(); + + $response = $client->members($request); + + self::assertTrue($response->isSuccessful() == true); + } + + /** + * @group("list") + * @throws \Exception + */ + public function testMessages() + { + $client = self::getApiClient(); + + $request = new Request\MessagesRequest(); + $request->setChannelType(Constants::CHANNEL_TYPE_INSTAGRAM); + $request->setType(Constants::MESSAGE_TYPE_TEXT); + + $response = $client->messages($request); + + self::assertTrue($response->isSuccessful() == true); + } + + /** + * @group("list") + * @throws \Exception + */ + public function testCommands() + { + $client = self::getApiClient(); + + $request = new Request\CommandsRequest(); + + $response = $client->commands($request); + + self::assertTrue($response->isSuccessful() == true); + } + + /** + * @group("list") + * @throws \Exception + */ + public function testBots() + { + $client = self::getApiClient(); + + $request = new Request\BotsRequest(); + $request->setActive(1); + $request->setRoles([Constants::BOT_ROLE_RESPONSIBLE]); + + $response = $client->bots($request); + + self::assertTrue($response->isSuccessful() == true); + } + + /** + * @group("list") + * @throws \Exception + */ + public function testUsers() + { + $client = self::getApiClient(); + + $request = new Request\UsersRequest(); + $request->setActive(1); + $request->setOnline(0); + + $response = $client->users($request); + + self::assertTrue($response->isSuccessful() == true); + } + + /** + * @group("list") + * @throws \Exception + */ + public function testDialogs() + { + $client = self::getApiClient(); + + $request = new Request\DialogsRequest(); + $request->setActive(1); + $request->setAssign(1); + + $response = $client->dialogs($request); + + self::assertTrue($response->isSuccessful() == true); + } + + /** + * @group("list") + * @throws \Exception + */ + public function testCustomers() + { + $client = self::getApiClient(); + + $request = new Request\CustomersRequest(); + + $response = $client->customers($request); + + self::assertTrue($response->isSuccessful() == true); + } +} diff --git a/tests/Bot/Tests/CommandsTest.php b/tests/Bot/Tests/CommandsTest.php new file mode 100644 index 0000000..db3c6d3 --- /dev/null +++ b/tests/Bot/Tests/CommandsTest.php @@ -0,0 +1,95 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Tests; + +use Exception; +use InvalidArgumentException; +use RetailCrm\Mg\Bot\Model\Request\CommandEditRequest; +use RetailCrm\Mg\Bot\Test\TestCase; + +/** + * PHP version 7.0 + * + * Class ClientTest + * + * @package RetailCrm\Mg\Bot\Tests + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class CommandsTest extends TestCase +{ + /** + * @group("commands") + * @throws \Exception + */ + public function testCommandEditException() + { + self::expectException(InvalidArgumentException::class); + + $client = self::getApiClient(); + + $request = new CommandEditRequest(); + $request->setDescription("qwerty"); + + $client->commandEdit($request); + } + + /** + * @group("commands") + * @throws \Exception + */ + public function testCommandDeleteException() + { + self::expectException(Exception::class); + + $client = self::getApiClient(); + + $request = "qwerty"; + + $client->commandDelete($request); + } + + /** + * @group("commands") + * @throws \Exception + */ + public function testCommandEdit() + { + $client = self::getApiClient(); + + $request = new CommandEditRequest(); + $request->setBotId(1); + $request->setName("show_payment_types"); + $request->setDescription("Get available payment types"); + + $response = $client->commandEdit($request); + + self::assertTrue($response->isSuccessful() == true); + } + + /** + * @group("commands") + * @depends testCommandEdit + * @throws \Exception + */ + public function testCommandDelete() + { + $client = self::getApiClient(); + + $response = $client->commandDelete("show_payment_types"); + + self::assertTrue($response->isSuccessful() == true); + } +} diff --git a/tests/Bot/Tests/MessagesTest.php b/tests/Bot/Tests/MessagesTest.php new file mode 100644 index 0000000..259304f --- /dev/null +++ b/tests/Bot/Tests/MessagesTest.php @@ -0,0 +1,54 @@ + + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ + +namespace RetailCrm\Mg\Bot\Tests; + +use Exception; +use InvalidArgumentException; +use RetailCrm\Common\Exception\CurlException; +use RetailCrm\Common\Exception\InvalidJsonException; +use RetailCrm\Mg\Bot\Model\Constants; +use RetailCrm\Mg\Bot\Model\Request\CommandEditRequest; +use RetailCrm\Mg\Bot\Model\Request\MessageSendRequest; +use RetailCrm\Mg\Bot\Test\TestCase; + +/** + * PHP version 7.0 + * + * Class MessagesTest + * + * @package RetailCrm\Mg\Bot\Tests + * @author retailCRM + * @license https://opensource.org/licenses/MIT MIT License + * @link http://help.retailcrm.pro/docs/Developers + */ +class MessagesTest extends TestCase +{ + /** + * @group("messages") + * @throws \Exception + */ + public function testMessageSend() + { + $client = self::getApiClient(); + + $request = new MessageSendRequest(); + $request->setChatId(0); + $request->setScope(Constants::MESSAGE_SCOPE_PUBLIC); + $request->setContent("Hello"); + + $request = $client->messageSend($request); + + self::assertEquals($request->getStatusCode(), 400); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..d5251eb --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,15 @@ +add('RetailCrm\\Mg\\Bot\\Test', __DIR__); + +use Symfony\Component\Dotenv\Dotenv; + +$dotenv = new Dotenv(); +$dotenv->load(__DIR__ . '/../.env');