diff --git a/.gitignore b/.gitignore index ae4975b08..738240c3f 100755 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,5 @@ coverage .project .settings/ local/cache/* -composer.lock web/assets/* web/.htaccess diff --git a/.travis.yml b/.travis.yml new file mode 100755 index 000000000..8e2c7321a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: php + +php: + - "5.4" + - "5.5" + +env: + - DB_USER=root + +before_script: + - composer install --prefer-dist --dev + - sh -c "mysql -u$DB_USER -e 'SET FOREIGN_KEY_CHECKS = 0; DROP DATABASE IF EXISTS thelia;SET FOREIGN_KEY_CHECKS = 1;'; fi" + - php Thelia thelia:install --db_host=localhost --db_username=$DB_USER --db_name=thelia diff --git a/composer.json b/composer.json index 301496fa9..31739057b 100755 --- a/composer.json +++ b/composer.json @@ -36,6 +36,7 @@ "simplepie/simplepie": "dev-master" }, "require-dev" : { + "phpunit/phpunit": "3.7.*", "fzaninotto/faker": "dev-master" }, "minimum-stability": "stable", diff --git a/composer.lock b/composer.lock new file mode 100755 index 000000000..22158aa3c --- /dev/null +++ b/composer.lock @@ -0,0 +1,1995 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "449a98ad751df49842394b9e47f3f447", + "packages": [ + { + "name": "ezyang/htmlpurifier", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "v4.5.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/v4.5.0", + "reference": "v4.5.0", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "time": "2013-02-18 00:04:08" + }, + { + "name": "ircmaxell/password-compat", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ircmaxell/password_compat.git", + "reference": "5d44eec3b571b4a6daae45794b0a31fbbf63c74c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5d44eec3b571b4a6daae45794b0a31fbbf63c74c", + "reference": "5d44eec3b571b4a6daae45794b0a31fbbf63c74c", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "lib/password.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthony Ferrara", + "email": "ircmaxell@php.net", + "homepage": "http://blog.ircmaxell.com" + } + ], + "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", + "homepage": "https://github.com/ircmaxell/password_compat", + "keywords": [ + "hashing", + "password" + ], + "time": "2013-06-24 12:01:11" + }, + { + "name": "kriswallsmith/assetic", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/kriswallsmith/assetic.git", + "reference": "82e8fc20a3b043b378a7efbda9e3d406d420f00e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/82e8fc20a3b043b378a7efbda9e3d406d420f00e", + "reference": "82e8fc20a3b043b378a7efbda9e3d406d420f00e", + "shasum": "" + }, + "require": { + "php": ">=5.3.1", + "symfony/process": "~2.1" + }, + "require-dev": { + "cssmin/cssmin": "*", + "joliclic/javascript-packer": "*", + "kamicane/packager": "*", + "leafo/lessphp": "*", + "leafo/scssphp": "*", + "leafo/scssphp-compass": "*", + "mrclay/minify": "*", + "phpunit/phpunit": ">=3.7,<4.0", + "ptachoire/cssembed": "*", + "twig/twig": ">=1.6,<2.0" + }, + "suggest": { + "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", + "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler", + "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin", + "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris", + "twig/twig": "Assetic provides the integration with the Twig templating engine" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-0": { + "Assetic": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kris Wallsmith", + "email": "kris.wallsmith@gmail.com", + "homepage": "http://kriswallsmith.net/" + } + ], + "description": "Asset Management for PHP", + "homepage": "https://github.com/kriswallsmith/assetic", + "keywords": [ + "assets", + "compression", + "minification" + ], + "time": "2013-06-13 16:47:03" + }, + { + "name": "leafo/lessphp", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/leafo/lessphp.git", + "reference": "ff86f2941c3f3d67d56acad2f8902ca57c73b359" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/leafo/lessphp/zipball/ff86f2941c3f3d67d56acad2f8902ca57c73b359", + "reference": "ff86f2941c3f3d67d56acad2f8902ca57c73b359", + "shasum": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.3-dev" + } + }, + "autoload": { + "classmap": [ + "lessc.inc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT", + "GPL-3.0" + ], + "authors": [ + { + "name": "Leaf Corcoran", + "email": "leafot@gmail.com", + "homepage": "http://leafo.net" + } + ], + "description": "lessphp is a compiler for LESS written in PHP.", + "homepage": "http://leafo.net/lessphp/", + "time": "2013-05-22 17:52:29" + }, + { + "name": "propel/propel", + "version": "2.0.0-alpha1", + "source": { + "type": "git", + "url": "https://github.com/propelorm/Propel2.git", + "reference": "2.0.0-alpha1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/propelorm/Propel2/zipball/2.0.0-alpha1", + "reference": "2.0.0-alpha1", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/log": ">=1.0,<2.0", + "symfony/console": ">=2.2,<3.0", + "symfony/filesystem": ">=2.2,<3.0", + "symfony/finder": ">=2.2,<3.0", + "symfony/validator": ">=2.2,<3.0", + "symfony/yaml": ">=2.2,<3.0" + }, + "require-dev": { + "behat/behat": ">=2.4,<3.0", + "monolog/monolog": ">=1.3,<2.0", + "phpunit/phpunit": "3.7.*" + }, + "suggest": { + "monolog/monolog": "The recommended logging library to use with Propel." + }, + "bin": [ + "bin/propel" + ], + "type": "library", + "autoload": { + "psr-0": { + "Propel": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "william.durand1@gmail.com", + "homepage": "http://www.willdurand.fr" + } + ], + "description": "Propel2 is an open-source Object-Relational Mapping (ORM) for PHP 5.4", + "homepage": "http://www.propelorm.org/", + "keywords": [ + "Active Record", + "orm", + "persistence" + ], + "time": "2013-06-05 06:46:14" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/php-fig/log/archive/1.0.0.zip", + "reference": "1.0.0", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "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", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "ptachoire/cssembed", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/krichprollsch/phpCssEmbed.git", + "reference": "v1.0.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/krichprollsch/phpCssEmbed/zipball/v1.0.1", + "reference": "v1.0.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "CssEmbed": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pierre Tachoire", + "email": "pierre.tachoire@gmail.com" + } + ], + "description": "Css url embed library.", + "homepage": "https://github.com/krichprollsch/phpCssEmbed", + "keywords": [ + "css", + "url" + ], + "time": "2013-04-29 19:58:29" + }, + { + "name": "simplepie/simplepie", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/simplepie/simplepie.git", + "reference": "f5436d69a8efa9d4ab3a9abc65d17317eb24b7f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplepie/simplepie/zipball/f5436d69a8efa9d4ab3a9abc65d17317eb24b7f4", + "reference": "f5436d69a8efa9d4ab3a9abc65d17317eb24b7f4", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "SimplePie": "library" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Ryan Parman", + "homepage": "http://ryanparman.com/", + "role": "Creator, alumnus developer" + }, + { + "name": "Geoffrey Sneddon", + "homepage": "http://gsnedders.com/", + "role": "Alumnus developer" + }, + { + "name": "Ryan McCue", + "email": "me@ryanmccue.info", + "homepage": "http://ryanmccue.info/", + "role": "Developer" + } + ], + "description": "A simple Atom/RSS parsing library for PHP", + "homepage": "http://simplepie.org/", + "keywords": [ + "atom", + "feeds", + "rss" + ], + "time": "2013-04-29 06:13:26" + }, + { + "name": "smarty/smarty", + "version": "v3.1.13", + "source": { + "type": "svn", + "url": "http://smarty-php.googlecode.com/svn", + "reference": "/tags/v3.1.13/@4699" + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "autoload": { + "classmap": [ + "distribution/libs/Smarty.class.php", + "distribution/libs/SmartyBC.class.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Monte Ohrt", + "email": "monte@ohrt.com" + }, + { + "name": "Uwe Tews", + "email": "uwe.tews@googlemail.com" + }, + { + "name": "Rodney Rehm", + "email": "rodney.rehm@medialize.de" + } + ], + "description": "Smarty - the compiling PHP template engine", + "homepage": "http://www.smarty.net", + "keywords": [ + "templating" + ], + "time": "2013-01-26 12:03:52" + }, + { + "name": "symfony-cmf/routing", + "version": "1.0.0", + "target-dir": "Symfony/Cmf/Component/Routing", + "source": { + "type": "git", + "url": "https://github.com/symfony-cmf/Routing.git", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/1.0.0", + "reference": "1.0.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "symfony/http-kernel": ">=2.1,<2.3-dev", + "symfony/routing": ">=2.1,<2.3-dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Cmf\\Component\\Routing": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony CMF Community", + "homepage": "https://github.com/symfony-cmf/Routing/contributors" + } + ], + "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers", + "homepage": "http://cmf.symfony.com", + "keywords": [ + "database", + "routing" + ], + "time": "2013-03-25 15:02:40" + }, + { + "name": "symfony/class-loader", + "version": "v2.2.3", + "target-dir": "Symfony/Component/ClassLoader", + "source": { + "type": "git", + "url": "https://github.com/symfony/ClassLoader.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/finder": ">=2.0,<3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\ClassLoader\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony ClassLoader Component", + "homepage": "http://symfony.com", + "time": "2013-05-06 20:02:13" + }, + { + "name": "symfony/config", + "version": "v2.2.3", + "target-dir": "Symfony/Component/Config", + "source": { + "type": "git", + "url": "https://github.com/symfony/Config.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Config/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "http://symfony.com", + "time": "2013-05-10 18:08:31" + }, + { + "name": "symfony/console", + "version": "v2.2.3", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com", + "time": "2013-06-13 07:47:06" + }, + { + "name": "symfony/dependency-injection", + "version": "v2.2.3", + "target-dir": "Symfony/Component/DependencyInjection", + "source": { + "type": "git", + "url": "https://github.com/symfony/DependencyInjection.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/config": ">=2.2,<2.3-dev", + "symfony/yaml": ">=2.0,<3.0" + }, + "suggest": { + "symfony/config": "2.2.*", + "symfony/yaml": "2.2.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\DependencyInjection\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "http://symfony.com", + "time": "2013-05-06 08:37:50" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.2.3", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/dependency-injection": ">=2.0,<3.0" + }, + "suggest": { + "symfony/dependency-injection": "2.2.*", + "symfony/http-kernel": "2.2.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "http://symfony.com", + "time": "2013-02-11 11:26:43" + }, + { + "name": "symfony/filesystem", + "version": "v2.2.3", + "target-dir": "Symfony/Component/Filesystem", + "source": { + "type": "git", + "url": "https://github.com/symfony/Filesystem.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "http://symfony.com", + "time": "2013-05-06 20:02:13" + }, + { + "name": "symfony/finder", + "version": "v2.3.1", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "v2.3.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/v2.3.1", + "reference": "v2.3.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "http://symfony.com", + "time": "2013-06-02 12:05:51" + }, + { + "name": "symfony/form", + "version": "v2.2.3", + "target-dir": "Symfony/Component/Form", + "source": { + "type": "git", + "url": "https://github.com/symfony/Form.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Form/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/event-dispatcher": ">=2.1,<3.0", + "symfony/locale": ">=2.0,<3.0", + "symfony/options-resolver": ">=2.1,<2.3-dev", + "symfony/property-access": ">=2.2,<2.3-dev" + }, + "require-dev": { + "symfony/http-foundation": ">=2.1,<2.3-dev", + "symfony/validator": ">=2.2,<2.3-dev" + }, + "suggest": { + "symfony/http-foundation": "2.2.*", + "symfony/validator": "2.2.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Form\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Form Component", + "homepage": "http://symfony.com", + "time": "2013-06-13 07:35:18" + }, + { + "name": "symfony/http-foundation", + "version": "v2.2.3", + "target-dir": "Symfony/Component/HttpFoundation", + "source": { + "type": "git", + "url": "https://github.com/symfony/HttpFoundation.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "classmap": [ + "Symfony/Component/HttpFoundation/Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "http://symfony.com", + "time": "2013-06-13 12:48:26" + }, + { + "name": "symfony/http-kernel", + "version": "v2.2.3", + "target-dir": "Symfony/Component/HttpKernel", + "source": { + "type": "git", + "url": "https://github.com/symfony/HttpKernel.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "psr/log": ">=1.0,<2.0", + "symfony/event-dispatcher": ">=2.1,<3.0", + "symfony/http-foundation": ">=2.2,<2.3-dev" + }, + "require-dev": { + "symfony/browser-kit": "2.2.*", + "symfony/class-loader": ">=2.1,<3.0", + "symfony/config": ">=2.0,<3.0", + "symfony/console": "2.2.*", + "symfony/dependency-injection": ">=2.0,<3.0", + "symfony/finder": ">=2.0,<3.0", + "symfony/process": ">=2.0,<3.0", + "symfony/routing": ">=2.2,<2.3-dev", + "symfony/stopwatch": ">=2.2,<2.3-dev" + }, + "suggest": { + "symfony/browser-kit": "2.2.*", + "symfony/class-loader": "2.2.*", + "symfony/config": "2.2.*", + "symfony/console": "2.2.*", + "symfony/dependency-injection": "2.2.*", + "symfony/finder": "2.2.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\HttpKernel\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "http://symfony.com", + "time": "2013-06-19 12:09:49" + }, + { + "name": "symfony/icu", + "version": "v1.2.0", + "target-dir": "Symfony/Component/Icu", + "source": { + "type": "git", + "url": "https://github.com/symfony/Icu.git", + "reference": "v1.2.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Icu/zipball/v1.2.0", + "reference": "v1.2.0", + "shasum": "" + }, + "require": { + "lib-icu": ">=4.4", + "php": ">=5.3.3", + "symfony/intl": ">=2.3,<3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Symfony\\Component\\Icu\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Contains an excerpt of the ICU data and classes to load it.", + "homepage": "http://symfony.com", + "keywords": [ + "icu", + "intl" + ], + "time": "2013-06-03 18:32:58" + }, + { + "name": "symfony/intl", + "version": "v2.3.1", + "target-dir": "Symfony/Component/Intl", + "source": { + "type": "git", + "url": "https://github.com/symfony/Intl.git", + "reference": "v2.3.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Intl/zipball/v2.3.1", + "reference": "v2.3.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/icu": ">=1.0-RC,<2.0" + }, + "require-dev": { + "symfony/filesystem": ">=2.1" + }, + "suggest": { + "ext-intl": "to use the component with locales other than \"en\"" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Symfony/Component/Intl/Resources/stubs" + ], + "files": [ + "Symfony/Component/Intl/Resources/stubs/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch", + "homepage": "http://wiedler.ch/igor/" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + } + ], + "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.", + "homepage": "http://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "time": "2013-05-18 11:21:22" + }, + { + "name": "symfony/locale", + "version": "v2.3.1", + "target-dir": "Symfony/Component/Locale", + "source": { + "type": "git", + "url": "https://github.com/symfony/Locale.git", + "reference": "v2.3.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Locale/zipball/v2.3.1", + "reference": "v2.3.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/intl": ">=2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Locale\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Locale Component", + "homepage": "http://symfony.com", + "time": "2013-04-11 09:29:25" + }, + { + "name": "symfony/options-resolver", + "version": "v2.2.3", + "target-dir": "Symfony/Component/OptionsResolver", + "source": { + "type": "git", + "url": "https://github.com/symfony/OptionsResolver.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\OptionsResolver\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony OptionsResolver Component", + "homepage": "http://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "time": "2013-01-17 15:25:59" + }, + { + "name": "symfony/process", + "version": "v2.3.1", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "v2.3.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/v2.3.1", + "reference": "v2.3.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "http://symfony.com", + "time": "2013-05-06 20:03:44" + }, + { + "name": "symfony/property-access", + "version": "v2.2.3", + "target-dir": "Symfony/Component/PropertyAccess", + "source": { + "type": "git", + "url": "https://github.com/symfony/PropertyAccess.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\PropertyAccess\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony PropertyAccess Component", + "homepage": "http://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "time": "2013-04-07 22:02:49" + }, + { + "name": "symfony/routing", + "version": "v2.2.3", + "target-dir": "Symfony/Component/Routing", + "source": { + "type": "git", + "url": "https://github.com/symfony/Routing.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Routing/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "doctrine/common": ">=2.2,<3.0", + "psr/log": ">=1.0,<2.0", + "symfony/config": ">=2.2,<2.3-dev", + "symfony/yaml": ">=2.0,<3.0" + }, + "suggest": { + "doctrine/common": "~2.2", + "symfony/config": "2.2.*", + "symfony/yaml": "2.2.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Routing\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "http://symfony.com", + "time": "2013-05-10 16:49:00" + }, + { + "name": "symfony/translation", + "version": "v2.2.3", + "target-dir": "Symfony/Component/Translation", + "source": { + "type": "git", + "url": "https://github.com/symfony/Translation.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Translation/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/config": ">=2.0,<2.3-dev", + "symfony/yaml": ">=2.2,<3.0" + }, + "suggest": { + "symfony/config": "2.2.*", + "symfony/yaml": "2.2.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "http://symfony.com", + "time": "2013-05-10 16:49:00" + }, + { + "name": "symfony/validator", + "version": "v2.2.3", + "target-dir": "Symfony/Component/Validator", + "source": { + "type": "git", + "url": "https://github.com/symfony/Validator.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Validator/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/translation": ">=2.0,<3.0" + }, + "require-dev": { + "symfony/config": ">=2.2,<2.3-dev", + "symfony/http-foundation": ">=2.1,<3.0", + "symfony/locale": ">=2.0,<3.0", + "symfony/yaml": ">=2.0,<3.0" + }, + "suggest": { + "doctrine/common": "~2.2", + "symfony/config": "2.2.*", + "symfony/http-foundation": "2.2.*", + "symfony/locale": "2.2.*", + "symfony/yaml": "2.2.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Validator\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "http://symfony.com", + "time": "2013-06-02 12:05:41" + }, + { + "name": "symfony/yaml", + "version": "v2.2.3", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "v2.2.3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.2.3", + "reference": "v2.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2013-05-10 18:08:31" + } + ], + "packages-dev": [ + { + "name": "fzaninotto/faker", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "8b9bb44bbf864a63c2eece6744fc40240877b0c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/8b9bb44bbf864a63c2eece6744fc40240877b0c6", + "reference": "8b9bb44bbf864a63c2eece6744fc40240877b0c6", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Faker": "src/", + "Faker\\PHPUnit": "test/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2013-07-08 09:31:33" + }, + { + "name": "phpunit/php-code-coverage", + "version": "1.2.12", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "1.2.12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1.2.12", + "reference": "1.2.12", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": ">=1.3.0@stable", + "phpunit/php-text-template": ">=1.1.1@stable", + "phpunit/php-token-stream": ">=1.1.3@stable" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*@dev" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2013-07-06 06:26:16" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.3", + "source": { + "type": "git", + "url": "git://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "1.3.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sebastianbergmann/php-file-iterator/zipball/1.3.3", + "reference": "1.3.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "File/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2012-10-11 04:44:38" + }, + { + "name": "phpunit/php-text-template", + "version": "1.1.4", + "source": { + "type": "git", + "url": "git://github.com/sebastianbergmann/php-text-template.git", + "reference": "1.1.4" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sebastianbergmann/php-text-template/zipball/1.1.4", + "reference": "1.1.4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2012-10-31 11:15:28" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.4", + "source": { + "type": "git", + "url": "git://github.com/sebastianbergmann/php-timer.git", + "reference": "1.0.4" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sebastianbergmann/php-timer/zipball/1.0.4", + "reference": "1.0.4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "timer" + ], + "time": "2012-10-11 04:45:58" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.1.5", + "source": { + "type": "git", + "url": "git://github.com/sebastianbergmann/php-token-stream.git", + "reference": "1.1.5" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sebastianbergmann/php-token-stream/zipball/1.1.5", + "reference": "1.1.5", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "tokenizer" + ], + "time": "2012-10-11 04:47:14" + }, + { + "name": "phpunit/phpunit", + "version": "3.7.22", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3.7.22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3.7.22", + "reference": "3.7.22", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpunit/php-code-coverage": "~1.2.1", + "phpunit/php-file-iterator": ">=1.3.1", + "phpunit/php-text-template": ">=1.1.1", + "phpunit/php-timer": "~1.0.2", + "phpunit/phpunit-mock-objects": "~1.2.0", + "symfony/yaml": "~2.0" + }, + "require-dev": { + "pear-pear/pear": "1.9.4" + }, + "suggest": { + "ext-json": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "phpunit/php-invoker": ">=1.1.0,<1.2.0" + }, + "bin": [ + "composer/bin/phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "", + "../../symfony/yaml/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2013-07-06 06:29:15" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "1.2.3", + "source": { + "type": "git", + "url": "git://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "1.2.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects/archive/1.2.3.zip", + "reference": "1.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-text-template": ">=1.1.1@stable" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "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": "2013-01-13 10:24:48" + } + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": { + "ezyang/htmlpurifier": 20, + "ircmaxell/password-compat": 20, + "propel/propel": 15, + "kriswallsmith/assetic": 20, + "leafo/lessphp": 20, + "ptachoire/cssembed": 20, + "simplepie/simplepie": 20, + "fzaninotto/faker": 20 + }, + "platform": { + "php": ">=5.4" + }, + "platform-dev": [ + + ] +} diff --git a/core/lib/Thelia/Admin/Controller/BaseAdminController.php b/core/lib/Thelia/Admin/Controller/BaseAdminController.php index 7c66c430b..7dc8f8a15 100755 --- a/core/lib/Thelia/Admin/Controller/BaseAdminController.php +++ b/core/lib/Thelia/Admin/Controller/BaseAdminController.php @@ -134,7 +134,7 @@ class BaseAdminController extends ContainerAware */ public function generateUrl($route, $parameters = array(), $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH) { - return "thelia2/$route"; + return "thelia2/$route"; //FIXME //return $this->container->get('router')->generate($route, $parameters, $referenceType); } diff --git a/core/lib/Thelia/Command/Install.php b/core/lib/Thelia/Command/Install.php index 81f493701..9d4d4d1fd 100755 --- a/core/lib/Thelia/Command/Install.php +++ b/core/lib/Thelia/Command/Install.php @@ -41,6 +41,30 @@ class Install extends ContainerAwareCommand ->setName("thelia:install") ->setDescription("Install thelia using cli tools. For now Thelia only use mysql database") ->setHelp("The thelia:install command install Thelia database and create config file needed.") + ->addOption( + "db_host", + null, + InputOption::VALUE_OPTIONAL, + "host for your database" + ) + ->addOption( + "db_username", + null, + InputOption::VALUE_OPTIONAL, + "username for your database" + ) + ->addOption( + "db_password", + null, + InputOption::VALUE_OPTIONAL, + "password for your database" + ) + ->addOption( + "db_name", + null, + InputOption::VALUE_OPTIONAL, + "database name" + ) ; } @@ -56,9 +80,19 @@ class Install extends ContainerAwareCommand $this->checkPermission($output); - do { - $connectionInfo = $this->getConnectionInfo($input, $output); - } while(false === $connection = $this->tryConnection($connectionInfo, $output)); + + $connectionInfo = array( + "host" => $input->getOption("db_host"), + "dbName" => $input->getOption("db_name"), + "username" => $input->getOption("db_username"), + "password" => $input->getOption("db_password") + ); + + + + while(false === $connection = $this->tryConnection($connectionInfo, $output)) { + $connectionInfo = $this->getConnectionInfo($input, $output); + } $this->createDatabase($connection, $connectionInfo["dbName"]); diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 4aa6cedb3..dee0b57b6 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -8,6 +8,7 @@ + @@ -56,7 +57,7 @@ - + @@ -83,6 +84,8 @@ + + %thelia.parser.loops% diff --git a/core/lib/Thelia/Core/Security/AuthenticationProcessor.php b/core/lib/Thelia/Core/Security/AuthenticationProcessor.php new file mode 100755 index 000000000..77fd3bd77 --- /dev/null +++ b/core/lib/Thelia/Core/Security/AuthenticationProcessor.php @@ -0,0 +1,35 @@ +container = $container; + } + + public function createToken(Request $request) { + + $context = $request->get('_context'); + + try { + $securityContext = $this->container->get("security.$context"); + + $token = new UsernamePasswordToken( + $request->get('_username'), + $request->get('_password') + ); + + $securityContext->setToken($token); + } + catch (\Exception $ex) { + // Nothing to do + } + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Tests/Core/Security/SecurityManagerTest.php b/core/lib/Thelia/Core/Security/Encoder/PasswordPhpCompatEncoder.php similarity index 59% rename from core/lib/Thelia/Tests/Core/Security/SecurityManagerTest.php rename to core/lib/Thelia/Core/Security/Encoder/PasswordPhpCompatEncoder.php index 84cb0d1ef..32b1c7fd0 100755 --- a/core/lib/Thelia/Tests/Core/Security/SecurityManagerTest.php +++ b/core/lib/Thelia/Core/Security/Encoder/PasswordPhpCompatEncoder.php @@ -1,11 +1,10 @@ . */ +/* along with this program. If not, see . */ /* */ /*************************************************************************************/ +namespace Thelia\Core\Security\Encoder; -namespace Thelia\Tests\Security; - -use Thelia\Core\Security\SecurityManager; /** * - * @author Franck Allimant + * use password api include in php 5.5 and available throw the password_compat library. * + * Class PasswordPhpCompatEncoder + * @package Thelia\Core\Security\Encoder */ -class SecurityManagerTest extends \PHPUnit_Framework_TestCase -{ - public function testGetSetToken() - { - /* - $context = new SecurityManager($authProvider)( - $this->getMock('AuthenticationProviderInterface'), - $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface') - ); - $this->assertNull($context->getToken()); +class PasswordPhpCompatEncoder implements PasswordEncoderInterface { - $context->setToken($token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')); - $this->assertSame($token, $context->getToken()); - */ - // $this->assertFalse(1==1, "faux !"); + /** + * Encode a string. + * + * @param string $password the password to encode + * @param string $algorithm the hash() algorithm + * @return string $salt the salt, the salt is not used here. + */ + public function encode($password, $algorithm, $salt = null) + { + return password_hash($password, $algorithm); } -} + + /** + * Check a string against an encoded password. + * + * @param string $string the string to compare against password + * @param string $password the encoded password + * @param string $algorithm the hash() algorithm, not used here + * @return string $salt the salt, not used here + */ + public function isEqual($string, $password, $algorithm = null, $salt = null) + { + return password_verify($string, $password); + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Core/Security/SecurityManager.php b/core/lib/Thelia/Core/Security/SecurityContext.php similarity index 99% rename from core/lib/Thelia/Core/Security/SecurityManager.php rename to core/lib/Thelia/Core/Security/SecurityContext.php index b60bf14d2..683431518 100755 --- a/core/lib/Thelia/Core/Security/SecurityManager.php +++ b/core/lib/Thelia/Core/Security/SecurityContext.php @@ -31,7 +31,7 @@ use Thelia\Core\Security\Exception\AuthenticationTokenNotFoundException; * * @author Franck Allimant */ -class SecurityManager { +class SecurityContext { /* protected $authProvider; diff --git a/core/lib/Thelia/Core/Security/Token/UsernamePasswordToken.php b/core/lib/Thelia/Core/Security/Token/UsernamePasswordToken.php index f605d1767..03f73dbdd 100755 --- a/core/lib/Thelia/Core/Security/Token/UsernamePasswordToken.php +++ b/core/lib/Thelia/Core/Security/Token/UsernamePasswordToken.php @@ -21,12 +21,12 @@ class UsernamePasswordToken extends AbstractToken * * @throws \InvalidArgumentException */ - public function __construct($username, $password, $authenticated = false) + public function __construct($username, $password, array $roles = array()) { $this->setUser($username); $this->credentials = $password; - parent::setAuthenticated($authenticated); + parent::setAuthenticated(count($roles) > 0); } /** diff --git a/core/lib/Thelia/Core/Security/User/AdminUserProvider.php b/core/lib/Thelia/Core/Security/UserProvider/AdminUserProvider.php similarity index 65% rename from core/lib/Thelia/Core/Security/User/AdminUserProvider.php rename to core/lib/Thelia/Core/Security/UserProvider/AdminUserProvider.php index 9df5ee484..c9ae34a96 100755 --- a/core/lib/Thelia/Core/Security/User/AdminUserProvider.php +++ b/core/lib/Thelia/Core/Security/UserProvider/AdminUserProvider.php @@ -1,7 +1,5 @@ request = $request; + $this->dispatcher = $dispatcher; + $this->securityContext = $securityContext; + + $this->args = $this->getArgDefinitions()->addArguments($this->getDefaultArgs()); } + /** + * Define common loop arguments + * + * @return an array ofL \Thelia\Core\Template\Loop\Argument\Argument + */ + protected function getDefaultArgs() + { + return array( + Argument::createIntTypeArgument('offset', 0), + Argument::createIntTypeArgument('page'), + Argument::createIntTypeArgument('limit', 10), + ); + } + + /** + * Provides a getter to loop parameters + * + * @param string $name the methode name (only getArgname is supported) + * @param mixed $arguments this parameter is ignored + * @throws \InvalidArgumentException if the parameter is unknown or the method name is not supported. + */ public function __call($name, $arguments) { + if (substr($name, 0, 3) == 'get') { $argName = strtolower(substr($name, 3)); @@ -65,22 +100,6 @@ abstract class BaseLoop } throw new \InvalidArgumentException(sprintf("Unsupported magic method %s. only getArgname() is supported.", $name)); - - } - - - /** - * Create a new Loop - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher - */ - public function __construct(Request $request, EventDispatcherInterface $dispatcher) - { - $this->request = $request; - $this->dispatcher = $dispatcher; - - $this->args = $this->getArgDefinitions()->addArguments($this->getDefaultArgs()); } /** @@ -104,30 +123,28 @@ abstract class BaseLoop if($value === null && $argument->mandatory) { $faultActor[] = $argument->name; $faultDetails[] = sprintf('"%s" parameter is missing', $argument->name); - continue; } - - /* check if empty */ - if($value === '' && !$argument->empty) { + else if($value === '' && !$argument->empty) { + /* check if empty */ $faultActor[] = $argument->name; $faultDetails[] = sprintf('"%s" parameter cannot be empty', $argument->name); - continue; } - - /* check type */ - if($value !== null && !$argument->type->isValid($value)) { + else if($value !== null && !$argument->type->isValid($value)) { + /* check type */ $faultActor[] = $argument->name; $faultDetails[] = sprintf('Invalid value for "%s" argument', $argument->name); - continue; } + else { + /* set default */ + /* did it as last checking for we consider default value is acceptable no matter type or empty restriction */ + if($value === null) { + $value = $argument->default; + } - /* set default */ - /* did it as last checking for we consider default value is acceptable no matter type or empty restriction */ - if($value === null) { - $value = $argument->default; - } + $argument->setValue($value); + } - $argument->setValue($value); + $this->args->next(); } if (!empty($faultActor)) { diff --git a/core/lib/Thelia/Core/Template/Loop/Auth.php b/core/lib/Thelia/Core/Template/Loop/Auth.php new file mode 100755 index 000000000..d0c477ef9 --- /dev/null +++ b/core/lib/Thelia/Core/Template/Loop/Auth.php @@ -0,0 +1,92 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template\Loop; + +use Thelia\Core\Template\Element\BaseLoop; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\LoopResultRow; + +use Thelia\Core\Template\Loop\Argument\ArgumentCollection; +use Thelia\Core\Template\Loop\Argument\Argument; + +use Thelia\Type\TypeCollection; +use Thelia\Type; + +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** + * + * @package Thelia\Core\Template\Loop + * + * @author Franck Allimant + */ +class Auth extends BaseLoop +{ + public function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createAnyTypeArgument('roles', null, true), + Argument::createAnyTypeArgument('permissions') + ); + } + + private function _explode($commaSeparatedValues) + { + + $array = explode(',', $commaSeparatedValues); + + if (array_walk($array, function(&$item) { + $item = strtoupper(trim($item)); + })) { + return $array; + } + + return array(); + } + + /** + * + * + * @return \Thelia\Core\Template\Element\LoopResult + */ + public function exec(&$pagination) + { + $roles = $this->_explode($this->getRoles()); + $permissions = $this->_explode($this->getPermissions()); + + $loopResult = new LoopResult(); + + try { + $this->securityContext->isGranted($roles, $permissions == null ? array() : $permissions); + + // Create an empty row: loop is no longer empty :) + $loopResult->addRow(new LoopResultRow()); + } + catch (\Exception $ex) { + // Not granted, loop is empty + } + + return $loopResult; + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/Security.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/Security.php index de7573be6..93367f341 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/Security.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/Security.php @@ -26,15 +26,15 @@ namespace Thelia\Core\Template\Smarty\Plugins; use Thelia\Core\Template\Smarty\SmartyPluginDescriptor; use Thelia\Core\Template\Smarty\SmartyPluginInterface; use Thelia\Core\Template\Smarty\Assets\SmartyAssetsManager; -use Thelia\Core\Security\SecurityManager; +use Thelia\Core\Security\SecurityContext; class Security implements SmartyPluginInterface { - private $securityManager; + private $securityContext; - public function __construct(SecurityManager $securityManager) + public function __construct(SecurityContext $securityContext) { - $this->securityManager = $securityManager; + $this->securityContext = $securityContext; } private function _explode($commaSeparatedValues) @@ -54,17 +54,16 @@ class Security implements SmartyPluginInterface /** * Process security check function * - * @param unknown $params + * @param array $params * @param unknown $smarty - * @return string + * @return string no text is returned. */ - public function checkAUth($params, &$smarty) + public function checkAuthFunction($params, &$smarty) { $roles = $this->_explode($params['role']); - $permissions = $this->_explode($params['role']); - - $this->securityManager->isGranted($roles, $permissions); + $permissions = $this->_explode($params['permissions']); + $this->securityContext->isGranted($roles, $permissions); } /** @@ -75,7 +74,7 @@ class Security implements SmartyPluginInterface public function getPluginDescriptors() { return array( - new SmartyPluginDescriptor('function', 'check_auth', $this, 'checkAUth'), + new SmartyPluginDescriptor('function', 'check_auth', $this, 'checkAuthFunction') ); } } diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/TheliaLoop.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/TheliaLoop.php index 77e38d277..3d5496741 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/TheliaLoop.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/TheliaLoop.php @@ -32,6 +32,7 @@ use Thelia\Core\Template\Element\Exception\InvalidElementException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Thelia\Core\Security\SecurityContext; class TheliaLoop implements SmartyPluginInterface { @@ -40,16 +41,17 @@ class TheliaLoop implements SmartyPluginInterface protected $loopDefinition = array(); protected $request; - protected $dispatcher; + protected $securityContext; protected $loopstack = array(); protected $varstack = array(); - public function __construct(Request $request, EventDispatcherInterface $dispatcher) + public function __construct(Request $request, EventDispatcherInterface $dispatcher, SecurityContext $securityContext) { $this->request = $request; $this->dispatcher = $dispatcher; + $this->securityContext = $securityContext; } /** @@ -294,7 +296,8 @@ class TheliaLoop implements SmartyPluginInterface $loop = $class->newInstance( $this->request, - $this->dispatcher + $this->dispatcher, + $this->securityContext ); $loop->initializeArgs($smartyParams); diff --git a/core/lib/Thelia/Form/CustomerCreation.php b/core/lib/Thelia/Form/CustomerCreation.php index 659bc4fe4..2ba80f362 100755 --- a/core/lib/Thelia/Form/CustomerCreation.php +++ b/core/lib/Thelia/Form/CustomerCreation.php @@ -22,10 +22,7 @@ /*************************************************************************************/ namespace Thelia\Form; -use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Validator\Constraints; -use Symfony\Component\Validator\ExecutionContext; use Symfony\Component\Validator\ExecutionContextInterface; use Thelia\Model\ConfigQuery; use Thelia\Model\CustomerQuery; diff --git a/core/lib/Thelia/Model/Admin.php b/core/lib/Thelia/Model/Admin.php index 6d3627294..5dd4b9ed4 100755 --- a/core/lib/Thelia/Model/Admin.php +++ b/core/lib/Thelia/Model/Admin.php @@ -36,6 +36,6 @@ class Admin extends BaseAdmin implements UserInterface * {@inheritDoc} */ public function getRoles() { - return array(new Role('USER_ADMIN')); + return array(new Role('ROLE_ADMIN')); } } diff --git a/core/lib/Thelia/Model/Customer.php b/core/lib/Thelia/Model/Customer.php index b9adade3f..13024996b 100755 --- a/core/lib/Thelia/Model/Customer.php +++ b/core/lib/Thelia/Model/Customer.php @@ -105,7 +105,7 @@ class Customer extends BaseCustomer implements UserInterface $this->setAlgo("PASSWORD_BCRYPT"); return parent::setPassword(password_hash($password, PASSWORD_BCRYPT)); } - + return $this; } public function setDispatcher(EventDispatcherInterface $dispatcher) @@ -132,6 +132,6 @@ class Customer extends BaseCustomer implements UserInterface * {@inheritDoc} */ public function getRoles() { - return array(new Role('USER_CUSTOMER')); + return array(new Role('ROLE_CUSTOMER')); } } diff --git a/core/lib/Thelia/Tests/Core/Security/Encoder/PasswordPhpCompatEncoderTest.php b/core/lib/Thelia/Tests/Core/Security/Encoder/PasswordPhpCompatEncoderTest.php new file mode 100755 index 000000000..988be2360 --- /dev/null +++ b/core/lib/Thelia/Tests/Core/Security/Encoder/PasswordPhpCompatEncoderTest.php @@ -0,0 +1,31 @@ +encoder = new PasswordPhpCompatEncoder(); + } + + public function testEncode() + { + $hash = $this->encoder->encode("foo", PASSWORD_BCRYPT); + + $this->assertEquals($hash, crypt("foo", $hash)); + } + +} \ No newline at end of file diff --git a/core/lib/Thelia/Tests/Core/Security/Token/UsernamePasswordTokenTest.php b/core/lib/Thelia/Tests/Core/Security/Token/UsernamePasswordTokenTest.php deleted file mode 100755 index 147c5b816..000000000 --- a/core/lib/Thelia/Tests/Core/Security/Token/UsernamePasswordTokenTest.php +++ /dev/null @@ -1,38 +0,0 @@ -assertFalse($token->isAuthenticated()); - - $token = new UsernamePasswordToken('username', 'password', true); - $this->assertTrue($token->isAuthenticated()); - } - - /** - * @expectedException LogicException - */ - public function testSetAuthenticatedToTrue() - { - $token = new UsernamePasswordToken('foo', 'bar', true); - $token->setAuthenticated(true); - } - - public function testSetAuthenticatedToFalse() - { - $token = new UsernamePasswordToken('foo', 'bar', true); - $token->setAuthenticated(false); - $this->assertFalse($token->isAuthenticated()); - } - - public function testEraseCredentials() - { - $token = new UsernamePasswordToken('foo', 'bar', true); - $token->eraseCredentials(); - $this->assertEquals('', $token->getCredentials()); - } -} \ No newline at end of file diff --git a/core/lib/Thelia/Tests/Log/TlogTest.php b/core/lib/Thelia/Tests/Log/TlogTest.php index acae68dc6..bde1cdb39 100755 --- a/core/lib/Thelia/Tests/Log/TlogTest.php +++ b/core/lib/Thelia/Tests/Log/TlogTest.php @@ -29,7 +29,8 @@ class TlogTest extends \PHPUnit_Framework_TestCase { protected static $logger; - protected $regex = "/(\\d)(:)(\\s+)(%s)(\\s+)(\\[.*?\\])(\\s+)(\\{.*?\\})(\\s+)((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))(.)(\\s+)(%s)([\n])/is"; + //protected $regex = "/(\\d)(:)(\\s+)(%s)(\\s+)(\\[.*?\\])(\\s+)(\\{.*?\\})(\\s+)(\\d{4})(-)(\\d{2})(-)(\\d{2})(\\s+)(\\d{2})(:)(\\d{2})(:)(\\d{2})(:)(\\s+)(%s)([\n])/is"; + protected $regex = "/[0-9]+:[\s](%s)+[\s]\[[a-zA-Z\.]+:[a-zA-Z]+\(\)\][\s]\{[0-9]+\}[\s][0-9]{4}-[0-9]{2}-[0-9]{2}[\s][0-9]{2}:[0-9]{2}:[0-9]{2}:[\s](%s).*$/is"; public static function setUpBeforeClass() { diff --git a/templates/smarty-sample/index.html b/templates/smarty-sample/index.html index c185ae5f8..87efeeb4d 100755 --- a/templates/smarty-sample/index.html +++ b/templates/smarty-sample/index.html @@ -1,5 +1,14 @@ {include file="includes/header.html"}
+ +{loop type="auth" name="auth_test" roles="CUSTOMER"} +

Customer is authentified :-)

+{/loop} + +{elseloop rel="auth_test"} +

Customer is not authentified :-(

+{/elseloop} + An image from asset directory : {images file='assets/img/logo-thelia-34px.png'}{intl l='Thelia, solution e-commerce libre'}{/images}