|
49 | 49 | _UNQUOTE_RE = re.compile(r'^([\'"]?)([^\1]*)(\1)$') |
50 | 50 |
|
51 | 51 |
|
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. |
54 | 54 |
|
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. |
57 | 59 |
|
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. |
60 | 62 |
|
61 | 63 | :rtype: :class:`Resource` |
62 | 64 | :return: The new combined resource. |
63 | 65 | """ |
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) |
68 | 78 |
|
69 | 79 |
|
70 | 80 | def check_ascii_256(string): |
@@ -150,7 +160,7 @@ def merge(self, other): |
150 | 160 | :rtype: :class:`Resource` |
151 | 161 | :return: The new combined resource. |
152 | 162 | """ |
153 | | - return merge_resources(self, other) |
| 163 | + return merge_resources([self, other]) |
154 | 164 |
|
155 | 165 |
|
156 | 166 | def unquote(string): |
|
0 commit comments