From a3724717ec37d4bd54dc117ef439c8a182157882 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 11 Nov 2017 14:00:18 +0100 Subject: [PATCH] ConfigManager: add a method to remove an entry --- application/config/ConfigManager.php | 50 +++++++++++++++++++++++++++- tests/config/ConfigManagerTest.php | 23 +++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/application/config/ConfigManager.php b/application/config/ConfigManager.php index 124fedc2..faf25426 100644 --- a/application/config/ConfigManager.php +++ b/application/config/ConfigManager.php @@ -147,6 +147,33 @@ class ConfigManager } } + /** + * Remove a config element from the config file. + * + * @param string $setting Asked setting, keys separated with dots. + * @param bool $write Write the new setting in the config file, default false. + * @param bool $isLoggedIn User login state, default false. + * + * @throws \Exception Invalid + */ + public function remove($setting, $write = false, $isLoggedIn = false) + { + if (empty($setting) || ! is_string($setting)) { + throw new \Exception(t('Invalid setting key parameter. String expected, got: '). gettype($setting)); + } + + // During the ConfigIO transition, map legacy settings to the new ones. + if ($this->configIO instanceof ConfigPhp && isset(ConfigPhp::$LEGACY_KEYS_MAPPING[$setting])) { + $setting = ConfigPhp::$LEGACY_KEYS_MAPPING[$setting]; + } + + $settings = explode('.', $setting); + self::removeConfig($settings, $this->loadedConfig); + if ($write) { + $this->write($isLoggedIn); + } + } + /** * Check if a settings exists. * @@ -272,7 +299,7 @@ class ConfigManager * * @param array $settings Ordered array which contains keys to find. * @param mixed $value - * @param array $conf Loaded settings, then sub-array. + * @param array $conf Loaded settings, then sub-array. * * @return mixed Found setting or NOT_FOUND flag. */ @@ -289,6 +316,27 @@ class ConfigManager $conf[$setting] = $value; } + /** + * Recursive function which find asked setting in the loaded config and deletes it. + * + * @param array $settings Ordered array which contains keys to find. + * @param array $conf Loaded settings, then sub-array. + * + * @return mixed Found setting or NOT_FOUND flag. + */ + protected static function removeConfig($settings, &$conf) + { + if (!is_array($settings) || count($settings) == 0) { + return self::$NOT_FOUND; + } + + $setting = array_shift($settings); + if (count($settings) > 0) { + return self::removeConfig($settings, $conf[$setting]); + } + unset($conf[$setting]); + } + /** * Set a bunch of default values allowing Shaarli to start without a config file. */ diff --git a/tests/config/ConfigManagerTest.php b/tests/config/ConfigManagerTest.php index 1ec447b2..4a4e94ac 100644 --- a/tests/config/ConfigManagerTest.php +++ b/tests/config/ConfigManagerTest.php @@ -81,6 +81,18 @@ class ConfigManagerTest extends \PHPUnit_Framework_TestCase $this->assertEquals('testSetWriteGetNested', $this->conf->get('foo.bar.key.stuff')); } + public function testSetDeleteNested() + { + $this->conf->set('foo.bar.key.stuff', 'testSetDeleteNested'); + $this->assertTrue($this->conf->exists('foo.bar')); + $this->assertTrue($this->conf->exists('foo.bar.key.stuff')); + $this->assertEquals('testSetDeleteNested', $this->conf->get('foo.bar.key.stuff')); + + $this->conf->remove('foo.bar'); + $this->assertFalse($this->conf->exists('foo.bar.key.stuff')); + $this->assertFalse($this->conf->exists('foo.bar')); + } + /** * Set with an empty key. * @@ -103,6 +115,17 @@ class ConfigManagerTest extends \PHPUnit_Framework_TestCase $this->conf->set(array('foo' => 'bar'), 'stuff'); } + /** + * Remove with an empty key. + * + * @expectedException \Exception + * @expectedExceptionMessageRegExp #^Invalid setting key parameter. String expected, got.*# + */ + public function testRmoveEmptyKey() + { + $this->conf->remove(''); + } + /** * Try to write the config without mandatory parameter (e.g. 'login'). * -- 2.41.0