From 89724653807f72b5694eb5c1b808c3e42e174a87 Mon Sep 17 00:00:00 2001 From: sallyx Date: Mon, 23 Nov 2015 18:58:49 +0100 Subject: [PATCH] fixed merging bug: merging with empty array caused error --- src/Adapters/XmlAdapter.php | 14 +++++-- tests/Adapters/XmlAdapter.merge.phpt | 36 +++++++++++++++++ tests/Adapters/XmlAdapter.phpt | 27 ------------- tests/Adapters/XmlAdapter.statement.phpt | 45 ++++++++++++++++++++++ tests/Adapters/files/xmlAdapter.merge.xml | 15 ++++++++ tests/Adapters/files/xmlAdapter.merge2.xml | 8 ++++ 6 files changed, 115 insertions(+), 30 deletions(-) create mode 100644 tests/Adapters/XmlAdapter.merge.phpt create mode 100644 tests/Adapters/XmlAdapter.statement.phpt create mode 100644 tests/Adapters/files/xmlAdapter.merge.xml create mode 100644 tests/Adapters/files/xmlAdapter.merge2.xml diff --git a/src/Adapters/XmlAdapter.php b/src/Adapters/XmlAdapter.php index 3480547..7a9c92b 100644 --- a/src/Adapters/XmlAdapter.php +++ b/src/Adapters/XmlAdapter.php @@ -212,7 +212,11 @@ private function parseStatement($child) } $arrayAttr = $argsElement[0]->getAttribute(self::ATTR_ARRAY); if (is_null($arrayAttr)) { - $argsElement[0]->addAttribute(self::ATTR_ARRAY, self::ATTR_ARRAY_NUMERIC); + if($argsElement[0]->count()) { + $argsElement[0]->addAttribute(self::ATTR_ARRAY, self::ATTR_ARRAY_NUMERIC); + } else { + $argsElement[0]->addAttribute(self::ATTR_ARRAY, self::ATTR_ARRAY_STRING); + } } $attributes = $argsElement[0]->parseChildren(); @@ -229,7 +233,7 @@ private function parseStatement($child) */ private function parseChildren() { - $arrayType = $this->getAttribute(self::ATTR_ARRAY, self::ATTR_ARRAY_ASSOCIATIVE); + $arrayType = $this->getAttribute(self::ATTR_ARRAY); $space = (string) $this->getAttribute(self::ATTR_SPACE); if ($space !== self::ATTR_SPACE_PRESERVE and ! empty($space)) { throw new Nette\InvalidStateException("Attribute " . self::ATTR_SPACE . " has an unknown value '$space'"); @@ -241,7 +245,11 @@ private function parseChildren() return $res; } - if (!$this->count()) { + if ($arrayType === NULL && $this->count()) { + $arrayType = self::ATTR_ARRAY_ASSOCIATIVE; + } + + if ($arrayType === NULL) { $res = $this->getValue(); $this->trim($res, $space); return $res; diff --git a/tests/Adapters/XmlAdapter.merge.phpt b/tests/Adapters/XmlAdapter.merge.phpt new file mode 100644 index 0000000..aef41bd --- /dev/null +++ b/tests/Adapters/XmlAdapter.merge.phpt @@ -0,0 +1,36 @@ +addAdapter('xml','Sallyx\Nette\DI\Config\Adapters\XmlAdapter'); +$data = $config->load('files/xmlAdapter.merge.xml', 'production'); +Assert::same(array( + 'webname' => 'the example', + 'extensions' => array( + 'redis' => 'Kdyby\\Redis\\DI\\RedisExtension', + 'streamWrappers' => 'Sallyx\\Bridges\\StreamWrappers\\Nette\\DI\\StreamWrappersExtension', + ), + 'redis' => array( + 'journal' => TRUE, + 'storage' => TRUE, + 'session' => array('native' => FALSE, 'debugger' => TRUE), + ), +), $data); + +$data = $config->load('files/xmlAdapter.merge2.xml', 'development'); +Assert::same(array( + 'webname' => 'the example', + 'extensions' => array( + ), + 'redis' => array( + ), +), $data); diff --git a/tests/Adapters/XmlAdapter.phpt b/tests/Adapters/XmlAdapter.phpt index c144bf2..015312a 100644 --- a/tests/Adapters/XmlAdapter.phpt +++ b/tests/Adapters/XmlAdapter.phpt @@ -74,30 +74,3 @@ Assert::match(<<the examplepdo_mysqldb.example.comdbusersecret dbnamedev.example.comdevuserdevsecretEurope/Prague EOD , $actual); - -$data = $config->load('files/xmlAdapter.entity.xml'); -Assert::equal(array( - new Statement('ent', array(1)), - new Statement(array( - new Statement('ent', array(2)), - 'inner', - ), - array('3', '4') - ), - new Statement(array( - new Statement('ent', array('3')), - 'inner', - ), - array('5','6') - ), -), $data); - -$data = $config->load('files/xmlAdapter.entity.xml'); -$config->save($data, TEMP_FILE); -$actual = file_get_contents(TEMP_FILE); -$actual = preg_replace('/\<([^\s\/>]+)(\s*[^\/>]*)\/\s*\>/i', '<$1$2>', $actual); -Assert::match(<< -ententinner34ent3inner56 -EOD -, $actual); diff --git a/tests/Adapters/XmlAdapter.statement.phpt b/tests/Adapters/XmlAdapter.statement.phpt new file mode 100644 index 0000000..bab6238 --- /dev/null +++ b/tests/Adapters/XmlAdapter.statement.phpt @@ -0,0 +1,45 @@ +addAdapter('xml','Sallyx\Nette\DI\Config\Adapters\XmlAdapter'); + +$data = $config->load('files/xmlAdapter.entity.xml'); +Assert::equal(array( + new Statement('ent', array(1)), + new Statement(array( + new Statement('ent', array(2)), + 'inner', + ), + array('3', '4') + ), + new Statement(array( + new Statement('ent', array('3')), + 'inner', + ), + array('5','6') + ), +), $data); + +$data = $config->load('files/xmlAdapter.entity.xml'); +$config->save($data, TEMP_FILE); +$actual = file_get_contents(TEMP_FILE); +$actual = preg_replace('/\<([^\s\/>]+)(\s*[^\/>]*)\/\s*\>/i', '<$1$2>', $actual); +Assert::match(<< +ententinner34ent3inner56 +EOD +, $actual); diff --git a/tests/Adapters/files/xmlAdapter.merge.xml b/tests/Adapters/files/xmlAdapter.merge.xml new file mode 100644 index 0000000..f4ebff0 --- /dev/null +++ b/tests/Adapters/files/xmlAdapter.merge.xml @@ -0,0 +1,15 @@ + + + + the example + + Kdyby\Redis\DI\RedisExtension + Sallyx\Bridges\StreamWrappers\Nette\DI\StreamWrappersExtension + + + + + + + + diff --git a/tests/Adapters/files/xmlAdapter.merge2.xml b/tests/Adapters/files/xmlAdapter.merge2.xml new file mode 100644 index 0000000..01ade65 --- /dev/null +++ b/tests/Adapters/files/xmlAdapter.merge2.xml @@ -0,0 +1,8 @@ + + + + the example + + + +