Skip to content

Commit 3761a8f

Browse files
committed
Merge lists of resources
1 parent 85b4620 commit 3761a8f

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

opencensus/common/resource.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,32 @@
4949
_UNQUOTE_RE = re.compile(r'^([\'"]?)([^\1]*)(\1)$')
5050

5151

52-
def merge_resources(r1, r2):
53-
"""Merge two resources to get a new resource.
52+
def merge_resources(resource_list):
53+
"""Merge multiple resources to get a new resource.
5454
55-
:type r1: :class:`Resource`
56-
:param r1: The first resource to merge, takes priority in conflicts.
55+
Resources earlier in the list take precedence: if multiple resources share
56+
a label key, use the value from the first resource in the list with that
57+
key. The combined resource's type will be the first non-null type in the
58+
list.
5759
58-
:type r2: :class:`Resource`
59-
:param r2: The second resource to merge.
60+
:type resource_list: list(:class:`Resource`)
61+
:param resource_list: The list of resources to combine.
6062
6163
:rtype: :class:`Resource`
6264
:return: The new combined resource.
6365
"""
64-
type_ = r1.type or r2.type
65-
labels = copy(r2.labels)
66-
labels.update(r1.labels)
67-
return Resource(type_, labels)
66+
if not resource_list:
67+
raise ValueError
68+
rtype = None
69+
for rr in resource_list:
70+
if rr.type:
71+
rtype = rr.type
72+
break
73+
last, rest = resource_list[::-1][0], resource_list[::-1][1:]
74+
labels = copy(last.labels)
75+
for rr in rest:
76+
labels.update(rr.labels)
77+
return Resource(rtype, labels)
6878

6979

7080
def check_ascii_256(string):
@@ -150,7 +160,7 @@ def merge(self, other):
150160
:rtype: :class:`Resource`
151161
:return: The new combined resource.
152162
"""
153-
return merge_resources(self, other)
163+
return merge_resources([self, other])
154164

155165

156166
def unquote(string):

tests/unit/common/test_resource.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,21 @@ def test_merge_overwrite(self):
123123

124124
class TestResourceModule(unittest.TestCase):
125125

126+
def test_merge_resource(self):
127+
with self.assertRaises(ValueError):
128+
resource_module.merge_resources(None)
129+
with self.assertRaises(ValueError):
130+
resource_module.merge_resources([])
131+
132+
r1 = Resource(None, {'lk1': 'lv11'})
133+
r2 = Resource('t2', {'lk1': 'lv12', 'lk2': 'lv22'})
134+
r3 = Resource('t3', {'lk2': 'lv23', 'lk3': 'lv33'})
135+
136+
merged = resource_module.merge_resources([r1, r2, r3])
137+
self.assertEqual(merged.type, 't2')
138+
self.assertDictEqual(
139+
merged.labels, {'lk1': 'lv11', 'lk2': 'lv22', 'lk3': 'lv33'})
140+
126141
def test_check_ascii_256(self):
127142
self.assertIsNone(resource_module.check_ascii_256(None))
128143

0 commit comments

Comments
 (0)