Browse Source

'file' key can be omitted from extends

If the 'file' key is not set in the extends_options dict then we
look for the 'service' from within the same file.

Fixes this issue: https://github.com/docker/compose/issues/1237

Signed-off-by: Mazz Mosley <[email protected]>
Mazz Mosley 10 years ago
parent
commit
6e4a954dbd
3 changed files with 39 additions and 1 deletions
  1. 6 1
      compose/config.py
  2. 9 0
      tests/fixtures/extends/no-file-specified.yml
  3. 24 0
      tests/unit/config_test.py

+ 6 - 1
compose/config.py

@@ -163,7 +163,12 @@ class ServiceLoader(object):
         if self.working_dir is None:
             raise Exception("No working_dir passed to ServiceLoader()")
 
-        other_config_path = expand_path(self.working_dir, extends_options['file'])
+        try:
+            extends_from_filename = extends_options['file']
+        except KeyError:
+            extends_from_filename = os.path.split(self.filename)[1]
+
+        other_config_path = expand_path(self.working_dir, extends_from_filename)
         other_working_dir = os.path.dirname(other_config_path)
         other_already_seen = self.already_seen + [self.signature(service_dict['name'])]
         other_loader = ServiceLoader(

+ 9 - 0
tests/fixtures/extends/no-file-specified.yml

@@ -0,0 +1,9 @@
+myweb:
+  extends:
+    service: web
+  environment:
+    - "BAR=1"
+web:
+  image: busybox
+  environment:
+    - "BAZ=3"

+ 24 - 0
tests/unit/config_test.py

@@ -447,6 +447,30 @@ class ExtendsTest(unittest.TestCase):
         dictionary['extends']['what'] = 'is this'
         self.assertRaisesRegexp(config.ConfigurationError, 'what', load_config)
 
+    def test_extends_file_defaults_to_self(self):
+        """
+        Test not specifying a file in our extends options that the
+        config is valid and correctly extends from itself.
+        """
+        service_dicts = config.load('tests/fixtures/extends/no-file-specified.yml')
+        self.assertEqual(service_dicts, [
+            {
+                'name': 'myweb',
+                'image': 'busybox',
+                'environment': {
+                    "BAR": "1",
+                    "BAZ": "3",
+                }
+            },
+            {
+                'name': 'web',
+                'image': 'busybox',
+                'environment': {
+                    "BAZ": "3",
+                }
+            }
+        ])
+
     def test_blacklisted_options(self):
         def load_config():
             return config.make_service_dict('myweb', {