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.
Files changed (51) hide show
  1. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/PKG-INFO +2 -2
  2. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/setup.py +2 -2
  3. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/api_client.py +12 -0
  4. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/decorators.py +1 -2
  5. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/test_result.py +1 -3
  6. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/plugin_manager.py +28 -8
  7. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/utils/html_escape_utils.py +0 -2
  8. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons.egg-info/PKG-INFO +2 -2
  9. testit_python_commons-3.10.9/src/testit_python_commons.egg-info/requires.txt +3 -0
  10. testit_python_commons-3.10.8.post550/src/testit_python_commons.egg-info/requires.txt +0 -3
  11. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/README.md +0 -0
  12. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/setup.cfg +0 -0
  13. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit.py +0 -0
  14. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/__init__.py +0 -0
  15. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/app_properties.py +0 -0
  16. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/__init__.py +0 -0
  17. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/client_configuration.py +0 -0
  18. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/converter.py +0 -0
  19. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/helpers/__init__.py +0 -0
  20. {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
  21. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/helpers/threads_manager.py +0 -0
  22. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/client/models/__init__.py +0 -0
  23. {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
  24. {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
  25. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/dynamic_methods.py +0 -0
  26. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/__init__.py +0 -0
  27. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/adapter_mode.py +0 -0
  28. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/fixture.py +0 -0
  29. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/link.py +0 -0
  30. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/link_type.py +0 -0
  31. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/outcome_type.py +0 -0
  32. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/models/step_result.py +0 -0
  33. {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
  34. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/__init__.py +0 -0
  35. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/adapter_manager.py +0 -0
  36. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/adapter_manager_configuration.py +0 -0
  37. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/fixture_manager.py +0 -0
  38. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/fixture_storage.py +0 -0
  39. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/logger.py +0 -0
  40. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/retry.py +0 -0
  41. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/step_manager.py +0 -0
  42. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/step_result_storage.py +0 -0
  43. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/services/utils.py +0 -0
  44. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/step.py +0 -0
  45. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons/utils/__init__.py +0 -0
  46. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons.egg-info/SOURCES.txt +0 -0
  47. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons.egg-info/dependency_links.txt +0 -0
  48. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/src/testit_python_commons.egg-info/top_level.txt +0 -0
  49. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/tests/test_app_properties.py +0 -0
  50. {testit_python_commons-3.10.8.post550 → testit_python_commons-3.10.9}/tests/test_dynamic_methods.py +0 -0
  51. {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.8.post550
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.post550
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.8.post550"
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.post550']
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 inspect.iscoroutinefunction(function):
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
- # don't use escaping for externalId
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('testit')
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.client.client_configuration import ClientConfiguration
28
- from testit_python_commons.services.adapter_manager_configuration import AdapterManagerConfiguration
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('logs') == 'true')
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(adapter_configuration, client_configuration, fixture_manager)
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
- logging.basicConfig(format='\n%(levelname)s (%(asctime)s): %(message)s', level=level)
83
+ cls.__logger.setLevel(level)
65
84
 
66
- cls.__logger = logging.getLogger('TmsLogger')
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.8.post550
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.post550
20
+ Requires-Dist: testit-api-client==7.2.0
21
21
  Dynamic: author
22
22
  Dynamic: author-email
23
23
  Dynamic: classifier
@@ -0,0 +1,3 @@
1
+ pluggy
2
+ tomli
3
+ testit-api-client==7.2.0
@@ -1,3 +0,0 @@
1
- pluggy
2
- tomli
3
- testit-api-client==7.2.0.post550