testit-python-commons 3.10.8.post550__tar.gz → 3.10.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/PKG-INFO +2 -2
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/setup.py +2 -2
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/api_client.py +12 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/decorators.py +1 -2
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/test_result.py +1 -3
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/plugin_manager.py +28 -8
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/utils/html_escape_utils.py +0 -2
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons.egg-info/PKG-INFO +2 -2
- testit_python_commons-3.10.9/src/testit_python_commons.egg-info/requires.txt +3 -0
- testit_python_commons-3.10.8.post550/src/testit_python_commons.egg-info/requires.txt +0 -3
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/README.md +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/setup.cfg +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/__init__.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/app_properties.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/__init__.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/client_configuration.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/converter.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/helpers/__init__.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/helpers/bulk_autotest_helper.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/helpers/threads_manager.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/models/__init__.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/models/threads_for_create_and_result.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/models/threads_for_update_and_result.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/dynamic_methods.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/__init__.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/adapter_mode.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/fixture.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/link.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/link_type.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/outcome_type.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/step_result.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/test_result_with_all_fixture_step_results_model.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/__init__.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/adapter_manager.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/adapter_manager_configuration.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/fixture_manager.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/fixture_storage.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/logger.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/retry.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/step_manager.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/step_result_storage.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/utils.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/step.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/utils/__init__.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons.egg-info/SOURCES.txt +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons.egg-info/dependency_links.txt +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons.egg-info/top_level.txt +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/tests/test_app_properties.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/tests/test_dynamic_methods.py +0 -0
- {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/tests/test_html_escape_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: testit-python-commons
|
|
3
|
-
Version: 3.10.
|
|
3
|
+
Version: 3.10.9
|
|
4
4
|
Summary: Python commons for Test IT
|
|
5
5
|
Home-page: https://github.com/testit-tms/adapters-python/
|
|
6
6
|
Author: Integration team
|
|
@@ -17,7 +17,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
Requires-Dist: pluggy
|
|
19
19
|
Requires-Dist: tomli
|
|
20
|
-
Requires-Dist: testit-api-client==7.2.0
|
|
20
|
+
Requires-Dist: testit-api-client==7.2.0
|
|
21
21
|
Dynamic: author
|
|
22
22
|
Dynamic: author-email
|
|
23
23
|
Dynamic: classifier
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from setuptools import find_packages, setup
|
|
2
2
|
|
|
3
|
-
VERSION = "3.10.
|
|
3
|
+
VERSION = "3.10.9"
|
|
4
4
|
|
|
5
5
|
setup(
|
|
6
6
|
name='testit-python-commons',
|
|
@@ -25,5 +25,5 @@ setup(
|
|
|
25
25
|
py_modules=['testit', 'testit_python_commons'],
|
|
26
26
|
packages=find_packages(where='src'),
|
|
27
27
|
package_dir={'': 'src'},
|
|
28
|
-
install_requires=['pluggy', 'tomli', 'testit-api-client==7.2.0
|
|
28
|
+
install_requires=['pluggy', 'tomli', 'testit-api-client==7.2.0']
|
|
29
29
|
)
|
|
@@ -61,6 +61,7 @@ class ApiClientWorker:
|
|
|
61
61
|
header_value='PrivateToken ' + token)
|
|
62
62
|
|
|
63
63
|
@adapter_logger
|
|
64
|
+
@retry
|
|
64
65
|
def create_test_run(self, test_run_name: str = None) -> str:
|
|
65
66
|
test_run_name = f'TestRun_{datetime.today().strftime("%Y-%m-%dT%H:%M:%S")}' if \
|
|
66
67
|
not test_run_name else test_run_name
|
|
@@ -73,6 +74,7 @@ class ApiClientWorker:
|
|
|
73
74
|
|
|
74
75
|
return Converter.get_id_from_create_test_run_response(response)
|
|
75
76
|
|
|
77
|
+
@retry
|
|
76
78
|
def get_test_run(self, test_run_id: str) -> TestRunV2ApiResult:
|
|
77
79
|
"""Function gets test run and returns test run."""
|
|
78
80
|
logging.debug(f"Getting test run by id {test_run_id}")
|
|
@@ -85,6 +87,7 @@ class ApiClientWorker:
|
|
|
85
87
|
logging.error(f"Test run by id {test_run_id} not found!")
|
|
86
88
|
raise Exception(f"Test run by id {test_run_id} not found!")
|
|
87
89
|
|
|
90
|
+
@retry
|
|
88
91
|
def update_test_run(self, test_run: TestRunV2ApiResult) -> None:
|
|
89
92
|
"""Function updates test run."""
|
|
90
93
|
model = Converter.build_update_empty_request(test_run)
|
|
@@ -111,6 +114,7 @@ class ApiClientWorker:
|
|
|
111
114
|
raise Exception('The autotests with the status "InProgress" ' +
|
|
112
115
|
f'and the configuration id "{self.__config.get_configuration_id()}" were not found!')
|
|
113
116
|
|
|
117
|
+
@retry
|
|
114
118
|
def __get_test_results(self) -> List[TestResultShortResponse]:
|
|
115
119
|
all_test_results = []
|
|
116
120
|
skip = 0
|
|
@@ -138,6 +142,7 @@ class ApiClientWorker:
|
|
|
138
142
|
return all_test_results
|
|
139
143
|
|
|
140
144
|
@adapter_logger
|
|
145
|
+
@retry
|
|
141
146
|
def __get_autotests_by_external_id(self, external_id: str) -> List[AutoTestApiResult]:
|
|
142
147
|
model = Converter.project_id_and_external_id_to_auto_tests_search_post_request(
|
|
143
148
|
self.__config.get_project_id(),
|
|
@@ -281,6 +286,7 @@ class ApiClientWorker:
|
|
|
281
286
|
logging.error(f'Getting workitem by id {work_item_id} status: {exc}')
|
|
282
287
|
|
|
283
288
|
@adapter_logger
|
|
289
|
+
@retry
|
|
284
290
|
def __get_work_items_linked_to_autotest(self, autotest_global_id: str) -> List[WorkItemIdentifierModel]:
|
|
285
291
|
return self.__autotest_api.get_work_items_linked_to_auto_test(id=autotest_global_id)
|
|
286
292
|
|
|
@@ -303,6 +309,7 @@ class ApiClientWorker:
|
|
|
303
309
|
self.__link_test_to_work_item(autotest_global_id, work_item_id)
|
|
304
310
|
|
|
305
311
|
@adapter_logger
|
|
312
|
+
@retry
|
|
306
313
|
def __create_test(self, test_result: TestResult) -> str:
|
|
307
314
|
logging.debug(f'Autotest "{test_result.get_autotest_name()}" was not found')
|
|
308
315
|
|
|
@@ -321,6 +328,7 @@ class ApiClientWorker:
|
|
|
321
328
|
return autotest_response.id
|
|
322
329
|
|
|
323
330
|
@adapter_logger
|
|
331
|
+
@retry
|
|
324
332
|
def __create_tests(self, autotests_for_create: List[AutoTestPostModel]) -> None:
|
|
325
333
|
logging.debug(f'Creating autotests: "{autotests_for_create}')
|
|
326
334
|
|
|
@@ -329,6 +337,7 @@ class ApiClientWorker:
|
|
|
329
337
|
logging.debug(f'Autotests were created')
|
|
330
338
|
|
|
331
339
|
@adapter_logger
|
|
340
|
+
@retry
|
|
332
341
|
def __update_test(self, test_result: TestResult, autotest: AutoTestApiResult) -> None:
|
|
333
342
|
logging.debug(f'Autotest "{test_result.get_autotest_name()}" was found')
|
|
334
343
|
|
|
@@ -342,6 +351,7 @@ class ApiClientWorker:
|
|
|
342
351
|
logging.debug(f'Autotest "{test_result.get_autotest_name()}" was updated')
|
|
343
352
|
|
|
344
353
|
@adapter_logger
|
|
354
|
+
@retry
|
|
345
355
|
def __update_tests(self, autotests_for_update: List[AutoTestPutModel]) -> None:
|
|
346
356
|
logging.debug(f'Updating autotests: {autotests_for_update}')
|
|
347
357
|
|
|
@@ -368,6 +378,7 @@ class ApiClientWorker:
|
|
|
368
378
|
logging.debug(f'Autotest was linked with workItem "{work_item_id}" by global id "{autotest_global_id}')
|
|
369
379
|
|
|
370
380
|
@adapter_logger
|
|
381
|
+
@retry
|
|
371
382
|
def __load_test_result(self, test_result: TestResult) -> str:
|
|
372
383
|
model = Converter.test_result_to_testrun_result_post_model(
|
|
373
384
|
test_result,
|
|
@@ -383,6 +394,7 @@ class ApiClientWorker:
|
|
|
383
394
|
return Converter.get_test_result_id_from_testrun_result_post_response(response)
|
|
384
395
|
|
|
385
396
|
@adapter_logger
|
|
397
|
+
@retry
|
|
386
398
|
def get_test_result_by_id(self, test_result_id: str) -> TestResultResponse:
|
|
387
399
|
return self.__test_results_api.api_v2_test_results_id_get(id=test_result_id)
|
|
388
400
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
import inspect
|
|
3
2
|
import logging
|
|
4
3
|
import types
|
|
5
4
|
from functools import wraps
|
|
@@ -29,7 +28,7 @@ def inner(function):
|
|
|
29
28
|
await function(*args, **kwargs)
|
|
30
29
|
|
|
31
30
|
if isinstance(function, types.FunctionType):
|
|
32
|
-
if
|
|
31
|
+
if asyncio.iscoroutinefunction(function):
|
|
33
32
|
return async_wrapper
|
|
34
33
|
|
|
35
34
|
return sync_wrapper
|
|
@@ -34,9 +34,7 @@ class TestResult:
|
|
|
34
34
|
|
|
35
35
|
@adapter_logger
|
|
36
36
|
def set_external_id(self, external_id: str):
|
|
37
|
-
|
|
38
|
-
# self.__external_id = HtmlEscapeUtils.escape_html_tags(external_id)
|
|
39
|
-
self.__external_id = external_id
|
|
37
|
+
self.__external_id = HtmlEscapeUtils.escape_html_tags(external_id)
|
|
40
38
|
|
|
41
39
|
return self
|
|
42
40
|
|
|
@@ -2,8 +2,8 @@ import logging
|
|
|
2
2
|
|
|
3
3
|
from pluggy import PluginManager
|
|
4
4
|
|
|
5
|
-
from testit_python_commons.services.step_manager import StepManager
|
|
6
5
|
from testit_python_commons.app_properties import AppProperties
|
|
6
|
+
from testit_python_commons.services.step_manager import StepManager
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class TmsPluginManager:
|
|
@@ -16,26 +16,32 @@ class TmsPluginManager:
|
|
|
16
16
|
@classmethod
|
|
17
17
|
def get_plugin_manager(cls):
|
|
18
18
|
if cls.__plugin_manager is None:
|
|
19
|
-
cls.__plugin_manager = PluginManager(
|
|
19
|
+
cls.__plugin_manager = PluginManager("testit")
|
|
20
20
|
|
|
21
21
|
return cls.__plugin_manager
|
|
22
22
|
|
|
23
23
|
@classmethod
|
|
24
24
|
def get_adapter_manager(cls, option=None):
|
|
25
25
|
if cls.__adapter_manager is None:
|
|
26
|
+
from testit_python_commons.client.client_configuration import (
|
|
27
|
+
ClientConfiguration,
|
|
28
|
+
)
|
|
26
29
|
from testit_python_commons.services.adapter_manager import AdapterManager
|
|
27
|
-
from testit_python_commons.
|
|
28
|
-
|
|
30
|
+
from testit_python_commons.services.adapter_manager_configuration import (
|
|
31
|
+
AdapterManagerConfiguration,
|
|
32
|
+
)
|
|
29
33
|
|
|
30
34
|
app_properties = AppProperties.load_properties(option)
|
|
31
35
|
|
|
32
|
-
cls.get_logger(app_properties.get(
|
|
36
|
+
cls.get_logger(app_properties.get("logs") == "true")
|
|
33
37
|
|
|
34
38
|
client_configuration = ClientConfiguration(app_properties)
|
|
35
39
|
adapter_configuration = AdapterManagerConfiguration(app_properties)
|
|
36
40
|
fixture_manager = cls.get_fixture_manager()
|
|
37
41
|
|
|
38
|
-
cls.__adapter_manager = AdapterManager(
|
|
42
|
+
cls.__adapter_manager = AdapterManager(
|
|
43
|
+
adapter_configuration, client_configuration, fixture_manager
|
|
44
|
+
)
|
|
39
45
|
|
|
40
46
|
return cls.__adapter_manager
|
|
41
47
|
|
|
@@ -58,12 +64,26 @@ class TmsPluginManager:
|
|
|
58
64
|
@classmethod
|
|
59
65
|
def get_logger(cls, debug: bool = False):
|
|
60
66
|
if cls.__logger is None:
|
|
67
|
+
# Fix for live log duplication issue
|
|
68
|
+
# Create a dedicated handler for TmsLogger to avoid affecting global logging configuration
|
|
69
|
+
cls.__logger = logging.getLogger("TmsLogger")
|
|
70
|
+
|
|
71
|
+
# Only add handler if none exists to prevent duplicates
|
|
72
|
+
if not cls.__logger.handlers:
|
|
73
|
+
handler = logging.StreamHandler()
|
|
74
|
+
formatter = logging.Formatter(
|
|
75
|
+
"\n%(levelname)s (%(asctime)s): %(message)s"
|
|
76
|
+
)
|
|
77
|
+
handler.setFormatter(formatter)
|
|
78
|
+
cls.__logger.addHandler(handler)
|
|
79
|
+
|
|
61
80
|
# Always show WARNING and above (WARNING, ERROR, CRITICAL)
|
|
62
81
|
# Only show DEBUG and INFO when debug mode is enabled
|
|
63
82
|
level = logging.DEBUG if debug else logging.WARNING
|
|
64
|
-
|
|
83
|
+
cls.__logger.setLevel(level)
|
|
65
84
|
|
|
66
|
-
|
|
85
|
+
# Prevent propagation to root logger to avoid interference with user loggers
|
|
86
|
+
cls.__logger.propagate = False
|
|
67
87
|
|
|
68
88
|
return cls.__logger
|
|
69
89
|
|
|
@@ -123,8 +123,6 @@ class HtmlEscapeUtils:
|
|
|
123
123
|
# Skip private/protected attributes and methods
|
|
124
124
|
if attr_name.startswith('_') or callable(getattr(obj, attr_name, None)):
|
|
125
125
|
continue
|
|
126
|
-
if attr_name.startswith("external_id") or attr_name.startswith("externalId"):
|
|
127
|
-
continue
|
|
128
126
|
|
|
129
127
|
try:
|
|
130
128
|
value = getattr(obj, attr_name)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: testit-python-commons
|
|
3
|
-
Version: 3.10.
|
|
3
|
+
Version: 3.10.9
|
|
4
4
|
Summary: Python commons for Test IT
|
|
5
5
|
Home-page: https://github.com/testit-tms/adapters-python/
|
|
6
6
|
Author: Integration team
|
|
@@ -17,7 +17,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
Requires-Dist: pluggy
|
|
19
19
|
Requires-Dist: tomli
|
|
20
|
-
Requires-Dist: testit-api-client==7.2.0
|
|
20
|
+
Requires-Dist: testit-api-client==7.2.0
|
|
21
21
|
Dynamic: author
|
|
22
22
|
Dynamic: author-email
|
|
23
23
|
Dynamic: classifier
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/tests/test_app_properties.py
RENAMED
|
File without changes
|
{testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/tests/test_dynamic_methods.py
RENAMED
|
File without changes
|
|
File without changes
|