diff --git a/.docker/includes.bash b/.docker/includes.bash new file mode 100644 index 0000000..ca8e136 --- /dev/null +++ b/.docker/includes.bash @@ -0,0 +1,5 @@ +# Aliases for common commands + +alias symfony-console="docker-compose exec php php /app/bin/console" +alias dcomposer="docker-compose exec php composer --working-dir=/app/" +alias dphpunit="docker-compose exec php php -d memory_limit=-1 /app/vendor/bin/phpunit -c /app/" diff --git a/.docker/nginx/Dockerfile b/.docker/nginx/Dockerfile new file mode 100644 index 0000000..70dfb1c --- /dev/null +++ b/.docker/nginx/Dockerfile @@ -0,0 +1,11 @@ +FROM nginx + +MAINTAINER Michael Phillips + +COPY bin/entrypoint.sh /usr/local/bin +RUN chmod +x /usr/local/bin/entrypoint.sh +COPY conf/vhost_dev.conf /etc/nginx/nginx.conf.dev +COPY conf/vhost_prod.conf /etc/nginx/nginx.conf.prod +ENV ENVIRONMENT dev + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/.docker/nginx/bin/entrypoint.sh b/.docker/nginx/bin/entrypoint.sh new file mode 100644 index 0000000..206f427 --- /dev/null +++ b/.docker/nginx/bin/entrypoint.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +if [ -z "$1" ]; then + cp /etc/nginx/nginx.conf.${ENVIRONMENT} /etc/nginx/nginx.conf + exec nginx -g "daemon off;" +fi + +exec "$@" + diff --git a/.docker/nginx/conf/vhost_dev.conf b/.docker/nginx/conf/vhost_dev.conf new file mode 100644 index 0000000..6014041 --- /dev/null +++ b/.docker/nginx/conf/vhost_dev.conf @@ -0,0 +1,63 @@ +user www-data; +worker_processes 4; +pid /run/nginx.pid; + +events { + worker_connections 2048; + multi_accept on; + use epoll; +} + +http { + server_tokens off; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 15; + types_hash_max_size 2048; + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log off; + error_log off; + gzip on; + gzip_disable "msie6"; + open_file_cache max=100; + + upstream php-upstream { server php:9000; } + + server { + server_name linode.localhost + access_log /dev/stdout; + error_log /dev/stdout info; + + root /app/web; + index app_dev.php; + + location = /favicon.ico { + log_not_found off; + access_log off; + } + + location = /robots.txt { + allow all; + log_not_found off; + access_log off; + } + + location / { + try_files $uri @rewriteapp; + } + + location @rewriteapp { + rewrite ^(.*)$ /app_dev.php/$1 last; + } + + location ~ ^/(app_dev|config)\.php(/|$) { + fastcgi_pass php-upstream; + fastcgi_split_path_info ^(.+\.php)(/.*)$; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param HTTPS off; + } + } +} diff --git a/.docker/nginx/conf/vhost_prod.conf b/.docker/nginx/conf/vhost_prod.conf new file mode 100644 index 0000000..4de4892 --- /dev/null +++ b/.docker/nginx/conf/vhost_prod.conf @@ -0,0 +1,65 @@ +user www-data; +worker_processes 4; +pid /run/nginx.pid; + +events { + worker_connections 2048; + multi_accept on; + use epoll; +} + +http { + server_tokens off; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 15; + types_hash_max_size 2048; + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log off; + error_log off; + gzip on; + gzip_disable "msie6"; + open_file_cache max=100; + + upstream php-upstream { server php:9000; } + + server { + access_log /dev/stdout; + error_log /dev/stdout info; + gzip on; + gzip_comp_level 4; + gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; + + root /app/web; + index app.php; + + location = /favicon.ico { + log_not_found off; + access_log off; + } + + location = /robots.txt { + allow all; + log_not_found off; + access_log off; + } + + location / { + try_files $uri @rewriteapp; + } + + location @rewriteapp { + rewrite ^(.*)$ /app.php/$1 last; + } + + location ~ ^/(app)\.php(/|$) { + fastcgi_pass php-upstream; + fastcgi_split_path_info ^(.+\.php)(/.*)$; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param HTTPS off; + } + } +} diff --git a/.docker/php/Dockerfile b/.docker/php/Dockerfile index 8698765..9598f5f 100644 --- a/.docker/php/Dockerfile +++ b/.docker/php/Dockerfile @@ -1,70 +1,32 @@ -FROM php:5.6-fpm +FROM deployment.manpow.com:5000/heartland/php:7.1.0 -MAINTAINER Mathew Peterson - -RUN usermod -u 1000 www-data - -COPY bin/* /usr/local/bin/ -RUN chmod +x -R /usr/local/bin/ +MAINTAINER Michael Phillips COPY conf/php.ini /usr/local/etc/php/conf.d/ -COPY conf/pool.conf /usr/local/etc/php/ - -WORKDIR /app +COPY conf/pool.conf /usr/local/etc/php-fpm.d/www.conf +COPY conf/xdebug.ini /usr/local/etc/php/conf.d/docker-php-pecl-xdebug.ini +COPY conf/opcache.ini /usr/local/etc/php/conf.d/opcache.ini RUN apt-install \ - apt-utils \ - less \ - libssl-dev \ git \ - zip \ - libfreetype6-dev \ - libjpeg62-turbo-dev \ - libpng12-dev \ - libxml2-dev \ - libmcrypt-dev \ - nodejs \ - npm \ - php5-ssh2 \ - libssh2-1 \ libssh2-1-dev +RUN curl -o /tmp/node.tar.xz https://nodejs.org/dist/v6.9.4/node-v6.9.4-linux-x64.tar.xz +RUN cd /usr/local && tar --strip-components 1 -xJf /tmp/node.tar.xz + RUN ln -s /usr/bin/nodejs /usr/bin/node RUN echo '{ "allow_root": true }' > /root/.bowerrc -RUN mkdir -p /tmp \ - && docker-php-ext-configure gd \ - --with-freetype-dir=/usr/include/ \ - --with-jpeg-dir=/usr/include/ \ - && docker-php-ext-install \ - gd \ - pdo \ - pdo_mysql \ - soap \ - mcrypt \ - pcntl \ - && docker-php-pecl-install zip memcached xdebug +RUN mkdir -p /usr/src/php/ext +RUN curl -o /tmp/ssh.tar.gz https://pecl.php.net/get/ssh2-1.0.tgz +RUN tar xf /tmp/ssh.tar.gz -C /usr/src/php/ext/ +RUN rm /tmp/ssh.tar.gz + +RUN docker-php-pecl-install xdebug ssh2-1.0 RUN curl -sS https://getcomposer.org/installer | php -- \ --install-dir=/usr/local/bin \ --filename=composer && \ echo "phar.readonly = off" > /usr/local/etc/php/conf.d/phar.ini -RUN version=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") \ - && curl -A "Docker" -o ./blackfire-probe.tar.gz -D - -L -s https://blackfire.io/api/v1/releases/probe/php/linux/amd64/$version \ - && mkdir ./blackfire \ - && tar zxpf ./blackfire-probe.tar.gz -C ./blackfire \ - && mv ./blackfire/blackfire-*.so $(php -r "echo ini_get('extension_dir');")/blackfire.so \ - && printf "extension=blackfire.so\nblackfire.agent_socket=tcp://blackfire:8707\n" > $PHP_INI_DIR/conf.d/blackfire.ini \ - && rm -r ./blackfire - -RUN pecl install ssh2 channel://pecl.php.net/ssh2-0.13 \ - && cp /etc/php5/mods-available/ssh2.ini /usr/local/etc/php/conf.d/ssh2.ini - -RUN curl -L -o ./phpunit.phar https://phar.phpunit.de/phpunit.phar \ - && chmod +x phpunit.phar \ - && mv phpunit.phar /usr/local/bin/phpunit - RUN npm install -g bower - -ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/.docker/php/bin/apt-install b/.docker/php/bin/apt-install deleted file mode 100644 index d4e13ae..0000000 --- a/.docker/php/bin/apt-install +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -e - -apt-get update -apt-get install "$@" --no-install-recommends -y -apt-get clean - -rm -rf /var/lib/apt/lists/* diff --git a/.docker/php/bin/apt-purge b/.docker/php/bin/apt-purge deleted file mode 100644 index c6d654c..0000000 --- a/.docker/php/bin/apt-purge +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -exec apt-get purge -y --auto-remove \ - -o APT::AutoRemove::RecommendsImportant=false \ - -o APT::AutoRemove::SuggestsImportant=false \ - "$@" -Status API Training Shop Blog About Pricing diff --git a/.docker/php/bin/docker-php-pecl-install b/.docker/php/bin/docker-php-pecl-install deleted file mode 100644 index 80c6621..0000000 --- a/.docker/php/bin/docker-php-pecl-install +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -set -e - -usage() { - echo "usage: $0 [channel/] ..." - echo " ie: $0 uploadprogress oauth-1.2.3" -} - -if [ $# -eq 0 ]; then - usage >&2 - exit 1 -fi - -pecl install "$@" - -while [ $# -gt 0 ]; do - ext="$1" - ext=$(echo "$ext" | cut -d- -f1) - ext=$(echo "$ext" | cut -d\/ -f2) - shift - - for module in $(find /usr/local/lib/php/extensions -name "$ext.so"); do - ini="/usr/local/etc/php/conf.d/docker-php-pecl-$ext.ini" - if grep -q zend_extension_entry "$module"; then - # https://wiki.php.net/internals/extensions#loading_zend_extensions - line="zend_extension=$(basename "$module")" - else - line="extension=$(basename "$module")" - fi - if ! grep -q "$line" "$ini" 2>/dev/null; then - echo "$line" >> "$ini" - fi - done -done - -rm -rf /tmp/ diff --git a/.docker/php/bin/entrypoint.sh b/.docker/php/bin/entrypoint.sh deleted file mode 100644 index bd21911..0000000 --- a/.docker/php/bin/entrypoint.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -e - -# There is an issue within docker that prevents non-privileged users from -# writing to stdout -# -# https://github.com/docker/docker/issues/6880#issuecomment-170214851 - -if [ ! -d /tmp ]; then - mkdir -p /tmp -fi - -if [ ! -e /tmp/stdout ]; then - mkfifo -m 666 /tmp/stdout 1>&2 -fi - -while true; do cat < /tmp/stdout 1>&2; done & - -if [ -z "$1" ]; then - exec php-fpm -fi - -exec "$@" diff --git a/.docker/php/conf/opcache.ini b/.docker/php/conf/opcache.ini new file mode 100644 index 0000000..00300fc --- /dev/null +++ b/.docker/php/conf/opcache.ini @@ -0,0 +1 @@ +opcache.enable = 0 diff --git a/.docker/php/conf/pool.conf b/.docker/php/conf/pool.conf index cf11be3..6d902be 100644 --- a/.docker/php/conf/pool.conf +++ b/.docker/php/conf/pool.conf @@ -2,23 +2,16 @@ error_log = /proc/self/fd/2 daemonize = no -[api] +[www] access.log = /proc/self/fd/2 - -user = www-data -group = www-data - -chroot = /app - +user = root +group = root listen = [::]:9000 - pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 - clear_env = no - ; Ensure worker stdout and stderr are sent to the main error log. catch_workers_output = yes diff --git a/.docker/php/conf/xdebug.ini b/.docker/php/conf/xdebug.ini new file mode 100644 index 0000000..4a0a504 --- /dev/null +++ b/.docker/php/conf/xdebug.ini @@ -0,0 +1,4 @@ +zend_extension=xdebug.so +xdebug.remote_enable=on +xdebug.remote_handler=dbgp +xdebug.remote_port=9000 diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..129b760 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,9 @@ +language: php +php: + - '7.1' +before_script: + - sudo apt-get install libssh2-1-dev + - printf "\n" | pecl install ssh2-1.0 + - composer install -n +after_script: + - bash <(curl -s https://codecov.io/bash) diff --git a/README.md b/README.md index 72f23f4..82266dd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +[![Build Status](https://travis-ci.org/Nomad145/SymfonyLinodeProvisioner.svg?branch=master)](https://travis-ci.org/Nomad145/SymfonyLinodeProvisioner) +[![codecov](https://codecov.io/gh/Nomad145/SymfonyLinodeProvisioner/branch/master/graph/badge.svg)](https://codecov.io/gh/Nomad145/SymfonyLinodeProvisioner) + # SymfonyLinodeProvisioner Creates and clones Linodes from an easy Web Interface. diff --git a/app/config/services.yml b/app/config/services.yml index 0fb1417..a23a519 100644 --- a/app/config/services.yml +++ b/app/config/services.yml @@ -8,10 +8,11 @@ services: # class: AppBundle\Directory\ClassName # arguments: ["@another_service_name", "plain_value", "%parameter_name%"] - linode.api: - class: AppBundle\Service\LinodeApiService + linode.factory: + class: AppBundle\Factory\LinodeApiFactory arguments: ["%linode.token%"] + linode.form.create: class: AppBundle\Form\CreateLinodeType arguments: ["@linode.api.avail"] @@ -26,22 +27,24 @@ services: linode.api.host: class: AppBundle\Service\LinodeHostService - arguments: ["@linode.api"] + arguments: + - "@=service('linode.factory').get('LinodeApi')" linode.api.avail: class: AppBundle\Service\LinodeAvailService - arguments: ["@linode.api"] + arguments: + - "@=service('linode.factory').get('AvailApi')" linode.api.ip: class: AppBundle\Service\LinodeIpService - arguments: ["@linode.api"] + arguments: + - '@=service("linode.factory").get("Linode\\IpApi")' linode.param: class: AppBundle\ParamConverter\LinodeConverter arguments: ["@linode.api.host"] tags: - { name: request.param_converter } - ssh.connection.factory: class: AppBundle\Service\SshConnectionFactory arguments: ["%ssh.username%", "%ssh.password%", "%ssh.port%"] diff --git a/bin/symfony_requirements b/bin/symfony_requirements index 8825a96..a7bf65a 100755 --- a/bin/symfony_requirements +++ b/bin/symfony_requirements @@ -22,7 +22,6 @@ echo '> Checking Symfony requirements:'.PHP_EOL.' '; $messages = array(); foreach ($symfonyRequirements->getRequirements() as $req) { - /** @var $req Requirement */ if ($helpText = get_error_message($req, $lineSize)) { echo_style('red', 'E'); $messages['error'][] = $helpText; @@ -121,10 +120,14 @@ function echo_block($style, $title, $message) echo PHP_EOL.PHP_EOL; - echo_style($style, str_repeat(' ', $width).PHP_EOL); - echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT).PHP_EOL); - echo_style($style, str_pad($message, $width, ' ', STR_PAD_RIGHT).PHP_EOL); - echo_style($style, str_repeat(' ', $width).PHP_EOL); + echo_style($style, str_repeat(' ', $width)); + echo PHP_EOL; + echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT)); + echo PHP_EOL; + echo_style($style, $message); + echo PHP_EOL; + echo_style($style, str_repeat(' ', $width)); + echo PHP_EOL; } function has_color_support() diff --git a/composer.json b/composer.json index 6b96457..dac30ae 100644 --- a/composer.json +++ b/composer.json @@ -1,30 +1,41 @@ { - "name": "symfony/framework-standard-edition", - "license": "MIT", + "name": "nomad145/linode-provisioner", + "license": "proprietary", "type": "project", - "description": "The \"Symfony Standard Edition\" distribution", "autoload": { - "psr-4": { "": "src/" }, - "classmap": [ "app/AppKernel.php", "app/AppCache.php" ] + "psr-4": { + "": "src/" + }, + "classmap": [ + "app/AppKernel.php", + "app/AppCache.php" + ] }, "autoload-dev": { - "psr-4": { "Tests\\": "tests/" } + "psr-4": { + "Tests\\": "tests/" + }, + "files": [ + "vendor/symfony/symfony/src/Symfony/Component/VarDumper/Resources/functions/dump.php" + ] }, "require": { "php": ">=5.5.9", - "symfony/symfony": "3.1.*", - "doctrine/orm": "^2.5", "doctrine/doctrine-bundle": "^1.6", "doctrine/doctrine-cache-bundle": "^1.2", - "symfony/swiftmailer-bundle": "^2.3", - "symfony/monolog-bundle": "^2.8", - "symfony/polyfill-apcu": "^1.0", + "doctrine/orm": "^2.5", + "herzult/php-ssh": "dev-master", + "incenteev/composer-parameter-handler": "^2.0", + "myclabs/php-enum": "^1.5", + "phpunit/phpunit": "5.7.9", "sensio/distribution-bundle": "^5.0", "sensio/framework-extra-bundle": "^3.0.2", - "incenteev/composer-parameter-handler": "^2.0", - "arodygin/linode-api-php": "^1.1", - "myclabs/php-enum": "^1.4", - "herzult/php-ssh": "~1.0" + "symfony/monolog-bundle": "^3.0.2", + "symfony/polyfill-apcu": "^1.0", + "symfony/swiftmailer-bundle": "^2.3.10", + "symfony/symfony": "3.2.*", + "twig/twig": "^1.0||^2.0", + "webinarium/linode-api3": "^1.1" }, "require-dev": { "sensio/generator-bundle": "^3.0", @@ -47,9 +58,7 @@ ] }, "config": { - "platform": { - "php": "5.5.9" - } + "sort-packages": true }, "extra": { "symfony-app-dir": "app", @@ -61,8 +70,12 @@ "incenteev-parameters": { "file": "app/config/parameters.yml" }, - "branch-alias": { - "dev-master": "3.1-dev" + "branch-alias": null + }, + "repositories": [ + { + "type": "git", + "url": "https://github.com/Nomad145/php-ssh" } - } + ] } diff --git a/composer.lock b/composer.lock index 99bf517..f2f5288 100644 --- a/composer.lock +++ b/composer.lock @@ -4,80 +4,98 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "4171a2db39a4efdcf69e0ea888d029cd", - "content-hash": "c360d46a6d5b4fedd23ee9b464ecbf97", + "content-hash": "a24f38f1af9abd09b47bf910169c22ac", "packages": [ { - "name": "arodygin/linode-api-php", - "version": "1.1.8", + "name": "composer/ca-bundle", + "version": "1.0.7", "source": { "type": "git", - "url": "https://github.com/arodygin/php-linode-api3.git", - "reference": "99eb4daeebe181a13347f0079eb8584eab166150" + "url": "https://github.com/composer/ca-bundle.git", + "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/arodygin/php-linode-api3/zipball/99eb4daeebe181a13347f0079eb8584eab166150", - "reference": "99eb4daeebe181a13347f0079eb8584eab166150", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b17e6153cb7f33c7e44eb59578dc12eee5dc8e12", + "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12", "shasum": "" }, "require": { - "ext-curl": "*", - "ext-json": "*", - "php": ">=5.4.0" + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11" + "phpunit/phpunit": "^4.5", + "psr/log": "^1.0", + "symfony/process": "^2.5 || ^3.0" + }, + "suggest": { + "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, "autoload": { "psr-4": { - "Linode\\": "src/" + "Composer\\CaBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Linode API v3 Client Library for PHP", - "homepage": "https://github.com/arodygin/php-linode-api3", + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", "keywords": [ - "api", - "linode" + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" ], - "time": "2016-07-28 21:53:13" + "time": "2017-03-06T11:59:08+00:00" }, { "name": "doctrine/annotations", - "version": "v1.2.7", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535" + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535", - "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", "shasum": "" }, "require": { "doctrine/lexer": "1.*", - "php": ">=5.3.2" + "php": "^5.6 || ^7.0" }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^5.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "1.4.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Annotations\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } }, "notification-url": "https://packagist.org/downloads/", @@ -113,20 +131,20 @@ "docblock", "parser" ], - "time": "2015-08-31 12:32:49" + "time": "2017-02-24T16:22:25+00:00" }, { "name": "doctrine/cache", - "version": "v1.6.0", + "version": "v1.6.1", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "f8af318d14bdb0eff0336795b428b547bd39ccb6" + "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/f8af318d14bdb0eff0336795b428b547bd39ccb6", - "reference": "f8af318d14bdb0eff0336795b428b547bd39ccb6", + "url": "https://api.github.com/repos/doctrine/cache/zipball/b6f544a20f4807e81f7044d31e679ccbb1866dc3", + "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3", "shasum": "" }, "require": { @@ -183,32 +201,33 @@ "cache", "caching" ], - "time": "2015-12-31 16:37:02" + "time": "2016-10-29T11:16:17+00:00" }, { "name": "doctrine/collections", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a" + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a", - "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a", + "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba", + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^5.6 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "doctrine/coding-standard": "~0.1@dev", + "phpunit/phpunit": "^5.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -249,20 +268,20 @@ "collections", "iterator" ], - "time": "2015-04-14 22:21:58" + "time": "2017-01-03T10:49:41+00:00" }, { "name": "doctrine/common", - "version": "v2.6.1", + "version": "v2.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "a579557bc689580c19fee4e27487a67fe60defc0" + "reference": "930297026c8009a567ac051fd545bf6124150347" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/a579557bc689580c19fee4e27487a67fe60defc0", - "reference": "a579557bc689580c19fee4e27487a67fe60defc0", + "url": "https://api.github.com/repos/doctrine/common/zipball/930297026c8009a567ac051fd545bf6124150347", + "reference": "930297026c8009a567ac051fd545bf6124150347", "shasum": "" }, "require": { @@ -271,10 +290,10 @@ "doctrine/collections": "1.*", "doctrine/inflector": "1.*", "doctrine/lexer": "1.*", - "php": "~5.5|~7.0" + "php": "~5.6|~7.0" }, "require-dev": { - "phpunit/phpunit": "~4.8|~5.0" + "phpunit/phpunit": "^5.4.6" }, "type": "library", "extra": { @@ -322,24 +341,24 @@ "persistence", "spl" ], - "time": "2015-12-25 13:18:31" + "time": "2017-01-13T14:02:13+00:00" }, { "name": "doctrine/dbal", - "version": "v2.5.5", + "version": "v2.5.12", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "9f8c05cd5225a320d56d4bfdb4772f10d045a0c9" + "reference": "7b9e911f9d8b30d43b96853dab26898c710d8f44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/9f8c05cd5225a320d56d4bfdb4772f10d045a0c9", - "reference": "9f8c05cd5225a320d56d4bfdb4772f10d045a0c9", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/7b9e911f9d8b30d43b96853dab26898c710d8f44", + "reference": "7b9e911f9d8b30d43b96853dab26898c710d8f44", "shasum": "" }, "require": { - "doctrine/common": ">=2.4,<2.7-dev", + "doctrine/common": ">=2.4,<2.8-dev", "php": ">=5.3.2" }, "require-dev": { @@ -393,41 +412,41 @@ "persistence", "queryobject" ], - "time": "2016-09-09 19:13:33" + "time": "2017-02-08T12:53:47+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "1.6.4", + "version": "1.6.7", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "dd40b0a7fb16658cda9def9786992b8df8a49be7" + "reference": "a01d99bc6c9a6c8a8ace0012690099dd957ce9b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/dd40b0a7fb16658cda9def9786992b8df8a49be7", - "reference": "dd40b0a7fb16658cda9def9786992b8df8a49be7", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/a01d99bc6c9a6c8a8ace0012690099dd957ce9b9", + "reference": "a01d99bc6c9a6c8a8ace0012690099dd957ce9b9", "shasum": "" }, "require": { "doctrine/dbal": "~2.3", "doctrine/doctrine-cache-bundle": "~1.0", "jdorn/sql-formatter": "~1.1", - "php": ">=5.3.2", - "symfony/console": "~2.3|~3.0", - "symfony/dependency-injection": "~2.3|~3.0", - "symfony/doctrine-bridge": "~2.2|~3.0", - "symfony/framework-bundle": "~2.3|~3.0" + "php": ">=5.5.9", + "symfony/console": "~2.7|~3.0", + "symfony/dependency-injection": "~2.7|~3.0", + "symfony/doctrine-bridge": "~2.7|~3.0", + "symfony/framework-bundle": "~2.7|~3.0" }, "require-dev": { "doctrine/orm": "~2.3", "phpunit/phpunit": "~4", - "satooshi/php-coveralls": "~0.6.1", + "satooshi/php-coveralls": "^1.0", "symfony/phpunit-bridge": "~2.7|~3.0", "symfony/property-info": "~2.8|~3.0", - "symfony/validator": "~2.2|~3.0", - "symfony/yaml": "~2.2|~3.0", - "twig/twig": "~1.10" + "symfony/validator": "~2.7|~3.0", + "symfony/yaml": "~2.7|~3.0", + "twig/twig": "~1.10|~2.0" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -474,7 +493,7 @@ "orm", "persistence" ], - "time": "2016-08-10 15:35:22" + "time": "2017-01-16T12:01:26+00:00" }, { "name": "doctrine/doctrine-cache-bundle", @@ -562,7 +581,7 @@ "cache", "caching" ], - "time": "2016-01-26 17:28:51" + "time": "2016-01-26T17:28:51+00:00" }, { "name": "doctrine/inflector", @@ -629,7 +648,7 @@ "singularize", "string" ], - "time": "2015-11-06 14:35:42" + "time": "2015-11-06T14:35:42+00:00" }, { "name": "doctrine/instantiator", @@ -683,7 +702,7 @@ "constructor", "instantiate" ], - "time": "2015-06-14 21:17:01" + "time": "2015-06-14T21:17:01+00:00" }, { "name": "doctrine/lexer", @@ -737,26 +756,26 @@ "lexer", "parser" ], - "time": "2014-09-09 13:34:57" + "time": "2014-09-09T13:34:57+00:00" }, { "name": "doctrine/orm", - "version": "v2.5.5", + "version": "v2.5.6", "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "73e4be7c7b3ba26f96b781a40b33feba4dfa6d45" + "reference": "e6c434196c8ef058239aaa0724b4aadb0107940b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/73e4be7c7b3ba26f96b781a40b33feba4dfa6d45", - "reference": "73e4be7c7b3ba26f96b781a40b33feba4dfa6d45", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/e6c434196c8ef058239aaa0724b4aadb0107940b", + "reference": "e6c434196c8ef058239aaa0724b4aadb0107940b", "shasum": "" }, "require": { "doctrine/cache": "~1.4", "doctrine/collections": "~1.2", - "doctrine/common": ">=2.5-dev,<2.7-dev", + "doctrine/common": ">=2.5-dev,<2.8-dev", "doctrine/dbal": ">=2.5-dev,<2.6-dev", "doctrine/instantiator": "~1.0.1", "ext-pdo": "*", @@ -813,22 +832,73 @@ "database", "orm" ], - "time": "2016-09-10 18:51:13" + "time": "2016-12-18T15:42:34+00:00" }, { - "name": "herzult/php-ssh", - "version": "v1.1.1", + "name": "egulias/email-validator", + "version": "2.1.2", "source": { "type": "git", - "url": "https://github.com/Herzult/php-ssh.git", - "reference": "d569d15483a5f9218700313cd21c50090aa93351" + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "bc31baa11ea2883e017f0a10d9722ef9d50eac1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Herzult/php-ssh/zipball/d569d15483a5f9218700313cd21c50090aa93351", - "reference": "d569d15483a5f9218700313cd21c50090aa93351", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/bc31baa11ea2883e017f0a10d9722ef9d50eac1c", + "reference": "bc31baa11ea2883e017f0a10d9722ef9d50eac1c", "shasum": "" }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">= 5.5" + }, + "require-dev": { + "dominicsayers/isemail": "dev-master", + "phpunit/phpunit": "^4.8.0", + "satooshi/php-coveralls": "dev-master" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2017-01-30T22:07:36+00:00" + }, + { + "name": "herzult/php-ssh", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Nomad145/php-ssh", + "reference": "9bc5cba5894828134d3b1a0a0ae6e2e4608dec92" + }, "require": { "ext-ssh2": "*", "php": ">=5.3.2" @@ -848,18 +918,17 @@ "Ssh": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ - { - "name": "The contributors", - "homepage": "http://github.com/Herzult/php-ssh/contributors" - }, { "name": "Antoine Hérault", "homepage": "https://github.com/Herzult" + }, + { + "name": "The contributors", + "homepage": "http://github.com/Herzult/php-ssh/contributors" } ], "description": "Provides an object-oriented wrapper for the php ssh2 extension.", @@ -867,7 +936,7 @@ "ssh", "ssh2" ], - "time": "2015-03-17 22:03:22" + "time": "2017-05-21 07:41:15" }, { "name": "incenteev/composer-parameter-handler", @@ -918,7 +987,7 @@ "keywords": [ "parameters management" ], - "time": "2015-11-10 17:04:01" + "time": "2015-11-10T17:04:01+00:00" }, { "name": "jdorn/sql-formatter", @@ -968,20 +1037,20 @@ "highlight", "sql" ], - "time": "2014-01-12 16:20:24" + "time": "2014-01-12T16:20:24+00:00" }, { "name": "monolog/monolog", - "version": "1.21.0", + "version": "1.22.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "f42fbdfd53e306bda545845e4dbfd3e72edb4952" + "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f42fbdfd53e306bda545845e4dbfd3e72edb4952", - "reference": "f42fbdfd53e306bda545845e4dbfd3e72edb4952", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1e044bc4b34e91743943479f1be7a1d5eb93add0", + "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0", "shasum": "" }, "require": { @@ -992,7 +1061,7 @@ "psr/log-implementation": "1.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9", + "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", "jakub-onderka/php-parallel-lint": "0.9", @@ -1046,20 +1115,62 @@ "logging", "psr-3" ], - "time": "2016-07-29 03:23:52" + "time": "2017-03-13T07:08:03+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102", + "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "doctrine/collections": "1.*", + "phpunit/phpunit": "~4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "homepage": "https://github.com/myclabs/DeepCopy", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2017-04-12T18:52:22+00:00" }, { "name": "myclabs/php-enum", - "version": "1.4.2", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "e83e992a5b5a0858ef7adbc9239a749d71fb6979" + "reference": "61f4a24da5be216301447f3278ea6562609d61f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/e83e992a5b5a0858ef7adbc9239a749d71fb6979", - "reference": "e83e992a5b5a0858ef7adbc9239a749d71fb6979", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/61f4a24da5be216301447f3278ea6562609d61f5", + "reference": "61f4a24da5be216301447f3278ea6562609d61f5", "shasum": "" }, "require": { @@ -1090,20 +1201,20 @@ "keywords": [ "enum" ], - "time": "2016-08-01 15:48:47" + "time": "2017-03-26T10:24:21+00:00" }, { "name": "paragonie/random_compat", - "version": "v2.0.2", + "version": "v2.0.10", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "088c04e2f261c33bed6ca5245491cfca69195ccf" + "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/088c04e2f261c33bed6ca5245491cfca69195ccf", - "reference": "088c04e2f261c33bed6ca5245491cfca69195ccf", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d", + "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d", "shasum": "" }, "require": { @@ -1138,24 +1249,27 @@ "pseudorandom", "random" ], - "time": "2016-04-03 06:00:07" + "time": "2017-03-13T16:27:32+00:00" }, { - "name": "psr/cache", - "version": "1.0.1", + "name": "phpdocumentor/reflection-common", + "version": "1.0", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" }, "type": "library", "extra": { @@ -1165,7 +1279,9 @@ }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "phpDocumentor\\Reflection\\": [ + "src" + ] } }, "notification-url": "https://packagist.org/downloads/", @@ -1174,44 +1290,51 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" } ], - "description": "Common interface for caching libraries", + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", "keywords": [ - "cache", - "psr", - "psr-6" + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" ], - "time": "2016-08-06 20:24:11" + "time": "2015-12-27T11:43:31+00:00" }, { - "name": "psr/log", - "version": "1.0.1", + "name": "phpdocumentor/reflection-docblock", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "5277094ed527a1c4477177d102fe4c53551953e0" + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/5277094ed527a1c4477177d102fe4c53551953e0", - "reference": "5277094ed527a1c4477177d102fe4c53551953e0", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.2.0", + "webmozart/assert": "^1.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" }, + "type": "library", "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "phpDocumentor\\Reflection\\": [ + "src/" + ] } }, "notification-url": "https://packagist.org/downloads/", @@ -1220,52 +1343,46 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Mike van Riel", + "email": "me@mikevanriel.com" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2016-09-19 16:02:08" + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2016-09-30T07:12:33+00:00" }, { - "name": "sensio/distribution-bundle", - "version": "v5.0.12", + "name": "phpdocumentor/type-resolver", + "version": "0.2.1", "source": { "type": "git", - "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", - "reference": "b6dcd04595e4db95ead22ddea58c397864e00c32" + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/b6dcd04595e4db95ead22ddea58c397864e00c32", - "reference": "b6dcd04595e4db95ead22ddea58c397864e00c32", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", "shasum": "" }, "require": { - "php": ">=5.3.9", - "sensiolabs/security-checker": "~3.0", - "symfony/class-loader": "~2.3|~3.0", - "symfony/config": "~2.3|~3.0", - "symfony/dependency-injection": "~2.3|~3.0", - "symfony/filesystem": "~2.3|~3.0", - "symfony/http-kernel": "~2.3|~3.0", - "symfony/process": "~2.3|~3.0" + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" }, - "type": "symfony-bundle", + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Sensio\\Bundle\\DistributionBundle\\": "" + "phpDocumentor\\Reflection\\": [ + "src/" + ] } }, "notification-url": "https://packagist.org/downloads/", @@ -1274,60 +1391,46 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Mike van Riel", + "email": "me@mikevanriel.com" } ], - "description": "Base bundle for Symfony Distributions", - "keywords": [ - "configuration", - "distribution" - ], - "time": "2016-09-14 20:25:12" + "time": "2016-11-25T06:54:22+00:00" }, { - "name": "sensio/framework-extra-bundle", - "version": "v3.0.16", + "name": "phpspec/prophecy", + "version": "v1.7.0", "source": { "type": "git", - "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "507a15f56fa7699f6cc8c2c7de4080b19ce22546" + "url": "https://github.com/phpspec/prophecy.git", + "reference": "93d39f1f7f9326d746203c7c056f300f7f126073" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/507a15f56fa7699f6cc8c2c7de4080b19ce22546", - "reference": "507a15f56fa7699f6cc8c2c7de4080b19ce22546", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073", + "reference": "93d39f1f7f9326d746203c7c056f300f7f126073", "shasum": "" }, "require": { - "doctrine/common": "~2.2", - "symfony/dependency-injection": "~2.3|~3.0", - "symfony/framework-bundle": "~2.3|~3.0" + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1|^2.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, "require-dev": { - "symfony/browser-kit": "~2.3|~3.0", - "symfony/dom-crawler": "~2.3|~3.0", - "symfony/expression-language": "~2.4|~3.0", - "symfony/finder": "~2.3|~3.0", - "symfony/phpunit-bridge": "~2.7|~3.0", - "symfony/security-bundle": "~2.4|~3.0", - "symfony/twig-bundle": "~2.3|~3.0", - "twig/twig": "~1.11|~2.0" - }, - "suggest": { - "symfony/expression-language": "", - "symfony/psr-http-message-bridge": "To use the PSR-7 converters", - "symfony/security-bundle": "" + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8 || ^5.6.5" }, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { - "psr-4": { - "Sensio\\Bundle\\FrameworkExtraBundle\\": "" + "psr-0": { + "Prophecy\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1336,145 +1439,1276 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" } ], - "description": "This bundle provides a way to configure your controllers with annotations", + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", "keywords": [ - "annotations", - "controllers" - ], - "time": "2016-03-25 17:08:27" + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2017-03-02T20:05:34+00:00" }, { - "name": "sensiolabs/security-checker", - "version": "v3.0.2", + "name": "phpunit/php-code-coverage", + "version": "4.0.8", "source": { "type": "git", - "url": "https://github.com/sensiolabs/security-checker.git", - "reference": "21696b0daa731064c23cfb694c60a2584a7b6e93" + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/21696b0daa731064c23cfb694c60a2584a7b6e93", - "reference": "21696b0daa731064c23cfb694c60a2584a7b6e93", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", "shasum": "" }, "require": { - "symfony/console": "~2.0|~3.0" + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^5.6 || ^7.0", + "phpunit/php-file-iterator": "^1.3", + "phpunit/php-text-template": "^1.2", + "phpunit/php-token-stream": "^1.4.2 || ^2.0", + "sebastian/code-unit-reverse-lookup": "^1.0", + "sebastian/environment": "^1.3.2 || ^2.0", + "sebastian/version": "^1.0 || ^2.0" + }, + "require-dev": { + "ext-xdebug": "^2.1.4", + "phpunit/phpunit": "^5.7" + }, + "suggest": { + "ext-xdebug": "^2.5.1" }, - "bin": [ - "security-checker" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { - "psr-0": { - "SensioLabs\\Security": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien.potencier@gmail.com" + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" } ], - "description": "A security checker for your composer.lock", - "time": "2015-11-07 08:07:40" + "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": "2017-04-02T07:44:40+00:00" }, { - "name": "swiftmailer/swiftmailer", - "version": "v5.4.3", + "name": "phpunit/php-file-iterator", + "version": "1.4.2", "source": { "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153" + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/4cc92842069c2bbc1f28daaaf1d2576ec4dfe153", - "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "require-dev": { - "mockery/mockery": "~0.9.1" - }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "1.4.x-dev" } }, "autoload": { - "files": [ - "lib/swift_required.php" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" } ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.org", + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ - "email", - "mail", - "mailer" + "filesystem", + "iterator" ], - "time": "2016-07-08 11:51:25" + "time": "2016-10-03T07:40:28+00:00" }, { - "name": "symfony/monolog-bundle", - "version": "2.11.1", + "name": "phpunit/php-text-template", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "e7caf4936c7be82bc6d68df87f1d23a0d5bf6e00" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/e7caf4936c7be82bc6d68df87f1d23a0d5bf6e00", - "reference": "e7caf4936c7be82bc6d68df87f1d23a0d5bf6e00", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", "shasum": "" }, "require": { - "monolog/monolog": "~1.18", - "php": ">=5.3.2", - "symfony/config": "~2.3|~3.0", - "symfony/dependency-injection": "~2.3|~3.0", - "symfony/http-kernel": "~2.3|~3.0", - "symfony/monolog-bridge": "~2.3|~3.0" + "php": ">=5.3.3" }, - "require-dev": { - "phpunit/phpunit": "^4.8", - "symfony/console": "~2.3|~3.0", - "symfony/yaml": "~2.3|~3.0" + "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": "1.4.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7", + "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-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-02-27T10:12:30+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "5.7.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "69f832b87c731d5cacad7f91948778fe98335fdd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/69f832b87c731d5cacad7f91948778fe98335fdd", + "reference": "69f832b87c731d5cacad7f91948778fe98335fdd", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "~1.3", + "php": "^5.6 || ^7.0", + "phpspec/prophecy": "^1.6.2", + "phpunit/php-code-coverage": "^4.0.4", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "^3.2", + "sebastian/comparator": "~1.2.2", + "sebastian/diff": "~1.2", + "sebastian/environment": "^1.3.4 || ^2.0", + "sebastian/exporter": "~2.0", + "sebastian/global-state": "^1.0 || ^2.0", + "sebastian/object-enumerator": "~2.0", + "sebastian/resource-operations": "~1.0", + "sebastian/version": "~1.0|~2.0", + "symfony/yaml": "~2.1|~3.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-xdebug": "*", + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.7.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": "2017-01-28T06:14:33+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.6 || ^7.0", + "phpunit/php-text-template": "^1.2", + "sebastian/exporter": "^1.2 || ^2.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.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": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2016-12-08T20:27:08+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "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": "2016-10-10T12:19:37+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": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.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": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2017-01-29T09:50:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3c7d21999e815cdfac70c6c7d79d3a9cb1bc7bc2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3c7d21999e815cdfac70c6c7d79d3a9cb1bc7bc2", + "reference": "3c7d21999e815cdfac70c6c7d79d3a9cb1bc7bc2", + "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.4-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-05-18T13:44:30+00:00" + }, + { + "name": "sebastian/environment", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.0" + }, + "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" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2016-11-26T07:53:53+00:00" + }, + { + "name": "sebastian/exporter", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "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": "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": "2016-11-19T08:54:04+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": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "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" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-02-18T15:18:39+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "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": "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": "2016-11-19T07:33:16+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": "sensio/distribution-bundle", + "version": "v5.0.20", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", + "reference": "4b019d4c0bd64438c42e4b6b0726085b409be8d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/4b019d4c0bd64438c42e4b6b0726085b409be8d9", + "reference": "4b019d4c0bd64438c42e4b6b0726085b409be8d9", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "sensiolabs/security-checker": "~3.0|~4.0", + "symfony/class-loader": "~2.3|~3.0", + "symfony/config": "~2.3|~3.0", + "symfony/dependency-injection": "~2.3|~3.0", + "symfony/filesystem": "~2.3|~3.0", + "symfony/http-kernel": "~2.3|~3.0", + "symfony/process": "~2.3|~3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\DistributionBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Base bundle for Symfony Distributions", + "keywords": [ + "configuration", + "distribution" + ], + "time": "2017-05-11T16:21:03+00:00" + }, + { + "name": "sensio/framework-extra-bundle", + "version": "v3.0.26", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "6d6cbe971554f0a2cc84965850481eb04a2a0059" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/6d6cbe971554f0a2cc84965850481eb04a2a0059", + "reference": "6d6cbe971554f0a2cc84965850481eb04a2a0059", + "shasum": "" + }, + "require": { + "doctrine/common": "~2.2", + "symfony/dependency-injection": "~2.3|~3.0", + "symfony/framework-bundle": "~2.3|~3.0" + }, + "require-dev": { + "doctrine/doctrine-bundle": "~1.5", + "doctrine/orm": "~2.4,>=2.4.5", + "symfony/asset": "~2.7|~3.0", + "symfony/browser-kit": "~2.3|~3.0", + "symfony/dom-crawler": "~2.3|~3.0", + "symfony/expression-language": "~2.4|~3.0", + "symfony/finder": "~2.3|~3.0", + "symfony/phpunit-bridge": "~3.2", + "symfony/psr-http-message-bridge": "^0.3", + "symfony/security-bundle": "~2.4|~3.0", + "symfony/templating": "~2.3|~3.0", + "symfony/translation": "~2.3|~3.0", + "symfony/twig-bundle": "~2.3|~3.0", + "symfony/yaml": "~2.3|~3.0", + "twig/twig": "~1.12|~2.0", + "zendframework/zend-diactoros": "^1.3" + }, + "suggest": { + "symfony/expression-language": "", + "symfony/psr-http-message-bridge": "To use the PSR-7 converters", + "symfony/security-bundle": "" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\FrameworkExtraBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], + "time": "2017-05-11T17:01:57+00:00" + }, + { + "name": "sensiolabs/security-checker", + "version": "v4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/security-checker.git", + "reference": "9e69eddf3bc49d1ee5c7908564da3141796d4bbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/9e69eddf3bc49d1ee5c7908564da3141796d4bbc", + "reference": "9e69eddf3bc49d1ee5c7908564da3141796d4bbc", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0", + "symfony/console": "~2.7|~3.0" + }, + "bin": [ + "security-checker" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-0": { + "SensioLabs\\Security": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "A security checker for your composer.lock", + "time": "2017-03-31T14:50:32+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.0.1", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "008f088d535ed3333af5ad804dd4c0eaf97c2805" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/008f088d535ed3333af5ad804dd4c0eaf97c2805", + "reference": "008f088d535ed3333af5ad804dd4c0eaf97c2805", + "shasum": "" + }, + "require": { + "egulias/email-validator": "~2.0", + "php": ">=7.0.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "~3.3@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.0-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.org", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2017-05-20T06:20:27+00:00" + }, + { + "name": "symfony/monolog-bundle", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "6f96c7dbb6b2ef70b307a1a6f897153cbca3da47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/6f96c7dbb6b2ef70b307a1a6f897153cbca3da47", + "reference": "6f96c7dbb6b2ef70b307a1a6f897153cbca3da47", + "shasum": "" + }, + "require": { + "monolog/monolog": "~1.22", + "php": ">=5.3.2", + "symfony/config": "~2.7|~3.0", + "symfony/dependency-injection": "~2.7|~3.0", + "symfony/http-kernel": "~2.7|~3.0", + "symfony/monolog-bridge": "~2.7|~3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8", + "symfony/console": "~2.3|~3.0", + "symfony/yaml": "~2.3|~3.0" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { @@ -1502,20 +2736,20 @@ "log", "logging" ], - "time": "2016-04-13 16:21:01" + "time": "2017-03-26T11:55:59+00:00" }, { "name": "symfony/polyfill-apcu", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-apcu.git", - "reference": "6d58bceaeea2c2d3eb62503839b18646e161cd6b" + "reference": "5d4474f447403c3348e37b70acc2b95475b7befa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/6d58bceaeea2c2d3eb62503839b18646e161cd6b", - "reference": "6d58bceaeea2c2d3eb62503839b18646e161cd6b", + "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/5d4474f447403c3348e37b70acc2b95475b7befa", + "reference": "5d4474f447403c3348e37b70acc2b95475b7befa", "shasum": "" }, "require": { @@ -1524,7 +2758,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1555,20 +2789,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "0f8dc2c45f69f8672379e9210bca4a115cd5146f" + "reference": "2d6e2b20d457603eefb6e614286c22efca30fdb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/0f8dc2c45f69f8672379e9210bca4a115cd5146f", - "reference": "0f8dc2c45f69f8672379e9210bca4a115cd5146f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/2d6e2b20d457603eefb6e614286c22efca30fdb4", + "reference": "2d6e2b20d457603eefb6e614286c22efca30fdb4", "shasum": "" }, "require": { @@ -1581,7 +2815,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1613,20 +2847,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "dff51f72b0706335131b00a7f49606168c582594" + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594", - "reference": "dff51f72b0706335131b00a7f49606168c582594", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", "shasum": "" }, "require": { @@ -1638,7 +2872,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1672,20 +2906,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php56", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a" + "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/3edf57a8fbf9a927533344cef65ad7e1cf31030a", - "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/1dd42b9b89556f18092f3d1ada22cb05ac85383c", + "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c", "shasum": "" }, "require": { @@ -1695,7 +2929,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1728,20 +2962,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php70", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "a42f4b6b05ed458910f8af4c4e1121b0101b2d85" + "reference": "13ce343935f0f91ca89605a2f6ca6f5c2f3faac2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/a42f4b6b05ed458910f8af4c4e1121b0101b2d85", - "reference": "a42f4b6b05ed458910f8af4c4e1121b0101b2d85", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/13ce343935f0f91ca89605a2f6ca6f5c2f3faac2", + "reference": "13ce343935f0f91ca89605a2f6ca6f5c2f3faac2", "shasum": "" }, "require": { @@ -1751,7 +2985,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1787,20 +3021,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-util", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-util.git", - "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99" + "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ef830ce3d218e622b221d6bfad42c751d974bf99", - "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/746bce0fca664ac0a575e465f65c6643faddf7fb", + "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb", "shasum": "" }, "require": { @@ -1809,7 +3043,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1839,32 +3073,34 @@ "polyfill", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/swiftmailer-bundle", - "version": "v2.3.11", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/symfony/swiftmailer-bundle.git", - "reference": "5e1a90f28213231ceee19c953bbebc5b5b95c690" + "reference": "a871c7294d001c81c6c30e7382c2acd70795b2aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/5e1a90f28213231ceee19c953bbebc5b5b95c690", - "reference": "5e1a90f28213231ceee19c953bbebc5b5b95c690", + "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/a871c7294d001c81c6c30e7382c2acd70795b2aa", + "reference": "a871c7294d001c81c6c30e7382c2acd70795b2aa", "shasum": "" }, "require": { "php": ">=5.3.2", - "swiftmailer/swiftmailer": ">=4.2.0,~5.0", - "symfony/config": "~2.3|~3.0", - "symfony/dependency-injection": "~2.3|~3.0", - "symfony/http-kernel": "~2.3|~3.0", - "symfony/yaml": "~2.3|~3.0" + "swiftmailer/swiftmailer": ">=4.2.0|~5.0", + "symfony/config": "~2.7|~3.0", + "symfony/dependency-injection": "~2.7|~3.0", + "symfony/http-kernel": "~2.7|~3.0" }, "require-dev": { - "symfony/phpunit-bridge": "~2.7|~3.0" + "symfony/console": "~2.7|~3.0", + "symfony/framework-bundle": "~2.7|~3.0", + "symfony/phpunit-bridge": "~3.3@dev", + "symfony/yaml": "~2.7|~3.0" }, "suggest": { "psr/log": "Allows logging" @@ -1872,7 +3108,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "2.6-dev" } }, "autoload": { @@ -1896,20 +3132,20 @@ ], "description": "Symfony SwiftmailerBundle", "homepage": "http://symfony.com", - "time": "2016-01-15 16:41:20" + "time": "2017-05-20T05:31:12+00:00" }, { "name": "symfony/symfony", - "version": "v3.1.4", + "version": "v3.2.8", "source": { "type": "git", "url": "https://github.com/symfony/symfony.git", - "reference": "65ca9e4fbdb34f6d463ef77898ca583b101a4162" + "reference": "85959c2abbe4d2f050f950f39c9c3cf83819f3df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/symfony/zipball/65ca9e4fbdb34f6d463ef77898ca583b101a4162", - "reference": "65ca9e4fbdb34f6d463ef77898ca583b101a4162", + "url": "https://api.github.com/repos/symfony/symfony/zipball/85959c2abbe4d2f050f950f39c9c3cf83819f3df", + "reference": "85959c2abbe4d2f050f950f39c9c3cf83819f3df", "shasum": "" }, "require": { @@ -1922,11 +3158,12 @@ "symfony/polyfill-php56": "~1.0", "symfony/polyfill-php70": "~1.0", "symfony/polyfill-util": "~1.0", - "twig/twig": "~1.23|~2.0" + "twig/twig": "~1.28|~2.0" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.0", - "phpdocumentor/type-resolver": "<0.2.0" + "phpdocumentor/type-resolver": "<0.2.0", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" }, "provide": { "psr/cache-implementation": "1.0" @@ -1977,6 +3214,7 @@ "symfony/validator": "self.version", "symfony/var-dumper": "self.version", "symfony/web-profiler-bundle": "self.version", + "symfony/workflow": "self.version", "symfony/yaml": "self.version" }, "require-dev": { @@ -1986,18 +3224,20 @@ "doctrine/dbal": "~2.4", "doctrine/doctrine-bundle": "~1.4", "doctrine/orm": "~2.4,>=2.4.5", - "egulias/email-validator": "~1.2,>=1.2.1", + "egulias/email-validator": "~1.2,>=1.2.8|~2.0", "monolog/monolog": "~1.11", "ocramius/proxy-manager": "~0.4|~1.0|~2.0", "phpdocumentor/reflection-docblock": "^3.0", "predis/predis": "~1.0", + "sensio/framework-extra-bundle": "^3.0.2", + "symfony/phpunit-bridge": "~3.2", "symfony/polyfill-apcu": "~1.1", "symfony/security-acl": "~2.8|~3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -2036,33 +3276,35 @@ "keywords": [ "framework" ], - "time": "2016-09-03 15:28:43" + "time": "2017-05-01T17:47:03+00:00" }, { "name": "twig/twig", - "version": "v1.25.0", + "version": "v2.3.2", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "f16a634ab08d87e520da5671ec52153d627f10f6" + "reference": "85e8372c451510165c04bf781295f9d922fa524b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/f16a634ab08d87e520da5671ec52153d627f10f6", - "reference": "f16a634ab08d87e520da5671ec52153d627f10f6", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/85e8372c451510165c04bf781295f9d922fa524b", + "reference": "85e8372c451510165c04bf781295f9d922fa524b", "shasum": "" }, "require": { - "php": ">=5.2.7" + "php": "^7.0", + "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { + "psr/container": "^1.0", "symfony/debug": "~2.7", - "symfony/phpunit-bridge": "~2.7" + "symfony/phpunit-bridge": "~3.3@dev" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.25-dev" + "dev-master": "2.3-dev" } }, "autoload": { @@ -2097,39 +3339,132 @@ "keywords": [ "templating" ], - "time": "2016-09-21 23:05:12" + "time": "2017-04-21T00:13:02+00:00" + }, + { + "name": "webinarium/linode-api3", + "version": "1.1.11", + "source": { + "type": "git", + "url": "https://github.com/webinarium/linode-api3.git", + "reference": "6794a16fb6ce6713410f04c9c1411eb6d46139e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webinarium/linode-api3/zipball/6794a16fb6ce6713410f04c9c1411eb6d46139e0", + "reference": "6794a16fb6ce6713410f04c9c1411eb6d46139e0", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.1", + "phpunit/phpunit": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Linode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Linode API v3 Client Library for PHP", + "homepage": "https://github.com/webinarium/linode-api3", + "keywords": [ + "api", + "linode" + ], + "time": "2017-03-23T22:44:05+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "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": "2016-11-23T20:04:58+00:00" } ], "packages-dev": [ { "name": "sensio/generator-bundle", - "version": "v3.0.8", + "version": "v3.1.4", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git", - "reference": "3c20d16512f37d2be159eca0411b99a141b90fa4" + "reference": "37f9f4e165b033fb76cc2320838321cc57140e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/3c20d16512f37d2be159eca0411b99a141b90fa4", - "reference": "3c20d16512f37d2be159eca0411b99a141b90fa4", + "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/37f9f4e165b033fb76cc2320838321cc57140e65", + "reference": "37f9f4e165b033fb76cc2320838321cc57140e65", "shasum": "" }, "require": { "symfony/console": "~2.7|~3.0", "symfony/framework-bundle": "~2.7|~3.0", "symfony/process": "~2.7|~3.0", - "symfony/yaml": "~2.7|~3.0" + "symfony/yaml": "~2.7|~3.0", + "twig/twig": "^1.28.2|^2.0" }, "require-dev": { "doctrine/orm": "~2.4", "symfony/doctrine-bridge": "~2.7|~3.0", - "twig/twig": "~1.18" + "symfony/filesystem": "~2.7|~3.0", + "symfony/phpunit-bridge": "^3.3" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "3.1.x-dev" } }, "autoload": { @@ -2151,32 +3486,39 @@ } ], "description": "This bundle generates code for you", - "time": "2016-09-06 01:30:19" + "time": "2017-03-15T01:02:10+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v3.1.4", + "version": "v3.2.8", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "1f4e2059cf4ecae1053b9c3027b3fc548fd077b9" + "reference": "00916603c524b8048906de460b7ea0dfa1651281" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/1f4e2059cf4ecae1053b9c3027b3fc548fd077b9", - "reference": "1f4e2059cf4ecae1053b9c3027b3fc548fd077b9", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/00916603c524b8048906de460b7ea0dfa1651281", + "reference": "00916603c524b8048906de460b7ea0dfa1651281", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "conflict": { + "phpunit/phpunit": ">=6.0" + }, "suggest": { + "ext-zip": "Zip support is required when using bin/simple-phpunit", "symfony/debug": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" }, + "bin": [ + "bin/simple-phpunit" + ], "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -2206,19 +3548,18 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2016-08-19 06:48:39" + "time": "2017-04-12T14:13:17+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "herzult/php-ssh": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=5.5.9" }, - "platform-dev": [], - "platform-overrides": { - "php": "5.5.9" - } + "platform-dev": [] } diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml new file mode 100644 index 0000000..8dcdb73 --- /dev/null +++ b/docker-compose-dev.yml @@ -0,0 +1,15 @@ +# Docker Compose file for OSX enabling Docker Sync. Requires docker-sync and docker-sync.yml. + +version: "2" +services: + php: + volumes: + - linode-sync:/app:nocopy + + nginx: + volumes: + - linode-sync:/app:nocopy + +volumes: + linode-sync: + external: true diff --git a/docker-compose.yml b/docker-compose.yml index 47a444e..8898fe3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,55 +1,19 @@ version: '2' services: - volumes: - container_name: linode-volumes - image: ubuntu:trusty - volumes: - - .:/app - - ./var/cache:/app/var/cache - - ./data:/var/lib/mysql - - /tmp - - .project/sql:/docker-entrypoint-initdb.d - php: - container_name: linode-php - image: heartland/php + container_name: php + image: nomad145/linode-php:latest build: .docker/php - volumes_from: - - volumes - # links: - # - mariadb + environment: + XDEBUG_CONFIG: remote_host=10.105.38.105 - linode: - container_name: linode-nginx - image: heartland/nginx - # build: .docker/nginx/heartland - volumes_from: - - volumes + nginx: + container_name: nginx + build: .docker/nginx links: - php environment: VIRTUAL_HOST: linode.localhost ports: - - "81:81" - - # mariadb: - # image: mariadb:latest - # container_name: heartland-mariadb - # volumes_from: - # - volumes - # environment: - # MYSQL_ROOT_PASSWORD: root - # MYSQL_USER: dbuser - # MYSQL_PASSWORD: dbpass - # MYSQL_DATABASE: dbname - # ports: - # - "3306:3306" - - nginx-proxy: - image: jwilder/nginx-proxy - container_name: nginx-proxy - ports: - - "80:80" - volumes: - - /var/run/docker.sock:/tmp/docker.sock:ro + - "80:80" diff --git a/docker-sync.yml b/docker-sync.yml new file mode 100644 index 0000000..fffbfae --- /dev/null +++ b/docker-sync.yml @@ -0,0 +1,7 @@ +version: "2" +syncs: + linode-sync: + src: './' + sync_strategy: 'native_osx' + sync_excludes: ['.project', '.git', '.docker', '.platform', 'var/cache'] + sync_excludes_type: 'Name' diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 65e9082..ea118d5 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -13,7 +13,7 @@ - + tests @@ -28,4 +28,7 @@ + + + diff --git a/src/AppBundle/Service/LinodeApiService.php b/src/AppBundle/Factory/LinodeApiFactory.php similarity index 83% rename from src/AppBundle/Service/LinodeApiService.php rename to src/AppBundle/Factory/LinodeApiFactory.php index 72c3d6d..69075df 100644 --- a/src/AppBundle/Service/LinodeApiService.php +++ b/src/AppBundle/Factory/LinodeApiFactory.php @@ -1,15 +1,15 @@ + * LinodeApiFactory */ -class LinodeApiService +class LinodeApiFactory { /** @var string $key */ protected $key; + private $var; /** * __construct diff --git a/src/AppBundle/Form/CloneType.php b/src/AppBundle/Form/CloneType.php index 6d360de..0141e6f 100644 --- a/src/AppBundle/Form/CloneType.php +++ b/src/AppBundle/Form/CloneType.php @@ -15,9 +15,10 @@ class CloneType extends CreateLinodeType { /** - * undocumented function + * __construct * - * @return void + * @param LinodeAvailService + * @param LinodeHostService */ public function __construct(LinodeAvailService $availApi, LinodeHostService $hostApi) { @@ -26,9 +27,7 @@ public function __construct(LinodeAvailService $availApi, LinodeHostService $hos } /** - * buildForm - * - * @inherit + * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { @@ -38,7 +37,7 @@ public function buildForm(FormBuilderInterface $builder, array $options) ->add('clone', ChoiceType::class, array( 'label' => "Clone", 'choices' => $this->hostApi->getLinodes(), - 'choice_label' => function(Linode $linode) { + 'choice_label' => function (Linode $linode) { return $linode->getLabel(); } )); diff --git a/src/AppBundle/Form/MigrateType.php b/src/AppBundle/Form/MigrateType.php index 0f97719..a9f5a31 100644 --- a/src/AppBundle/Form/MigrateType.php +++ b/src/AppBundle/Form/MigrateType.php @@ -22,18 +22,14 @@ class MigrateType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->add('domain') - ->add('hostname') - ->add('ipv4', TextType::class, array( - 'constraints' => new Ip(array('version' => 4)) - )) - ->add('ipv6', TextType::class, array( - 'constraints' => new Ip(array('version' => 6)) - )) - ->add('longviewUrl') - ->add('longviewKey') - ->add('mandrillKey') - ->add('mandrillSub') + ->add('domain', TextType::class) + ->add('hostname', TextType::class) + ->add('ipv4', TextType::class) + ->add('ipv6', TextType::class) + ->add('longviewUrl', TextType::class) + ->add('longviewKey', TextType::class) + ->add('mandrillKey', TextType::class) + ->add('mandrillSub', TextType::class) ->add('submit', SubmitType::class); } diff --git a/src/AppBundle/Model/MigrateConfig.php b/src/AppBundle/Model/MigrateConfig.php index c814234..59a8853 100644 --- a/src/AppBundle/Model/MigrateConfig.php +++ b/src/AppBundle/Model/MigrateConfig.php @@ -2,6 +2,8 @@ namespace AppBundle\Model; +use Symfony\Component\Validator\Constraints as Assert; + /** * Class MigrateConfig * @author Michael Phillips @@ -10,7 +12,15 @@ class MigrateConfig { protected $domain; protected $hostname; + + /** + * @Assert\Ip(version="4") + */ protected $ipv4; + + /** + * @Assert\Ip(version="6") + */ protected $ipv6; protected $longviewUrl; protected $longviewKey; diff --git a/src/AppBundle/Service/LinodeAvailService.php b/src/AppBundle/Service/LinodeAvailService.php index 042bdd9..c39d152 100644 --- a/src/AppBundle/Service/LinodeAvailService.php +++ b/src/AppBundle/Service/LinodeAvailService.php @@ -5,6 +5,7 @@ use Doctrine\Common\Collections\ArrayCollection; use AppBundle\Model\DataCenter; use AppBundle\Model\LinodePlan; +use Linode\AvailApi; /** * Class LinodeAvailService @@ -20,9 +21,9 @@ class LinodeAvailService * * @param LinodeApi $api */ - public function __construct(LinodeApiService $api) + public function __construct(AvailApi $api) { - $this->api = $api->get('AvailApi'); + $this->api = $api; } /** diff --git a/src/AppBundle/Service/LinodeHostService.php b/src/AppBundle/Service/LinodeHostService.php index 84e6c60..1f3431c 100644 --- a/src/AppBundle/Service/LinodeHostService.php +++ b/src/AppBundle/Service/LinodeHostService.php @@ -8,6 +8,7 @@ use AppBundle\Model\DataCenter; use AppBundle\Enum\PaymentTermEnum; use AppBundle\Model\LinodePlan; +use Linode\LinodeApi; /** * Class LinodeHostService @@ -23,11 +24,15 @@ class LinodeHostService * * @param LinodeApiService */ - public function __construct(LinodeApiService $api) + public function __construct(LinodeApi $api) { - $this->api = $api->get('LinodeApi'); + $this->api = $api; } + /** + * @param int $linodeId + * @return ArrayCollection + */ public function getLinodes($linodeId = null) { $linodes = new ArrayCollection( diff --git a/src/AppBundle/Service/LinodeIpService.php b/src/AppBundle/Service/LinodeIpService.php index ef2798f..ef011e5 100644 --- a/src/AppBundle/Service/LinodeIpService.php +++ b/src/AppBundle/Service/LinodeIpService.php @@ -4,6 +4,7 @@ use AppBundle\Service\LinodeApiService; use Doctrine\Common\Collections\ArrayCollection; +use Linode\Linode\IpApi; use AppBundle\Model\IpAddress; /** @@ -19,9 +20,9 @@ class LinodeIpService * __construct * @param LinodeApiService $api */ - public function __construct(LinodeApiService $api) + public function __construct(IpApi $api) { - $this->api = $api->get('Linode\\IpApi'); + $this->api = $api; } /** diff --git a/tests/AppBundle/Controller/DefaultControllerTest.php b/tests/AppBundle/Controller/DefaultControllerTest.php deleted file mode 100644 index 594803c..0000000 --- a/tests/AppBundle/Controller/DefaultControllerTest.php +++ /dev/null @@ -1,18 +0,0 @@ -request('GET', '/'); - - $this->assertEquals(200, $client->getResponse()->getStatusCode()); - $this->assertContains('Welcome to Symfony', $crawler->filter('#container h1')->text()); - } -} diff --git a/tests/AppBundle/Controller/LinodeControllerTest.php b/tests/AppBundle/Controller/LinodeControllerTest.php new file mode 100644 index 0000000..0900e1e --- /dev/null +++ b/tests/AppBundle/Controller/LinodeControllerTest.php @@ -0,0 +1,78 @@ +client = static::createClient(); + + $availApi = $this->createMock(AvailApi::class); + $hostApi = $this->createMock(LinodeApi::class); + $ipApi = $this->createMock(IpApi::class); + + $map = [ + ['AvailApi', $availApi], + ['LinodeApi', $hostApi], + ['Linode\\IpApi', $ipApi], + ]; + + $factory = $this->createMock(LinodeApiFactory::class); + $factory + ->method('get') + ->will($this->returnValueMap($map)); + + $hostService = $this->createMock(LinodeHostService::class); + $hostService + ->expects($this->any()) + ->method('getLinodes') + ->willReturn([ + (new Linode())->setLabel('Test Linode') + ]); + + $availService = $this->createMock(LinodeAvailService::class); + $availService + ->expects($this->any()) + ->method('getDataCenters') + ->willReturn([ + (new DataCenter())->setLocation('Test Location') + ]); + + $this->client->getContainer()->set('linode.factory', $factory); + $this->client->getContainer()->set('linode.api.host', $hostService); + $this->client->getContainer()->set('linode.api.avail', $availService); + } + + public function testIndex() + { + $crawler = $this->client->request('GET', '/'); + + $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); + $this->assertContains('Test Linode', $this->client->getResponse()->getContent()); + } + + public function testCloneAction() + { + $crawler = $this->client->request('GET', '/clone'); + + $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); + } + + public function testCreateAction() + { + $crawler = $this->client->request('GET', '/create'); + + $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); + } +} diff --git a/tests/AppBundle/Factory/LinodeApiFactoryTest.php b/tests/AppBundle/Factory/LinodeApiFactoryTest.php new file mode 100644 index 0000000..fb7e8d8 --- /dev/null +++ b/tests/AppBundle/Factory/LinodeApiFactoryTest.php @@ -0,0 +1,18 @@ + + */ +class LinodeApiFactoryTest extends \PHPUnit_Framework_TestCase +{ + public function testGet() + { + $factory = new LinodeApiFactory('key'); + $this->assertInstanceOf(AvailApi::class, $factory->get('AvailApi')); + } +} diff --git a/tests/AppBundle/Form/CreateLinodeTypeTest.php b/tests/AppBundle/Form/CreateLinodeTypeTest.php new file mode 100644 index 0000000..f209390 --- /dev/null +++ b/tests/AppBundle/Form/CreateLinodeTypeTest.php @@ -0,0 +1,74 @@ + + */ +class CreateLinodeTypeTest extends TypeTestCase +{ + public function setUp() + { + $this->availApi = $this->createMock(LinodeAvailService::class); + parent::setUp(); + } + + public function getExtensions() + { + $type = new CreateLinodeType($this->availApi); + + return array( + new PreloadedExtension(array($type), array()), + ); + } + + public function testLinodeType() + { + $this->availApi + ->method('getDataCenters') + ->willReturn([ + (new DataCenter)->setLocation('Test Location') + ]); + + $this->availApi + ->method('getPlans') + ->willReturn([ + (new LinodePlan)->setLabel('Test Plan') + ]); + + $data = [ + 'dataCenter' => 0, + 'plan' => 0, + 'paymentTerm' => 1 + ]; + + $model = [ + 'dataCenter' => (new DataCenter())->setLocation('Test Location'), + 'plan' => (new LinodePlan())->setLabel('Test Plan'), + 'paymentTerm' => PaymentTermEnum::MONTHLY() + ]; + + $form = $this->factory->create(CreateLinodeType::class); + $form->submit($data); + + $this->assertTrue($form->isSynchronized()); + $this->assertEquals($model, $form->getData()); + + $view = $form->createView(); + $children = $view->children; + + foreach (array_keys($data) as $key) { + $this->assertArrayHasKey($key, $children); + } + } +} diff --git a/tests/AppBundle/Form/LinodeTypeTest.php b/tests/AppBundle/Form/LinodeTypeTest.php new file mode 100644 index 0000000..fa7b6dd --- /dev/null +++ b/tests/AppBundle/Form/LinodeTypeTest.php @@ -0,0 +1,40 @@ + + */ +class LinodeTypeTest extends TypeTestCase +{ + public function testLinodeType() + { + $form = $this->factory->create(LinodeType::class); + + $data = [ + 'label' => 'Test Linode', + 'backupsEnabled' => true, + ]; + + $object = (new Linode()) + ->setLabel('Test Linode') + ->setBackupsEnabled(true); + + $form->submit($data); + + $this->assertTrue($form->isSynchronized()); + $this->assertEquals($object, $form->getData()); + + $view = $form->createView(); + $children = $view->children; + + foreach (array_keys($data) as $key) { + $this->assertArrayHasKey($key, $children); + } + } +} diff --git a/tests/AppBundle/Form/MigrateTypeTest.php b/tests/AppBundle/Form/MigrateTypeTest.php new file mode 100644 index 0000000..5a29c54 --- /dev/null +++ b/tests/AppBundle/Form/MigrateTypeTest.php @@ -0,0 +1,54 @@ + + */ +class MigrateTypeTest extends TypeTestCase +{ + public function testMigrateType() + { + $form = $this->factory->create(MigrateType::class); + + $data = [ + 'domain' => 'testdomain.com', + 'hostname' => 'test', + 'ipv4' => '127.0.0.1', + 'ipv6' => '::1', + 'longviewUrl' => 'longviewUrl', + 'longviewKey' => 'longviewKey', + 'mandrillKey' => 'mandrillKey', + 'mandrillSub' => 'mandrillSub', + 'submit' => 'submit', + ]; + + $object = (new MigrateConfig()) + ->setDomain('testdomain.com') + ->setHostname('test') + ->setIpv4('127.0.0.1') + ->setIpv6('::1') + ->setLongviewUrl('longviewUrl') + ->setLongviewKey('longviewKey') + ->setMandrillKey('mandrillKey') + ->setMandrillSub('mandrillSub'); + + + $form->submit($data); + + $this->assertTrue($form->isSynchronized()); + $this->assertEquals($object, $form->getData()); + + $view = $form->createView(); + $children = $view->children; + + foreach (array_keys($data) as $key) { + $this->assertArrayHasKey($key, $children); + } + } +} diff --git a/tests/AppBundle/Service/LinodeAvailServiceTest.php b/tests/AppBundle/Service/LinodeAvailServiceTest.php new file mode 100644 index 0000000..46341dc --- /dev/null +++ b/tests/AppBundle/Service/LinodeAvailServiceTest.php @@ -0,0 +1,62 @@ + + */ +class LinodeAvailServiceTest extends \PHPUnit_Framework_TestCase +{ + public function setUp() + { + $this->api = $this->createMock(AvailApi::class); + + $this->api + ->method('dataCenters') + ->willReturn([ + [ + 'DATACENTERID' => 1, + 'LOCATION' => 'Dallas, TX', + 'ABBR' => 'DTX' + ], + ]); + + $this->api + ->method('linodePlans') + ->willReturn([ + [ + 'PLANID' => 1, + 'PRICE' => 200.00, + 'RAM' => 4096, + 'XFER' => 100, + 'LABEL' => 'High Speed', + 'AVAIL' => '1', + 'DISK' => '100', + 'HOURLY' => '.06' + ], + ]); + } + + public function testGetDataCenters() + { + $subject = new LinodeAvailService($this->api); + $dataCenters = $subject->getDataCenters(); + + $this->assertInstanceOf(ArrayCollection::class, $dataCenters); + $this->assertNotEmpty($dataCenters); + } + + public function testGetPlans() + { + $subject = new LinodeAvailService($this->api); + $plans = $subject->getPlans(); + + $this->assertInstanceOf(ArrayCollection::class, $plans); + $this->assertNotEmpty($plans); + } +} diff --git a/tests/AppBundle/Service/LinodeHostServiceTest.php b/tests/AppBundle/Service/LinodeHostServiceTest.php new file mode 100644 index 0000000..e52980d --- /dev/null +++ b/tests/AppBundle/Service/LinodeHostServiceTest.php @@ -0,0 +1,24 @@ + + */ +class LinodeHostServiceTest extends \PHPUnit_Framework_TestCase +{ + public function testLinodes() + { + $api = $this->createMock(LinodeApi::class); + $api->method('getList') + ->willReturn([]); + + $subject = new LinodeHostService($api); + $this->assertInstanceOf(ArrayCollection::class, $subject->getLinodes()); + } +} diff --git a/tests/Model/DataCenterTest.php b/tests/Model/DataCenterTest.php new file mode 100644 index 0000000..0224418 --- /dev/null +++ b/tests/Model/DataCenterTest.php @@ -0,0 +1,25 @@ + + */ +class DataCenterTest extends \PHPUnit_Framework_TestCase +{ + public function testCreateFromArray() + { + $dataCenter = DataCenter::createFromArray([ + 'DATACENTERID' => 1, + 'LOCATION' => 'Dallas, TX', + 'ABBR' => 'DFW', + ]); + + $this->assertSame($dataCenter->getId(), 1); + $this->assertSame($dataCenter->getLocation(), 'Dallas, TX'); + $this->assertSame($dataCenter->getAbbreviation(), 'DFW'); + } +} diff --git a/tests/Model/IpAddressTest.php b/tests/Model/IpAddressTest.php new file mode 100644 index 0000000..91f766e --- /dev/null +++ b/tests/Model/IpAddressTest.php @@ -0,0 +1,27 @@ + + */ +class IpAddressTest extends \PHPUnit_Framework_TestCase +{ + public function testCreateFromArray() + { + $ipAddress = IpAddress::createFromArray([ + 'LINODEID' => 1, + 'ISPUBLIC' => 'false', + 'IPADDRESS' => '10.0.0.1', + 'IPADDRESSID' => '1337', + ]); + + $this->assertSame($ipAddress->getLinodeId(), 1); + $this->assertSame($ipAddress->getIsPublic(), 'false'); + $this->assertSame($ipAddress->getIpAddress(), '10.0.0.1'); + $this->assertSame($ipAddress->getIpAddressId(), '1337'); + } +} diff --git a/tests/Model/LinodePlanTest.php b/tests/Model/LinodePlanTest.php new file mode 100644 index 0000000..e69de29 diff --git a/tests/Model/LinodeTest.php b/tests/Model/LinodeTest.php new file mode 100644 index 0000000..80f4cd9 --- /dev/null +++ b/tests/Model/LinodeTest.php @@ -0,0 +1,78 @@ + + */ +class LinodeTest extends \PHPUnit_Framework_TestCase +{ + public function setUp() + { + $this->array = [ + 'TOTALXFER' => 1000, + 'ALERT_BWQUOTA_ENABLED' => 1, + 'ALERT_DISKIO_ENABLED' => 1, + 'DISTRIBUTIONVENDOR' => 'Ubuntu', + 'ALERT_BWOUT_ENABLED' => 1, + 'ALERT_CPU_THRESHOLD' => 90, + 'LINODEID' => 411628, + 'ALERT_BWOUT_THRESHOLD' => 5, + 'BACKUPWINDOW' => 8, + 'DATACENTERID' => 2, + 'ALERT_BWIN_ENABLED' => 1, + 'STATUS' => 1, + 'PLANID' => 1, + 'LABEL' => 'BoichFamilyCellar', + 'ALERT_BWIN_THRESHOLD' => 5, + 'ALERT_CPU_ENABLED' => 1, + 'BACKUPSENABLED' => 1, + 'TOTALRAM' => 1024, + 'WATCHDOG' => 1, + 'CREATE_DT' => '2013-10-19 16:12:28.0', + 'ISKVM' => 1, + 'ALERT_BWQUOTA_THRESHOLD' => 80, + 'BACKUPWEEKLYDAY' => 0, + 'TOTALHD' => 20480, + 'LPM_DISPLAYGROUP' => 'clients', + 'ALERT_DISKIO_THRESHOLD' => 1000, + 'ISXEN' => 0, + ]; + } + + public function testCreateFromArray() + { + $linode = Linode::createFromArray($this->array); + + $this->assertSame($linode->getId(), $this->array['LINODEID']); + $this->assertSame($linode->getAlertCpuEnabled(), $this->array['ALERT_CPU_ENABLED']); + $this->assertSame($linode->getIsKvm(), $this->array['ISKVM']); + $this->assertSame($linode->getAlertBwinEnabled(), $this->array['ALERT_BWIN_ENABLED']); + $this->assertSame($linode->getAlertBwQuotaEnabled(), $this->array['ALERT_BWQUOTA_ENABLED']); + $this->assertSame($linode->getAlertDiskIoThreshold(), $this->array['ALERT_DISKIO_THRESHOLD']); + $this->assertSame($linode->getBackupWindow(), $this->array['BACKUPWINDOW']); + $this->assertSame($linode->getIsWatchdog(), $this->array['WATCHDOG']); + $this->assertSame($linode->getDistributionVendor(), $this->array['DISTRIBUTIONVENDOR']); + $this->assertSame($linode->getDataCenterId(), $this->array['DATACENTERID']); + $this->assertSame($linode->getStatus(), $this->array['STATUS']); + $this->assertSame($linode->getAlertDiskIoEnabled(), $this->array['ALERT_DISKIO_ENABLED']); + $this->assertSame($linode->getCreateDate(), $this->array['CREATE_DT']); + $this->assertSame($linode->getAlertBwQuotaThreshold(), $this->array['TOTALHD']); + $this->assertSame($linode->getTotalRam(), $this->array['ALERT_BWQUOTA_THRESHOLD']); + $this->assertSame($linode->getTotalHd(), $this->array['TOTALRAM']); + $this->assertSame($linode->getIsXen(), $this->array['ISXEN']); + $this->assertSame($linode->getAlertBwinThreshold(), $this->array['ALERT_BWIN_THRESHOLD']); + $this->assertSame($linode->getAlertBwoutThreshold(), $this->array['ALERT_BWOUT_THRESHOLD']); + $this->assertSame($linode->getAlertBwoutEnabled(), $this->array['ALERT_BWOUT_ENABLED']); + $this->assertSame($linode->getBackupsEnabled(), $this->array['BACKUPSENABLED']); + $this->assertSame($linode->getAlertCpuThreshold(), $this->array['ALERT_CPU_THRESHOLD']); + $this->assertSame($linode->getPlanId(), $this->array['PLANID']); + $this->assertSame($linode->getBackupWeeklyDay(), $this->array['BACKUPWEEKLYDAY']); + $this->assertSame($linode->getLabel(), $this->array['LABEL']); + $this->assertSame($linode->getLpmDisplayGroup(), $this->array['LPM_DISPLAYGROUP']); + $this->assertSame($linode->getTotalXfer(), $this->array['TOTALXFER']); + } +} diff --git a/tests/ParamConverter/LinodeConverterTest.php b/tests/ParamConverter/LinodeConverterTest.php new file mode 100644 index 0000000..5a644bf --- /dev/null +++ b/tests/ParamConverter/LinodeConverterTest.php @@ -0,0 +1,17 @@ + + */ +class LinodeConverterTest extends \PHPUnit_Framework_TestCase +{ + public function testApply() + { + $request = $this->createMock(Request::class); + } +} diff --git a/var/SymfonyRequirements.php b/var/SymfonyRequirements.php new file mode 100644 index 0000000..3b14a40 --- /dev/null +++ b/var/SymfonyRequirements.php @@ -0,0 +1,817 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Users of PHP 5.2 should be able to run the requirements checks. + * This is why the file and all classes must be compatible with PHP 5.2+ + * (e.g. not using namespaces and closures). + * + * ************** CAUTION ************** + * + * DO NOT EDIT THIS FILE as it will be overridden by Composer as part of + * the installation/update process. The original file resides in the + * SensioDistributionBundle. + * + * ************** CAUTION ************** + */ + +/** + * Represents a single PHP requirement, e.g. an installed extension. + * It can be a mandatory requirement or an optional recommendation. + * There is a special subclass, named PhpIniRequirement, to check a php.ini configuration. + * + * @author Tobias Schultze + */ +class Requirement +{ + private $fulfilled; + private $testMessage; + private $helpText; + private $helpHtml; + private $optional; + + /** + * Constructor that initializes the requirement. + * + * @param bool $fulfilled Whether the requirement is fulfilled + * @param string $testMessage The message for testing the requirement + * @param string $helpHtml The help text formatted in HTML for resolving the problem + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement + */ + public function __construct($fulfilled, $testMessage, $helpHtml, $helpText = null, $optional = false) + { + $this->fulfilled = (bool) $fulfilled; + $this->testMessage = (string) $testMessage; + $this->helpHtml = (string) $helpHtml; + $this->helpText = null === $helpText ? strip_tags($this->helpHtml) : (string) $helpText; + $this->optional = (bool) $optional; + } + + /** + * Returns whether the requirement is fulfilled. + * + * @return bool true if fulfilled, otherwise false + */ + public function isFulfilled() + { + return $this->fulfilled; + } + + /** + * Returns the message for testing the requirement. + * + * @return string The test message + */ + public function getTestMessage() + { + return $this->testMessage; + } + + /** + * Returns the help text for resolving the problem. + * + * @return string The help text + */ + public function getHelpText() + { + return $this->helpText; + } + + /** + * Returns the help text formatted in HTML. + * + * @return string The HTML help + */ + public function getHelpHtml() + { + return $this->helpHtml; + } + + /** + * Returns whether this is only an optional recommendation and not a mandatory requirement. + * + * @return bool true if optional, false if mandatory + */ + public function isOptional() + { + return $this->optional; + } +} + +/** + * Represents a PHP requirement in form of a php.ini configuration. + * + * @author Tobias Schultze + */ +class PhpIniRequirement extends Requirement +{ + /** + * Constructor that initializes the requirement. + * + * @param string $cfgName The configuration name used for ini_get() + * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, + * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. + * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string|null $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) + * @param string|null $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement + */ + public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null, $optional = false) + { + $cfgValue = ini_get($cfgName); + + if (is_callable($evaluation)) { + if (null === $testMessage || null === $helpHtml) { + throw new InvalidArgumentException('You must provide the parameters testMessage and helpHtml for a callback evaluation.'); + } + + $fulfilled = call_user_func($evaluation, $cfgValue); + } else { + if (null === $testMessage) { + $testMessage = sprintf('%s %s be %s in php.ini', + $cfgName, + $optional ? 'should' : 'must', + $evaluation ? 'enabled' : 'disabled' + ); + } + + if (null === $helpHtml) { + $helpHtml = sprintf('Set %s to %s in php.ini*.', + $cfgName, + $evaluation ? 'on' : 'off' + ); + } + + $fulfilled = $evaluation == $cfgValue; + } + + parent::__construct($fulfilled || ($approveCfgAbsence && false === $cfgValue), $testMessage, $helpHtml, $helpText, $optional); + } +} + +/** + * A RequirementCollection represents a set of Requirement instances. + * + * @author Tobias Schultze + */ +class RequirementCollection implements IteratorAggregate +{ + /** + * @var Requirement[] + */ + private $requirements = array(); + + /** + * Gets the current RequirementCollection as an Iterator. + * + * @return Traversable A Traversable interface + */ + public function getIterator() + { + return new ArrayIterator($this->requirements); + } + + /** + * Adds a Requirement. + * + * @param Requirement $requirement A Requirement instance + */ + public function add(Requirement $requirement) + { + $this->requirements[] = $requirement; + } + + /** + * Adds a mandatory requirement. + * + * @param bool $fulfilled Whether the requirement is fulfilled + * @param string $testMessage The message for testing the requirement + * @param string $helpHtml The help text formatted in HTML for resolving the problem + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addRequirement($fulfilled, $testMessage, $helpHtml, $helpText = null) + { + $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, false)); + } + + /** + * Adds an optional recommendation. + * + * @param bool $fulfilled Whether the recommendation is fulfilled + * @param string $testMessage The message for testing the recommendation + * @param string $helpHtml The help text formatted in HTML for resolving the problem + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addRecommendation($fulfilled, $testMessage, $helpHtml, $helpText = null) + { + $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, true)); + } + + /** + * Adds a mandatory requirement in form of a php.ini configuration. + * + * @param string $cfgName The configuration name used for ini_get() + * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, + * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. + * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) + * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addPhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) + { + $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, false)); + } + + /** + * Adds an optional recommendation in form of a php.ini configuration. + * + * @param string $cfgName The configuration name used for ini_get() + * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, + * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. + * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) + * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addPhpIniRecommendation($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) + { + $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, true)); + } + + /** + * Adds a requirement collection to the current set of requirements. + * + * @param RequirementCollection $collection A RequirementCollection instance + */ + public function addCollection(RequirementCollection $collection) + { + $this->requirements = array_merge($this->requirements, $collection->all()); + } + + /** + * Returns both requirements and recommendations. + * + * @return Requirement[] + */ + public function all() + { + return $this->requirements; + } + + /** + * Returns all mandatory requirements. + * + * @return Requirement[] + */ + public function getRequirements() + { + $array = array(); + foreach ($this->requirements as $req) { + if (!$req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns the mandatory requirements that were not met. + * + * @return Requirement[] + */ + public function getFailedRequirements() + { + $array = array(); + foreach ($this->requirements as $req) { + if (!$req->isFulfilled() && !$req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns all optional recommendations. + * + * @return Requirement[] + */ + public function getRecommendations() + { + $array = array(); + foreach ($this->requirements as $req) { + if ($req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns the recommendations that were not met. + * + * @return Requirement[] + */ + public function getFailedRecommendations() + { + $array = array(); + foreach ($this->requirements as $req) { + if (!$req->isFulfilled() && $req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns whether a php.ini configuration is not correct. + * + * @return bool php.ini configuration problem? + */ + public function hasPhpIniConfigIssue() + { + foreach ($this->requirements as $req) { + if (!$req->isFulfilled() && $req instanceof PhpIniRequirement) { + return true; + } + } + + return false; + } + + /** + * Returns the PHP configuration file (php.ini) path. + * + * @return string|false php.ini file path + */ + public function getPhpIniConfigPath() + { + return get_cfg_var('cfg_file_path'); + } +} + +/** + * This class specifies all requirements and optional recommendations that + * are necessary to run the Symfony Standard Edition. + * + * @author Tobias Schultze + * @author Fabien Potencier + */ +class SymfonyRequirements extends RequirementCollection +{ + const LEGACY_REQUIRED_PHP_VERSION = '5.3.3'; + const REQUIRED_PHP_VERSION = '5.5.9'; + + /** + * Constructor that initializes the requirements. + */ + public function __construct() + { + /* mandatory requirements follow */ + + $installedPhpVersion = phpversion(); + $requiredPhpVersion = $this->getPhpRequiredVersion(); + + $this->addRecommendation( + $requiredPhpVersion, + 'Vendors should be installed in order to check all requirements.', + 'Run the composer install command.', + 'Run the "composer install" command.' + ); + + if (false !== $requiredPhpVersion) { + $this->addRequirement( + version_compare($installedPhpVersion, $requiredPhpVersion, '>='), + sprintf('PHP version must be at least %s (%s installed)', $requiredPhpVersion, $installedPhpVersion), + sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run. + Before using Symfony, upgrade your PHP installation, preferably to the latest version.', + $installedPhpVersion, $requiredPhpVersion), + sprintf('Install PHP %s or newer (installed version is %s)', $requiredPhpVersion, $installedPhpVersion) + ); + } + + $this->addRequirement( + version_compare($installedPhpVersion, '5.3.16', '!='), + 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it', + 'Install PHP 5.3.17 or newer (or downgrade to an earlier PHP version)' + ); + + $this->addRequirement( + is_dir(__DIR__.'/../vendor/composer'), + 'Vendor libraries must be installed', + 'Vendor libraries are missing. Install composer following instructions from http://getcomposer.org/. '. + 'Then run "php composer.phar install" to install them.' + ); + + $cacheDir = is_dir(__DIR__.'/../var/cache') ? __DIR__.'/../var/cache' : __DIR__.'/cache'; + + $this->addRequirement( + is_writable($cacheDir), + 'app/cache/ or var/cache/ directory must be writable', + 'Change the permissions of either "app/cache/" or "var/cache/" directory so that the web server can write into it.' + ); + + $logsDir = is_dir(__DIR__.'/../var/logs') ? __DIR__.'/../var/logs' : __DIR__.'/logs'; + + $this->addRequirement( + is_writable($logsDir), + 'app/logs/ or var/logs/ directory must be writable', + 'Change the permissions of either "app/logs/" or "var/logs/" directory so that the web server can write into it.' + ); + + if (version_compare($installedPhpVersion, '7.0.0', '<')) { + $this->addPhpIniRequirement( + 'date.timezone', true, false, + 'date.timezone setting must be set', + 'Set the "date.timezone" setting in php.ini* (like Europe/Paris).' + ); + } + + if (false !== $requiredPhpVersion && version_compare($installedPhpVersion, $requiredPhpVersion, '>=')) { + $timezones = array(); + foreach (DateTimeZone::listAbbreviations() as $abbreviations) { + foreach ($abbreviations as $abbreviation) { + $timezones[$abbreviation['timezone_id']] = true; + } + } + + $this->addRequirement( + isset($timezones[@date_default_timezone_get()]), + sprintf('Configured default timezone "%s" must be supported by your installation of PHP', @date_default_timezone_get()), + 'Your default timezone is not supported by PHP. Check for typos in your php.ini file and have a look at the list of deprecated timezones at http://php.net/manual/en/timezones.others.php.' + ); + } + + $this->addRequirement( + function_exists('iconv'), + 'iconv() must be available', + 'Install and enable the iconv extension.' + ); + + $this->addRequirement( + function_exists('json_encode'), + 'json_encode() must be available', + 'Install and enable the JSON extension.' + ); + + $this->addRequirement( + function_exists('session_start'), + 'session_start() must be available', + 'Install and enable the session extension.' + ); + + $this->addRequirement( + function_exists('ctype_alpha'), + 'ctype_alpha() must be available', + 'Install and enable the ctype extension.' + ); + + $this->addRequirement( + function_exists('token_get_all'), + 'token_get_all() must be available', + 'Install and enable the Tokenizer extension.' + ); + + $this->addRequirement( + function_exists('simplexml_import_dom'), + 'simplexml_import_dom() must be available', + 'Install and enable the SimpleXML extension.' + ); + + if (function_exists('apc_store') && ini_get('apc.enabled')) { + if (version_compare($installedPhpVersion, '5.4.0', '>=')) { + $this->addRequirement( + version_compare(phpversion('apc'), '3.1.13', '>='), + 'APC version must be at least 3.1.13 when using PHP 5.4', + 'Upgrade your APC extension (3.1.13+).' + ); + } else { + $this->addRequirement( + version_compare(phpversion('apc'), '3.0.17', '>='), + 'APC version must be at least 3.0.17', + 'Upgrade your APC extension (3.0.17+).' + ); + } + } + + $this->addPhpIniRequirement('detect_unicode', false); + + if (extension_loaded('suhosin')) { + $this->addPhpIniRequirement( + 'suhosin.executor.include.whitelist', + create_function('$cfgValue', 'return false !== stripos($cfgValue, "phar");'), + false, + 'suhosin.executor.include.whitelist must be configured correctly in php.ini', + 'Add "phar" to suhosin.executor.include.whitelist in php.ini*.' + ); + } + + if (extension_loaded('xdebug')) { + $this->addPhpIniRequirement( + 'xdebug.show_exception_trace', false, true + ); + + $this->addPhpIniRequirement( + 'xdebug.scream', false, true + ); + + $this->addPhpIniRecommendation( + 'xdebug.max_nesting_level', + create_function('$cfgValue', 'return $cfgValue > 100;'), + true, + 'xdebug.max_nesting_level should be above 100 in php.ini', + 'Set "xdebug.max_nesting_level" to e.g. "250" in php.ini* to stop Xdebug\'s infinite recursion protection erroneously throwing a fatal error in your project.' + ); + } + + $pcreVersion = defined('PCRE_VERSION') ? (float) PCRE_VERSION : null; + + $this->addRequirement( + null !== $pcreVersion, + 'PCRE extension must be available', + 'Install the PCRE extension (version 8.0+).' + ); + + if (extension_loaded('mbstring')) { + $this->addPhpIniRequirement( + 'mbstring.func_overload', + create_function('$cfgValue', 'return (int) $cfgValue === 0;'), + true, + 'string functions should not be overloaded', + 'Set "mbstring.func_overload" to 0 in php.ini* to disable function overloading by the mbstring extension.' + ); + } + + /* optional recommendations follow */ + + if (file_exists(__DIR__.'/../vendor/composer')) { + require_once __DIR__.'/../vendor/autoload.php'; + + try { + $r = new ReflectionClass('Sensio\Bundle\DistributionBundle\SensioDistributionBundle'); + + $contents = file_get_contents(dirname($r->getFileName()).'/Resources/skeleton/app/SymfonyRequirements.php'); + } catch (ReflectionException $e) { + $contents = ''; + } + $this->addRecommendation( + file_get_contents(__FILE__) === $contents, + 'Requirements file should be up-to-date', + 'Your requirements file is outdated. Run composer install and re-check your configuration.' + ); + } + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.3.4', '>='), + 'You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions', + 'Your project might malfunction randomly due to PHP bug #52083 ("Notice: Trying to get property of non-object"). Install PHP 5.3.4 or newer.' + ); + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.3.8', '>='), + 'When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156', + 'Install PHP 5.3.8 or newer if your project uses annotations.' + ); + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.4.0', '!='), + 'You should not use PHP 5.4.0 due to the PHP bug #61453', + 'Your project might not work properly due to the PHP bug #61453 ("Cannot dump definitions which have method calls"). Install PHP 5.4.1 or newer.' + ); + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.4.11', '>='), + 'When using the logout handler from the Symfony Security Component, you should have at least PHP 5.4.11 due to PHP bug #63379 (as a workaround, you can also set invalidate_session to false in the security logout handler configuration)', + 'Install PHP 5.4.11 or newer if your project uses the logout handler from the Symfony Security Component.' + ); + + $this->addRecommendation( + (version_compare($installedPhpVersion, '5.3.18', '>=') && version_compare($installedPhpVersion, '5.4.0', '<')) + || + version_compare($installedPhpVersion, '5.4.8', '>='), + 'You should use PHP 5.3.18+ or PHP 5.4.8+ to always get nice error messages for fatal errors in the development environment due to PHP bug #61767/#60909', + 'Install PHP 5.3.18+ or PHP 5.4.8+ if you want nice error messages for all fatal errors in the development environment.' + ); + + if (null !== $pcreVersion) { + $this->addRecommendation( + $pcreVersion >= 8.0, + sprintf('PCRE extension should be at least version 8.0 (%s installed)', $pcreVersion), + 'PCRE 8.0+ is preconfigured in PHP since 5.3.2 but you are using an outdated version of it. Symfony probably works anyway but it is recommended to upgrade your PCRE extension.' + ); + } + + $this->addRecommendation( + class_exists('DomDocument'), + 'PHP-DOM and PHP-XML modules should be installed', + 'Install and enable the PHP-DOM and the PHP-XML modules.' + ); + + $this->addRecommendation( + function_exists('mb_strlen'), + 'mb_strlen() should be available', + 'Install and enable the mbstring extension.' + ); + + $this->addRecommendation( + function_exists('utf8_decode'), + 'utf8_decode() should be available', + 'Install and enable the XML extension.' + ); + + $this->addRecommendation( + function_exists('filter_var'), + 'filter_var() should be available', + 'Install and enable the filter extension.' + ); + + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { + $this->addRecommendation( + function_exists('posix_isatty'), + 'posix_isatty() should be available', + 'Install and enable the php_posix extension (used to colorize the CLI output).' + ); + } + + $this->addRecommendation( + extension_loaded('intl'), + 'intl extension should be available', + 'Install and enable the intl extension (used for validators).' + ); + + if (extension_loaded('intl')) { + // in some WAMP server installations, new Collator() returns null + $this->addRecommendation( + null !== new Collator('fr_FR'), + 'intl extension should be correctly configured', + 'The intl extension does not behave properly. This problem is typical on PHP 5.3.X x64 WIN builds.' + ); + + // check for compatible ICU versions (only done when you have the intl extension) + if (defined('INTL_ICU_VERSION')) { + $version = INTL_ICU_VERSION; + } else { + $reflector = new ReflectionExtension('intl'); + + ob_start(); + $reflector->info(); + $output = strip_tags(ob_get_clean()); + + preg_match('/^ICU version +(?:=> )?(.*)$/m', $output, $matches); + $version = $matches[1]; + } + + $this->addRecommendation( + version_compare($version, '4.0', '>='), + 'intl ICU version should be at least 4+', + 'Upgrade your intl extension with a newer ICU version (4+).' + ); + + if (class_exists('Symfony\Component\Intl\Intl')) { + $this->addRecommendation( + \Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion(), + sprintf('intl ICU version installed on your system is outdated (%s) and does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), + 'To get the latest internationalization data upgrade the ICU system package and the intl PHP extension.' + ); + if (\Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion()) { + $this->addRecommendation( + \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(), + sprintf('intl ICU version installed on your system (%s) does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), + 'To avoid internationalization data inconsistencies upgrade the symfony/intl component.' + ); + } + } + + $this->addPhpIniRecommendation( + 'intl.error_level', + create_function('$cfgValue', 'return (int) $cfgValue === 0;'), + true, + 'intl.error_level should be 0 in php.ini', + 'Set "intl.error_level" to "0" in php.ini* to inhibit the messages when an error occurs in ICU functions.' + ); + } + + $accelerator = + (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) + || + (extension_loaded('apc') && ini_get('apc.enabled')) + || + (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.enable')) + || + (extension_loaded('Zend OPcache') && ini_get('opcache.enable')) + || + (extension_loaded('xcache') && ini_get('xcache.cacher')) + || + (extension_loaded('wincache') && ini_get('wincache.ocenabled')) + ; + + $this->addRecommendation( + $accelerator, + 'a PHP accelerator should be installed', + 'Install and/or enable a PHP accelerator (highly recommended).' + ); + + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $this->addRecommendation( + $this->getRealpathCacheSize() >= 5 * 1024 * 1024, + 'realpath_cache_size should be at least 5M in php.ini', + 'Setting "realpath_cache_size" to e.g. "5242880" or "5M" in php.ini* may improve performance on Windows significantly in some cases.' + ); + } + + $this->addPhpIniRecommendation('short_open_tag', false); + + $this->addPhpIniRecommendation('magic_quotes_gpc', false, true); + + $this->addPhpIniRecommendation('register_globals', false, true); + + $this->addPhpIniRecommendation('session.auto_start', false); + + $this->addRecommendation( + class_exists('PDO'), + 'PDO should be installed', + 'Install PDO (mandatory for Doctrine).' + ); + + if (class_exists('PDO')) { + $drivers = PDO::getAvailableDrivers(); + $this->addRecommendation( + count($drivers) > 0, + sprintf('PDO should have some drivers installed (currently available: %s)', count($drivers) ? implode(', ', $drivers) : 'none'), + 'Install PDO drivers (mandatory for Doctrine).' + ); + } + } + + /** + * Loads realpath_cache_size from php.ini and converts it to int. + * + * (e.g. 16k is converted to 16384 int) + * + * @return int + */ + protected function getRealpathCacheSize() + { + $size = ini_get('realpath_cache_size'); + $size = trim($size); + $unit = ''; + if (!ctype_digit($size)) { + $unit = strtolower(substr($size, -1, 1)); + $size = (int) substr($size, 0, -1); + } + switch ($unit) { + case 'g': + return $size * 1024 * 1024 * 1024; + case 'm': + return $size * 1024 * 1024; + case 'k': + return $size * 1024; + default: + return (int) $size; + } + } + + /** + * Defines PHP required version from Symfony version. + * + * @return string|false The PHP required version or false if it could not be guessed + */ + protected function getPhpRequiredVersion() + { + if (!file_exists($path = __DIR__.'/../composer.lock')) { + return false; + } + + $composerLock = json_decode(file_get_contents($path), true); + foreach ($composerLock['packages'] as $package) { + $name = $package['name']; + if ('symfony/symfony' !== $name && 'symfony/http-kernel' !== $name) { + continue; + } + + return (int) $package['version'][1] > 2 ? self::REQUIRED_PHP_VERSION : self::LEGACY_REQUIRED_PHP_VERSION; + } + + return false; + } +} diff --git a/web/app_dev.php b/web/app_dev.php index bd62e81..1a8c0f1 100644 --- a/web/app_dev.php +++ b/web/app_dev.php @@ -10,12 +10,14 @@ // This check prevents access to debug front controllers that are deployed by accident to production servers. // Feel free to remove this, extend it, or make something more sophisticated. -if (isset($_SERVER['HTTP_CLIENT_IP']) - || isset($_SERVER['HTTP_X_FORWARDED_FOR']) - || !(in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1']) || php_sapi_name() === 'cli-server') -) { - header('HTTP/1.0 403 Forbidden'); - exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.'); +if ($_SERVER['SERVER_NAME'] !== 'linode.localhost') { + if (isset($_SERVER['HTTP_CLIENT_IP']) + || isset($_SERVER['HTTP_X_FORWARDED_FOR']) + || !(in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1']) || php_sapi_name() === 'cli-server') + ) { + header('HTTP/1.0 403 Forbidden'); + exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.'); + } } /**