qase-python-commons 3.5.3__py3-none-any.whl → 3.5.5__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 qase-python-commons might be problematic. Click here for more details.

qase/commons/config.py CHANGED
@@ -142,6 +142,14 @@ class ConfigManager:
142
142
  self.config.testops.configurations.set_create_if_not_exists(
143
143
  configurations.get("createIfNotExists"))
144
144
 
145
+ if testops.get("statusFilter"):
146
+ status_filter = testops.get("statusFilter")
147
+ if isinstance(status_filter, list):
148
+ self.config.testops.set_status_filter(status_filter)
149
+ elif isinstance(status_filter, str):
150
+ # Parse comma-separated string
151
+ self.config.testops.set_status_filter([s.strip() for s in status_filter.split(',')])
152
+
145
153
  if config.get("report"):
146
154
  report = config.get("report")
147
155
 
@@ -262,6 +270,10 @@ class ConfigManager:
262
270
  if key == 'QASE_TESTOPS_CONFIGURATIONS_CREATE_IF_NOT_EXISTS':
263
271
  self.config.testops.configurations.set_create_if_not_exists(value)
264
272
 
273
+ if key == 'QASE_TESTOPS_STATUS_FILTER':
274
+ # Parse comma-separated string
275
+ self.config.testops.set_status_filter([s.strip() for s in value.split(',')])
276
+
265
277
  if key == 'QASE_REPORT_DRIVER':
266
278
  self.config.report.set_driver(value)
267
279
 
@@ -48,6 +48,7 @@ class TestopsConfig(BaseModel):
48
48
  plan: PlanConfig = None
49
49
  batch: BatchConfig = None
50
50
  configurations: ConfigurationsConfig = None
51
+ status_filter: List[str] = None
51
52
 
52
53
  def __init__(self):
53
54
  self.api = ApiConfig()
@@ -56,9 +57,13 @@ class TestopsConfig(BaseModel):
56
57
  self.plan = PlanConfig()
57
58
  self.configurations = ConfigurationsConfig()
58
59
  self.defect = False
60
+ self.status_filter = []
59
61
 
60
62
  def set_project(self, project: str):
61
63
  self.project = project
62
64
 
63
65
  def set_defect(self, defect):
64
66
  self.defect = QaseUtils.parse_bool(defect)
67
+
68
+ def set_status_filter(self, status_filter: List[str]):
69
+ self.status_filter = status_filter
@@ -33,10 +33,10 @@ class Execution(BaseModel):
33
33
  self.thread = thread
34
34
 
35
35
  def set_status(self, status: Optional[str]):
36
- if status in ['passed', 'failed', 'skipped', 'untested']:
36
+ if status in ['passed', 'failed', 'skipped', 'untested', 'invalid']:
37
37
  self.status = status
38
38
  else:
39
- raise ValueError('Step status must be one of: passed, failed, skipped, untested')
39
+ raise ValueError('Step status must be one of: passed, failed, skipped, untested, invalid')
40
40
 
41
41
  def get_status(self):
42
42
  return self.status
@@ -24,6 +24,7 @@ class RunStats(BaseModel):
24
24
  self.failed = 0
25
25
  self.skipped = 0
26
26
  self.broken = 0
27
+ self.invalid = 0
27
28
  self.muted = 0
28
29
  self.total = 0
29
30
 
@@ -37,6 +38,8 @@ class RunStats(BaseModel):
37
38
  self.skipped += 1
38
39
  elif status == "broken":
39
40
  self.broken += 1
41
+ elif status == "invalid":
42
+ self.invalid += 1
40
43
  self.total += 1
41
44
  if result.get('muted', False):
42
45
  self.muted += 1
@@ -82,10 +82,10 @@ class StepExecution(BaseModel):
82
82
  self.attachments = []
83
83
 
84
84
  def set_status(self, status: Optional[str]):
85
- if status in ['passed', 'failed', 'skipped', 'blocked', 'untested']:
85
+ if status in ['passed', 'failed', 'skipped', 'blocked', 'untested', 'invalid']:
86
86
  self.status = status
87
87
  else:
88
- raise ValueError('Step status must be one of: passed, failed, skipped, blocked, untested')
88
+ raise ValueError('Step status must be one of: passed, failed, skipped, blocked, untested, invalid')
89
89
 
90
90
  def complete(self):
91
91
  self.end_time = time.time()
@@ -86,15 +86,34 @@ class QaseTestOps:
86
86
 
87
87
  def _send_results(self) -> None:
88
88
  if self.results:
89
- # Acquire semaphore before starting the send operation
90
- self.send_semaphore.acquire()
91
- self.count_running_threads += 1
89
+ # Filter results by status if status_filter is configured
92
90
  results_to_send = self.results.copy()
91
+
92
+ if self.config.testops.status_filter and len(self.config.testops.status_filter) > 0:
93
+ filtered_results = []
94
+ for result in results_to_send:
95
+ result_status = result.get_status()
96
+ if result_status and result_status not in self.config.testops.status_filter:
97
+ filtered_results.append(result)
98
+ else:
99
+ self.logger.log_debug(f"Filtering out result '{result.title}' with status '{result_status}'")
100
+
101
+ results_to_send = filtered_results
102
+ self.logger.log_debug(f"Filtered {len(self.results) - len(results_to_send)} results by status filter")
103
+
104
+ if results_to_send:
105
+ # Acquire semaphore before starting the send operation
106
+ self.send_semaphore.acquire()
107
+ self.count_running_threads += 1
108
+
109
+ # Start a new thread for sending results
110
+ send_thread = threading.Thread(target=self._send_results_threaded, args=(results_to_send,))
111
+ send_thread.start()
112
+ else:
113
+ self.logger.log("No results to send after filtering", "info")
114
+
115
+ # Clear results regardless of filtering
93
116
  self.results = []
94
-
95
- # Start a new thread for sending results
96
- send_thread = threading.Thread(target=self._send_results_threaded, args=(results_to_send,))
97
- send_thread.start()
98
117
  else:
99
118
  self.logger.log("No results to send", "info")
100
119
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qase-python-commons
3
- Version: 3.5.3
3
+ Version: 3.5.5
4
4
  Summary: A library for Qase TestOps and Qase Report
5
5
  Author-email: Qase Team <support@qase.io>
6
6
  Project-URL: Homepage, https://github.com/qase-tms/qase-python/tree/main/qase-python-commons
@@ -1,5 +1,5 @@
1
1
  qase/commons/__init__.py,sha256=3HI65PJES4Q6YvtkSuRPh6tZboTETJo8wbdHlNYaePU,323
2
- qase/commons/config.py,sha256=-JSKACvKPsUSFwU6Eilq7cgFJlY-6V7AdmJJnUTmYOM,11666
2
+ qase/commons/config.py,sha256=X7PsggEZRPbrE1eb1JBM0ZmhtR4k06dqaFzcNmTG-Rw,12394
3
3
  qase/commons/loader.py,sha256=-MMY4HgSI6q1xq3NaJoq_w4liM73qdFKjYLVCT1E7Pc,1064
4
4
  qase/commons/logger.py,sha256=KEQr8G0eFZxlI3LJIaaNWOKD8o3NhKsZD06swXFn3FI,1313
5
5
  qase/commons/utils.py,sha256=utPRoYyThLs2tgD1lmjkwJ9KZuE7ZjliUiZkJJWFca0,3330
@@ -11,10 +11,10 @@ qase/commons/models/__init__.py,sha256=FTt5dYASBX4r6-tQi-_JAUVx4uvJs9GTxROdAZEV6
11
11
  qase/commons/models/attachment.py,sha256=Rjq1mAP11uk7TN2RrtImntw6DUMV7U0R-44TYj8O5j0,1432
12
12
  qase/commons/models/basemodel.py,sha256=0j8E-LE6hxAKQPYLNM9qThor9s2ZndZys_kibeoLImo,426
13
13
  qase/commons/models/relation.py,sha256=HymHeh1uBcoQnTs4Vra7WJ_KFkhryj5o7cShjoGQImI,511
14
- qase/commons/models/result.py,sha256=Lw7KIe16BOfPG0zJdg-_JGvnaN8tXPczFC49DCn9YSA,3773
15
- qase/commons/models/run.py,sha256=nU_FX_YKqJWSyM6QfJpPjhDO-DMz_JXcEVyJ8AzMJN4,3007
14
+ qase/commons/models/result.py,sha256=8dES10mjBx7SdltAlKDB39bO3k1-xGQVKrHWn19gXK0,3793
15
+ qase/commons/models/run.py,sha256=ANbljW1mgua4JF1wGZG9S-jnUpI7FC4F15sAQOoNnko,3096
16
16
  qase/commons/models/runtime.py,sha256=h0kJcPYRo8dglIQVFyzh-cFpWb3bAaQaIq5wV8VfClM,1508
17
- qase/commons/models/step.py,sha256=gEvqbs1kZB5NIqm6vzNuOXlJXFdTiSlANuM_0lbssL0,4417
17
+ qase/commons/models/step.py,sha256=2ihwvEVO7nwgPGl8mzHGC8hNBGuU9oOlHOnAZtZs6SE,4437
18
18
  qase/commons/models/config/api.py,sha256=IyYY2f3ncESUAEGvkE3-meatebBFJdvgo7KNOQnxLE0,288
19
19
  qase/commons/models/config/batch.py,sha256=X0H8SVOCCD2pV6LSMqjI-tIjRcLifnrM5MareK2FhQw,321
20
20
  qase/commons/models/config/connection.py,sha256=wK2fGjc0G0rMVVhPnjw_t_M1YWZwANlhwl-awmI7XSo,516
@@ -23,7 +23,7 @@ qase/commons/models/config/plan.py,sha256=JbAY7qfGXYreXOLa32OLxw6z0paeCCf87-2b1m
23
23
  qase/commons/models/config/qaseconfig.py,sha256=ho_22bcouoJb1f68EGffeBs_ovK3DVyfbFrYXwQFrWs,1918
24
24
  qase/commons/models/config/report.py,sha256=g3Z2B3Tewaasjc1TMj2mkXxz0Zc1C39sHeTXH0MRM2Y,497
25
25
  qase/commons/models/config/run.py,sha256=UeZ_1khhKSLbER3pzAl__5iKfDMErvUsXikelc31iKo,682
26
- qase/commons/models/config/testops.py,sha256=jofietKpOISLeTM-vHmn5Jboqj-D1WFoydQZCloZMPE,1722
26
+ qase/commons/models/config/testops.py,sha256=rJ9wW-VMt-5XaoPdRUKeM9rlV0eTiRINEhEulFVczv0,1893
27
27
  qase/commons/profilers/__init__.py,sha256=GhKT5hRbHbhAC4GhdyChA8XoAsGQOnIb8S2Z4-fdS7Q,222
28
28
  qase/commons/profilers/db.py,sha256=Am1tvvLgJq4_A8JsuSeBGf47BD2lnSX-5KiMjSgr-Ko,391
29
29
  qase/commons/profilers/network.py,sha256=zKNBnTQG4BMg8dn8O--tQzQLpu-qs5ADhHEnqIas0gM,4950
@@ -31,11 +31,11 @@ qase/commons/profilers/sleep.py,sha256=HT6h0R-2XHZAoBYRxS2T_KC8RrnEoVjP7MXusaE4N
31
31
  qase/commons/reporters/__init__.py,sha256=J0aNLzb_MPPT_zF8BtX_w9nj_U7Ad06RGpyWK5Pxq1o,169
32
32
  qase/commons/reporters/core.py,sha256=JyFMGhcDOr3nBlhh0Ca8Dx6BmvNBoG8m1Y4hpC0qIog,8185
33
33
  qase/commons/reporters/report.py,sha256=ZLwtVn5gjwgJFtfbpLUO-vW3M3skEq3AhKJwtmM0nUw,4810
34
- qase/commons/reporters/testops.py,sha256=pYSLjSSvDeN3K1DN_7pFHataZHQEjU3ul-8x8-9uotY,6446
34
+ qase/commons/reporters/testops.py,sha256=uph_8upIt5bu4ncqyK7ehXR9NqtpZ34wGUBFLVJKOpE,7481
35
35
  qase/commons/util/__init__.py,sha256=0sRRfrMOIPCHpk9tXM94Pj10qrk18B61qEcbLpRjw_I,74
36
36
  qase/commons/util/host_data.py,sha256=n8o5PDs8kELCZZ5GR7Jug6LsgZHWJudU7iRmZHRdrlw,5264
37
37
  qase/commons/validators/base.py,sha256=wwSn-4YiuXtfGMGnSKgo9Vm5hAKevVmmfd2Ro6Q7MYQ,173
38
- qase_python_commons-3.5.3.dist-info/METADATA,sha256=PSg3wNbBOow7ahZ4hg4satURnYpfANL_Os3wKSmHd1Q,1857
39
- qase_python_commons-3.5.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
- qase_python_commons-3.5.3.dist-info/top_level.txt,sha256=Mn5aFk7H7Uia4s1NRDsvebu8vCrFy9nOuRIBfkIY5kQ,5
41
- qase_python_commons-3.5.3.dist-info/RECORD,,
38
+ qase_python_commons-3.5.5.dist-info/METADATA,sha256=iWzl0apoGP6Xh4Ufzq20-GBrP46W0Pk4rFmKOEPFJMc,1857
39
+ qase_python_commons-3.5.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
+ qase_python_commons-3.5.5.dist-info/top_level.txt,sha256=Mn5aFk7H7Uia4s1NRDsvebu8vCrFy9nOuRIBfkIY5kQ,5
41
+ qase_python_commons-3.5.5.dist-info/RECORD,,