diff --git a/.travis.yml b/.travis.yml index 97dda12..8353067 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ php: - "5.5" - "5.6" - "7.0" + - "7.1" - "hhvm" before_script: diff --git a/README.md b/README.md index 2bc5b87..b550fe1 100644 --- a/README.md +++ b/README.md @@ -10,19 +10,16 @@ [![composer.lock](https://poser.pugx.org/eugene-matvejev/css-compiler/composerlock)](https://packagist.org/packages/eugene-matvejev/css-compiler) -# PHP CSS Compiler +# PHP CSS compiler with composer handler _can be triggered from composer's script's section: compiles SCSS with compass|LESS_ -# How to use: -``` -composer require "eugene-matvejev/css-compiler" -``` +## how to use +`composer require eugene-matvejev/css-compiler` -### add callback into into composer's __scripts__: -``` -"EM\\CssCompiler\\ScriptHandler::generateCSS" -``` -_example_: +### add callback into into composer's __scripts__ +`"EM\\CssCompiler\\ScriptHandler::generateCSS"` + +_example_ ``` "scripts": { "post-update-cmd": "@custom-events", @@ -32,12 +29,13 @@ _example_: ] } ``` + ### add _css-compiler_ information inside of the _extra_ composer configuration * _format_: compression format * _input_: array of relative paths to the composer.json, all files will be picked up recursivly inside of the directory - * _output_: relative file path to the composer.json, where to save output (hard-copy) + * _output_: relative file path to the composer.json, where to save output (hard-copy) -_example_: +_example_ ``` "extra": { "css-compiler": [ diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..d34193f --- /dev/null +++ b/circle.yml @@ -0,0 +1,15 @@ +machine: + php: + version: 7.1.0 + +dependencies: + cache_directories: + - ~/.composer/cache + override: + - composer install --no-progress --no-interaction + +test: + override: + - phpunit -c . + post: + - bash <(curl -s https://codecov.io/bash) -t eaad9275-9810-4190-bd1e-55cb0f5a8899 diff --git a/src/ScriptHandler.php b/src/ScriptHandler.php index 29b8b7f..732cc59 100644 --- a/src/ScriptHandler.php +++ b/src/ScriptHandler.php @@ -18,11 +18,13 @@ class ScriptHandler const OPTION_KEY_FORMATTER = 'format'; const DEFAULT_OPTION_FORMATTER = 'compact'; protected static $mandatoryOptions = [ - self::OPTION_KEY_INPUT, - self::OPTION_KEY_OUTPUT + self::OPTION_KEY_INPUT => 'array', + self::OPTION_KEY_OUTPUT => 'string' ]; /** + * @api + * * @param Event $event * * @throws \InvalidArgumentException @@ -34,20 +36,26 @@ public static function generateCSS(Event $event) $processor = new Processor($event->getIO()); - foreach ($extra[static::CONFIG_MAIN_KEY] as $config) { - foreach ($config[static::OPTION_KEY_INPUT] as $inputSource) { + foreach ($extra[static::CONFIG_MAIN_KEY] as $options) { + foreach ($options[static::OPTION_KEY_INPUT] as $inputSource) { $processor->attachFiles( static::resolvePath($inputSource, getcwd()), - static::resolvePath($config[static::OPTION_KEY_OUTPUT], getcwd()) + static::resolvePath($options[static::OPTION_KEY_OUTPUT], getcwd()) ); } - $formatter = isset($config[static::OPTION_KEY_FORMATTER]) ? $config[static::OPTION_KEY_FORMATTER] : static::DEFAULT_OPTION_FORMATTER; + $formatter = array_key_exists(static::OPTION_KEY_FORMATTER, $options) ? $options[static::OPTION_KEY_FORMATTER] : static::DEFAULT_OPTION_FORMATTER; $processor->processFiles($formatter); } $processor->saveOutput(); } + /** + * @param string $path + * @param string $prefix + * + * @return string + */ protected static function resolvePath($path, $prefix) { return '/' === substr($path, 0, 1) ? $path : "{$prefix}/{$path}"; @@ -56,92 +64,44 @@ protected static function resolvePath($path, $prefix) /** * @param array $config * - * @return bool * @throws \InvalidArgumentException */ protected static function validateConfiguration(array $config) { - if (empty($config[static::CONFIG_MAIN_KEY])) { + if (!array_key_exists(static::CONFIG_MAIN_KEY, $config)) { throw new \InvalidArgumentException('compiler should needs to be configured through the extra.css-compiler setting'); } if (!is_array($config[static::CONFIG_MAIN_KEY])) { - throw new \InvalidArgumentException('the extra.css-compiler setting must be an array of objects'); + throw new \InvalidArgumentException('the extra.' . static::CONFIG_MAIN_KEY . ' setting must be an array of objects'); } - return static::validateOptions($config[static::CONFIG_MAIN_KEY]); - } - - /** - * @param array $config - * - * @return bool - * @throws \InvalidArgumentException - */ - protected static function validateOptions(array $config) - { - foreach ($config as $option) { - if (!is_array($option)) { - throw new \InvalidArgumentException('extra.' . static::CONFIG_MAIN_KEY . "[]." . static::OPTION_KEY_INPUT . ' array'); + foreach ($config[static::CONFIG_MAIN_KEY] as $index => $options) { + if (!is_array($options)) { + throw new \InvalidArgumentException('extra.' . static::CONFIG_MAIN_KEY . "[$index] should be an array"); } - static::validateMandatoryOptions($option); + static::validateMandatoryOptions($options, $index); } - - return true; } /** - * @param array $config + * @param array $options + * @param int $index * - * @return bool * @throws \InvalidArgumentException */ - protected static function validateMandatoryOptions(array $config) + protected static function validateMandatoryOptions(array $options, $index) { - foreach (static::$mandatoryOptions as $option) { - if (empty($config[$option])) { - throw new \InvalidArgumentException('extra.' . static::CONFIG_MAIN_KEY . "[].{$option} is required!"); + foreach (static::$mandatoryOptions as $optionIndex => $type) { + if (!array_key_exists($optionIndex, $options)) { + throw new \InvalidArgumentException('extra.' . static::CONFIG_MAIN_KEY . "[$index].{$optionIndex} is required!"); } - switch ($option) { - case static::OPTION_KEY_INPUT: - static::validateIsArray($config[$option]); - break; - case static::OPTION_KEY_OUTPUT: - static::validateIsString($config[$option]); - break; + $callable = "is_{$type}"; + if (!$callable($options[$optionIndex])) { + throw new \InvalidArgumentException('extra.' . static::CONFIG_MAIN_KEY . "[$index].{$optionIndex} should be {$type}!"); } } - - return true; - } - - /** - * @param array $option - * - * @return bool - */ - protected static function validateIsArray($option) - { - if (!is_array($option)) { - throw new \InvalidArgumentException('extra.' . static::CONFIG_MAIN_KEY . '[]' . static::OPTION_KEY_INPUT . ' should be array!'); - } - - return true; - } - - /** - * @param string $option - * - * @return bool - */ - protected static function validateIsString($option) - { - if (!is_string($option)) { - throw new \InvalidArgumentException('extra.' . static::CONFIG_MAIN_KEY . '[]' . static::OPTION_KEY_OUTPUT . ' should string!'); - } - - return true; } } diff --git a/tests/phpunit/ScriptHandlerTest.php b/tests/phpunit/ScriptHandlerTest.php index 83fdd80..3ba63c4 100644 --- a/tests/phpunit/ScriptHandlerTest.php +++ b/tests/phpunit/ScriptHandlerTest.php @@ -72,88 +72,101 @@ public function validateConfigurationOnValid() ] ]; - $this->assertTrue($this->validateConfiguration($args)); + $this->assertNull($this->validateConfiguration($args)); } + /** + * @see ScriptHandler::validateConfiguration + * + * @param $args + * + * @return bool + */ private function validateConfiguration($args) { return $this->invokeMethod(new ScriptHandler(), 'validateConfiguration', [$args]); } /*** *************************** OPTIONS VALIDATION *************************** ***/ /** - * @see ScriptHandler::validateOptions + * @see ScriptHandler::validateMandatoryOptions * @test * * @expectedException \InvalidArgumentException */ public function validateOptionsExpectedExceptionOnMissingInput() { - $this->validateOptions([[ScriptHandler::OPTION_KEY_OUTPUT => 'output']]); + $this->validateMandatoryOptions([[ScriptHandler::OPTION_KEY_OUTPUT => 'output']]); } /** - * @see ScriptHandler::validateOptions + * @see ScriptHandler::validateMandatoryOptions * @test * * @expectedException \InvalidArgumentException */ public function validateOptionsExpectedExceptionOnMissingOutput() { - $this->validateOptions([ScriptHandler::OPTION_KEY_INPUT => 'input']); + $this->validateMandatoryOptions([ScriptHandler::OPTION_KEY_INPUT => 'input']); } /** - * @see ScriptHandler::validateOptions + * @see ScriptHandler::validateMandatoryOptions * @test * * @expectedException \InvalidArgumentException */ public function validateOptionsExpectedExceptionOnInputNotArray() { - $this->validateOptions([ + $this->validateMandatoryOptions([ ScriptHandler::OPTION_KEY_INPUT => 'string', ScriptHandler::OPTION_KEY_OUTPUT => 'string' ]); } /** - * @see ScriptHandler::validateOptions + * @see ScriptHandler::validateMandatoryOptions * @test * * @expectedException \InvalidArgumentException */ public function validateOptionsExpectedExceptionOnOutputNotString() { - $this->validateOptions([ + $this->validateMandatoryOptions([ ScriptHandler::OPTION_KEY_INPUT => ['string'], ScriptHandler::OPTION_KEY_OUTPUT => ['string'] ]); } /** - * @see ScriptHandler::validateOptions + * @see ScriptHandler::validateMandatoryOptions * @test + * + * @group tester */ public function validateOptionsOnValid() { - $this->assertTrue( - $this->validateOptions([ - ScriptHandler::OPTION_KEY_INPUT => ['string'], - ScriptHandler::OPTION_KEY_OUTPUT => 'string' - ]) + $this->assertNull( + $this->validateMandatoryOptions( + [ + ScriptHandler::OPTION_KEY_INPUT => ['string'], + ScriptHandler::OPTION_KEY_OUTPUT => 'string' + ] + ) ); } /** + * @see ScriptHandler::validateMandatoryOptions + * * @param array $config * * @return bool */ - private function validateOptions($config) + private function validateMandatoryOptions($config) { - return $this->invokeMethod(new ScriptHandler(), 'validateOptions', [[$config]]); + return $this->invokeMethod(new ScriptHandler(), 'validateMandatoryOptions', [$config, 1]); } - + /*** *************************** INTEGRATION *************************** ***/ /** * @see ScriptHandler::generateCSS pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy