From 19193e8e82e83e019eb59c5d43c68525e6a3d0ca Mon Sep 17 00:00:00 2001 From: Stephan Huber Date: Fri, 19 Aug 2022 15:39:59 +0200 Subject: [PATCH] fix(configuration): Move deprecation logic before handling defaults --- src/Configuration/ConfigurationService.php | 36 ++++++++++++---------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/Configuration/ConfigurationService.php b/src/Configuration/ConfigurationService.php index 0ba6a4c1..3d75ba5a 100644 --- a/src/Configuration/ConfigurationService.php +++ b/src/Configuration/ConfigurationService.php @@ -737,22 +737,11 @@ private function validateHostConfig($config_name, Node $data) $data['needs'] = $gathered_methods; $used_methods = $this->methods->getSubset($data['needs']); - foreach ($used_methods as $method) { - $data = $this->applyDefaults( - $data, - $method->getDefaultConfig($this, $data), - $this->disallowDeepMergeForKeys - ); - } - // Overall validation. - $validation_errors = new ValidationErrorBag(); $validation = new ValidationService($data, $validation_errors, 'host-config: `' . $config_name . '`'); - $validation->isArray('needs', 'Please specify the needed methods as an array'); - $validation->isOneOf('type', HostType::getAll()); - // Validate data against used methods. + // Apply defaults and handle deprecations foreach ($used_methods as $method) { if (!empty($deprecation_mapping = $method->getDeprecationMapping())) { @@ -766,6 +755,20 @@ private function validateHostConfig($config_name, Node $data) } } } + $data = $this->applyDefaults( + $data, + $method->getDefaultConfig($this, $data), + $this->disallowDeepMergeForKeys + ); + } + + + $validation->isArray('needs', 'Please specify the needed methods as an array'); + $validation->isOneOf('type', HostType::getAll()); + + // Validate data against used methods. + + foreach ($used_methods as $method) { $method->validateConfig($data, $validation_errors); } @@ -1148,11 +1151,12 @@ public function getData(): Node private function mapDeprecatedConfig(Node $data, array $mapping) { foreach ($mapping as $deprecated => $key) { - if ($data->has($deprecated)) { - $data->setProperty($key, $data[$deprecated]); - + if (!is_null($deprecated_value = $data->getProperty($deprecated))) { + $existing_value = $data->find($key); + if (is_null($existing_value)) { + $data->setProperty($key, $deprecated_value); + } } } } - }