testit-python-commons 5.2.1__py3-none-any.whl → 5.2.3__py3-none-any.whl
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.py +4 -0
- testit_python_commons/client/api_client.py +6 -3
- testit_python_commons/client/converter.py +12 -2
- testit_python_commons/decorators.py +14 -1
- testit_python_commons/dynamic_methods.py +12 -0
- testit_python_commons/models/test_result.py +14 -0
- testit_python_commons/services/adapter_manager.py +54 -19
- testit_python_commons/utils/html_escape_utils.py +12 -16
- {testit_python_commons-5.2.1.dist-info → testit_python_commons-5.2.3.dist-info}/METADATA +1 -1
- {testit_python_commons-5.2.1.dist-info → testit_python_commons-5.2.3.dist-info}/RECORD +12 -12
- {testit_python_commons-5.2.1.dist-info → testit_python_commons-5.2.3.dist-info}/WHEEL +0 -0
- {testit_python_commons-5.2.1.dist-info → testit_python_commons-5.2.3.dist-info}/top_level.txt +0 -0
testit.py
CHANGED
|
@@ -12,6 +12,7 @@ from testit_python_commons.decorators import (
|
|
|
12
12
|
nameSpace,
|
|
13
13
|
title,
|
|
14
14
|
workItemID,
|
|
15
|
+
workItemId,
|
|
15
16
|
workItemIds
|
|
16
17
|
)
|
|
17
18
|
from testit_python_commons.dynamic_methods import (
|
|
@@ -19,6 +20,7 @@ from testit_python_commons.dynamic_methods import (
|
|
|
19
20
|
addLink,
|
|
20
21
|
addLinks,
|
|
21
22
|
addMessage,
|
|
23
|
+
addWorkItemId,
|
|
22
24
|
addWorkItemIds,
|
|
23
25
|
addDisplayName,
|
|
24
26
|
addNameSpace,
|
|
@@ -43,6 +45,7 @@ __all__ = [
|
|
|
43
45
|
'nameSpace',
|
|
44
46
|
'className',
|
|
45
47
|
'workItemID',
|
|
48
|
+
'workItemId',
|
|
46
49
|
'workItemIds',
|
|
47
50
|
'title',
|
|
48
51
|
'description',
|
|
@@ -57,6 +60,7 @@ __all__ = [
|
|
|
57
60
|
'addAttachments',
|
|
58
61
|
'message',
|
|
59
62
|
'addMessage',
|
|
63
|
+
'addWorkItemId',
|
|
60
64
|
'addWorkItemIds',
|
|
61
65
|
'addDisplayName',
|
|
62
66
|
'addNameSpace',
|
|
@@ -266,9 +266,9 @@ class ApiClientWorker:
|
|
|
266
266
|
self,
|
|
267
267
|
test_results: List[TestResult],
|
|
268
268
|
fixture_containers: dict,
|
|
269
|
-
|
|
269
|
+
finalized_result_keys: set = None) -> None:
|
|
270
270
|
logging.debug("call __write_tests")
|
|
271
|
-
|
|
271
|
+
finalized_result_keys = finalized_result_keys or set()
|
|
272
272
|
bulk_autotest_helper = BulkAutotestHelper(self.__autotest_api, self.__test_run_api, self.__config)
|
|
273
273
|
create_count = 0
|
|
274
274
|
update_count = 0
|
|
@@ -278,8 +278,11 @@ class ApiClientWorker:
|
|
|
278
278
|
for test_result in test_results:
|
|
279
279
|
test_result = self.__add_fixtures_to_test_result(test_result, fixture_containers)
|
|
280
280
|
external_id = test_result.get_external_id()
|
|
281
|
+
finalize_key = test_result.get_finalize_key()
|
|
281
282
|
|
|
282
|
-
|
|
283
|
+
# Skip only the same invocation (Java: by UUID). Bare externalId would
|
|
284
|
+
# drop other parametrize iterations that share one autotest id.
|
|
285
|
+
if finalize_key in finalized_result_keys:
|
|
283
286
|
skip_count += 1
|
|
284
287
|
logging.info(
|
|
285
288
|
'Bulk import: skip sendTestResults for %s (already finalized at test finish)',
|
|
@@ -45,9 +45,19 @@ from testit_python_commons.models.step_result import StepResult
|
|
|
45
45
|
from testit_python_commons.models.test_result import TestResult
|
|
46
46
|
from testit_python_commons.models.test_result_with_all_fixture_step_results_model import TestResultWithAllFixtureStepResults
|
|
47
47
|
from testit_python_commons.services.logger import adapter_logger
|
|
48
|
+
from testit_python_commons.utils.html_escape_utils import HtmlEscapeUtils
|
|
48
49
|
|
|
49
50
|
|
|
50
51
|
class Converter:
|
|
52
|
+
@staticmethod
|
|
53
|
+
def _escape_string_map(values: Optional[dict]) -> Optional[dict]:
|
|
54
|
+
if not values:
|
|
55
|
+
return values
|
|
56
|
+
return {
|
|
57
|
+
str(key): HtmlEscapeUtils.escape_html_tags(str(value)) if value is not None else value
|
|
58
|
+
for key, value in values.items()
|
|
59
|
+
}
|
|
60
|
+
|
|
51
61
|
@staticmethod
|
|
52
62
|
@adapter_logger
|
|
53
63
|
def test_run_to_test_run_short_model(
|
|
@@ -402,8 +412,8 @@ class Converter:
|
|
|
402
412
|
test_result.get_teardown_results()),
|
|
403
413
|
traces=test_result.get_traces(),
|
|
404
414
|
attachments=test_result.get_attachments(),
|
|
405
|
-
parameters=test_result.get_parameters(),
|
|
406
|
-
properties=test_result.get_properties(),
|
|
415
|
+
parameters=cls._escape_string_map(test_result.get_parameters()),
|
|
416
|
+
properties=cls._escape_string_map(test_result.get_properties()),
|
|
407
417
|
links=cls.links_to_links_post_model(
|
|
408
418
|
test_result.get_result_links()),
|
|
409
419
|
duration=round(test_result.get_duration()),
|
|
@@ -37,7 +37,7 @@ def inner(function):
|
|
|
37
37
|
return function
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
@Utils.deprecated('Use "
|
|
40
|
+
@Utils.deprecated('Use "workItemId" instead.')
|
|
41
41
|
@adapter_logger
|
|
42
42
|
def workItemID(*test_workitems_id: int or str): # noqa: N802
|
|
43
43
|
def outer(function):
|
|
@@ -49,6 +49,19 @@ def workItemID(*test_workitems_id: int or str): # noqa: N802
|
|
|
49
49
|
return outer
|
|
50
50
|
|
|
51
51
|
|
|
52
|
+
@adapter_logger
|
|
53
|
+
def workItemId(globalId: int or str): # noqa: N802
|
|
54
|
+
"""
|
|
55
|
+
specifies a method that links an autotest with a manual test. Receives a single globalId
|
|
56
|
+
"""
|
|
57
|
+
def outer(function):
|
|
58
|
+
function.test_workitems_id = [str(globalId)]
|
|
59
|
+
return inner(function)
|
|
60
|
+
|
|
61
|
+
return outer
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@Utils.deprecated('Use "workItemId" instead.')
|
|
52
65
|
@adapter_logger
|
|
53
66
|
def workItemIds(*test_workitems_id: int or str): # noqa: N802
|
|
54
67
|
"""
|
|
@@ -130,6 +130,7 @@ def __add_attachments_to_test(data, is_text: bool = False, name: str = None):
|
|
|
130
130
|
logging.warning(f'({data}) is not path!')
|
|
131
131
|
|
|
132
132
|
|
|
133
|
+
@Utils.deprecated('Use "addWorkItemId" instead.')
|
|
133
134
|
@adapter_logger
|
|
134
135
|
def addWorkItemIds(*test_work_item_ids: int or str): # noqa: N802
|
|
135
136
|
"""
|
|
@@ -142,6 +143,17 @@ def addWorkItemIds(*test_work_item_ids: int or str): # noqa: N802
|
|
|
142
143
|
TmsPluginManager.get_plugin_manager().hook.add_work_item_id(test_work_item_id=str(test_work_item_id))
|
|
143
144
|
|
|
144
145
|
|
|
146
|
+
@adapter_logger
|
|
147
|
+
def addWorkItemId(globalId: int or str): # noqa: N802
|
|
148
|
+
"""
|
|
149
|
+
a dynamic method that links an autotest with a manual test. Receives a single globalId
|
|
150
|
+
"""
|
|
151
|
+
if not hasattr(TmsPluginManager.get_plugin_manager().hook, 'add_work_item_id'):
|
|
152
|
+
return
|
|
153
|
+
|
|
154
|
+
TmsPluginManager.get_plugin_manager().hook.add_work_item_id(test_work_item_id=str(globalId))
|
|
155
|
+
|
|
156
|
+
|
|
145
157
|
@adapter_logger
|
|
146
158
|
def addDisplayName(test_display_name: str): # noqa: N802
|
|
147
159
|
"""
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import json
|
|
1
2
|
from typing import List
|
|
2
3
|
|
|
3
4
|
from testit_python_commons.models.link import Link
|
|
@@ -297,6 +298,19 @@ class TestResult:
|
|
|
297
298
|
def get_external_key(self) -> str:
|
|
298
299
|
return self.__external_key
|
|
299
300
|
|
|
301
|
+
def get_finalize_key(self) -> str:
|
|
302
|
+
"""
|
|
303
|
+
Identity of one test invocation for bulk dedupe (parametrize-safe).
|
|
304
|
+
Prefer externalKey (e.g. pytest node id); else externalId + parameters.
|
|
305
|
+
"""
|
|
306
|
+
if self.__external_key:
|
|
307
|
+
return self.__external_key
|
|
308
|
+
params = self.__parameters or {}
|
|
309
|
+
return '{0}\n{1}'.format(
|
|
310
|
+
self.__external_id,
|
|
311
|
+
json.dumps(params, sort_keys=True, default=str, ensure_ascii=False),
|
|
312
|
+
)
|
|
313
|
+
|
|
300
314
|
@adapter_logger
|
|
301
315
|
def set_layer(self, layer: str):
|
|
302
316
|
self.__layer = HtmlEscapeUtils.escape_html_tags(layer) if layer else None
|
|
@@ -5,6 +5,7 @@ import uuid
|
|
|
5
5
|
from testit_python_commons.client.api_client import ApiClientWorker
|
|
6
6
|
from testit_python_commons.client.client_configuration import ClientConfiguration
|
|
7
7
|
from testit_python_commons.models.adapter_mode import AdapterMode
|
|
8
|
+
from testit_python_commons.models.status_type import StatusType
|
|
8
9
|
from testit_python_commons.models.test_result import TestResult
|
|
9
10
|
from testit_python_commons.services.adapter_manager_configuration import (
|
|
10
11
|
AdapterManagerConfiguration,
|
|
@@ -18,6 +19,7 @@ from testit_python_commons.services.sync_storage.sync_storage_runner import (
|
|
|
18
19
|
)
|
|
19
20
|
|
|
20
21
|
SYNC_STORAGE_AVAILABLE = True
|
|
22
|
+
IN_PROGRESS_LITERAL = "InProgress"
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
class AdapterManager:
|
|
@@ -33,6 +35,9 @@ class AdapterManager:
|
|
|
33
35
|
self.__api_client = ApiClientWorker(client_configuration)
|
|
34
36
|
self.__fixture_manager = fixture_manager
|
|
35
37
|
self.__test_result_map = {}
|
|
38
|
+
# Keys of results already sent at test finish (externalKey or externalId+params).
|
|
39
|
+
# Must not be bare externalId — parametrize shares one externalId.
|
|
40
|
+
self.__finalized_result_keys = set()
|
|
36
41
|
self.__test_results = []
|
|
37
42
|
self.__test_run_metadata_applied = False
|
|
38
43
|
|
|
@@ -146,23 +151,32 @@ class AdapterManager:
|
|
|
146
151
|
|
|
147
152
|
@adapter_logger
|
|
148
153
|
def write_test(self, test_result: TestResult) -> None:
|
|
149
|
-
|
|
150
|
-
self.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
# for realtime false
|
|
154
|
-
# if
|
|
155
|
-
logging.debug("Is already in progress: " + str(self.__is_already_in_progress()))
|
|
156
|
-
# Handle Sync Storage integration if available
|
|
157
|
-
# Check if current worker is master and no test is in progress
|
|
158
|
-
if self.__is_active_syncstorage_instance() and self.__is_master_and_no_in_progress():
|
|
159
|
-
logging.debug(f"Outcome: {test_result.get_outcome()}")
|
|
160
|
-
is_ok = self.on_master_no_already_in_progress(test_result)
|
|
161
|
-
if is_ok:
|
|
154
|
+
try:
|
|
155
|
+
if self.__config.should_import_realtime():
|
|
156
|
+
self.__write_test_realtime(test_result)
|
|
162
157
|
return
|
|
163
|
-
# else continue normal processing
|
|
164
158
|
|
|
165
|
-
|
|
159
|
+
# for realtime false
|
|
160
|
+
# if
|
|
161
|
+
logging.debug("Is already in progress: " + str(self.__is_already_in_progress()))
|
|
162
|
+
# Handle Sync Storage integration if available
|
|
163
|
+
# Check if current worker is master and no test is in progress
|
|
164
|
+
if self.__is_active_syncstorage_instance() and self.__is_master_and_no_in_progress():
|
|
165
|
+
logging.debug(f"Outcome: {test_result.get_outcome()}")
|
|
166
|
+
is_ok = self.on_master_no_already_in_progress(test_result)
|
|
167
|
+
if is_ok:
|
|
168
|
+
return
|
|
169
|
+
# else continue normal processing
|
|
170
|
+
|
|
171
|
+
self.__test_results.append(test_result)
|
|
172
|
+
except Exception as exc:
|
|
173
|
+
# Do not abort the pytest/session run if TMS rejects one result (e.g. XSS validation)
|
|
174
|
+
logging.error(
|
|
175
|
+
'Failed to write test result for external_id="%s", parameters=%s: %s',
|
|
176
|
+
test_result.get_external_id(),
|
|
177
|
+
test_result.get_parameters(),
|
|
178
|
+
exc,
|
|
179
|
+
)
|
|
166
180
|
|
|
167
181
|
|
|
168
182
|
@adapter_logger
|
|
@@ -189,12 +203,31 @@ class AdapterManager:
|
|
|
189
203
|
self.__sync_storage_runner.set_is_already_in_progress(True)
|
|
190
204
|
|
|
191
205
|
try:
|
|
192
|
-
#
|
|
206
|
+
# Mode 0: finalize in TMS now (TP-bound InProgress / orphan fix).
|
|
207
|
+
# Modes 1/2: post InProgress to TMS; Work X finalizes from the cut.
|
|
208
|
+
if self.__config.get_mode() == AdapterMode.USE_FILTER:
|
|
209
|
+
logging.debug(
|
|
210
|
+
"SyncStorage accepted %s; sendTestResults with final status (mode 0)",
|
|
211
|
+
test_result.get_external_id(),
|
|
212
|
+
)
|
|
213
|
+
self._write_test_realtime_internal(test_result)
|
|
214
|
+
return True
|
|
215
|
+
|
|
216
|
+
final_outcome = test_result.get_outcome()
|
|
217
|
+
final_status_type = test_result.get_status_type()
|
|
193
218
|
logging.debug(
|
|
194
|
-
"SyncStorage accepted %s; sendTestResults
|
|
219
|
+
"SyncStorage accepted %s; sendTestResults InProgress (Work X will finalize)",
|
|
195
220
|
test_result.get_external_id(),
|
|
196
221
|
)
|
|
197
|
-
|
|
222
|
+
try:
|
|
223
|
+
test_result.set_outcome(IN_PROGRESS_LITERAL)
|
|
224
|
+
test_result.set_status_type(StatusType.INPROGRESS)
|
|
225
|
+
self._write_test_realtime_internal(test_result)
|
|
226
|
+
finally:
|
|
227
|
+
if final_outcome is not None:
|
|
228
|
+
test_result.set_outcome(final_outcome)
|
|
229
|
+
if final_status_type is not None:
|
|
230
|
+
test_result.set_status_type(final_status_type)
|
|
198
231
|
return True
|
|
199
232
|
except Exception as e:
|
|
200
233
|
logging.warning(
|
|
@@ -233,7 +266,9 @@ class AdapterManager:
|
|
|
233
266
|
logging.warning(test_result)
|
|
234
267
|
return
|
|
235
268
|
|
|
269
|
+
# Fixture attach (realtime) still indexes by externalId.
|
|
236
270
|
self.__test_result_map[ext_id] = test_result_id
|
|
271
|
+
self.__finalized_result_keys.add(test_result.get_finalize_key())
|
|
237
272
|
|
|
238
273
|
@adapter_logger
|
|
239
274
|
def write_tests(self) -> None:
|
|
@@ -265,7 +300,7 @@ class AdapterManager:
|
|
|
265
300
|
self.__api_client.write_tests(
|
|
266
301
|
self.__test_results,
|
|
267
302
|
fixtures,
|
|
268
|
-
|
|
303
|
+
finalized_result_keys=set(self.__finalized_result_keys),
|
|
269
304
|
)
|
|
270
305
|
|
|
271
306
|
@adapter_logger
|
|
@@ -15,23 +15,18 @@ class HtmlEscapeUtils:
|
|
|
15
15
|
|
|
16
16
|
NO_ESCAPE_HTML_ENV_VAR = "NO_ESCAPE_HTML"
|
|
17
17
|
|
|
18
|
-
#
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
# Using negative lookbehind to avoid double escaping
|
|
24
|
-
_LESS_THAN_PATTERN = re.compile('<')
|
|
25
|
-
_GREATER_THAN_PATTERN = re.compile('>')
|
|
26
|
-
|
|
18
|
+
# Align with Java adapters: tag must start with letter, '!' or '/'
|
|
19
|
+
_HTML_TAG_PATTERN = re.compile(
|
|
20
|
+
r'''<[a-zA-Z!/][^<>"']*(?:"[^"]*"[^<>"']*|'[^']*'[^<>"']*)*>'''
|
|
21
|
+
)
|
|
22
|
+
|
|
27
23
|
@staticmethod
|
|
28
24
|
def escape_html_tags(text: Optional[str]) -> Optional[str]:
|
|
29
25
|
"""
|
|
30
26
|
Escapes HTML tags to prevent XSS attacks.
|
|
31
27
|
First checks if the string contains HTML tags using regex pattern.
|
|
32
28
|
Only performs escaping if HTML tags are detected.
|
|
33
|
-
Escapes
|
|
34
|
-
Uses regex with negative lookbehind to avoid double escaping.
|
|
29
|
+
Escapes < as < and > as > (idempotent for already-escaped text).
|
|
35
30
|
|
|
36
31
|
Args:
|
|
37
32
|
text: The text to escape
|
|
@@ -51,11 +46,7 @@ class HtmlEscapeUtils:
|
|
|
51
46
|
if not HtmlEscapeUtils._HTML_TAG_PATTERN.search(text):
|
|
52
47
|
return text # No HTML tags found, return original string
|
|
53
48
|
|
|
54
|
-
|
|
55
|
-
result = HtmlEscapeUtils._LESS_THAN_PATTERN.sub('<', text)
|
|
56
|
-
result = HtmlEscapeUtils._GREATER_THAN_PATTERN.sub('>', result)
|
|
57
|
-
|
|
58
|
-
return result
|
|
49
|
+
return text.replace('<', '<').replace('>', '>')
|
|
59
50
|
|
|
60
51
|
@staticmethod
|
|
61
52
|
def escape_html_in_object(obj: Any) -> Any:
|
|
@@ -190,6 +181,11 @@ class HtmlEscapeUtils:
|
|
|
190
181
|
HtmlEscapeUtils._process_list(value)
|
|
191
182
|
elif isinstance(value, dict):
|
|
192
183
|
HtmlEscapeUtils._process_dict(value)
|
|
184
|
+
try:
|
|
185
|
+
# Write back so OpenAPI models that return dict copies keep escaped values
|
|
186
|
+
setattr(obj, attr_name, value)
|
|
187
|
+
except AttributeError:
|
|
188
|
+
pass
|
|
193
189
|
elif value is not None and not HtmlEscapeUtils._is_simple_type(type(value)):
|
|
194
190
|
# Process nested objects (but not simple types)
|
|
195
191
|
HtmlEscapeUtils.escape_html_in_object(value)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
testit.py,sha256=
|
|
1
|
+
testit.py,sha256=iNy08vrdtMqxr08L6Xwyz2LzDtWrvBP5-mwmcwXU42Q,1377
|
|
2
2
|
adapters_api/__init__.py,sha256=fqW8APi58KZ76csM-f1XP1XAgfzMFQuIMQ6F2EBo9xE,749
|
|
3
3
|
adapters_api/api_client.py,sha256=eBdekkUzczBxt3aZL6VcnU4L70LV_Fk0wPFGWmQQNyo,39263
|
|
4
4
|
adapters_api/configuration.py,sha256=JZv-bDb_CNGYjNpIvydnCxlyTcE119bjM02dixGcZI4,17594
|
|
@@ -223,13 +223,13 @@ api_client_syncstorage/model/test_result_save_response.py,sha256=Q7J6WD6Yzx6TWYO
|
|
|
223
223
|
api_client_syncstorage/models/__init__.py,sha256=-Wa3--s7VgbP9o6_RY33g1lXm5J-1PSqLw7VcpPZsaY,1131
|
|
224
224
|
testit_python_commons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
225
225
|
testit_python_commons/app_properties.py,sha256=0o7G24OMdcyv7eZUAaZjyvuEp1z9QVVlnDMIra-wXQQ,9891
|
|
226
|
-
testit_python_commons/decorators.py,sha256=
|
|
227
|
-
testit_python_commons/dynamic_methods.py,sha256=
|
|
226
|
+
testit_python_commons/decorators.py,sha256=gO45ohjihgTSioytJyM9OhwD6cMy4XhPF7llL7ibKgM,6576
|
|
227
|
+
testit_python_commons/dynamic_methods.py,sha256=jhM_SQAsJm6hqtad8vlqxvChShlI1G_SNuUBZ7ov5DU,9243
|
|
228
228
|
testit_python_commons/step.py,sha256=CYUs_S8opmRg1tsTY1dVJOPzzt-HYR3_uLTBpYtHSfQ,3244
|
|
229
229
|
testit_python_commons/client/__init__.py,sha256=zSJhxDHzWWTFHJ0s8bqCaBtM5FK2GcPgZxaKdI8zf-o,165
|
|
230
|
-
testit_python_commons/client/api_client.py,sha256=
|
|
230
|
+
testit_python_commons/client/api_client.py,sha256=j6omqfCR_FI0OvTlW-li291BwL96U7e8agdbG4Fs7k0,25725
|
|
231
231
|
testit_python_commons/client/client_configuration.py,sha256=1M-OrROU3Xj0YGsUX4venG-l6Ewr43LNvUcyFfY57ys,2776
|
|
232
|
-
testit_python_commons/client/converter.py,sha256
|
|
232
|
+
testit_python_commons/client/converter.py,sha256=-TfQsLI9ezPwngbXwTrRKJenNmuyNdYRHX__xFQvxaE,28578
|
|
233
233
|
testit_python_commons/client/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
234
234
|
testit_python_commons/client/helpers/bulk_autotest_helper.py,sha256=I8kIetucvjN5Zws8q99GRd8Rjy7I7MrmduBSjG7vTgQ,10903
|
|
235
235
|
testit_python_commons/client/helpers/test_result_matching.py,sha256=XSGzzESs-vg41MrvcijD91snpczL3fiVTywOe2j2WZg,1373
|
|
@@ -248,10 +248,10 @@ testit_python_commons/models/outcome_type.py,sha256=WAAuPRTopmYPczd-Gd0IrE7SGDZO
|
|
|
248
248
|
testit_python_commons/models/status_type.py,sha256=lm4Hp02Z5Wo1mOaaMDjzBD1W0BE6gtwjBMPdhxuO_5U,152
|
|
249
249
|
testit_python_commons/models/step_result.py,sha256=T9BbcPB6BCz3ZkrWXy2Z2Guj2wecvKJX1oIrG-yJH4I,2209
|
|
250
250
|
testit_python_commons/models/test_layers.py,sha256=XACHq-r3bf35ktU9_HUputiBYKXwOXJmeqMJTnrB460,168
|
|
251
|
-
testit_python_commons/models/test_result.py,sha256=
|
|
251
|
+
testit_python_commons/models/test_result.py,sha256=jgdYtg2d56wNXBAMh7qJVjgpSIPVycBibTY_Cp9bxgM,8316
|
|
252
252
|
testit_python_commons/models/test_result_with_all_fixture_step_results_model.py,sha256=aI5nfJ_4EAhzZg7eIV1JhSf9i3EENiRiuQuqJvSUs3M,866
|
|
253
253
|
testit_python_commons/services/__init__.py,sha256=yVVmiCgMyike_8OoNPiHLNoMqKhCDlWYhvmGW0IRHJM,1197
|
|
254
|
-
testit_python_commons/services/adapter_manager.py,sha256=
|
|
254
|
+
testit_python_commons/services/adapter_manager.py,sha256=c47V4oFAm2tMC6GZSZCQ-svHcNu9YZI1HlF-zqMapLY,13689
|
|
255
255
|
testit_python_commons/services/adapter_manager_configuration.py,sha256=ZPgSRUskSh8sJNAtlpOSAXqGWWTdYNsDb3jaiuTFEc8,2228
|
|
256
256
|
testit_python_commons/services/fixture_manager.py,sha256=PCSLBEPa3yJVbCPsMt_Y5badWLAhKrJsZTaUesq7oNI,2006
|
|
257
257
|
testit_python_commons/services/fixture_storage.py,sha256=nAIW0p9lVvVWtiVdFNqaD7-gCBislY8DLrfdlh8OqFw,1205
|
|
@@ -265,8 +265,8 @@ testit_python_commons/services/utils.py,sha256=5LBymIxEC1AKtGQz-S1-ipo3OYR-JzRUA
|
|
|
265
265
|
testit_python_commons/services/sync_storage/__init__.py,sha256=Qmjs6Xk5l-i5FFItk0-XPrlVK_HkDuX6FD8FID1iKu0,154
|
|
266
266
|
testit_python_commons/services/sync_storage/sync_storage_runner.py,sha256=DPOHJZ57otKlmAHHD7JV1rfYAgSTm0fYTvlp1QFtR4I,20539
|
|
267
267
|
testit_python_commons/utils/__init__.py,sha256=CUHziylwvFAuKyUM1tCp13ik5Z2Mw-VK8n7c92aVy-I,78
|
|
268
|
-
testit_python_commons/utils/html_escape_utils.py,sha256=
|
|
269
|
-
testit_python_commons-5.2.
|
|
270
|
-
testit_python_commons-5.2.
|
|
271
|
-
testit_python_commons-5.2.
|
|
272
|
-
testit_python_commons-5.2.
|
|
268
|
+
testit_python_commons/utils/html_escape_utils.py,sha256=xizAyxl0eQa1joW0pLgAhe1E8KYxPpEDxSkKcswlDR4,8758
|
|
269
|
+
testit_python_commons-5.2.3.dist-info/METADATA,sha256=otiUcjTTUaMq8X5PZzKe69Ylaa3THexT9xMiHeHNaaE,1766
|
|
270
|
+
testit_python_commons-5.2.3.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
271
|
+
testit_python_commons-5.2.3.dist-info/top_level.txt,sha256=TuyfRneOyFuvNz83bbn-pWaAR1fY7FINrrJRTW9Lyqg,65
|
|
272
|
+
testit_python_commons-5.2.3.dist-info/RECORD,,
|
|
File without changes
|
{testit_python_commons-5.2.1.dist-info → testit_python_commons-5.2.3.dist-info}/top_level.txt
RENAMED
|
File without changes
|