holado 0.10.1__py3-none-any.whl → 0.10.2__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.

Potentially problematic release.


This version of holado might be problematic. Click here for more details.

@@ -337,7 +337,7 @@ class SessionContext(Context):
337
337
  category_validation, status_validation, step_failed, step_number = ReportManager.get_current_scenario_status_information(scenario)
338
338
  if status_validation != "Passed":
339
339
  msg_list = []
340
- category_str = f" ({category_validation})" if category_validation else ""
340
+ category_str = f" => {category_validation}" if category_validation else ""
341
341
  if step_failed is not None:
342
342
  msg_list.append(f"Scenario {status_validation}{category_str}: [scenario in {scenario.filename} at l.{scenario.line} - step {step_number} (l.{step_failed.line})]")
343
343
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: holado
3
- Version: 0.10.1
3
+ Version: 0.10.2
4
4
  Summary: HolAdo framework
5
5
  Project-URL: Homepage, https://gitlab.com/holado_framework/python
6
6
  Project-URL: Issues, https://gitlab.com/holado_framework/python/-/issues
@@ -4,7 +4,7 @@ holado/common/__init__.py,sha256=ZjXM-FRQgnfzRNXqcvJOGewDHVRR-U5-ugStSs8U2Xs,152
4
4
  holado/common/context/__init__.py,sha256=3jJBLm8myrYF9jbdV1EhIA6BtnlmjX33eeoDpTzwmLA,1604
5
5
  holado/common/context/context.py,sha256=MV8A6JSpUcTcfia_QzjyDLybQC50rZ-NA0ffotnHXQY,11994
6
6
  holado/common/context/service_manager.py,sha256=LaCn8ukE1aqJynmwoexAYj5hCkdb_F3hXRtUBGqorUE,14087
7
- holado/common/context/session_context.py,sha256=TOT2_CqeqQtvuGBfVnuY1cbj8PGhyLPv0mlPJD0e6V0,23474
7
+ holado/common/context/session_context.py,sha256=IWxkeYnMSVImNyamTd3PXZSFIkXY96qFyAlC1y8s0J4,23475
8
8
  holado/common/handlers/__init__.py,sha256=d0KDUpaAAw1eBXyX08gaRh4RECnJlXjYQ0TcU-Ndicc,1372
9
9
  holado/common/handlers/enums.py,sha256=ieqKVoukEiNyfE3KrKmMOImdbFS1ocUMud8JHe2xNLs,1662
10
10
  holado/common/handlers/object.py,sha256=rDaav8zHTYfKVEaLtEdeXMxYXATGVcs2a7um1f5MvCs,7205
@@ -126,7 +126,7 @@ holado_core/common/tables/comparators/table_with_header_comparator.py,sha256=j7B
126
126
  holado_core/common/tables/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
127
  holado_core/common/tables/converters/table_converter.py,sha256=PD7NJoxtejpr4aS1l3YKcXW1aEn1xBxdi4Ljs5G7R4g,10251
128
128
  holado_core/common/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
- holado_core/common/tools/path_manager.py,sha256=27kLsvS2PfbZufG6P7T_-7N9Dh4dY3wgSZUwjM6ta_A,10876
129
+ holado_core/common/tools/path_manager.py,sha256=XeQ8tS2S5XZn3L65LYXsOhNDe166uO8X2sxnwXqZbVE,10932
130
130
  holado_core/common/tools/string_tools.py,sha256=bQuMlI_yS7OoSPFL7qyfyXkrnjC8xHVpIsfmEC6JxhI,5590
131
131
  holado_core/common/tools/tools.py,sha256=zkDz7u8S_02bfyN6K-p7-Ey_SkDxzu9DJljnczY0OAo,9683
132
132
  holado_core/common/tools/comparators/comparator.py,sha256=K4LcXIRORHX5vkmDibI6P6Bu1L-6Xezb63ZzzOMKrWY,6812
@@ -392,19 +392,19 @@ holado_redis/tools/redis/TODO.txt,sha256=cmFyx6qS6_FgL1Ph0OWRsWch6MQaklfv1j0qBO2
392
392
  holado_redis/tools/redis/redis_client.py,sha256=KWuOrnwTcwt5xkD3rtI_l07v164Y_bsoo1kE0IGzqaQ,8316
393
393
  holado_redis/tools/redis/redis_manager.py,sha256=tMO0XrCZTCfGdByFfgWXk9R-I_TUPLO9wXMQf8yCYcQ,1814
394
394
  holado_report/__init__.py,sha256=3wtu5g9d4d-AICmLZclPQrw2MS-FJL9CyiVO1n2MYWA,1868
395
- holado_report/campaign/campaign_manager.py,sha256=Py5aAGc-6rJb1FlDsUJ7EwyrGy0DBEXLPTJzR7yBMe8,8693
395
+ holado_report/campaign/campaign_manager.py,sha256=fZtxvtFc7_BZm3KGZNMYh0p8SJ-znEX89MlEY6Gp3aE,8748
396
396
  holado_report/report/execution_historic.py,sha256=M4lYoZwyrSivRa17Q39GOAgROnr0oBvIZX5BNcO5Mnc,6951
397
- holado_report/report/report_manager.py,sha256=VOA9ABV3DAGf5Q5_eNPVJ3oJndiZSXGI8SKg6uP-Sq0,14713
397
+ holado_report/report/report_manager.py,sha256=Xsiw8b5OW4QhMlyKSLMtP9fLydR-akzFkMkyy3bZtts,16272
398
398
  holado_report/report/analyze/execution_historic_manager.py,sha256=FMKKPguXOvWNxjF7Q8DodHHsH-2ci9pFzrTV41B8nL4,4556
399
399
  holado_report/report/analyze/scenario_duration_manager.py,sha256=Preaxu83qFKGfbvQnzolhSXztZ4i5Zo_Bnxx8tNA80Q,12468
400
400
  holado_report/report/builders/detailed_scenario_failed_report_builder.py,sha256=hOXxHYniL9mpN-U7YTW5xVEaE4Z-GlPq8ltT_iNJan4,7892
401
- holado_report/report/builders/failure_report_builder.py,sha256=jbw2Y1oEZQdk1i1PdbhQqbG8i3AuIlOmVRx3M598BTA,6532
401
+ holado_report/report/builders/failure_report_builder.py,sha256=WLLlLgLbEyYJNENEoxSkQQSf11DDoKpSa4kdaq7eV8U,6533
402
402
  holado_report/report/builders/json_execution_historic_report_builder.py,sha256=M7OGUvkqNRTG5Td7fO96tv1SJEzRzjm0pl1W02v052E,5929
403
403
  holado_report/report/builders/report_builder.py,sha256=5qlhxbdTkSN7p9q6EADkpHQGPDVEHquIhgA3mK2Ck2k,2261
404
- holado_report/report/builders/short_scenario_failed_report_builder.py,sha256=9athhQPoVioz-NTc1BoD0kbCqKzW3ARkQy77ODPuGkM,4011
404
+ holado_report/report/builders/short_scenario_failed_report_builder.py,sha256=50pXhWX8xwIDZWSFaBejzMUlS9a0GRXqA82d84V3udk,4012
405
405
  holado_report/report/builders/summary_report_builder.py,sha256=v4LG3W5x_y4FH0kh_5MRaG8pyPOV2GfhlBImsW4BJrs,3954
406
- holado_report/report/builders/summary_scenario_failed_report_builder.py,sha256=NGJiUTGpEWBcC9Chj6oY34fnQ_SUBoLWKEkBhlwKy9o,3062
407
- holado_report/report/builders/summary_scenario_report_builder.py,sha256=OaHfZitXFoX0lrGXzRX6zeXGiUFiYh44fNdxxKDRCGQ,3864
406
+ holado_report/report/builders/summary_scenario_failed_report_builder.py,sha256=uqf86SUAiIQLRQOV0A434oR8Bj4e_DtxqRsy-pe84p4,3063
407
+ holado_report/report/builders/summary_scenario_report_builder.py,sha256=ZtOg5SWgFUsOJyG-KLybT-8twTX3CwmuFTVIaWJXXZ8,3865
408
408
  holado_report/report/reports/base_report.py,sha256=NGnWe66uyvT4bCjhd3upwVpc6yQ2gyVNFhcy-3LeQsE,6850
409
409
  holado_report/report/reports/feature_report.py,sha256=i0wpk3LQLArVjWDsP9UcNSJzAUWwLhe73HNyfye2gYQ,4810
410
410
  holado_report/report/reports/scenario_report.py,sha256=eMyqw9EzaKMmX3pGFJN1rqAOQ5eqO2ISZdxAfK3XQR4,2945
@@ -671,7 +671,7 @@ test_holado/tools/django/api_rest/api_rest/api1/serializers.py,sha256=o_YxFr-tgC
671
671
  test_holado/tools/django/api_rest/api_rest/api1/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
672
672
  test_holado/tools/django/api_rest/api_rest/api1/views.py,sha256=kOt2xT6bxO47_z__5yYR9kcYIWWv4qYzpX0K8Tqonik,758
673
673
  test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
674
- holado-0.10.1.dist-info/METADATA,sha256=Q5DwNRjrAWS6lrHGiUbz7T2pJPXzlvE39zM4hnxx3I0,7672
675
- holado-0.10.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
676
- holado-0.10.1.dist-info/licenses/LICENSE,sha256=IgGmNlcFHnbp7UWrLJqAFvs_HIgjJDTmjCNRircJLsk,1070
677
- holado-0.10.1.dist-info/RECORD,,
674
+ holado-0.10.2.dist-info/METADATA,sha256=4_dqAlxXKA4_NttBQYpoNN-cSwaxpJurg1cwUVc4UIY,7672
675
+ holado-0.10.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
676
+ holado-0.10.2.dist-info/licenses/LICENSE,sha256=IgGmNlcFHnbp7UWrLJqAFvs_HIgjJDTmjCNRircJLsk,1070
677
+ holado-0.10.2.dist-info/RECORD,,
@@ -158,13 +158,13 @@ class PathManager(object):
158
158
  else:
159
159
  return base_path
160
160
 
161
- def get_reports_path(self, name=None):
161
+ def get_reports_path(self, name=None, with_application_group=True):
162
162
  base_path = os.getenv('HOLADO_OUTPUT_BASEDIR')
163
163
  if base_path is None:
164
164
  base_path = os.path.join(self.get_user_home_path(), '.holado', 'output')
165
165
 
166
166
  res = os.path.join(base_path, "reports")
167
- if Config.application_group is not None:
167
+ if with_application_group and Config.application_group is not None:
168
168
  res = os.path.join(res, Config.application_group)
169
169
  if name is not None:
170
170
  res = os.path.join(res, name)
@@ -82,7 +82,7 @@ class CampaignManager(object):
82
82
  self.import_campaign_reports(report_path)
83
83
 
84
84
  def __get_campaigns_report_paths(self, since_datetime):
85
- reports_path = SessionContext.instance().path_manager.get_reports_path()
85
+ reports_path = SessionContext.instance().path_manager.get_reports_path(name="test_runner", with_application_group=False)
86
86
  file_paths = SessionContext.instance().path_manager.find_files(reports_path, subdir_relative_path='report_summary_scenario_all.txt', since_datetime=since_datetime)
87
87
  return [os.path.dirname(p) for p in file_paths]
88
88
 
@@ -185,7 +185,7 @@ class CampaignManager(object):
185
185
  scenario_name = parts[1]
186
186
  status_info = parts[-1]
187
187
 
188
- m = re.match(r"^(.*?)(?: \(.*\))?$", status_info)
188
+ m = re.match(r"^(.*?)(?: \(.*\)| => .*)?$", status_info)
189
189
  status = m.group(1)
190
190
 
191
191
  self.update_or_add_campaign_scenario(camp_id, scenario_name, status=status, status_at_str=status_dt_str)
@@ -48,7 +48,7 @@ class FailureReportBuilder(ReportBuilder):
48
48
  if step_error_message not in self.__failures:
49
49
  self.__failures[step_error_message] = []
50
50
 
51
- category_str = f" ({category_validation})" if category_validation else ""
51
+ category_str = f" => {category_validation}" if category_validation else ""
52
52
  if self.__file_format == 'txt':
53
53
  msg_list = []
54
54
  msg_list.append(f"scenario in {scenario.filename} at l.{scenario.line} - step {step_number} (l.{step_failed.line}) - {status_validation}{category_str}")
@@ -49,7 +49,7 @@ class ShortScenarioFailedReportBuilder(ReportBuilder):
49
49
  self.__open_file_if_needed()
50
50
 
51
51
  msg_list = []
52
- category_str = f" ({category_validation})" if category_validation else ""
52
+ category_str = f" => {category_validation}" if category_validation else ""
53
53
  if step_failed is not None:
54
54
  msg_list.append(f"scenario in {scenario.filename} at l.{scenario.line} - step {step_number} (l.{step_failed.line}) - {status_validation}{category_str}")
55
55
  else:
@@ -44,7 +44,7 @@ class SummaryScenarioFailedReportBuilder(ReportBuilder):
44
44
 
45
45
  def __file_fail_add_scenario(self, scenario, category_validation, status_validation, step_failed, step_number):
46
46
  self.__open_file_if_needed()
47
- category_str = f" ({category_validation})" if category_validation else ""
47
+ category_str = f" => {category_validation}" if category_validation else ""
48
48
  if step_failed is not None:
49
49
  self.__file_fail.write(f"scenario in {scenario.filename} at l.{scenario.line} - step {step_number} (l.{step_failed.line}) - {status_validation}{category_str}\n")
50
50
  else:
@@ -63,7 +63,7 @@ class SummaryScenarioReportBuilder(ReportBuilder):
63
63
  dt = DateTime.now()
64
64
  dt_str = DateTime.datetime_2_str(dt, FORMAT_DATETIME_HUMAN_SECOND)
65
65
 
66
- category_str = f" ({category_validation})" if category_validation else ""
66
+ category_str = f" => {category_validation}" if category_validation else ""
67
67
  if text:
68
68
  self.__file.write(f"{dt_str} - {scenario.filename} at l.{scenario.line} - {text} - {status_validation}{category_str}\n")
69
69
  else:
@@ -232,33 +232,59 @@ class ReportManager(BaseReport):
232
232
  if cls._get_test_server_client().is_available:
233
233
  # Get scenario execution statuses
234
234
  scenario_name = f"{scenario.filename} at l.{scenario.line}"
235
- sce_hist = cls._get_test_server_client().get_scenario_history(scenario_name=scenario_name, size=10)
236
- statuses = [s['status'] for s in sce_hist[0]['statuses']] if sce_hist else []
235
+ sce_hist = cls._get_test_server_client().get_scenario_history(scenario_name=scenario_name, size=29)
236
+ statuses = [s['status'] for s in reversed(sce_hist[0]['statuses'])] if sce_hist else []
237
237
  statuses.append(status)
238
238
 
239
239
  # Get scenario status sequences
240
240
  passed_sequences = []
241
+ is_failed_relevant = None
241
242
  for status in statuses:
242
243
  if status == 'Passed':
243
244
  passed = True
244
245
  elif status.startswith("Failed"):
245
246
  passed = False
247
+ if status == "Failed":
248
+ is_failed_relevant = True
249
+ elif is_failed_relevant is None:
250
+ is_failed_relevant = False
246
251
  else:
247
252
  continue
248
- if len(passed_sequences) == 0 or passed != passed_sequences[-1]:
249
- passed_sequences.append(passed)
253
+
254
+ if len(passed_sequences) == 0 or passed != passed_sequences[-1][0]:
255
+ passed_sequences.append([passed, 1])
256
+ else:
257
+ passed_sequences[-1][1] += 1
250
258
 
251
259
  # Compute category
252
260
  if passed_sequences:
261
+ nb_exec = sum([x[1] for x in passed_sequences])
262
+ last_passed, last_nb_times = passed_sequences[-1]
253
263
  if len(passed_sequences) == 1:
254
- category = 'Success' if passed_sequences[0] else 'Failed'
264
+ if last_passed:
265
+ category = f'Always Success ({last_nb_times})'
266
+ elif is_failed_relevant:
267
+ category = f'Always Failed ({last_nb_times})'
268
+ else:
269
+ category = f'Always Not Relevant ({last_nb_times})'
270
+ elif last_passed and len(passed_sequences) in [2, 3]:
271
+ category = f'Fixed ({last_nb_times} success / {nb_exec})'
255
272
  elif len(passed_sequences) > 2:
256
- category = 'Randomly Failed'
257
- elif passed_sequences[-1]:
258
- category = 'Newly Success'
273
+ nb_fail = sum([x[1] for x in passed_sequences if not x[0]])
274
+ if is_failed_relevant:
275
+ category = f'Random ({nb_fail} fails / {nb_exec})'
276
+ else:
277
+ category = f'Random but Not Relevant ({nb_fail} fails / {nb_exec})'
278
+ elif not last_passed:
279
+ if is_failed_relevant:
280
+ category = f'Regression ({last_nb_times} fails / {nb_exec})'
281
+ else:
282
+ category = f'Regression but Not Relevant ({last_nb_times} fails / {nb_exec})'
259
283
  else:
260
- category = 'Newly Failed'
261
-
284
+ category = f'Unknown (unmanaged sequence: {passed_sequences})'
285
+
286
+ logger.print(f"++++++++++ {category} <= {statuses}")
287
+
262
288
  cls._scenario_status_information_by_uid[scenario_uid] = [category, status, step_failed, step_nb]
263
289
 
264
290
  return cls._scenario_status_information_by_uid[scenario_uid]