From 303aadad5722e982bb9104763ea7e1b924433efe Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Tue, 16 Jul 2013 19:36:18 +0200 Subject: [PATCH] Make developer commands runnable without install --- bin/developer | 16 ++++--- lib/Alchemy/Phrasea/Application.php | 2 - lib/Alchemy/Phrasea/CLI.php | 7 ++- .../Developer/Utils}/RecessDriver.php | 11 ++++- .../CLIProvider/CLIDriversServiceProvider.php | 43 ++++++++++++++----- .../LessBuilderServiceProvider.php | 7 ++- .../Provider/LessCompilerServiceProvider.php | 30 ------------- .../Phrasea/Utilities/Less/Compiler.php | 10 +---- .../Developper/Utils}/RecessDriverTest.php | 13 +----- .../CLISDriversServiceProviderTest.php | 5 +++ .../LessBuilderServiceProviderTest.php | 25 +++++++++++ .../LessBuilderServiceProviderTest.php | 16 ------- .../LessCompilerServiceProviderTest.php | 16 ------- .../Phrasea/Utilities/Less/CompilerTest.php | 21 ++++----- 14 files changed, 106 insertions(+), 116 deletions(-) rename lib/Alchemy/Phrasea/{Utilities/Less => Command/Developer/Utils}/RecessDriver.php (78%) rename lib/Alchemy/Phrasea/Core/{Provider => CLIProvider}/LessBuilderServiceProvider.php (89%) delete mode 100644 lib/Alchemy/Phrasea/Core/Provider/LessCompilerServiceProvider.php rename tests/Alchemy/Tests/Phrasea/{Utilities/Less => Command/Developper/Utils}/RecessDriverTest.php (58%) create mode 100644 tests/Alchemy/Tests/Phrasea/Core/CLIProvider/LessBuilderServiceProviderTest.php delete mode 100644 tests/Alchemy/Tests/Phrasea/Core/Provider/LessBuilderServiceProviderTest.php delete mode 100644 tests/Alchemy/Tests/Phrasea/Core/Provider/LessCompilerServiceProviderTest.php diff --git a/bin/developer b/bin/developer index f52158113e..07c5c1bde2 100755 --- a/bin/developer +++ b/bin/developer @@ -57,14 +57,16 @@ try { under certain conditions; type `about:license' for details.\n\n" . ' Phraseanet Developer Tools ', Version::getName() . ' ' . Version::getNumber()); - $helpers = array( - 'db' => new ConnectionHelper($cli['EM']->getConnection()), - 'em' => new EntityManagerHelper($cli['EM']) - ); + if ($cli['phraseanet.configuration']->isSetup()) { + $helpers = array( + 'db' => new ConnectionHelper($cli['EM']->getConnection()), + 'em' => new EntityManagerHelper($cli['EM']) + ); - $helperSet = $cli['console']->getHelperSet(); - foreach ($helpers as $name => $helper) { - $helperSet->set($helper, $name); + $helperSet = $cli['console']->getHelperSet(); + foreach ($helpers as $name => $helper) { + $helperSet->set($helper, $name); + } } $cli->command(new InstallAll()); diff --git a/lib/Alchemy/Phrasea/Application.php b/lib/Alchemy/Phrasea/Application.php index 922431cbf0..f9b27c120f 100644 --- a/lib/Alchemy/Phrasea/Application.php +++ b/lib/Alchemy/Phrasea/Application.php @@ -89,7 +89,6 @@ use Alchemy\Geonames\GeonamesServiceProvider; use Alchemy\Phrasea\Core\Provider\InstallerServiceProvider; use Alchemy\Phrasea\Core\Provider\JMSSerializerServiceProvider; use Alchemy\Phrasea\Core\Provider\LessBuilderServiceProvider; -use Alchemy\Phrasea\Core\Provider\LessCompilerServiceProvider; use Alchemy\Phrasea\Core\Provider\LocaleServiceProvider; use Alchemy\Phrasea\Core\Provider\NotificationDelivererServiceProvider; use Alchemy\Phrasea\Core\Provider\ORMServiceProvider; @@ -255,7 +254,6 @@ class Application extends SilexApplication $this->register(new PhraseaVersionServiceProvider()); $this->register(new PHPExiftoolServiceProvider()); $this->register(new ReCaptchaServiceProvider()); - $this->register(new LessCompilerServiceProvider()); $this->register(new LessBuilderServiceProvider()); $this['recaptcha.public-key'] = $this->share(function (Application $app) { diff --git a/lib/Alchemy/Phrasea/CLI.php b/lib/Alchemy/Phrasea/CLI.php index 6e68bcf3bc..410ca9b604 100644 --- a/lib/Alchemy/Phrasea/CLI.php +++ b/lib/Alchemy/Phrasea/CLI.php @@ -13,9 +13,10 @@ namespace Alchemy\Phrasea; use Alchemy\Phrasea\Command\CommandInterface; use Symfony\Component\Console; -use Alchemy\Phrasea\Core\CLIProvider\PluginServiceProvider; -use Alchemy\Phrasea\Core\CLIProvider\ComposerSetupServiceProvider; use Alchemy\Phrasea\Core\CLIProvider\CLIDriversServiceProvider; +use Alchemy\Phrasea\Core\CLIProvider\ComposerSetupServiceProvider; +use Alchemy\Phrasea\Core\CLIProvider\LessBuilderServiceProvider; +use Alchemy\Phrasea\Core\CLIProvider\PluginServiceProvider; /** * Phraseanet Command Line Application @@ -51,7 +52,9 @@ class CLI extends Application $this->register(new PluginServiceProvider()); $this->register(new ComposerSetupServiceProvider()); + $this->register(new CLIDriversServiceProvider()); + $this->register(new LessBuilderServiceProvider()); $this->bindRoutes(); } diff --git a/lib/Alchemy/Phrasea/Utilities/Less/RecessDriver.php b/lib/Alchemy/Phrasea/Command/Developer/Utils/RecessDriver.php similarity index 78% rename from lib/Alchemy/Phrasea/Utilities/Less/RecessDriver.php rename to lib/Alchemy/Phrasea/Command/Developer/Utils/RecessDriver.php index be447d7948..e90de8e3b4 100644 --- a/lib/Alchemy/Phrasea/Utilities/Less/RecessDriver.php +++ b/lib/Alchemy/Phrasea/Command/Developer/Utils/RecessDriver.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Alchemy\Phrasea\Utilities\Less; +namespace Alchemy\Phrasea\Command\Developer\Utils; use Alchemy\BinaryDriver\AbstractBinary; use Psr\Log\LoggerInterface; @@ -18,11 +18,20 @@ 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 = array(), LoggerInterface $logger = null) { if (!$conf instanceof ConfigurationInterface) { diff --git a/lib/Alchemy/Phrasea/Core/CLIProvider/CLIDriversServiceProvider.php b/lib/Alchemy/Phrasea/Core/CLIProvider/CLIDriversServiceProvider.php index fbe6a4858f..56f1b16beb 100644 --- a/lib/Alchemy/Phrasea/Core/CLIProvider/CLIDriversServiceProvider.php +++ b/lib/Alchemy/Phrasea/Core/CLIProvider/CLIDriversServiceProvider.php @@ -14,6 +14,7 @@ namespace Alchemy\Phrasea\Core\CLIProvider; use Alchemy\Phrasea\Command\Developer\Utils\BowerDriver; use Alchemy\Phrasea\Command\Developer\Utils\UglifyJsDriver; use Alchemy\Phrasea\Command\Developer\Utils\ComposerDriver; +use Alchemy\Phrasea\Utilities\Less\RecessDriver; use Silex\Application; use Silex\ServiceProviderInterface; use Symfony\Component\Process\ExecutableFinder; @@ -26,13 +27,21 @@ class CLIDriversServiceProvider implements ServiceProviderInterface return new ExecutableFinder(); }); - $app['driver.bower'] = $app->share(function (Application $app) { - if (isset($app['phraseanet.configuration']['binaries']['bower_binary'])) { - $bowerBinary = $app['phraseanet.configuration']['binaries']['bower_binary']; - } else { - $bowerBinary = $app['executable-finder']->find('bower'); + $app['driver.binary-finder'] = $app->protect(function ($name, $configName) use ($app) { + if (!$app['phraseanet.configuration']->isSetup()) { + return $app['executable-finder']->find($name); } + if (isset($app['phraseanet.configuration']['binaries'][$configName])) { + return $app['phraseanet.configuration']['binaries'][$configName]; + } + + return $app['executable-finder']->find($name); + }); + + $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.'); } @@ -40,13 +49,19 @@ class CLIDriversServiceProvider implements ServiceProviderInterface return BowerDriver::create(array('bower.binaries' => $bowerBinary), $app['monolog']); }); - $app['driver.composer'] = $app->share(function (Application $app) { - if (isset($app['phraseanet.configuration']['binaries']['composer_binary'])) { - $composerBinary = $app['phraseanet.configuration']['binaries']['composer_binary']; - } else { - $composerBinary = $app['executable-finder']->find('composer'); + $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(array('recess.binaries' => $recessBinary), $app['monolog']); + }); + + $app['driver.composer'] = $app->share(function (Application $app) { + $composerBinary = $app['driver.binary-finder']('composer', 'composer_binary'); + if (null === $composerBinary) { throw new RuntimeException('Unable to find composer executable.'); } @@ -55,7 +70,13 @@ class CLIDriversServiceProvider implements ServiceProviderInterface }); $app['driver.uglifyjs'] = $app->share(function (Application $app) { - return UglifyJsDriver::create(array(), $app['monolog']); + $uglifyJsBinary = $app['driver.binary-finder']('uglifyjs', 'uglifyjs_binary'); + + if (null === $uglifyJsBinary) { + throw new RuntimeException('Unable to find uglifyJs executable.'); + } + + return UglifyJsDriver::create(array('uglifyjs.binaries' => $uglifyJsBinary), $app['monolog']); }); } diff --git a/lib/Alchemy/Phrasea/Core/Provider/LessBuilderServiceProvider.php b/lib/Alchemy/Phrasea/Core/CLIProvider/LessBuilderServiceProvider.php similarity index 89% rename from lib/Alchemy/Phrasea/Core/Provider/LessBuilderServiceProvider.php rename to lib/Alchemy/Phrasea/Core/CLIProvider/LessBuilderServiceProvider.php index 416c88fb7d..8b3f866428 100644 --- a/lib/Alchemy/Phrasea/Core/Provider/LessBuilderServiceProvider.php +++ b/lib/Alchemy/Phrasea/Core/CLIProvider/LessBuilderServiceProvider.php @@ -9,11 +9,12 @@ * file that was distributed with this source code. */ -namespace Alchemy\Phrasea\Core\Provider; +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 { @@ -47,6 +48,10 @@ class LessBuilderServiceProvider implements ServiceProviderInterface ); }); + $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']); }); diff --git a/lib/Alchemy/Phrasea/Core/Provider/LessCompilerServiceProvider.php b/lib/Alchemy/Phrasea/Core/Provider/LessCompilerServiceProvider.php deleted file mode 100644 index 50700dbf01..0000000000 --- a/lib/Alchemy/Phrasea/Core/Provider/LessCompilerServiceProvider.php +++ /dev/null @@ -1,30 +0,0 @@ -share(function($app) { - return LessCompiler::create($app); - }); - } - - public function boot(Application $app) - { - } -} diff --git a/lib/Alchemy/Phrasea/Utilities/Less/Compiler.php b/lib/Alchemy/Phrasea/Utilities/Less/Compiler.php index 9344b19600..6636934f28 100644 --- a/lib/Alchemy/Phrasea/Utilities/Less/Compiler.php +++ b/lib/Alchemy/Phrasea/Utilities/Less/Compiler.php @@ -12,7 +12,6 @@ namespace Alchemy\Phrasea\Utilities\Less; use Alchemy\Phrasea\Application; -use Alchemy\BinaryDriver\BinaryInterface; use Alchemy\BinaryDriver\Exception\ExecutionFailureException; use Alchemy\Phrasea\Exception\RuntimeException; use Symfony\Component\Filesystem\Filesystem; @@ -22,19 +21,12 @@ class Compiler private $filesystem; private $recess; - public function __construct(Filesystem $filesystem, BinaryInterface $recess) + public function __construct(Filesystem $filesystem, RecessDriver $recess) { $this->filesystem = $filesystem; $this->recess = $recess; } - public static function create(Application $app) - { - $binaries = $app['phraseanet.configuration']['binaries']; - - return new self($app['filesystem'], RecessDriver::create($binaries)); - } - /** * Compile LESS files * diff --git a/tests/Alchemy/Tests/Phrasea/Utilities/Less/RecessDriverTest.php b/tests/Alchemy/Tests/Phrasea/Command/Developper/Utils/RecessDriverTest.php similarity index 58% rename from tests/Alchemy/Tests/Phrasea/Utilities/Less/RecessDriverTest.php rename to tests/Alchemy/Tests/Phrasea/Command/Developper/Utils/RecessDriverTest.php index 0543e1b314..6b4355fcae 100644 --- a/tests/Alchemy/Tests/Phrasea/Utilities/Less/RecessDriverTest.php +++ b/tests/Alchemy/Tests/Phrasea/Command/Developper/Utils/RecessDriverTest.php @@ -1,17 +1,8 @@ getMock('Alchemy\BinaryDriver\BinaryInterface'); + $recessDriver = $this->getMockBuilder('Alchemy\Phrasea\Utilities\Less\RecessDriver') + ->disableOriginalConstructor() + ->getMock(); $recessDriver->expects($this->once())->method('command'); $filesystem = $this->getMock('Symfony\Component\Filesystem\Filesystem'); @@ -30,18 +32,14 @@ class CompilerTest extends \PhraseanetPHPUnitAbstract $compiler->compile(__DIR__ . '/output.css', __FILE__); } - public function testCreate() - { - $compiler = Compiler::create(self::$DI['app']); - $this->assertInstanceOf('Alchemy\Phrasea\Utilities\Less\Compiler', $compiler); - } - - /** + /** * @expectedException Alchemy\Phrasea\Exception\RuntimeException */ public function testCompileFileNotExists() { - $recessDriver = $this->getMock('Alchemy\BinaryDriver\BinaryInterface'); + $recessDriver = $this->getMockBuilder('Alchemy\Phrasea\Utilities\Less\RecessDriver') + ->disableOriginalConstructor() + ->getMock(); $filesystem = $this->getMock('Symfony\Component\Filesystem\Filesystem'); $filesystem->expects($this->once())->method('mkdir'); @@ -56,7 +54,10 @@ class CompilerTest extends \PhraseanetPHPUnitAbstract */ public function testCompileExecutionFailure() { - $recessDriver = $this->getMock('Alchemy\BinaryDriver\BinaryInterface'); + $recessDriver = $this->getMockBuilder('Alchemy\Phrasea\Utilities\Less\RecessDriver') + ->disableOriginalConstructor() + ->getMock(); + $recessDriver->expects($this->once())->method('command')->will( $this->throwException(new ExecutionFailureException()) );