Skip to content

Commit 7331fb0

Browse files
authored
refactor commons (fixes #18 fixes #75 fixes #76 via #81)
1 parent 6d589b9 commit 7331fb0

File tree

18 files changed

+317
-259
lines changed

18 files changed

+317
-259
lines changed

allure-behave/src/listener.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
from allure.logger import AllureLogger
2-
from allure.utils import uuid4
3-
from allure.utils import now
4-
from allure.types import LabelType, AttachmentType
5-
from allure.model2 import TestResult
6-
from allure.model2 import TestStepResult
7-
from allure.model2 import TestBeforeResult
8-
from allure.model2 import TestResultContainer
9-
from allure.model2 import Status, Parameter, Label
1+
from allure_commons.logger import AllureLogger
2+
from allure_commons.utils import uuid4
3+
from allure_commons.utils import now
4+
from allure_commons.types import LabelType, AttachmentType
5+
from allure_commons.model2 import TestResult
6+
from allure_commons.model2 import TestStepResult
7+
from allure_commons.model2 import TestBeforeResult
8+
from allure_commons.model2 import TestResultContainer
9+
from allure_commons.model2 import Status, Parameter, Label
1010
from allure_behave.utils import scenario_parameters
1111
from allure_behave.utils import scenario_severity
1212
from allure_behave.utils import scenario_tags

allure-behave/src/utils.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from behave.model import ScenarioOutline
22
from behave.runner_util import make_undefined_step_snippet
3-
from allure.types import Severity
4-
from allure.model2 import Status, Parameter, Label
5-
from allure.model2 import StatusDetails
6-
from allure.utils import md5
3+
from allure_commons.types import Severity
4+
from allure_commons.model2 import Status, Parameter, Label
5+
from allure_commons.model2 import StatusDetails
6+
from allure_commons.utils import md5
77
import traceback
88

99
STATUS = {

allure-pytest/src/helper.py

Lines changed: 11 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -1,134 +1,23 @@
11
import pytest
2-
from functools import wraps
3-
from allure.utils import uuid4
4-
from allure.types import Severity
5-
from allure.types import LabelType, LinkType, AttachmentType
6-
7-
from allure_pytest.utils import step_parameters
2+
import allure_commons
83
from allure_pytest.utils import ALLURE_LABEL_PREFIX, ALLURE_LINK_PREFIX
94

105

116
class AllureTestHelper(object):
127

138
def __init__(self, config):
149
self.config = config
15-
self.attach = Attach(config)
16-
17-
@property
18-
def attachment_type(self):
19-
return AttachmentType
20-
21-
def label(self, label_type, *value):
22-
allure_label = getattr(pytest.mark, '{prefix}.{label_type}'.format(prefix=ALLURE_LABEL_PREFIX,
23-
label_type=label_type))
24-
return allure_label(*value, label_type=label_type)
25-
26-
def severity(self, severity):
27-
return self.label(LabelType.SEVERITY, severity.value)
2810

29-
@property
30-
def severity_level(self):
31-
return Severity
11+
@allure_commons.hookimpl
12+
def decorate_as_label(self, label_type, labels):
13+
allure_label_marker = u'{prefix}.{label_type}'.format(prefix=ALLURE_LABEL_PREFIX, label_type=label_type)
14+
allure_label = getattr(pytest.mark, allure_label_marker)
15+
return allure_label(*labels, label_type=label_type)
3216

33-
def feature(self, *features):
34-
return self.label(LabelType.FEATURE, *features)
35-
36-
def story(self, *stories):
37-
return self.label(LabelType.STORY, *stories)
38-
39-
def link(self, url, link_type=LinkType.LINK, name=None):
40-
allure_link = getattr(pytest.mark, '{prefix}.{link_type}'.format(prefix=ALLURE_LINK_PREFIX,
41-
link_type=link_type))
42-
43-
pattern = dict(self.config.option.allure_link_pattern).get(str(link_type), '{}')
17+
@allure_commons.hookimpl
18+
def decorate_as_link(self, url, link_type, name):
19+
allure_link_marker = u'{prefix}.{link_type}'.format(prefix=ALLURE_LINK_PREFIX, link_type=link_type)
20+
pattern = dict(self.config.option.allure_link_pattern).get(str(link_type), u'{}')
4421
url = pattern.format(url)
45-
22+
allure_link = getattr(pytest.mark, allure_link_marker)
4623
return allure_link(url, name=name)
47-
48-
def issue(self, url, name=None):
49-
return self.link(url, link_type=LinkType.ISSUE, name=name)
50-
51-
def testcase(self, url, name=None):
52-
return self.link(url, link_type=LinkType.TEST_CASE, name=name)
53-
54-
def step(self, title):
55-
if callable(title):
56-
return LazyInitStepContext(self, title.__name__)(title)
57-
else:
58-
return LazyInitStepContext(self, title)
59-
60-
def __getattr__(self, attr):
61-
for severity in Severity:
62-
if severity.name == attr:
63-
return self.severity(severity)
64-
65-
for attach_type in AttachmentType:
66-
if attach_type.name == attr:
67-
return attach_type
68-
69-
raise AttributeError
70-
71-
@pytest.hookimpl()
72-
def pytest_namespace(self):
73-
return {"allure": self}
74-
75-
76-
class StepContext:
77-
78-
def __init__(self, allure, title, params):
79-
self.allure = allure
80-
self.title = title
81-
self._uuid = uuid4()
82-
self.params = params
83-
84-
def __enter__(self):
85-
self.allure.config.hook.pytest_allure_before_step(uuid=self._uuid,
86-
title=self.title,
87-
params=self.params)
88-
89-
def __exit__(self, exc_type, exc_val, exc_tb):
90-
self.allure.config.hook.pytest_allure_after_step(uuid=self._uuid,
91-
title=self.title,
92-
exc_type=exc_type,
93-
exc_val=exc_val,
94-
exc_tb=exc_tb)
95-
96-
def __call__(self, func):
97-
@wraps(func)
98-
def impl(*a, **kw):
99-
__tracebackhide__ = True
100-
params = step_parameters(func, *a, **kw)
101-
with StepContext(self.allure, self.title.format(*a, **kw), params):
102-
return func(*a, **kw)
103-
return impl
104-
105-
106-
class LazyInitStepContext(StepContext):
107-
108-
def __init__(self, allure_helper, title):
109-
self.allure_helper = allure_helper
110-
self.title = title
111-
self._uuid = uuid4()
112-
self.params = []
113-
114-
@property
115-
def allure(self):
116-
return self.allure_helper
117-
118-
119-
class Attach(object):
120-
121-
def __init__(self, config):
122-
self.config = config
123-
124-
def __call__(self, body, name=None, attachment_type=None, extension=None):
125-
self.config.hook.pytest_allure_attach_data(body=body,
126-
name=name,
127-
attachment_type=attachment_type,
128-
extension=extension)
129-
130-
def file(self, source, name=None, attachment_type=None, extension=None):
131-
self.config.hook.pytest_allure_attach_file(source=source,
132-
name=name,
133-
attachment_type=attachment_type,
134-
extension=extension)

allure-pytest/src/hooks.py

Lines changed: 0 additions & 31 deletions
This file was deleted.

allure-pytest/src/listener.py

Lines changed: 27 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import pytest
2+
import allure_commons
23

3-
from allure.utils import now
4-
from allure.utils import md5
5-
from allure.utils import uuid4
6-
from allure.logger import AllureLogger
7-
from allure.model2 import TestStepResult, TestResult, TestBeforeResult, TestAfterResult
8-
from allure.model2 import TestResultContainer
9-
from allure.model2 import StatusDetails
10-
from allure.model2 import Parameter
11-
from allure.model2 import Label, Link
12-
from allure.model2 import Status
4+
from allure_commons.utils import now
5+
from allure_commons.utils import md5
6+
from allure_commons.utils import uuid4
7+
8+
from allure_commons.logger import AllureLogger
9+
10+
from allure_commons.model2 import TestStepResult, TestResult, TestBeforeResult, TestAfterResult
11+
from allure_commons.model2 import TestResultContainer
12+
from allure_commons.model2 import StatusDetails
13+
from allure_commons.model2 import Parameter
14+
from allure_commons.model2 import Label, Link
15+
from allure_commons.model2 import Status
1316

1417
from allure_pytest.utils import allure_parameters
1518
from allure_pytest.utils import allure_labels, allure_links
@@ -23,14 +26,14 @@ def __init__(self, config):
2326
self.allure_logger = AllureLogger(config.option.allure_report_dir)
2427
self._cache = ItemCache()
2528

26-
@pytest.hookimpl
27-
def pytest_allure_before_step(self, uuid, title, params):
29+
@allure_commons.hookimpl
30+
def start_step(self, uuid, title, params):
2831
parameters = [Parameter(name=name, value=value) for name, value in params]
2932
step = TestStepResult(name=title, start=now(), parameters=parameters)
3033
self.allure_logger.start_step(None, uuid, step)
3134

32-
@pytest.hookimpl
33-
def pytest_allure_after_step(self, uuid, exc_type, exc_val, exc_tb):
35+
@allure_commons.hookimpl
36+
def stop_step(self, uuid, exc_type, exc_val, exc_tb):
3437
status = Status.PASSED
3538
if exc_type is not None:
3639
if exc_type == pytest.skip.Exception:
@@ -40,13 +43,13 @@ def pytest_allure_after_step(self, uuid, exc_type, exc_val, exc_tb):
4043

4144
self.allure_logger.stop_step(uuid, stop=now(), status=status)
4245

43-
@pytest.hookimpl
44-
def pytest_allure_before_finalizer(self, parent_uuid, uuid, name):
46+
@allure_commons.hookimpl
47+
def start_fixture(self, parent_uuid, uuid, name):
4548
after_fixture = TestAfterResult(name=name, start=now())
4649
self.allure_logger.start_after_fixture(parent_uuid, uuid, after_fixture)
4750

48-
@pytest.hookimpl
49-
def pytest_allure_after_finalizer(self, uuid, exc_type, exc_val, exc_tb):
51+
@allure_commons.hookimpl
52+
def stop_fixture(self, uuid, exc_type, exc_val, exc_tb):
5053
self.allure_logger.stop_after_fixture(uuid, stop=now())
5154

5255
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
@@ -109,7 +112,8 @@ def pytest_fixture_setup(self, fixturedef, request):
109112
self.allure_logger.stop_before_fixture(before_fixture_uuid, stop=now())
110113

111114
for index, finalizer in enumerate(fixturedef._finalizer or ()):
112-
fixturedef._finalizer[index] = FinalizerSpy(container_uuid, fixturedef.argname, finalizer, self.config)
115+
name = u'{fixture}::{finalizer}'.format(fixture=fixturedef.argname, finalizer=finalizer.__name__)
116+
fixturedef._finalizer[index] = allure_commons.fixture(finalizer, parent_uuid=container_uuid, name=name)
113117

114118
@pytest.hookimpl(hookwrapper=True)
115119
def pytest_fixture_post_finalizer(self, fixturedef):
@@ -158,39 +162,15 @@ def pytest_runtest_makereport(self, item, call):
158162
else:
159163
self.allure_logger.update_test(uuid, status=status)
160164

161-
@pytest.hookimpl
162-
def pytest_allure_attach_data(self, body, name, attachment_type, extension):
165+
@allure_commons.hookimpl
166+
def attach_data(self, body, name, attachment_type, extension):
163167
self.allure_logger.attach_data(uuid4(), body, name=name, attachment_type=attachment_type, extension=extension)
164168

165-
@pytest.hookimpl
166-
def pytest_allure_attach_file(self, source, name, attachment_type, extension):
169+
@allure_commons.hookimpl
170+
def attach_file(self, source, name, attachment_type, extension):
167171
self.allure_logger.attach_file(uuid4(), source, name=name, attachment_type=attachment_type, extension=extension)
168172

169173

170-
class FinalizerSpy(object):
171-
def __init__(self, parent_uuid, fixturename, finalizer, config):
172-
self._parent_uuid = parent_uuid
173-
self._config = config
174-
self._finalizer = finalizer
175-
self._uuid = uuid4()
176-
self._name = "{fixture}::{finalizer}".format(fixture=fixturename, finalizer=finalizer.__name__)
177-
178-
def __call__(self, *args, **kwards):
179-
with self:
180-
return self._finalizer(*args, **kwards)
181-
182-
def __enter__(self):
183-
self._config.hook.pytest_allure_before_finalizer(parent_uuid=self._parent_uuid,
184-
uuid=self._uuid,
185-
name=self._name)
186-
187-
def __exit__(self, exc_type, exc_val, exc_tb):
188-
self._config.hook.pytest_allure_after_finalizer(uuid=self._uuid,
189-
exc_type=exc_type,
190-
exc_val=exc_val,
191-
exc_tb=exc_tb)
192-
193-
194174
class ItemCache(object):
195175

196176
def __init__(self):

allure-pytest/src/plugin.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
import argparse
33
from six import text_type
44

5-
from allure.types import Severity
6-
from allure.types import LabelType
7-
5+
import allure
6+
import allure_commons
7+
from allure_commons.types import LabelType
88
from allure_pytest.utils import allure_labels
99
from allure_pytest.helper import AllureTestHelper
1010
from allure_pytest.listener import AllureListener
@@ -27,7 +27,7 @@ def a_label_type(string):
2727
return set((name.value, atom) for atom in atoms)
2828
return a_label_type
2929

30-
severities = [x.value for x in list(Severity)]
30+
severities = [x.value for x in list(allure.severity_level)]
3131
parser.getgroup("general").addoption('--allure-severities',
3232
action="store",
3333
dest="allure_severities",
@@ -84,7 +84,8 @@ def pytest_configure(config):
8484
config.pluginmanager.register(test_listener)
8585

8686
test_helper = AllureTestHelper(config)
87-
config.pluginmanager.register(test_helper)
87+
allure_commons.register(test_listener)
88+
allure_commons.register(test_helper)
8889

8990

9091
def pytest_runtest_setup(item):
@@ -98,10 +99,5 @@ def pytest_runtest_setup(item):
9899
pytest.skip('Not suitable with selected labels: %s.' % ', '.join(text_type(l) for l in sorted(arg_labels)))
99100

100101

101-
def pytest_addhooks(pluginmanager):
102-
import allure_pytest.hooks as hooks
103-
# avoid warnings with pytest-2.8
104-
method = getattr(pluginmanager, "add_hookspecs", None)
105-
if method is None:
106-
method = pluginmanager.addhooks
107-
method(hooks)
102+
def pytest_namespace():
103+
return {"allure": allure}

0 commit comments

Comments
 (0)