Browse Source

Merge all fields inside build dict

Signed-off-by: Joffrey F <[email protected]>
Joffrey F 8 years ago
parent
commit
150c44dc36
2 changed files with 70 additions and 0 deletions
  1. 2 0
      compose/config/config.py
  2. 68 0
      tests/unit/config/config_test.py

+ 2 - 0
compose/config/config.py

@@ -952,6 +952,8 @@ def merge_build(output, base, override):
     md.merge_scalar('context')
     md.merge_scalar('dockerfile')
     md.merge_mapping('args', parse_build_arguments)
+    md.merge_field('cache_from', merge_unique_items_lists, default=[])
+    md.merge_mapping('labels', parse_labels)
     return dict(md)
 
 

+ 68 - 0
tests/unit/config/config_test.py

@@ -2847,6 +2847,74 @@ class MergeLabelsTest(unittest.TestCase):
         assert service_dict['labels'] == {'foo': '1', 'bar': ''}
 
 
+class MergeBuildTest(unittest.TestCase):
+    def test_full(self):
+        base = {
+            'context': '.',
+            'dockerfile': 'Dockerfile',
+            'args': {
+                'x': '1',
+                'y': '2',
+            },
+            'cache_from': ['ubuntu'],
+            'labels': ['com.docker.compose.test=true']
+        }
+
+        override = {
+            'context': './prod',
+            'dockerfile': 'Dockerfile.prod',
+            'args': ['x=12'],
+            'cache_from': ['debian'],
+            'labels': {
+                'com.docker.compose.test': 'false',
+                'com.docker.compose.prod': 'true',
+            }
+        }
+
+        result = config.merge_build(None, {'build': base}, {'build': override})
+        assert result['context'] == override['context']
+        assert result['dockerfile'] == override['dockerfile']
+        assert result['args'] == {'x': '12', 'y': '2'}
+        assert set(result['cache_from']) == set(['ubuntu', 'debian'])
+        assert result['labels'] == override['labels']
+
+    def test_empty_override(self):
+        base = {
+            'context': '.',
+            'dockerfile': 'Dockerfile',
+            'args': {
+                'x': '1',
+                'y': '2',
+            },
+            'cache_from': ['ubuntu'],
+            'labels': {
+                'com.docker.compose.test': 'true'
+            }
+        }
+
+        override = {}
+
+        result = config.merge_build(None, {'build': base}, {'build': override})
+        assert result == base
+
+    def test_empty_base(self):
+        base = {}
+
+        override = {
+            'context': './prod',
+            'dockerfile': 'Dockerfile.prod',
+            'args': {'x': '12'},
+            'cache_from': ['debian'],
+            'labels': {
+                'com.docker.compose.test': 'false',
+                'com.docker.compose.prod': 'true',
+            }
+        }
+
+        result = config.merge_build(None, {'build': base}, {'build': override})
+        assert result == override
+
+
 class MemoryOptionsTest(unittest.TestCase):
 
     def test_validation_fails_with_just_memswap_limit(self):