diff --git a/Processor.php b/Processor.php
index 1b960bd..60a8aeb 100644
--- a/Processor.php
+++ b/Processor.php
@@ -141,12 +141,14 @@ private function getParams(array $expectedParams, array $actualParams)
{
// Simply use the expectedParams value as default for the missing params.
if (!$this->io->isInteractive()) {
- return array_replace($expectedParams, $actualParams);
+ return array_replace_recursive($expectedParams, $actualParams);
}
$isStarted = false;
- foreach ($expectedParams as $key => $message) {
+ $diffParams = self::arrayDiffKeyRecursive($expectedParams, $actualParams);
+
+ foreach ($diffParams as $key => $message) {
if (array_key_exists($key, $actualParams)) {
continue;
}
@@ -159,9 +161,33 @@ private function getParams(array $expectedParams, array $actualParams)
$default = Inline::dump($message);
$value = $this->io->ask(sprintf('%s (%s): ', $key, $default), $default);
- $actualParams[$key] = Inline::parse($value);
+ if (array_key_exists($key, $actualParams)) {
+ $actualParams[$key] = array_merge($actualParams[$key], Inline::parse($value));
+ } else {
+ $actualParams[$key] = Inline::parse($value);
+ }
}
return $actualParams;
}
+
+ /**
+ * Return recursive diff based on keys
+ * @param array $arr1 [description]
+ * @param array $arr2 [description]
+ * @return [type] [description]
+ */
+ private static function arrayDiffKeyRecursive(array $arr1, array $arr2)
+ {
+ $diff = array_diff_key($arr1, $arr2);
+ $intersect = array_intersect_key($arr1, $arr2);
+ foreach ($intersect as $k => $v) {
+ if (is_array($arr1[$k]) && is_array($arr2[$k])) {
+ $d = self::arrayDiffKeyRecursive($arr1[$k], $arr2[$k]);
+ if ($d) $diff[$k] = $d;
+ }
+ }
+
+ return $diff;
+ }
}
diff --git a/Tests/fixtures/testcases/extra_array_keys/dist.yml b/Tests/fixtures/testcases/extra_array_keys/dist.yml
new file mode 100644
index 0000000..2a9c644
--- /dev/null
+++ b/Tests/fixtures/testcases/extra_array_keys/dist.yml
@@ -0,0 +1,12 @@
+parameters:
+ foo: bar
+ bare:
+ foo2: existing_foo2
+ foo3: existing_foo3
+ foo4: existing_foo4
+ foo5:
+ bare2:
+ - bloup
+ - glop
+
+extra_key: a new extra key
diff --git a/Tests/fixtures/testcases/extra_array_keys/existing.yml b/Tests/fixtures/testcases/extra_array_keys/existing.yml
new file mode 100644
index 0000000..97f4210
--- /dev/null
+++ b/Tests/fixtures/testcases/extra_array_keys/existing.yml
@@ -0,0 +1,7 @@
+# This file is auto-generated during the composer install
+parameters:
+ foo: existing_foo
+ bare:
+ foo1: existing_foo1
+ foo3: existing_foo3
+another_key: foo
diff --git a/Tests/fixtures/testcases/extra_array_keys/expected.yml b/Tests/fixtures/testcases/extra_array_keys/expected.yml
new file mode 100644
index 0000000..e7dbd0d
--- /dev/null
+++ b/Tests/fixtures/testcases/extra_array_keys/expected.yml
@@ -0,0 +1,14 @@
+# This file is auto-generated during the composer install
+parameters:
+ foo: existing_foo
+ bare:
+ foo2: existing_foo2
+ foo3: existing_foo3
+ foo4: existing_foo4
+ foo5:
+ bare2:
+ - bloup
+ - glop
+ foo1: existing_foo1
+extra_key: 'a new extra key'
+another_key: foo
diff --git a/Tests/fixtures/testcases/extra_array_keys/setup.yml b/Tests/fixtures/testcases/extra_array_keys/setup.yml
new file mode 100644
index 0000000..726a209
--- /dev/null
+++ b/Tests/fixtures/testcases/extra_array_keys/setup.yml
@@ -0,0 +1 @@
+title: Extra deep array keys and preserve existing values