From 9b4bd389cc3e983d5dac40af9512a7f4f0b91718 Mon Sep 17 00:00:00 2001 From: Matze Date: Wed, 24 Jul 2013 07:43:39 +0200 Subject: [PATCH 1/9] Introduce Lousson_Container as dependency in package.xml --- package.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/package.xml b/package.xml index d1e5942..e975880 100644 --- a/package.xml +++ b/package.xml @@ -66,6 +66,12 @@ ${contents} 3.0.0 3.999.9999 + + Lousson_Container + pear.lousson.org + 1.0.0 + 1.999.999 + Lousson_Sniffs pear.lousson.org From 308eb19052d9be3054b508a1d1066af236edbf2e Mon Sep 17 00:00:00 2001 From: Matze Date: Wed, 24 Jul 2013 09:32:52 +0200 Subject: [PATCH 2/9] Move builtin handlers and parsers one layer upwards --- .../Record/Builtin/BuiltinRecordFactory.php | 20 +++++++++---------- .../BuiltinRecordHandlerJSON.php | 4 ++-- .../{Handler => }/BuiltinRecordHandlerPHP.php | 4 ++-- .../BuiltinRecordHandlerYAML.php | 4 ++-- .../{Parser => }/BuiltinRecordParserINI.php | 4 ++-- .../BuiltinRecordHandlerJSONTest.php | 6 +++--- .../BuiltinRecordHandlerPHPTest.php | 6 +++--- .../BuiltinRecordHandlerYAMLTest.php | 6 +++--- .../BuiltinRecordParserINITest.php | 6 +++--- .../Generic/GenericRecordBuilderTest.php | 4 ++-- .../Generic/GenericRecordHandlerTest.php | 4 ++-- .../Generic/GenericRecordParserTest.php | 4 ++-- 12 files changed, 36 insertions(+), 36 deletions(-) rename src/php/Lousson/Record/Builtin/{Handler => }/BuiltinRecordHandlerJSON.php (98%) rename src/php/Lousson/Record/Builtin/{Handler => }/BuiltinRecordHandlerPHP.php (97%) rename src/php/Lousson/Record/Builtin/{Handler => }/BuiltinRecordHandlerYAML.php (98%) rename src/php/Lousson/Record/Builtin/{Parser => }/BuiltinRecordParserINI.php (97%) rename src/tests/unit-tests/php/Lousson/Record/Builtin/{Handler => }/BuiltinRecordHandlerJSONTest.php (97%) rename src/tests/unit-tests/php/Lousson/Record/Builtin/{Handler => }/BuiltinRecordHandlerPHPTest.php (96%) rename src/tests/unit-tests/php/Lousson/Record/Builtin/{Handler => }/BuiltinRecordHandlerYAMLTest.php (97%) rename src/tests/unit-tests/php/Lousson/Record/Builtin/{Parser => }/BuiltinRecordParserINITest.php (96%) diff --git a/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php b/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php index e871018..d3dc98a 100644 --- a/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php +++ b/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php @@ -215,9 +215,9 @@ public function hasRecordHandler($type) */ private $parsers = array( "application/textedit" => - "Lousson\\Record\\Builtin\\Parser\\BuiltinRecordParserINI", + "Lousson\\Record\\Builtin\\BuiltinRecordParserINI", "zz-application/zz-winassoc-ini" => - "Lousson\\Record\\Builtin\\Parser\\BuiltinRecordParserINI", + "Lousson\\Record\\Builtin\\BuiltinRecordParserINI", ); /** @@ -227,21 +227,21 @@ public function hasRecordHandler($type) */ private $handlers = array( "application/json" => - "Lousson\\Record\\Builtin\\Handler\\BuiltinRecordHandlerJSON", + "Lousson\\Record\\Builtin\\BuiltinRecordHandlerJSON", "application/vnd.php.serialized" => - "Lousson\\Record\\Builtin\\Handler\\BuiltinRecordHandlerPHP", + "Lousson\\Record\\Builtin\\BuiltinRecordHandlerPHP", "text/json" => - "Lousson\\Record\\Builtin\\Handler\\BuiltinRecordHandlerJSON", + "Lousson\\Record\\Builtin\\BuiltinRecordHandlerJSON", "text/x-json" => - "Lousson\\Record\\Builtin\\Handler\\BuiltinRecordHandlerJSON", + "Lousson\\Record\\Builtin\\BuiltinRecordHandlerJSON", "text/yaml" => - "Lousson\\Record\\Builtin\\Handler\\BuiltinRecordHandlerYAML", + "Lousson\\Record\\Builtin\\BuiltinRecordHandlerYAML", "text/x-yaml" => - "Lousson\\Record\\Builtin\\Handler\\BuiltinRecordHandlerYAML", + "Lousson\\Record\\Builtin\\BuiltinRecordHandlerYAML", "application/yaml" => - "Lousson\\Record\\Builtin\\Handler\\BuiltinRecordHandlerYAML", + "Lousson\\Record\\Builtin\\BuiltinRecordHandlerYAML", "application/x-yaml" => - "Lousson\\Record\\Builtin\\Handler\\BuiltinRecordHandlerYAML", + "Lousson\\Record\\Builtin\\BuiltinRecordHandlerYAML", ); } diff --git a/src/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerJSON.php b/src/php/Lousson/Record/Builtin/BuiltinRecordHandlerJSON.php similarity index 98% rename from src/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerJSON.php rename to src/php/Lousson/Record/Builtin/BuiltinRecordHandlerJSON.php index 195866d..7a3899c 100644 --- a/src/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerJSON.php +++ b/src/php/Lousson/Record/Builtin/BuiltinRecordHandlerJSON.php @@ -32,7 +32,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** - * Lousson\Record\Builtin\Handler\BuiltinRecordHandlerJSON definition + * Lousson\Record\Builtin\BuiltinRecordHandlerJSON definition * * @package org.lousson.record * @copyright (c) 2013, The Lousson Project @@ -40,7 +40,7 @@ * @author Mathias J. Hennig * @filesource */ -namespace Lousson\Record\Builtin\Handler; +namespace Lousson\Record\Builtin; /** Dependencies: */ use Lousson\Record\AnyRecordHandler; diff --git a/src/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerPHP.php b/src/php/Lousson/Record/Builtin/BuiltinRecordHandlerPHP.php similarity index 97% rename from src/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerPHP.php rename to src/php/Lousson/Record/Builtin/BuiltinRecordHandlerPHP.php index e7641e2..ce63ef6 100644 --- a/src/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerPHP.php +++ b/src/php/Lousson/Record/Builtin/BuiltinRecordHandlerPHP.php @@ -32,7 +32,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** - * Lousson\Record\Builtin\Handler\BuiltinRecordHandlerPHP class definition + * Lousson\Record\Builtin\BuiltinRecordHandlerPHP class definition * * @package org.lousson.record * @copyright (c) 2013, The Lousson Project @@ -40,7 +40,7 @@ * @author Mathias J. Hennig * @filesource */ -namespace Lousson\Record\Builtin\Handler; +namespace Lousson\Record\Builtin; /** Dependencies: */ use Lousson\Record\AnyRecordHandler; diff --git a/src/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerYAML.php b/src/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAML.php similarity index 98% rename from src/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerYAML.php rename to src/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAML.php index 859eb33..34abb2c 100644 --- a/src/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerYAML.php +++ b/src/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAML.php @@ -32,7 +32,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** - * Lousson\Record\Builtin\Handler\BuiltinRecordHandlerYAML definition + * Lousson\Record\Builtin\BuiltinRecordHandlerYAML definition * * @package org.lousson.record * @copyright (c) 2013, The Lousson Project @@ -40,7 +40,7 @@ * @author Attila G. Levai * @filesource */ -namespace Lousson\Record\Builtin\Handler; +namespace Lousson\Record\Builtin; /** Interfaces: */ use Lousson\Record\AnyRecordHandler; diff --git a/src/php/Lousson/Record/Builtin/Parser/BuiltinRecordParserINI.php b/src/php/Lousson/Record/Builtin/BuiltinRecordParserINI.php similarity index 97% rename from src/php/Lousson/Record/Builtin/Parser/BuiltinRecordParserINI.php rename to src/php/Lousson/Record/Builtin/BuiltinRecordParserINI.php index b92d630..901a861 100644 --- a/src/php/Lousson/Record/Builtin/Parser/BuiltinRecordParserINI.php +++ b/src/php/Lousson/Record/Builtin/BuiltinRecordParserINI.php @@ -32,7 +32,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** - * Lousson\Record\Builtin\Parser\BuiltinRecordParserINI class definition + * Lousson\Record\Builtin\BuiltinRecordParserINI class definition * * @package org.lousson.record * @copyright (c) 2013, The Lousson Project @@ -40,7 +40,7 @@ * @author Mathias J. Hennig * @filesource */ -namespace Lousson\Record\Builtin\Parser; +namespace Lousson\Record\Builtin; /** Dependencies: */ use Lousson\Record\AnyRecordParser; diff --git a/src/tests/unit-tests/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerJSONTest.php b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerJSONTest.php similarity index 97% rename from src/tests/unit-tests/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerJSONTest.php rename to src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerJSONTest.php index 2302028..406c014 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerJSONTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerJSONTest.php @@ -32,7 +32,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** - * Lousson\Record\Builtin\Builder\BuiltinRecordHandlerJSONTest definition + * Lousson\Record\Builtin\BuiltinRecordHandlerJSONTest definition * * @package org.lousson.record * @copyright (c) 2013, The Lousson Project @@ -40,11 +40,11 @@ * @author Mathias J. Hennig * @filesource */ -namespace Lousson\Record\Builtin\Builder; +namespace Lousson\Record\Builtin; /** Dependencies: */ use Lousson\Record\AbstractRecordHandlerTest; -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerJSON; +use Lousson\Record\Builtin\BuiltinRecordHandlerJSON; use ReflectionException; use ReflectionMethod; diff --git a/src/tests/unit-tests/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerPHPTest.php b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerPHPTest.php similarity index 96% rename from src/tests/unit-tests/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerPHPTest.php rename to src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerPHPTest.php index 27a7a38..1aa5956 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerPHPTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerPHPTest.php @@ -32,7 +32,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** - * Lousson\Record\Builtin\Handler\BuiltinRecordHandlerPHPTest definition + * Lousson\Record\Builtin\BuiltinRecordHandlerPHPTest definition * * @package org.lousson.record * @copyright (c) 2013, The Lousson Project @@ -40,11 +40,11 @@ * @author Mathias J. Hennig * @filesource */ -namespace Lousson\Record\Builtin\Handler; +namespace Lousson\Record\Builtin; /** Dependencies: */ use Lousson\Record\AbstractRecordHandlerTest; -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerPHP; +use Lousson\Record\Builtin\BuiltinRecordHandlerPHP; /** * A test case for the builtin PHP record builder diff --git a/src/tests/unit-tests/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerYAMLTest.php b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAMLTest.php similarity index 97% rename from src/tests/unit-tests/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerYAMLTest.php rename to src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAMLTest.php index b846854..b05802e 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Builtin/Handler/BuiltinRecordHandlerYAMLTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAMLTest.php @@ -32,7 +32,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** - * Lousson\Record\Builtin\Handler\BuiltinRecordHandlerYAMLTest definition + * Lousson\Record\Builtin\BuiltinRecordHandlerYAMLTest definition * * @package org.lousson.record * @copyright (c) 2013, The Lousson Project @@ -40,11 +40,11 @@ * @author Attila G. Levai * @filesource */ -namespace Lousson\Record\Builtin\Handler; +namespace Lousson\Record\Builtin; /** Dependencies: */ use Lousson\Record\AbstractRecordHandlerTest; -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerYAML; +use Lousson\Record\Builtin\BuiltinRecordHandlerYAML; use ReflectionException; use ReflectionMethod; diff --git a/src/tests/unit-tests/php/Lousson/Record/Builtin/Parser/BuiltinRecordParserINITest.php b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordParserINITest.php similarity index 96% rename from src/tests/unit-tests/php/Lousson/Record/Builtin/Parser/BuiltinRecordParserINITest.php rename to src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordParserINITest.php index a01b7ea..a653add 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Builtin/Parser/BuiltinRecordParserINITest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordParserINITest.php @@ -32,7 +32,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** - * Lousson\Record\Builtin\Parser\BuiltinRecordParserINITest definition + * Lousson\Record\Builtin\BuiltinRecordParserINITest definition * * @package org.lousson.record * @copyright (c) 2013, The Lousson Project @@ -40,11 +40,11 @@ * @author Mathias J. Hennig * @filesource */ -namespace Lousson\Record\Builtin\Parser; +namespace Lousson\Record\Builtin; /** Dependencies: */ use Lousson\Record\AbstractRecordHandlerTest; -use Lousson\Record\Builtin\Parser\BuiltinRecordParserINI; +use Lousson\Record\Builtin\BuiltinRecordParserINI; use ReflectionException; use ReflectionMethod; diff --git a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordBuilderTest.php b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordBuilderTest.php index e1942cd..d41d853 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordBuilderTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordBuilderTest.php @@ -43,8 +43,8 @@ namespace Lousson\Record\Generic; /** Dependencies: */ -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerPHP; -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerPHPTest; +use Lousson\Record\Builtin\BuiltinRecordHandlerPHP; +use Lousson\Record\Builtin\BuiltinRecordHandlerPHPTest; use Lousson\Record\Error\RecordRuntimeError; use Lousson\Record\Generic\GenericRecordBuilder; use Closure; diff --git a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordHandlerTest.php b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordHandlerTest.php index a048f48..0c56fae 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordHandlerTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordHandlerTest.php @@ -43,8 +43,8 @@ namespace Lousson\Record\Generic; /** Dependencies: */ -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerPHP; -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerPHPTest; +use Lousson\Record\Builtin\BuiltinRecordHandlerPHP; +use Lousson\Record\Builtin\BuiltinRecordHandlerPHPTest; use Lousson\Record\Generic\GenericRecordHandler; /** diff --git a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordParserTest.php b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordParserTest.php index e71a302..1d0ae51 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordParserTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordParserTest.php @@ -43,8 +43,8 @@ namespace Lousson\Record\Generic; /** Dependencies: */ -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerPHP; -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerPHPTest; +use Lousson\Record\Builtin\BuiltinRecordHandlerPHP; +use Lousson\Record\Builtin\BuiltinRecordHandlerPHPTest; use Lousson\Record\Error\RecordRuntimeError; use Lousson\Record\Generic\GenericRecordParser; use Closure; From b4b83adc6adb0013a3dcabb03d95754dcd339d47 Mon Sep 17 00:00:00 2001 From: Matze Date: Mon, 29 Jul 2013 02:57:12 +0200 Subject: [PATCH 3/9] Introduce basic plugin system --- phpunit.xml.dist | 1 + src/php/Lousson/Record/AnyRecordPlugin.php | 70 ++++++ .../Record/Builtin/BuiltinRecordFactory.php | 228 +++++++++++++----- src/php/Lousson/Record/Plugin/INI.php | 91 +++++++ src/php/Lousson/Record/Plugin/JSON.php | 92 +++++++ src/php/Lousson/Record/Plugin/PHP.php | 89 +++++++ src/php/Lousson/Record/Plugin/YAML.php | 92 +++++++ 7 files changed, 608 insertions(+), 55 deletions(-) create mode 100644 src/php/Lousson/Record/AnyRecordPlugin.php create mode 100644 src/php/Lousson/Record/Plugin/INI.php create mode 100644 src/php/Lousson/Record/Plugin/JSON.php create mode 100644 src/php/Lousson/Record/Plugin/PHP.php create mode 100644 src/php/Lousson/Record/Plugin/YAML.php diff --git a/phpunit.xml.dist b/phpunit.xml.dist index dcb7422..7cf0d2e 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -22,6 +22,7 @@ src/php/Lousson/Record/AnyRecordHandler.php src/php/Lousson/Record/AnyRecordManager.php src/php/Lousson/Record/AnyRecordParser.php + src/php/Lousson/Record/AnyRecordPlugin.php diff --git a/src/php/Lousson/Record/AnyRecordPlugin.php b/src/php/Lousson/Record/AnyRecordPlugin.php new file mode 100644 index 0000000..c448f60 --- /dev/null +++ b/src/php/Lousson/Record/AnyRecordPlugin.php @@ -0,0 +1,70 @@ + + * @filesource + */ +namespace Lousson\Record; + +/** Dependencies: */ +use Lousson\Container\Generic\GenericContainer; + +/** + * An interface for record plugins + * + * The AnyRecordPlugin interface declares the API to be provided by + * plugin loader classes, e.g. in the Lousson\Record\Plugin namespace. + * + * @since lousson/Lousson_Record-2.0.0 + * @package org.lousson.record + */ +interface AnyRecordPlugin +{ + /** + * Set up and register the plugin + * + * The bootstrap() method is used by e.g. the BuiltinRecordFactory, + * in order to load, set up and register the plugin with the context + * plugin $container. + * + * @param GenericContainer $container The plugin container + */ + public static function bootstrap(GenericContainer $container); +} + diff --git a/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php b/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php index d3dc98a..579df89 100644 --- a/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php +++ b/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php @@ -42,11 +42,21 @@ */ namespace Lousson\Record\Builtin; -/** Dependencies: */ +/** Interfaces: */ +use Lousson\Container\AnyContainer; +use Lousson\Record\AnyRecordBuilder; +use Lousson\Record\AnyRecordHandler; use Lousson\Record\AnyRecordFactory; +use Lousson\Record\AnyRecordParser; +use Lousson\Record\AnyRecordPlugin; + +/** Dependencies: */ +use Lousson\Container\Generic\GenericContainerDecorator; +use Lousson\Container\Generic\GenericContainer; use Lousson\Record\Builtin\BuiltinRecordUtil; + +/** Exceptions: */ use Lousson\Record\Error\RecordRuntimeError; -use Lousson\Record\Generic\GenericRecordHandler; /** * The builtin record factory @@ -60,6 +70,24 @@ */ class BuiltinRecordFactory implements AnyRecordFactory { + /** + * Create a container instance + * + * The constructor allows the caller to provide a custom container + * instance to be used as root when loading plugins - instead of the + * default, empty one. + * + * @param AnyContainer $container The factory container + */ + public function __construct(AnyContainer $container = null) + { + if (null === $container) { + $container = new GenericContainer(); + } + + $this->root = $container; + } + /** * Obtain a record parser * @@ -77,13 +105,9 @@ class BuiltinRecordFactory implements AnyRecordFactory */ public function getRecordParser($type) { - $normalizedType = BuiltinRecordUtil::normalizeType($type); + $parser = $this->getRecordEntity($type, "record.parser"); - if (isset($this->parsers[$normalizedType])) { - $class = $this->parsers[$normalizedType]; - $parser = new $class(); - } - else { + if (!$parser instanceof AnyRecordParser) { $parser = $this->getRecordHandler($type); } @@ -107,7 +131,12 @@ public function getRecordParser($type) */ public function getRecordBuilder($type) { - $builder = $this->getRecordHandler($type); + $builder = $this->getRecordEntity($type, "record.builder"); + + if (!$builder instanceof AnyRecordBuilder) { + $builder = $this->getRecordHandler($type); + } + return $builder; } @@ -128,14 +157,10 @@ public function getRecordBuilder($type) */ public function getRecordHandler($type) { - $normalizedType = BuiltinRecordUtil::normalizeType($type); + $handler = $this->getRecordEntity($type, "record.handler"); - if (isset($this->handlers[$normalizedType])) { - $class = $this->handlers[$normalizedType]; - $handler = new $class(); - } - else { - $message = "Could not provide \"$normalizedType\" handler"; + if (!$handler instanceof AnyRecordHandler) { + $message = "Could not provide \"$type\" handler"; $code = RecordRuntimeError::E_NOT_SUPPORTED; throw new RecordRuntimeError($message, $code); } @@ -157,12 +182,14 @@ public function getRecordHandler($type) */ public function hasRecordParser($type) { - $normalizedType = BuiltinRecordUtil::normalizeType($type); - $hasRecordParser = - isset($this->handlers[$normalizedType]) || - isset($this->parsers[$normalizedType]); + $parser = $this->getRecordEntity($type, "record.parser"); + $hasParser = $parser instanceof AnyRecordParser; - return $hasRecordParser; + if (!$hasParser) { + $hasParser = $this->hasRecordHandler($type); + } + + return $hasParser; } /** @@ -179,12 +206,14 @@ public function hasRecordParser($type) */ public function hasRecordBuilder($type) { - $normalizedType = BuiltinRecordUtil::normalizeType($type); - $hasRecordBuilder = - isset($this->handlers[$normalizedType]) || - isset($this->builders[$normalizedType]); + $builder = $this->getRecordEntity($type, "record.builder"); + $hasBuilder = $builder instanceof AnyRecordBuilder; - return $hasRecordBuilder; + if (!$hasBuilder) { + $hasBuilder = $this->hasRecordHandler($type); + } + + return $hasBuilder; } /** @@ -201,47 +230,136 @@ public function hasRecordBuilder($type) */ public function hasRecordHandler($type) { - $hasRecordParser = $this->hasRecordParser($type); - $hasRecordBuilder = $this->hasRecordBuilder($type); - $hasRecordHandler = $hasRecordParser && $hasRecordBuilder; + $handler = $this->getRecordEntity($type, "record.handler"); + $hasHandler = $handler instanceof AnyRecordHandler; + return $hasHandler; + } + + /** + * Obtain an entity instance + * + * The getRecordEntity() method is used internally to retrieve the + * object that is associated with the given $name from the container + * associated with the given mime $type. + * + * @param string $type The media type + * @param string $name The entity name + * + * @return object + * An object is returned on success, NULL otherwise + * + * @throws \Lousson\Record\AnyRecordException + * All exceptions raised implement this interface + * + * @throws \InvalidArgumentException + * Raised in case the $type parameter is malformed + */ + protected function getRecordEntity($type, $name) + { + $type = BuiltinRecordUtil::normalizeType($type); + $container = $this->getRecordContainer($type); + $entity = $container->get($name)->orNull()->asObject(); + return $entity; + } + + /** + * Obtain a container instance + * + * The getRecordContainer() method is used internally to retrieve + * the container associated with the given media $type. If no such + * container is found, the default container is returned. + * + * @param string $type The media type + * + * @return \Lousson\Container\AnyContainer + * A container instance is returned on success + */ + private function getRecordContainer($type) + { + if (!isset($this->containers)) { + $this->loadRecordContainers(); + } - return $hasRecordHandler; + if (isset($this->containers[$type])) { + $container = $this->containers[$type]; + } + else { + $container = $this->root; + } + + return $container; } /** - * A register of builtin parser classes + * Populate the $containers member + * + * The loadRecordContainers() method is used internally to load the + * plugins to be bound to the factory, populating the $containers for + * later use via getRecordContainer(). + */ + private function loadRecordContainers() + { + $plugins = $this->root + ->get("record.plugins") + ->orFallback(self::$plugins) + ->asArray(); + + $plugins = array_filter( + $plugins, function($className) { + return class_exists($className) && is_subclass_of( + $className, "Lousson\\Record\\AnyRecordPlugin" + ); + } + ); + + foreach ($plugins as $className) try { + + $child = new GenericContainerDecorator($this->root); + call_user_func(array($className, "bootstrap"), $child); + + $typeList = $child + ->get("record.types") + ->orFallback(array()) + ->asArray(); + + foreach ($typeList as $type) { + $this->containers[$type] = $child; + } + } + catch (\Exception $error) { + $message = "While loading $className plugin: Caught $error"; + trigger_error($message, E_USER_WARNING); + } + + if (empty($this->containers)) { + $this->containers = array(); + } + } + + /** + * The default plugins that ship with the package * * @var array */ - private $parsers = array( - "application/textedit" => - "Lousson\\Record\\Builtin\\BuiltinRecordParserINI", - "zz-application/zz-winassoc-ini" => - "Lousson\\Record\\Builtin\\BuiltinRecordParserINI", + private static $plugins = array( + "Lousson\\Record\\Plugin\\INI", + "Lousson\\Record\\Plugin\\JSON", + "Lousson\\Record\\Plugin\\PHP", + "Lousson\\Record\\Plugin\\YAML", ); /** - * A register of builtin handler classes + * The containers loaded from plugins * * @var array */ - private $handlers = array( - "application/json" => - "Lousson\\Record\\Builtin\\BuiltinRecordHandlerJSON", - "application/vnd.php.serialized" => - "Lousson\\Record\\Builtin\\BuiltinRecordHandlerPHP", - "text/json" => - "Lousson\\Record\\Builtin\\BuiltinRecordHandlerJSON", - "text/x-json" => - "Lousson\\Record\\Builtin\\BuiltinRecordHandlerJSON", - "text/yaml" => - "Lousson\\Record\\Builtin\\BuiltinRecordHandlerYAML", - "text/x-yaml" => - "Lousson\\Record\\Builtin\\BuiltinRecordHandlerYAML", - "application/yaml" => - "Lousson\\Record\\Builtin\\BuiltinRecordHandlerYAML", - "application/x-yaml" => - "Lousson\\Record\\Builtin\\BuiltinRecordHandlerYAML", - ); + private $containers; + + /** + * The root container provided at construction time + * + * @var \Lousson\Container\AnyContainer + */ + private $root; } diff --git a/src/php/Lousson/Record/Plugin/INI.php b/src/php/Lousson/Record/Plugin/INI.php new file mode 100644 index 0000000..322dbe6 --- /dev/null +++ b/src/php/Lousson/Record/Plugin/INI.php @@ -0,0 +1,91 @@ + + * @filesource + */ +namespace Lousson\Record\Plugin; + +/** Interfaces: */ +use Lousson\Container\AnyContainer; +use Lousson\Record\AnyRecordPlugin; + +/** Dependencies: */ +use Lousson\Container\Generic\GenericContainer; +use Lousson\Record\Builtin\BuiltinRecordParserINI; + +/** + * A INI record plugin + * + * The Lousson\Record\Plugin\INI class is a plugin for e.g. the builtin + * record factory that ships with the Lousson_Record package, providing a + * INI record parser - including a set of associated mime-types. + * + * @since lousson/Lousson_Record-2.0.0 + * @package org.lousson.record + */ +class INI implements AnyRecordPlugin +{ + /** + * Set up and register the INI plugin + * + * The bootstrap() method is used by e.g. the BuiltinRecordFactory, + * in order to load, set up and register the plugin with the factory's + * plugin $container. + * + * @param GenericContainer $container The plugin container + */ + public static function bootstrap(GenericContainer $container) + { + $callback = function(AnyContainer $container, $name) { + $parser = new BuiltinRecordParserINI(); + return $parser; + }; + + $types = array( + "application/textedit", + "text/plain", + "zz-application/zz-winassoc-ini", + ); + + $container->share("record.parser", $callback); + $container->share("record.types", $types); + } +} + diff --git a/src/php/Lousson/Record/Plugin/JSON.php b/src/php/Lousson/Record/Plugin/JSON.php new file mode 100644 index 0000000..2d44a23 --- /dev/null +++ b/src/php/Lousson/Record/Plugin/JSON.php @@ -0,0 +1,92 @@ + + * @filesource + */ +namespace Lousson\Record\Plugin; + +/** Interfaces: */ +use Lousson\Container\AnyContainer; +use Lousson\Record\AnyRecordPlugin; + +/** Dependencies: */ +use Lousson\Container\Generic\GenericContainer; +use Lousson\Record\Builtin\BuiltinRecordHandlerJSON; + +/** + * A JSON record plugin + * + * The Lousson\Record\Plugin\JSON class is a plugin for e.g. the builtin + * record factory that ships with the Lousson_Record package, providing a + * JSON record handler - including a set of associated mime-types. + * + * @since lousson/Lousson_Record-2.0.0 + * @package org.lousson.record + */ +class JSON implements AnyRecordPlugin +{ + /** + * Set up and register the JSON plugin + * + * The bootstrap() method is used by e.g. the BuiltinRecordFactory, + * in order to load, set up and register the plugin with the factory's + * plugin $container. + * + * @param GenericContainer $container The plugin container + */ + public static function bootstrap(GenericContainer $container) + { + $callback = function(AnyContainer $container, $name) { + $handler = new BuiltinRecordHandlerJSON(); + return $handler; + }; + + $types = array( + "application/json", + "application/x-json", + "text/json", + "text/x-json", + ); + + $container->share("record.handler", $callback); + $container->share("record.types", $types); + } +} + diff --git a/src/php/Lousson/Record/Plugin/PHP.php b/src/php/Lousson/Record/Plugin/PHP.php new file mode 100644 index 0000000..8160ec6 --- /dev/null +++ b/src/php/Lousson/Record/Plugin/PHP.php @@ -0,0 +1,89 @@ + + * @filesource + */ +namespace Lousson\Record\Plugin; + +/** Interfaces: */ +use Lousson\Container\AnyContainer; +use Lousson\Record\AnyRecordPlugin; + +/** Dependencies: */ +use Lousson\Container\Generic\GenericContainer; +use Lousson\Record\Builtin\BuiltinRecordHandlerPHP; + +/** + * A PHP record plugin + * + * The Lousson\Record\Plugin\PHP class is a plugin for e.g. the builtin + * record factory that ships with the Lousson_Record package, providing a + * PHP record handler - including a set of associated mime-types. + * + * @since lousson/Lousson_Record-2.0.0 + * @package org.lousson.record + */ +class PHP implements AnyRecordPlugin +{ + /** + * Set up and register the PHP plugin + * + * The bootstrap() method is used by e.g. the BuiltinRecordFactory, + * in order to load, set up and register the plugin with the factory's + * plugin $container. + * + * @param GenericContainer $container The plugin container + */ + public static function bootstrap(GenericContainer $container) + { + $callback = function(AnyContainer $container, $name) { + $handler = new BuiltinRecordHandlerPHP(); + return $handler; + }; + + $types = array( + "application/vnd.php.serialized", + ); + + $container->share("record.handler", $callback); + $container->share("record.types", $types); + } +} + diff --git a/src/php/Lousson/Record/Plugin/YAML.php b/src/php/Lousson/Record/Plugin/YAML.php new file mode 100644 index 0000000..b49c45d --- /dev/null +++ b/src/php/Lousson/Record/Plugin/YAML.php @@ -0,0 +1,92 @@ + + * @filesource + */ +namespace Lousson\Record\Plugin; + +/** Interfaces: */ +use Lousson\Container\AnyContainer; +use Lousson\Record\AnyRecordPlugin; + +/** Dependencies: */ +use Lousson\Container\Generic\GenericContainer; +use Lousson\Record\Builtin\BuiltinRecordHandlerYAML; + +/** + * A YAML record plugin + * + * The Lousson\Record\Plugin\YAML class is a plugin for e.g. the builtin + * record factory that ships with the Lousson_Record package, providing a + * YAML record handler - including a set of associated mime-types. + * + * @since lousson/Lousson_Record-2.0.0 + * @package org.lousson.record + */ +class YAML implements AnyRecordPlugin +{ + /** + * Set up and register the YAML plugin + * + * The bootstrap() method is used by e.g. the BuiltinRecordFactory, + * in order to load, set up and register the plugin with the factory's + * plugin $container. + * + * @param GenericContainer $container The plugin container + */ + public static function bootstrap(GenericContainer $container) + { + $callback = function(AnyContainer $container, $name) { + $handler = new BuiltinRecordHandlerYAML(); + return $handler; + }; + + $types = array( + "application/yaml", + "application/x-yaml", + "text/yaml", + "text/x-yaml", + ); + + $container->share("record.handler", $callback); + $container->share("record.types", $types); + } +} + From 9143aee4f6b0508e2c6275716fb8fc8cd430dbee Mon Sep 17 00:00:00 2001 From: Matze Date: Mon, 29 Jul 2013 04:50:31 +0200 Subject: [PATCH 4/9] Fix "use" statements not rewritten yet --- .../Lousson/Record/Generic/GenericRecordFactoryBasicTest.php | 4 ++-- .../php/Lousson/Record/Generic/GenericRecordFactoryTest.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordFactoryBasicTest.php b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordFactoryBasicTest.php index 9fa2d5f..09a5bc2 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordFactoryBasicTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordFactoryBasicTest.php @@ -47,8 +47,8 @@ use Lousson\Record\AnyRecordBuilder; use Lousson\Record\AnyRecordParser; use Lousson\Record\Builtin\BuiltinRecordFactory; -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerJSON; -use Lousson\Record\Builtin\Parser\BuiltinRecordParserINI; +use Lousson\Record\Builtin\BuiltinRecordHandlerJSON; +use Lousson\Record\Builtin\BuiltinRecordParserINI; use Lousson\Record\Generic\GenericRecordFactory; use Lousson\Record\Generic\GenericRecordHandler; diff --git a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordFactoryTest.php b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordFactoryTest.php index 251141d..e9c9d91 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordFactoryTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Generic/GenericRecordFactoryTest.php @@ -47,8 +47,8 @@ use Lousson\Record\AnyRecordBuilder; use Lousson\Record\AnyRecordParser; use Lousson\Record\Builtin\BuiltinRecordFactory; -use Lousson\Record\Builtin\Handler\BuiltinRecordHandlerJSON; -use Lousson\Record\Builtin\Parser\BuiltinRecordParserINI; +use Lousson\Record\Builtin\BuiltinRecordHandlerJSON; +use Lousson\Record\Builtin\BuiltinRecordParserINI; use Lousson\Record\Generic\GenericRecordFactory; /** From 762576d59ef88cb0760385945c35e9e24ccce645 Mon Sep 17 00:00:00 2001 From: Matze Date: Tue, 30 Jul 2013 09:41:45 +0200 Subject: [PATCH 5/9] Increase version of Lousson_Container dependency to 1.1.1 --- package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.xml b/package.xml index e975880..190e1c2 100644 --- a/package.xml +++ b/package.xml @@ -69,7 +69,7 @@ ${contents} Lousson_Container pear.lousson.org - 1.0.0 + 1.1.1 1.999.999 From 05e06a7d83ad03273e72cb465be367d3222995a0 Mon Sep 17 00:00:00 2001 From: Matze Date: Wed, 31 Jul 2013 07:23:29 +0200 Subject: [PATCH 6/9] Let files created during tests become removed --- .../unit-tests/php/Lousson/Record/AbstractRecordManagerTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tests/unit-tests/php/Lousson/Record/AbstractRecordManagerTest.php b/src/tests/unit-tests/php/Lousson/Record/AbstractRecordManagerTest.php index 0c83849..6ec2102 100644 --- a/src/tests/unit-tests/php/Lousson/Record/AbstractRecordManagerTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/AbstractRecordManagerTest.php @@ -142,6 +142,8 @@ public function smokeTest(array $data, $type = null) "The %s::loadRecord() method must return the same value ". "formerly saved via saveRecord()", $managerClass )); + + unlink($location); } } From d0b1c0b7a9b0409e432998bb228216f66f2f6e81 Mon Sep 17 00:00:00 2001 From: Matze Date: Wed, 31 Jul 2013 07:33:19 +0200 Subject: [PATCH 7/9] Switch to a GenericContainer::alias() based type association --- package.xml | 2 +- .../Record/Builtin/BuiltinRecordFactory.php | 47 ++++--------------- src/php/Lousson/Record/Plugin/INI.php | 12 ++--- src/php/Lousson/Record/Plugin/JSON.php | 14 +++--- src/php/Lousson/Record/Plugin/PHP.php | 8 +--- src/php/Lousson/Record/Plugin/YAML.php | 14 +++--- .../Record/AbstractRecordManagerTest.php | 2 + 7 files changed, 34 insertions(+), 65 deletions(-) diff --git a/package.xml b/package.xml index 190e1c2..adb3d88 100644 --- a/package.xml +++ b/package.xml @@ -69,7 +69,7 @@ ${contents} Lousson_Container pear.lousson.org - 1.1.1 + 1.1.2 1.999.999 diff --git a/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php b/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php index 579df89..03c8abb 100644 --- a/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php +++ b/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php @@ -48,7 +48,6 @@ use Lousson\Record\AnyRecordHandler; use Lousson\Record\AnyRecordFactory; use Lousson\Record\AnyRecordParser; -use Lousson\Record\AnyRecordPlugin; /** Dependencies: */ use Lousson\Container\Generic\GenericContainerDecorator; @@ -257,37 +256,20 @@ public function hasRecordHandler($type) protected function getRecordEntity($type, $name) { $type = BuiltinRecordUtil::normalizeType($type); - $container = $this->getRecordContainer($type); - $entity = $container->get($name)->orNull()->asObject(); - return $entity; - } + $entity = null; + $index = "$name.$type"; - /** - * Obtain a container instance - * - * The getRecordContainer() method is used internally to retrieve - * the container associated with the given media $type. If no such - * container is found, the default container is returned. - * - * @param string $type The media type - * - * @return \Lousson\Container\AnyContainer - * A container instance is returned on success - */ - private function getRecordContainer($type) - { if (!isset($this->containers)) { $this->loadRecordContainers(); } - if (isset($this->containers[$type])) { - $container = $this->containers[$type]; - } - else { - $container = $this->root; + foreach ($this->containers as $container) { + if ($entity = $container->get($index)->orNull()->asObject()) { + break; + } } - return $container; + return $entity; } /** @@ -313,27 +295,16 @@ private function loadRecordContainers() ); foreach ($plugins as $className) try { - $child = new GenericContainerDecorator($this->root); call_user_func(array($className, "bootstrap"), $child); - - $typeList = $child - ->get("record.types") - ->orFallback(array()) - ->asArray(); - - foreach ($typeList as $type) { - $this->containers[$type] = $child; - } + $this->containers[] = $child; } catch (\Exception $error) { $message = "While loading $className plugin: Caught $error"; trigger_error($message, E_USER_WARNING); } - if (empty($this->containers)) { - $this->containers = array(); - } + $this->containers[] = $this->root; } /** diff --git a/src/php/Lousson/Record/Plugin/INI.php b/src/php/Lousson/Record/Plugin/INI.php index 322dbe6..f83532f 100644 --- a/src/php/Lousson/Record/Plugin/INI.php +++ b/src/php/Lousson/Record/Plugin/INI.php @@ -78,14 +78,14 @@ public static function bootstrap(GenericContainer $container) return $parser; }; - $types = array( - "application/textedit", - "text/plain", - "zz-application/zz-winassoc-ini", + $aliases = array( + "record.parser.application/textedit", + "record.parser.text/plain", + "record.parser.zz-application/zz-winassoc-ini", ); - $container->share("record.parser", $callback); - $container->share("record.types", $types); + $container->share("record.parser.ini", $callback); + $container->alias("record.parser.ini", $aliases); } } diff --git a/src/php/Lousson/Record/Plugin/JSON.php b/src/php/Lousson/Record/Plugin/JSON.php index 2d44a23..12e7bf8 100644 --- a/src/php/Lousson/Record/Plugin/JSON.php +++ b/src/php/Lousson/Record/Plugin/JSON.php @@ -78,15 +78,15 @@ public static function bootstrap(GenericContainer $container) return $handler; }; - $types = array( - "application/json", - "application/x-json", - "text/json", - "text/x-json", + $aliases = array( + "record.handler.application/json", + "record.handler.application/x-json", + "record.handler.text/json", + "record.handler.text/x-json", ); - $container->share("record.handler", $callback); - $container->share("record.types", $types); + $container->share("record.handler.json", $callback); + $container->alias("record.handler.json", $aliases); } } diff --git a/src/php/Lousson/Record/Plugin/PHP.php b/src/php/Lousson/Record/Plugin/PHP.php index 8160ec6..31ab68c 100644 --- a/src/php/Lousson/Record/Plugin/PHP.php +++ b/src/php/Lousson/Record/Plugin/PHP.php @@ -78,12 +78,8 @@ public static function bootstrap(GenericContainer $container) return $handler; }; - $types = array( - "application/vnd.php.serialized", - ); - - $container->share("record.handler", $callback); - $container->share("record.types", $types); + $name = "record.handler.application/vnd.php.serialized"; + $container->share($name, $callback); } } diff --git a/src/php/Lousson/Record/Plugin/YAML.php b/src/php/Lousson/Record/Plugin/YAML.php index b49c45d..fb9299c 100644 --- a/src/php/Lousson/Record/Plugin/YAML.php +++ b/src/php/Lousson/Record/Plugin/YAML.php @@ -78,15 +78,15 @@ public static function bootstrap(GenericContainer $container) return $handler; }; - $types = array( - "application/yaml", - "application/x-yaml", - "text/yaml", - "text/x-yaml", + $aliases = array( + "record.handler.application/yaml", + "record.handler.application/x-yaml", + "record.handler.text/yaml", + "record.handler.text/x-yaml", ); - $container->share("record.handler", $callback); - $container->share("record.types", $types); + $container->share("record.handler.yaml", $callback); + $container->alias("record.handler.yaml", $aliases); } } diff --git a/src/tests/unit-tests/php/Lousson/Record/AbstractRecordManagerTest.php b/src/tests/unit-tests/php/Lousson/Record/AbstractRecordManagerTest.php index 0c83849..6ec2102 100644 --- a/src/tests/unit-tests/php/Lousson/Record/AbstractRecordManagerTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/AbstractRecordManagerTest.php @@ -142,6 +142,8 @@ public function smokeTest(array $data, $type = null) "The %s::loadRecord() method must return the same value ". "formerly saved via saveRecord()", $managerClass )); + + unlink($location); } } From 4a78b9babb297757fe70acaf0a2d789b215aa91a Mon Sep 17 00:00:00 2001 From: Matze Date: Wed, 31 Jul 2013 08:04:50 +0200 Subject: [PATCH 8/9] Remove initial release note --- package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.xml b/package.xml index d1e5942..00ad7ce 100644 --- a/package.xml +++ b/package.xml @@ -43,7 +43,7 @@ New BSD License - Initial release. + - From aa68fd52050dd4b3de397f22e8a6dd99483a81b4 Mon Sep 17 00:00:00 2001 From: Matze Date: Thu, 1 Aug 2013 16:15:32 +0200 Subject: [PATCH 9/9] Remove builtin YAML support --- package.xml | 6 - .../Record/Builtin/BuiltinRecordFactory.php | 1 - .../Builtin/BuiltinRecordHandlerYAML.php | 167 ---------------- src/php/Lousson/Record/Plugin/YAML.php | 92 --------- .../Builtin/BuiltinRecordFactoryTest.php | 8 - .../Builtin/BuiltinRecordHandlerYAMLTest.php | 182 ------------------ 6 files changed, 456 deletions(-) delete mode 100644 src/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAML.php delete mode 100644 src/php/Lousson/Record/Plugin/YAML.php delete mode 100644 src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAMLTest.php diff --git a/package.xml b/package.xml index 93809f8..d984b81 100644 --- a/package.xml +++ b/package.xml @@ -83,12 +83,6 @@ ${contents} 1.0.0 1.999.999 - - Yaml - pear.symfony.com - 2.3.1 - 2.999.999 - diff --git a/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php b/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php index 03c8abb..8ef36b0 100644 --- a/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php +++ b/src/php/Lousson/Record/Builtin/BuiltinRecordFactory.php @@ -316,7 +316,6 @@ private function loadRecordContainers() "Lousson\\Record\\Plugin\\INI", "Lousson\\Record\\Plugin\\JSON", "Lousson\\Record\\Plugin\\PHP", - "Lousson\\Record\\Plugin\\YAML", ); /** diff --git a/src/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAML.php b/src/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAML.php deleted file mode 100644 index 34abb2c..0000000 --- a/src/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAML.php +++ /dev/null @@ -1,167 +0,0 @@ - - * @filesource - */ -namespace Lousson\Record\Builtin; - -/** Interfaces: */ -use Lousson\Record\AnyRecordHandler; - -/** Dependencies: */ -use Lousson\Record\Builtin\BuiltinRecordHandler; -use Symfony\Component\Yaml; - -/** Exceptions: */ -use Lousson\Record\Error\RecordArgumentError; -use Lousson\Record\Error\RecordRuntimeError; - -/** - * A YAML record handler - * - * @since lousson/Lousson_Record-0.6.0 - * @package org.lousson.record - */ -class BuiltinRecordHandlerYAML - extends BuiltinRecordHandler - implements AnyRecordHandler -{ - /** - * Create a handler instance - * - * The constructor allows the caller to provide YAML parser and - * dumper instances to be used instead of those that would otherwise - * be created at runtime. - * - * @param Yaml\Parser $parser The YAML parser - * @param Yaml\Dumper $dumper The YAML dumper - */ - public function __construct( - Yaml\Parser $parser = null, - Yaml\Dumper $dumper = null - ) { - $this->parser = $parser; - $this->dumper = $dumper; - } - - /** - * Build record content - * - * The buildRecord() method returns a byte sequence representing the - * given $record in its serialized form. - * - * @param array $data The record's data - * - * @return string - * The serialized record is returned on success - * - * @throws \Lousson\Record\AnyRecordException - * Raised in case of malformed $data or internal errors - */ - public function buildRecord(array $data) - { - $record = $this->normalizeInputData($data); - - if (!isset($this->dumper)) { - $this->dumper = new Yaml\Dumper(); - } - - try { - $sequence = $this->dumper->dump($record); - } - catch (\Exception $error) { - $class = get_class($error); - $message = "Failed to build YAML record: Caught $class"; - $code = RecordRuntimeError::E_UNKNOWN; - throw new RecordRuntimeError($message, $code, $error); - } - - return $sequence; - } - - /** - * Parse record content - * - * The parseRecord() method returns an array representing the given - * byte $sequence in its unserialized form. - * - * @param string $sequence The record's byte sequence - * - * @return array - * The unserialized record is returned on success - * - * @throws \Lousson\Record\AnyRecordException - * Indicates a malformed $sequence or an internal error - */ - public function parseRecord($sequence) - { - if (!isset($this->parser)) { - $this->parser = new Yaml\Parser(); - } - - try { - $data = $this->parser->parse($sequence); - } - catch (\Exception $error) { - $class = get_class($error); - $message = "Could not parse YAML record: Caught $class"; - $code = RecordArgumentError::E_UNKNOWN; - throw new RecordArgumentError($message, $code, $error); - } - - $record = $this->normalizeOutputData($data); - return $record; - } - - /** - * The YAML parser instance in use - * - * @var \Symfony\Component\Yaml\Parser - */ - private $parser; - - /** - * The YAML dumper instance in use - * - * @var \Symfony\Component\Yaml\Dumper - */ - private $dumper; -} - diff --git a/src/php/Lousson/Record/Plugin/YAML.php b/src/php/Lousson/Record/Plugin/YAML.php deleted file mode 100644 index fb9299c..0000000 --- a/src/php/Lousson/Record/Plugin/YAML.php +++ /dev/null @@ -1,92 +0,0 @@ - - * @filesource - */ -namespace Lousson\Record\Plugin; - -/** Interfaces: */ -use Lousson\Container\AnyContainer; -use Lousson\Record\AnyRecordPlugin; - -/** Dependencies: */ -use Lousson\Container\Generic\GenericContainer; -use Lousson\Record\Builtin\BuiltinRecordHandlerYAML; - -/** - * A YAML record plugin - * - * The Lousson\Record\Plugin\YAML class is a plugin for e.g. the builtin - * record factory that ships with the Lousson_Record package, providing a - * YAML record handler - including a set of associated mime-types. - * - * @since lousson/Lousson_Record-2.0.0 - * @package org.lousson.record - */ -class YAML implements AnyRecordPlugin -{ - /** - * Set up and register the YAML plugin - * - * The bootstrap() method is used by e.g. the BuiltinRecordFactory, - * in order to load, set up and register the plugin with the factory's - * plugin $container. - * - * @param GenericContainer $container The plugin container - */ - public static function bootstrap(GenericContainer $container) - { - $callback = function(AnyContainer $container, $name) { - $handler = new BuiltinRecordHandlerYAML(); - return $handler; - }; - - $aliases = array( - "record.handler.application/yaml", - "record.handler.application/x-yaml", - "record.handler.text/yaml", - "record.handler.text/x-yaml", - ); - - $container->share("record.handler.yaml", $callback); - $container->alias("record.handler.yaml", $aliases); - } -} - diff --git a/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordFactoryTest.php b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordFactoryTest.php index 24d11ac..6a41e4d 100644 --- a/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordFactoryTest.php +++ b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordFactoryTest.php @@ -87,10 +87,6 @@ public function provideBuilderMediaTypes() array("application/vnd.php.serialized"), array("text/json"), array("text/x-json"), - array("text/yaml"), - array("text/x-yaml"), - array("application/yaml"), - array("application/x-yaml"), ); } @@ -113,10 +109,6 @@ public function provideParserMediaTypes() array("text/json"), array("text/x-json"), array("zz-application/zz-winassoc-ini"), - array("text/yaml"), - array("text/x-yaml"), - array("application/yaml"), - array("application/x-yaml"), ); } } diff --git a/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAMLTest.php b/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAMLTest.php deleted file mode 100644 index b05802e..0000000 --- a/src/tests/unit-tests/php/Lousson/Record/Builtin/BuiltinRecordHandlerYAMLTest.php +++ /dev/null @@ -1,182 +0,0 @@ - - * @filesource - */ -namespace Lousson\Record\Builtin; - -/** Dependencies: */ -use Lousson\Record\AbstractRecordHandlerTest; -use Lousson\Record\Builtin\BuiltinRecordHandlerYAML; -use ReflectionException; -use ReflectionMethod; - -/** - * A test case for the builtin YAML record builder - * - * @since lousson/Lousson_Record-0.6.0 - * @package org.lousson.record - */ -final class BuiltinRecordHandlerYAMLTest - extends AbstractRecordHandlerTest -{ - /** - * Obtain the record builder to test - * - * The getRecordBuilder() method returns the record builder instance - * that is used in the tests or NULL, in case the test does not have - * an associated builder. - * - * @return \Lousson\Record\AnyRecordBuilder - * A record builder instance is returned on success - */ - public function getRecordBuilder() - { - $builder = new BuiltinRecordHandlerYAML(); - return $builder; - } - - /** - * Obtain the record parser to test - * - * The getRecordParser() method returns the record parser instance - * that is used in the tests or NULL, in case the test does not have - * an associated parser. - * - * @return \Lousson\Record\AnyRecordBuilder - * A record builder instance is returned on success - */ - public function getRecordParser() - { - $parser = new BuiltinRecordHandlerYAML(); - return $parser; - } - - /** - * Provide valid parseRecord() parameters - * - * The provideValidRecordBytes() method returns an array of multiple - * items, each of whose is an array with one item; a sequence of bytes - * representing valid record data. - * - * @return array - * A list of parseRecord() parameters is returned on success - */ - public function provideValidRecordBytes() - { - $data[][] = '{"foo":"bar","baz":[0,1,2,3,4,5]}'; - $data[][] = '{"foo":{"bar":"baz"}}'; - $data[][] = '{"foobar":null}'; - - return $data; - } - - /** - * Provide invalid parseRecord() parameters - * - * The provideInvalidRecordBytes() method returns an array of multiple - * items, each of whose is an array with one item; a sequence of bytes - * representing invalid record data. - * - * @return array - * A list of parseRecord() parameters is returned on success - */ - public function provideInvalidRecordBytes() - { - $data[][] = '{"foo":"bar","0 1 2":"baz"}'; - - return $data; - } - - /** - * Test the buildRecord() method - * - + The testBuildRecordException() method is a test case to verify - * that exceptions raised by the Yaml\Dumper are handled properly. - * - * @expectedException Lousson\Record\AnyRecordException - * @test - * - * @throws \Lousson\Record\AnyRecordException - * Raised in case the test is successful - * - * @throws \Exception - * Raised in case of an implementation error - */ - public function testBuildRecordException() - { - $dumper = $this->getMock("Symfony\Component\Yaml\Dumper"); - $dumper - ->expects($this->once()) - ->method("dump") - ->will($this->throwException(new \DomainException)); - - $handler = new BuiltinRecordHandlerYAML(null, $dumper); - $handler->buildRecord(array()); - } - - /** - * Test the parseRecprd() method - * - + The testBuildRecordException() method is a test case to verify - * that exceptions raised by the Yaml\Parser are handled properly. - * - * @expectedException Lousson\Record\AnyRecordException - * @test - * - * @throws \Lousson\Record\AnyRecordException - * Raised in case the test is successful - * - * @throws \Exception - * Raised in case of an implementation error - */ - public function testParseRecordException() - { - $parser = $this->getMock("Symfony\Component\Yaml\Parser"); - $parser - ->expects($this->once()) - ->method("parse") - ->will($this->throwException(new \DomainException)); - - $handler = new BuiltinRecordHandlerYAML($parser, null); - $handler->parseRecord("foo. bar? baz!"); - } -} -