remove recess, bower, grunt and uglifyJs dependencies in php utils and tests

updated minifier tests
This commit is contained in:
Florian BLOUET
2015-12-02 17:16:47 +01:00
parent 82a35ce457
commit 261339ecd5
50 changed files with 19 additions and 993 deletions

3
.gitignore vendored
View File

@@ -13,9 +13,6 @@
# Exclude node.js dependencies folder
/node_modules
# Exclude compiled LESS folder
/www/skins/build
# Exclude compiled javascript test fixture folder
/www/scripts/tests/fixtures

View File

@@ -4,9 +4,7 @@ install:
php bin/console system:clear-cache
npm install
composer install -o
./node_modules/.bin/grunt install-assets
php bin/console system:clear-cache
php bin/developer assets:compile-less
config:
@php bin/console compile:configuration

View File

@@ -13,9 +13,7 @@ use Alchemy\Phrasea\CLI;
use Alchemy\Phrasea\Core\Version;
use Alchemy\Phrasea\Command\Developer\APIRoutesDumper;
use Alchemy\Phrasea\Command\Developer\Behat;
use Alchemy\Phrasea\Command\Developer\BowerInstall;
use Alchemy\Phrasea\Command\Developer\ComposerInstall;
use Alchemy\Phrasea\Command\Developer\LessCompiler;
use Alchemy\Phrasea\Command\Developer\IniReset;
use Alchemy\Phrasea\Command\Developer\InstallAll;
use Alchemy\Phrasea\Command\Developer\JsFixtures;
@@ -71,13 +69,11 @@ $cli = new CLI("
$cli->command(new TranslationDumper());
$cli->command(new InstallAll());
$cli->command(new BowerInstall());
$cli->command(new ComposerInstall());
$cli->command(new RegenerateSqliteDb());
$cli->command(new APIRoutesDumper());
$cli->command(new RoutesDumper());
$cli->command(new Behat());
$cli->command(new LessCompiler());
$cli->command(new Uninstaller());
$cli->command(new JsFixtures());
$cli->command(new IniReset());

View File

@@ -53,7 +53,6 @@ main:
ffprobe_binary: null
mp4box_binary: null
pdftotext_binary: null
recess_binary: null
ffmpeg_timeout: 3600
ffprobe_timeout: 60
gs_timeout: 60

View File

@@ -20,7 +20,6 @@ use Symfony\Component\Console;
use Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider;
use Alchemy\Phrasea\Core\CLIProvider\ComposerSetupServiceProvider;
use Alchemy\Phrasea\Core\CLIProvider\DoctrineMigrationServiceProvider;
use Alchemy\Phrasea\Core\CLIProvider\LessBuilderServiceProvider;
use Alchemy\Phrasea\Core\CLIProvider\PluginServiceProvider;
use Alchemy\Phrasea\Core\CLIProvider\SignalHandlerServiceProvider;
use Alchemy\Phrasea\Core\CLIProvider\TaskManagerServiceProvider;
@@ -68,7 +67,6 @@ class CLI extends Application
$this->register(new PluginServiceProvider());
$this->register(new ComposerSetupServiceProvider());
$this->register(new CLIDriversServiceProvider());
$this->register(new LessBuilderServiceProvider());
$this->register(new SignalHandlerServiceProvider());
$this->register(new TaskManagerServiceProvider());
$this->register(new TranslationExtractorServiceProvider());

View File

@@ -1,78 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2015 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Command\Developer;
use Alchemy\Phrasea\Command\Command;
use Alchemy\BinaryDriver\Exception\ExecutionFailureException;
use Alchemy\Phrasea\Exception\RuntimeException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;
use vierbergenlars\SemVer\version;
class BowerInstall extends Command
{
public function __construct()
{
parent::__construct('dependencies:bower');
$this
->setDescription('Installs bower dependencies')
->addOption('no-dev', 'd', InputOption::VALUE_NONE, 'Do not install dev dependencies')
->addOption('clear-cache', null, InputOption::VALUE_NONE, 'If defined forces to clear the cache before installation');
}
protected function doExecute(InputInterface $input, OutputInterface $output)
{
$grunt = $this->container['driver.grunt'];
$grunt->getProcessBuilderFactory()->setTimeout(600);
$bower = $this->container['driver.bower'];
$output->writeln("Using <info>".$grunt->getProcessBuilderFactory()->getBinary()."</info> for driver");
$output->writeln("Using <info>".$bower->getProcessBuilderFactory()->getBinary()."</info> for driver");
$version = trim($bower->command('-v'));
if (version::lt($version, '1.0.0-alpha.1')) {
throw new RuntimeException(sprintf(
'Bower version 1.0.0-alpha.1 is required (version %s provided), please install bower-canary : `npm install -g bower-canary or run npm install from root directory`', $version
));
}
$version = trim($grunt->command('--version'));
if (!version_compare('0.4.0', substr($version, -5), '<=')) {
throw new RuntimeException(sprintf(
'Grunt version >= 0.4.0 is required (version %s provided), please install grunt `http://gruntjs.com/getting-started`', $version
));
}
if ($input->getOption('clear-cache')) {
$output->write("Cleaning bower cache... ");
$bower->command(['cache', 'clean']);
$output->writeln("<comment>OK</comment>");
}
try {
$output->write("Installing assets...");
$grunt->command('install-assets');
$output->write(" <comment>OK</comment>");
$output->writeln("");
$this->container['console']->get('assets:compile-less')->execute($input, $output);
} catch (ExecutionFailureException $e) {
throw new RuntimeException('Unable to install bower dependencies', $e->getCode(), $e);
}
return 0;
}
}

View File

@@ -34,7 +34,6 @@ class InstallAll extends Command
$ret = 0;
$ret += $this->container['console']->get('dependencies:composer')->execute($input, $output);
$ret += $this->container['console']->get('dependencies:bower')->execute($input, $output);
return min($ret, 255);
}

View File

@@ -1,45 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2015 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Command\Developer;
use Alchemy\Phrasea\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
/**
* This command builds less file
*/
class LessCompiler extends Command
{
public function __construct()
{
parent::__construct('assets:compile-less');
$this->setDescription('Compiles Phraseanet LESS files');
}
/**
* {@inheritdoc}
*/
protected function doExecute(InputInterface $input, OutputInterface $output)
{
foreach ($this->container['phraseanet.less-assets'] as $source => $target) {
$this->container['filesystem']->mkdir(dirname($target));
$this->container['filesystem']->copy($source, $target);
}
$output->writeln('Building LESS assets');
$this->container['phraseanet.less-builder']->build($this->container['phraseanet.less-mapping'], $output);
return 0;
}
}

View File

@@ -1,45 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2015 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Command\Developer\Utils;
use Alchemy\BinaryDriver\AbstractBinary;
use Alchemy\BinaryDriver\Configuration;
use Alchemy\BinaryDriver\ConfigurationInterface;
use Psr\Log\LoggerInterface;
class BowerDriver extends AbstractBinary
{
/**
* {@inheritdoc}
*/
public function getName()
{
return 'bower';
}
/**
* @param array|ConfigurationInterface $conf
* @param LoggerInterface $logger
*
* @return BowerDriver
*/
public static function create($conf = [], LoggerInterface $logger = null)
{
if (!$conf instanceof ConfigurationInterface) {
$conf = new Configuration($conf);
}
$binaries = $conf->get('bower.binaries', ['bower']);
return static::load($binaries, $logger, $conf);
}
}

View File

@@ -1,48 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2014 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Command\Developer\Utils;
use Alchemy\BinaryDriver\AbstractBinary;
use Alchemy\BinaryDriver\Configuration;
use Alchemy\BinaryDriver\ConfigurationInterface;
use Psr\Log\LoggerInterface;
class GruntDriver extends AbstractBinary
{
/**
* {@inheritdoc}
*/
public function getName()
{
return 'grunt';
}
/**
* @param array|ConfigurationInterface $conf
* @param LoggerInterface $logger
*
* @return GruntDriver
*/
public static function create($conf = [], LoggerInterface $logger = null)
{
if (!$conf instanceof ConfigurationInterface) {
$conf = new Configuration($conf);
}
$binaries = $conf->get('grunt.binaries', ['grunt']);
$driver = static::load($binaries, $logger, $conf);
$driver->getProcessBuilderFactory()->getBuilder()->setWorkingDirectory(__DIR__.'/../../../../../..');
return $driver;
}
}

View File

@@ -1,45 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2015 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Command\Developer\Utils;
use Alchemy\BinaryDriver\AbstractBinary;
use Psr\Log\LoggerInterface;
use Alchemy\BinaryDriver\Configuration;
use Alchemy\BinaryDriver\ConfigurationInterface;
class RecessDriver extends AbstractBinary
{
/**
* {@inheritdoc}
*/
public function getName()
{
return 'recess';
}
/**
* @param array|ConfigurationInterface $conf
* @param LoggerInterface $logger
*
* @return RecessDriver
*/
public static function create($conf = [], LoggerInterface $logger = null)
{
if (!$conf instanceof ConfigurationInterface) {
$conf = new Configuration($conf);
}
$binaries = $conf->get('recess.binaries', ['recess']);
return static::load($binaries, $logger, $conf);
}
}

View File

@@ -1,45 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2015 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Command\Developer\Utils;
use Alchemy\BinaryDriver\AbstractBinary;
use Alchemy\BinaryDriver\Configuration;
use Alchemy\BinaryDriver\ConfigurationInterface;
use Psr\Log\LoggerInterface;
class UglifyJsDriver extends AbstractBinary
{
/**
* {@inheritdoc}
*/
public function getName()
{
return 'uglifyjs';
}
/**
* @param array|ConfigurationInterface $conf
* @param LoggerInterface $logger
*
* @return UglifyJsDriver
*/
public static function create($conf = [], LoggerInterface $logger = null)
{
if (!$conf instanceof ConfigurationInterface) {
$conf = new Configuration($conf);
}
$binaries = $conf->get('uglifyjs.binaries', ['uglifyjs']);
return static::load($binaries, $logger, $conf);
}
}

View File

@@ -50,9 +50,5 @@ abstract class AbstractPluginCommand extends Command
$output->write("Updating config files...");
$this->container['plugins.autoloader-generator']->write($manifests);
$output->writeln(" <comment>OK</comment>");
$output->write('Building LESS assets ...');
$this->container['phraseanet.less-builder']->build($this->container['phraseanet.less-mapping.customizable']);
$output->writeln(" <comment>OK</comment>");
}
}

View File

@@ -311,7 +311,6 @@ class Install extends Command
'mp4box_binary' => $this->executableFinder->find('MP4Box'),
'pdftotext_binary' => $this->executableFinder->find('pdftotext'),
'ghostscript_binary' => $this->executableFinder->find('gs'),
'recess_binary' => $this->executableFinder->find('recess'),
];
}
}

View File

@@ -323,7 +323,6 @@ class V1Controller extends Controller
'ffprobe' => isset($binaries['ffprobe_binary']) ? $binaries['ffprobe_binary'] : null,
'mp4box' => isset($binaries['mp4box_binary']) ? $binaries['mp4box_binary'] : null,
'pdftotext' => isset($binaries['pdftotext_binary']) ? $binaries['pdftotext_binary'] : null,
'recess' => isset($binaries['recess_binary']) ? $binaries['recess_binary'] : null,
'pdfmaxpages' => $conf->get(['registry', 'executables', 'pdf-max-pages']),
],
'mainConfiguration' => [

View File

@@ -169,7 +169,6 @@ class SetupController extends Controller
'ffmpeg_binary' => $request->request->get('binary_ffmpeg'),
'mp4box_binary' => $request->request->get('binary_MP4Box'),
'pdftotext_binary' => $request->request->get('binary_xpdf'),
'recess_binary' => $request->request->get('binary_recess'),
] as $key => $path) {
$binaryData[$key] = $path;
}

View File

@@ -11,11 +11,7 @@
namespace Alchemy\Phrasea\Core\CLIProvider;
use Alchemy\Phrasea\Command\Developer\Utils\BowerDriver;
use Alchemy\Phrasea\Command\Developer\Utils\ComposerDriver;
use Alchemy\Phrasea\Command\Developer\Utils\GruntDriver;
use Alchemy\Phrasea\Command\Developer\Utils\RecessDriver;
use Alchemy\Phrasea\Command\Developer\Utils\UglifyJsDriver;
use Alchemy\Phrasea\Exception\RuntimeException;
use Silex\Application;
use Silex\ServiceProviderInterface;
@@ -47,26 +43,6 @@ class CLIDriversServiceProvider implements ServiceProviderInterface
return $app['executable-finder']->find($name, null, $extraDirs);
});
$app['driver.bower'] = $app->share(function (Application $app) {
$bowerBinary = $app['driver.binary-finder']('bower', 'bower_binary');
if (null === $bowerBinary) {
throw new RuntimeException('Unable to find bower executable.');
}
return BowerDriver::create(['bower.binaries' => $bowerBinary, 'timeout' => 300], $app['monolog']);
});
$app['driver.recess'] = $app->share(function (Application $app) {
$recessBinary = $app['driver.binary-finder']('recess', 'recess_binary');
if (null === $recessBinary) {
throw new RuntimeException('Unable to find recess executable.');
}
return RecessDriver::create(['recess.binaries' => $recessBinary], $app['monolog']);
});
$app['driver.composer'] = $app->share(function (Application $app) {
$composerBinary = $app['driver.binary-finder']('composer', 'composer_binary');
@@ -76,26 +52,6 @@ class CLIDriversServiceProvider implements ServiceProviderInterface
return ComposerDriver::create(['composer.binaries' => $composerBinary, 'timeout' => 300], $app['monolog']);
});
$app['driver.uglifyjs'] = $app->share(function (Application $app) {
$uglifyJsBinary = $app['driver.binary-finder']('uglifyjs', 'uglifyjs_binary');
if (null === $uglifyJsBinary) {
throw new RuntimeException('Unable to find uglifyJs executable.');
}
return UglifyJsDriver::create(['uglifyjs.binaries' => $uglifyJsBinary], $app['monolog']);
});
$app['driver.grunt'] = $app->share(function (Application $app) {
$gruntBinary = $app['driver.binary-finder']('grunt', 'grunt_binary');
if (null === $gruntBinary) {
throw new RuntimeException('Unable to find grunt executable.');
}
return GruntDriver::create(['grunt.binaries' => $gruntBinary], $app['monolog']);
});
}
public function boot(Application $app)

View File

@@ -1,60 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2015 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Core\CLIProvider;
use Silex\Application;
use Silex\ServiceProviderInterface;
use Alchemy\Phrasea\Utilities\Less\Builder as LessBuilder;
use Alchemy\Phrasea\Utilities\Less\Compiler as LessCompiler;
class LessBuilderServiceProvider implements ServiceProviderInterface
{
public function register(Application $app)
{
$app['phraseanet.less-assets'] = $app->share(function ($app) {
return [
$app['root.path'] . '/www/assets/bootstrap/img/glyphicons-halflings-white.png' => $app['root.path'] . '/www/skins/build/bootstrap/img/glyphicons-halflings-white.png',
$app['root.path'] . '/www/assets/bootstrap/img/glyphicons-halflings.png' => $app['root.path'] . '/www/skins/build/bootstrap/img/glyphicons-halflings.png',
];
});
$app['phraseanet.less-mapping.base'] = $app->share(function ($app) {
return [];
});
$app['phraseanet.less-mapping.customizable'] = $app->share(function ($app) {
return [
$app['root.path'] . '/www/skins/login/less/login.less' => $app['root.path'] . '/www/assets/build/login.css',
$app['root.path'] . '/www/skins/account/less/account.less' => $app['root.path'] . '/www/assets/build/account.css',
];
});
$app['phraseanet.less-mapping'] = $app->share(function ($app) {
return array_merge(
$app['phraseanet.less-mapping.base'],
$app['phraseanet.less-mapping.customizable']
);
});
$app['phraseanet.less-compiler'] = $app->share(function ($app) {
return new LessCompiler($app['filesystem'], $app['driver.recess']);
});
$app['phraseanet.less-builder'] = $app->share(function ($app) {
return new LessBuilder($app['phraseanet.less-compiler'], $app['filesystem']);
});
}
public function boot(Application $app)
{
}
}

View File

@@ -30,8 +30,8 @@ class AutoloaderGenerator
->doWrite('services.php', $this->createServices($manifests))
->doWrite('commands.php', $this->createCommands($manifests))
->doWrite('twig-paths.php', $this->createTwigPathsMap($manifests))
->doWrite('login.less', $this->createLoginLess($manifests))
->doWrite('account.less', $this->createAccountLess($manifests));
->doWrite('login.scss', $this->createLoginStylesheet($manifests))
->doWrite('account.scss', $this->createAccountStylesheet($manifests));
return $this;
}
@@ -40,16 +40,16 @@ class AutoloaderGenerator
* @param Manifest[] $manifests
* @return string
*/
private function createLoginLess($manifests)
private function createLoginStylesheet($manifests)
{
$buffer = <<<EOF
// This file is automatically generated, please do not edit it.
EOF;
foreach ($manifests as $manifest) {
$filepath = $this->pluginDirectory . DIRECTORY_SEPARATOR . $manifest->getName() . DIRECTORY_SEPARATOR . 'less' . DIRECTORY_SEPARATOR . 'login.less';
$filepath = $this->pluginDirectory . DIRECTORY_SEPARATOR . $manifest->getName() . DIRECTORY_SEPARATOR . 'scss' . DIRECTORY_SEPARATOR . 'login.scss';
if (is_file($filepath)) {
$relativePath = $manifest->getName() . DIRECTORY_SEPARATOR . 'less' . DIRECTORY_SEPARATOR . 'login.less';
$relativePath = $manifest->getName() . DIRECTORY_SEPARATOR . 'scss' . DIRECTORY_SEPARATOR . 'login.scss';
$buffer .= <<<EOF
@import "$relativePath";
@@ -64,16 +64,16 @@ EOF;
* @param Manifest[] $manifests
* @return string
*/
private function createAccountLess($manifests)
private function createAccountStylesheet($manifests)
{
$buffer = <<<EOF
// This file is automatically generated, please do not edit it.
EOF;
foreach ($manifests as $manifest) {
$filepath = $this->pluginDirectory . DIRECTORY_SEPARATOR . $manifest->getName() . DIRECTORY_SEPARATOR . 'less' . DIRECTORY_SEPARATOR . 'account.less';
$filepath = $this->pluginDirectory . DIRECTORY_SEPARATOR . $manifest->getName() . DIRECTORY_SEPARATOR . 'scss' . DIRECTORY_SEPARATOR . 'account.scss';
if (is_file($filepath)) {
$relativePath = $manifest->getName() . DIRECTORY_SEPARATOR . 'less' . DIRECTORY_SEPARATOR . 'account.less';
$relativePath = $manifest->getName() . DIRECTORY_SEPARATOR . 'scss' . DIRECTORY_SEPARATOR . 'account.scss';
$buffer .= <<<EOF
@import "$relativePath";

View File

@@ -28,7 +28,6 @@ class BinariesProbe extends BinariesRequirements implements ProbeInterface
'pdftotext_binary' => isset($binaries['pdftotext_binary']) ? $binaries['pdftotext_binary'] : null,
'ffmpeg_binary' => isset($binaries['ffmpeg_binary']) ? $binaries['ffmpeg_binary'] : null,
'ffprobe_binary' => isset($binaries['ffprobe_binary']) ? $binaries['ffprobe_binary'] : null,
'recess_binary' => isset($binaries['recess_binary']) ? $binaries['recess_binary'] : null,
]));
}

View File

@@ -215,13 +215,5 @@ class BinariesRequirements extends RequirementCollection implements RequirementI
'FFProbe (or avprobe) is required for Video processing',
'Please install FFProbe (or avprobe)'
);
$recess = isset($binaries['recess_binary']) ? $binaries['recess_binary'] : $finder->find('recess');
$this->addRecommendation(
null !== $recess && is_executable($recess),
'Recess is required for compiling css or less files.',
'Please install Recess (https://github.com/twitter/recess)'
);
}
}

View File

@@ -1,52 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2015 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Utilities\Less;
use Alchemy\Phrasea\Utilities\Less\Compiler as LessCompiler;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;
class Builder
{
/**
* @var LessCompiler
*/
protected $compiler;
/**
* @var Filesystem
*/
protected $filesystem;
public function __construct(LessCompiler $compiler, Filesystem $filesystem)
{
$this->compiler = $compiler;
$this->filesystem = $filesystem;
}
/**
* Build LESS files
*
* @param array $files
*
* @throws RuntimeException
*/
public function build($files, OutputInterface $output = null)
{
foreach ($files as $lessFile => $target) {
$this->filesystem->mkdir(dirname($target));
if (null !== $output) {
$output->writeln(" Building <info>" . basename($target) . "</info>... <comment>OK</comment>");
}
$this->compiler->compile($target, $lessFile);
}
}
}

View File

@@ -1,68 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2015 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Utilities\Less;
use Alchemy\Phrasea\Command\Developer\Utils\RecessDriver;
use Alchemy\BinaryDriver\Exception\ExecutionFailureException;
use Alchemy\Phrasea\Exception\RuntimeException;
use Symfony\Component\Filesystem\Filesystem;
class Compiler
{
private $filesystem;
private $recess;
public function __construct(Filesystem $filesystem, RecessDriver $recess)
{
$this->filesystem = $filesystem;
$this->recess = $recess;
}
/**
* Compile LESS files
*
* @param string $target
* @param string $files
*
* @throws RuntimeException
*/
public function compile($target, $files)
{
$this->filesystem->mkdir(dirname($target));
if (!$files instanceof \Traversable) {
$files = new \ArrayObject(is_array($files) ? $files : [$files]);
}
$files = (array) $files;
foreach ($files as $file) {
if (false === is_file($file)) {
throw new RuntimeException($file . ' does not exists.');
}
}
if (!is_writable(dirname($target))) {
throw new RuntimeException(dirname($target) . ' is not writable.');
}
$commands = $files;
array_unshift($commands, '--compile');
try {
$output = $this->recess->command($commands);
$this->filesystem->dumpFile($target, $output);
} catch (ExecutionFailureException $e) {
throw new RuntimeException('Could not execute recess command.', $e->getCode(), $e);
}
}
}

View File

@@ -59,10 +59,6 @@ class setup
'name' => 'FFmpeg',
'binary' => $finder->find('ffmpeg')
],
'recess' => [
'name' => 'Recesss',
'binary' => $finder->find('recess')
],
];
}
}

View File

@@ -53,7 +53,6 @@ main:
ffprobe_binary: null
mp4box_binary: null
pdftotext_binary: null
recess_binary: null
ffmpeg_timeout: 3600
ffprobe_timeout: 60
gs_timeout: 60

View File

@@ -60,7 +60,6 @@ main:
ffprobe_binary: null
mp4box_binary: null
pdftotext_binary: null
recess_binary: null
ffmpeg_timeout: 3600
ffprobe_timeout: 60
gs_timeout: 60

View File

@@ -70,9 +70,6 @@ find . -maxdepth 1 -type f -exec rm {} \;
sudo cp -rf * /usr/local/
# npm binaries
sudo npm install -g recess
sudo npm install -g bower
sudo npm install -g uglify-js
#twig
cd /tmp

View File

@@ -1,78 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Command\Developper;
use Alchemy\Phrasea\Command\Developer\BowerInstall;
/**
* @group functional
* @group legacy
*/
class BowerInstallTest extends \PhraseanetTestCase
{
public function testRunWithoutProblems()
{
$input = $this->getMock('Symfony\Component\Console\Input\InputInterface');
$output = $this->getMock('Symfony\Component\Console\Output\OutputInterface');
self::$DI['cli']['filesystem'] = $this->getMockBuilder('Symfony\Component\Filesystem\Filesystem')
->disableOriginalConstructor()
->getMock();
self::$DI['cli']['driver.bower'] = $this->getMockBuilder('Alchemy\Phrasea\Command\Developer\Utils\BowerDriver')
->disableOriginalConstructor()
->getMock();
self::$DI['cli']['console'] = $this->getMockBuilder('Symfony\Component\Console\Application')
->disableOriginalConstructor()
->getMock();
$mockedCommand = $this->getMockBuilder('Symfony\Component\Console\Command\Command')
->setMethods(['execute'])
->disableOriginalConstructor()
->getMock();
self::$DI['cli']['console']->expects($this->any())
->method('get')
->will($this->returnValue($mockedCommand));
self::$DI['cli']['driver.grunt'] = $this->getMockBuilder('Alchemy\Phrasea\Command\Developer\Utils\GruntDriver')
->disableOriginalConstructor()
->getMock();
$processBuilder = $this->getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface');
$processBuilder->expects($this->any())
->method('getBinary');
self::$DI['cli']['driver.bower']->expects($this->at(0))
->method('getProcessBuilderFactory')
->will($this->returnValue($processBuilder));
self::$DI['cli']['driver.bower']->expects($this->at(1))
->method('command')
->with('-v')
->will($this->returnValue('1.0.0-alpha.5'));
self::$DI['cli']['driver.grunt']->expects($this->at(0))
->method('getProcessBuilderFactory')
->will($this->returnValue($processBuilder));
self::$DI['cli']['driver.grunt']->expects($this->at(1))
->method('getProcessBuilderFactory')
->will($this->returnValue($processBuilder));
self::$DI['cli']['driver.grunt']->expects($this->at(2))
->method('command')
->with('--version')
->will($this->returnValue('4.0.1'));
self::$DI['cli']['driver.grunt']->expects($this->at(3))
->method('command')
->with('install-assets');
$command = new BowerInstall();
$command->setContainer(self::$DI['cli']);
$this->assertEquals(0, $command->execute($input, $output));
}
}

View File

@@ -21,8 +21,7 @@ class InstallAllTest extends \PhraseanetTestCase
$n = 0;
foreach ([
'dependencies:composer',
'dependencies:bower'
'dependencies:composer'
] as $name) {
$command = $this->getMockBuilder('Symfony\Component\Console\Command\Command')
->setMethods(['execute'])

View File

@@ -1,30 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Command\Developper\Utils;
use Alchemy\Phrasea\Command\Developer\Utils\BowerDriver;
use Symfony\Component\Process\PhpExecutableFinder;
/**
* @group functional
* @group legacy
*/
class BowerDriverTest extends \PhraseanetTestCase
{
public function testCreate()
{
$driver = BowerDriver::create();
$this->assertInstanceOf('Alchemy\Phrasea\Command\Developer\Utils\BowerDriver', $driver);
$this->assertEquals('bower', $driver->getName());
}
public function testCreateWithCustomBinary()
{
$finder = new PhpExecutableFinder();
$php = $finder->find();
$driver = BowerDriver::create(['bower.binaries' => $php]);
$this->assertInstanceOf('Alchemy\Phrasea\Command\Developer\Utils\BowerDriver', $driver);
$this->assertEquals($php, $driver->getProcessBuilderFactory()->getBinary());
}
}

View File

@@ -1,33 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Command\Developper\Utils;
use Alchemy\Phrasea\Command\Developer\Utils\GruntDriver;
use Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider;
use Symfony\Component\Process\PhpExecutableFinder;
/**
* @group functional
* @group legacy
*/
class GruntDriverTest extends \PhraseanetTestCase
{
public function testCreate()
{
$app = $this->getApplication();
$app->register(new CLIDriversServiceProvider());
$driver = GruntDriver::create(['grunt.binaries' => $app['driver.binary-finder']('grunt', 'grunt_binary')]);
$this->assertInstanceOf('Alchemy\Phrasea\Command\Developer\Utils\GruntDriver', $driver);
$this->assertEquals('grunt', $driver->getName());
}
public function testCreateWithCustomBinary()
{
$finder = new PhpExecutableFinder();
$php = $finder->find();
$driver = GruntDriver::create(['grunt.binaries' => $php]);
$this->assertInstanceOf('Alchemy\Phrasea\Command\Developer\Utils\GruntDriver', $driver);
$this->assertEquals($php, $driver->getProcessBuilderFactory()->getBinary());
}
}

View File

@@ -1,26 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Command\Developper\Utils;
use Alchemy\Phrasea\Command\Developer\Utils\RecessDriver;
/**
* @group functional
* @group legacy
*/
class RecessDriverTest extends \PhraseanetTestCase
{
public function testGetCreate()
{
$recessDriver = RecessDriver::create();
$this->assertInstanceOf('Alchemy\BinaryDriver\BinaryInterface', $recessDriver);
}
public function testGetName()
{
$recessDriver = RecessDriver::create();
$this->assertEquals('recess', $recessDriver->getName());
}
}

View File

@@ -1,33 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Command\Developper\Utils;
use Alchemy\Phrasea\Command\Developer\Utils\UglifyJsDriver;
use Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider;
use Symfony\Component\Process\PhpExecutableFinder;
/**
* @group functional
* @group legacy
*/
class UglifyJsDriverTest extends \PhraseanetTestCase
{
public function testCreate()
{
$app = $this->getApplication();
$app->register(new CLIDriversServiceProvider());
$driver = UglifyJsDriver::create(['uglifyjs.binaries' => $app['driver.binary-finder']('uglifyjs', 'uglifyjs_binary')]);
$this->assertInstanceOf('Alchemy\Phrasea\Command\Developer\Utils\UglifyJsDriver', $driver);
$this->assertEquals('uglifyjs', $driver->getName());
}
public function testCreateWithCustomBinary()
{
$finder = new PhpExecutableFinder();
$php = $finder->find();
$driver = UglifyJsDriver::create(['uglifyjs.binaries' => $php]);
$this->assertInstanceOf('Alchemy\Phrasea\Command\Developer\Utils\UglifyJsDriver', $driver);
$this->assertEquals($php, $driver->getProcessBuilderFactory()->getBinary());
}
}

View File

@@ -5,6 +5,7 @@ namespace Alchemy\Tests\Phrasea\Controller;
/**
* @group functional
* @group legacy
* @group minify
*/
class MinifierTest extends \PhraseanetTestCase
{
@@ -25,23 +26,6 @@ class MinifierTest extends \PhraseanetTestCase
$_GET = [];
}
/**
* @dataProvider provideGroupsToMinify
*/
public function testGenerationOfGroups($name)
{
$_GET['g'] = $name;
self::$DI['client']->request('GET', '/include/minify/?g=' . $name);
$this->assertTrue(self::$DI['client']->getResponse()->isOk(), "Group $name is ok");
}
public function provideGroupsToMinify()
{
$groups = require __DIR__ . '/../../../../../lib/conf.d/minifyGroupsConfig.php';
return array_map(function ($group) {return [$group];}, array_keys($groups));
}
/**
* @dataProvider provideFilesToMinify
*/
@@ -54,17 +38,7 @@ class MinifierTest extends \PhraseanetTestCase
public function provideFilesToMinify()
{
$files = [];
$groups = require __DIR__ . '/../../../../../lib/conf.d/minifyGroupsConfig.php';
foreach ($groups as $name => $data) {
foreach ($data as $file) {
$files[] = substr($file, 2);
}
}
return array_map(function ($file) {return [$file];}, array_unique($files));
return [['scripts/apps/admin/require.config.js']];
}
public function testFileMinificationWithoutParamsShouldReturnA400()

View File

@@ -1,56 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Core\CLIProvider;
use Alchemy\Phrasea\CLI;
/**
* @group functional
* @group legacy
* @covers Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider
*/
class CLISDriversServiceProviderTest extends ServiceProviderTestCase
{
public function provideServiceDescription()
{
return [
[
'Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider',
'executable-finder',
'Symfony\Component\Process\ExecutableFinder'
],
[
'Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider',
'driver.bower',
'Alchemy\Phrasea\Command\Developer\Utils\BowerDriver'
],
[
'Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider',
'driver.composer',
'Alchemy\Phrasea\Command\Developer\Utils\ComposerDriver'
],
[
'Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider',
'driver.uglifyjs',
'Alchemy\Phrasea\Command\Developer\Utils\UglifyJsDriver'
],
[
'Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider',
'driver.recess',
'Alchemy\Phrasea\Command\Developer\Utils\RecessDriver'
],
];
}
public function testComposerTimeout()
{
$cli = new CLI('test');
$this->assertEquals(300, $cli['driver.composer']->getProcessBuilderFactory()->getTimeout());
}
public function testBowerTimeout()
{
$cli = new CLI('test');
$this->assertEquals(300, $cli['driver.bower']->getProcessBuilderFactory()->getTimeout());
}
}

View File

@@ -1,27 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Core\CLIProvider;
/**
* @group functional
* @group legacy
* @covers Alchemy\Phrasea\Core\CLIProvider\LessBuilderServiceProvider
*/
class LessBuilderServiceProviderTest extends ServiceProviderTestCase
{
public function provideServiceDescription()
{
return [
[
'Alchemy\Phrasea\Core\CLIProvider\LessBuilderServiceProvider',
'phraseanet.less-compiler',
'\Alchemy\Phrasea\Utilities\Less\Compiler'
],
[
'Alchemy\Phrasea\Core\CLIProvider\LessBuilderServiceProvider',
'phraseanet.less-builder',
'\Alchemy\Phrasea\Utilities\Less\Builder'
],
];
}
}

View File

@@ -53,7 +53,6 @@ main:
ffprobe_binary: null
mp4box_binary: null
pdftotext_binary: null
recess_binary: null
ffmpeg_timeout: 3600
ffprobe_timeout: 60
gs_timeout: 60

View File

@@ -67,7 +67,6 @@ main:
ffprobe_binary: null
mp4box_binary: null
pdftotext_binary: null
recess_binary: null
ffmpeg_timeout: 3600
ffprobe_timeout: 60
gs_timeout: 60

View File

@@ -53,7 +53,6 @@ main:
ffprobe_binary: null
mp4box_binary: null
pdftotext_binary: null
recess_binary: null
ffmpeg_timeout: 3600
ffprobe_timeout: 60
gs_timeout: 60

View File

@@ -1 +0,0 @@
@import "my-plugin/account.less";

View File

@@ -1 +0,0 @@
@import "my-plugin/login.less";

View File

@@ -0,0 +1 @@
@import "my-plugin/account.scss";

View File

@@ -0,0 +1 @@
@import "my-plugin/login.scss";

View File

@@ -1 +0,0 @@
@import "my-plugin/account.less";

View File

@@ -1 +0,0 @@
@import "my-plugin/login.less";

View File

@@ -0,0 +1 @@
@import "my-plugin/account.scss";

View File

@@ -0,0 +1 @@
@import "my-plugin/login.scss";

View File

@@ -25,8 +25,8 @@ class AutoloaderGeneratorTest extends \PhraseanetTestCase
$pluginsDir . '/autoload.php',
$pluginsDir . '/commands.php',
$pluginsDir . '/twig-paths.php',
$pluginsDir . '/login.less',
$pluginsDir . '/account.less',
$pluginsDir . '/login.scss',
$pluginsDir . '/account.scss',
];
$this->cleanup($files);
@@ -73,8 +73,8 @@ class AutoloaderGeneratorTest extends \PhraseanetTestCase
$mapping = require $pluginsDir . '/twig-paths.php';
$this->assertSame(['plugin-test-plugin' => realpath($pluginsDir) . '/test-plugin/views', realpath($pluginsDir) . '/test-plugin/views', realpath($pluginsDir) . '/test-plugin/twig-views'], $mapping);
$this->assertRegExp('#@import#', file_get_contents($pluginsDir . '/login.less'));
$this->assertRegExp('#@import#', file_get_contents($pluginsDir . '/account.less'));
$this->assertRegExp('#@import#', file_get_contents($pluginsDir . '/login.scss'));
$this->assertRegExp('#@import#', file_get_contents($pluginsDir . '/account.scss'));
$this->cleanup($files);
}

View File

@@ -1,27 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Utilities\Less;
use Alchemy\Phrasea\Utilities\Less\Builder;
/**
* @group functional
* @group legacy
*/
class BuilderTest extends \PhraseanetTestCase
{
public function testBuildSuccess()
{
$compiler = $this->getMockBuilder('Alchemy\Phrasea\Utilities\Less\Compiler')
->disableOriginalConstructor()
->getMock();
$compiler->expects($this->once())->method('compile');
$filesystem = $this->getMock('Symfony\Component\Filesystem\Filesystem');
$filesystem->expects($this->once())->method('mkdir');
$builder = new Builder($compiler, $filesystem);
$builder->build([ __FILE__ => __DIR__ . '/output.css']);
}
}

View File

@@ -1,66 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Utilities\Less;
use Alchemy\Phrasea\Utilities\Less\Compiler;
use Alchemy\BinaryDriver\Exception\ExecutionFailureException;
/**
* @group functional
* @group legacy
*/
class CompilerTest extends \PhraseanetTestCase
{
public function testCompileSuccess()
{
$recessDriver = $this->getMockBuilder('Alchemy\Phrasea\Command\Developer\Utils\RecessDriver')
->disableOriginalConstructor()
->getMock();
$recessDriver->expects($this->once())->method('command');
$filesystem = $this->getMock('Symfony\Component\Filesystem\Filesystem');
$filesystem->expects($this->once())->method('mkdir');
$filesystem->expects($this->once())->method('dumpFile');
$compiler = new Compiler($filesystem, $recessDriver);
$compiler->compile(__DIR__ . '/output.css', __FILE__);
}
/**
* @expectedException \Alchemy\Phrasea\Exception\RuntimeException
*/
public function testCompileFileNotExists()
{
$recessDriver = $this->getMockBuilder('Alchemy\Phrasea\Command\Developer\Utils\RecessDriver')
->disableOriginalConstructor()
->getMock();
$filesystem = $this->getMock('Symfony\Component\Filesystem\Filesystem');
$filesystem->expects($this->once())->method('mkdir');
$compiler = new Compiler($filesystem, $recessDriver);
$compiler->compile(__DIR__ . '/output.css', 'not_existsing_file');
}
/**
* @expectedException \Alchemy\Phrasea\Exception\RuntimeException
*/
public function testCompileExecutionFailure()
{
$recessDriver = $this->getMockBuilder('Alchemy\Phrasea\Command\Developer\Utils\RecessDriver')
->disableOriginalConstructor()
->getMock();
$recessDriver->expects($this->once())->method('command')->will(
$this->throwException(new ExecutionFailureException())
);
$filesystem = $this->getMock('Symfony\Component\Filesystem\Filesystem');
$compiler = new Compiler($filesystem, $recessDriver);
$compiler->compile(__DIR__ . '/output.css', __FILE__);
}
}