comparison env/lib/python3.9/site-packages/allure_commons/mapping.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 from itertools import chain, islice
2 import attr
3 import re
4 from allure_commons.types import Severity, LabelType, LinkType
5 from allure_commons.types import ALLURE_UNIQUE_LABELS
6 from allure_commons.model2 import Label, Link
7
8
9 TAG_PREFIX = "allure"
10
11 semi_sep = re.compile(r"allure[\.\w]+:")
12 eq_sep = re.compile(r"allure[\.\w]+=")
13
14
15 def allure_tag_sep(tag):
16 if semi_sep.search(tag):
17 return ":"
18 if eq_sep.search(tag):
19 return "="
20
21
22 def __is(kind, t):
23 return kind in [v for k, v in t.__dict__.items() if not k.startswith('__')]
24
25
26 def parse_tag(tag, issue_pattern=None, link_pattern=None):
27 """
28 >>> parse_tag("blocker")
29 Label(name='severity', value='blocker')
30
31 >>> parse_tag("allure.issue:http://example.com/BUG-42")
32 Link(type='issue', url='http://example.com/BUG-42', name='http://example.com/BUG-42')
33
34 >>> parse_tag("allure.link.home:http://qameta.io")
35 Link(type='link', url='http://qameta.io', name='home')
36
37 >>> parse_tag("allure.suite:mapping")
38 Label(name='suite', value='mapping')
39
40 >>> parse_tag("allure.suite:mapping")
41 Label(name='suite', value='mapping')
42
43 >>> parse_tag("allure.label.owner:me")
44 Label(name='owner', value='me')
45
46 >>> parse_tag("foo.label:1")
47 Label(name='tag', value='foo.label:1')
48
49 >>> parse_tag("allure.foo:1")
50 Label(name='tag', value='allure.foo:1')
51 """
52 sep = allure_tag_sep(tag)
53 schema, value = islice(chain(tag.split(sep, 1), [None]), 2)
54 prefix, kind, name = islice(chain(schema.split('.'), [None], [None]), 3)
55
56 if tag in [severity for severity in Severity]:
57 return Label(name=LabelType.SEVERITY, value=tag)
58
59 if prefix == TAG_PREFIX and value is not None:
60
61 if __is(kind, LinkType):
62 if issue_pattern and kind == "issue" and not value.startswith("http"):
63 value = issue_pattern.format(value)
64 if link_pattern and kind == "link" and not value.startswith("http"):
65 value = link_pattern.format(value)
66 return Link(type=kind, name=name or value, url=value)
67
68 if __is(kind, LabelType):
69 return Label(name=kind, value=value)
70
71 if kind == "id":
72 return Label(name=LabelType.ID, value=value)
73
74 if kind == "label" and name is not None:
75 return Label(name=name, value=value)
76
77 return Label(name=LabelType.TAG, value=tag)
78
79
80 def labels_set(labels):
81 """
82 >>> labels_set([Label(name=LabelType.SEVERITY, value=Severity.NORMAL),
83 ... Label(name=LabelType.SEVERITY, value=Severity.BLOCKER)
84 ... ])
85 [Label(name='severity', value=<Severity.BLOCKER: 'blocker'>)]
86
87 >>> labels_set([Label(name=LabelType.SEVERITY, value=Severity.NORMAL),
88 ... Label(name='severity', value='minor')
89 ... ])
90 [Label(name='severity', value='minor')]
91
92 >>> labels_set([Label(name=LabelType.EPIC, value="Epic"),
93 ... Label(name=LabelType.EPIC, value="Epic")
94 ... ])
95 [Label(name='epic', value='Epic')]
96
97 >>> labels_set([Label(name=LabelType.EPIC, value="Epic1"),
98 ... Label(name=LabelType.EPIC, value="Epic2")
99 ... ])
100 [Label(name='epic', value='Epic1'), Label(name='epic', value='Epic2')]
101 """
102 class Wl(object):
103 def __init__(self, label):
104 self.label = label
105
106 def __repr__(self):
107 return "{name}{value}".format(**attr.asdict(self.label))
108
109 def __eq__(self, other):
110 if self.label.name in ALLURE_UNIQUE_LABELS:
111 return self.label.name == other.label.name
112 return repr(self) == repr(other)
113
114 def __hash__(self):
115 if self.label.name in ALLURE_UNIQUE_LABELS:
116 return hash(self.label.name)
117 return hash(repr(self))
118
119 return sorted([wl.label for wl in set([Wl(label) for label in reversed(labels)])])