qase-python-commons 3.1.3__py3-none-any.whl → 4.1.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.
Potentially problematic release.
This version of qase-python-commons might be problematic. Click here for more details.
- qase/__init__.py +3 -0
- qase/commons/client/api_v1_client.py +169 -143
- qase/commons/client/api_v2_client.py +77 -23
- qase/commons/client/base_api_client.py +12 -1
- qase/commons/config.py +159 -20
- qase/commons/logger.py +82 -13
- qase/commons/models/__init__.py +0 -2
- qase/commons/models/attachment.py +11 -8
- qase/commons/models/basemodel.py +12 -3
- qase/commons/models/config/framework.py +61 -0
- qase/commons/models/config/qaseconfig.py +34 -0
- qase/commons/models/config/run.py +19 -0
- qase/commons/models/config/testops.py +45 -3
- qase/commons/models/external_link.py +41 -0
- qase/commons/models/relation.py +16 -6
- qase/commons/models/result.py +16 -31
- qase/commons/models/run.py +17 -2
- qase/commons/models/runtime.py +15 -1
- qase/commons/models/step.py +43 -11
- qase/commons/profilers/__init__.py +4 -3
- qase/commons/profilers/db.py +965 -5
- qase/commons/profilers/network.py +5 -1
- qase/commons/reporters/core.py +50 -9
- qase/commons/reporters/report.py +11 -6
- qase/commons/reporters/testops.py +56 -22
- qase/commons/status_mapping/__init__.py +12 -0
- qase/commons/status_mapping/status_mapping.py +237 -0
- qase/commons/util/__init__.py +9 -0
- qase/commons/util/host_data.py +140 -0
- qase/commons/utils.py +95 -0
- {qase_python_commons-3.1.3.dist-info → qase_python_commons-4.1.3.dist-info}/METADATA +16 -11
- qase_python_commons-4.1.3.dist-info/RECORD +45 -0
- {qase_python_commons-3.1.3.dist-info → qase_python_commons-4.1.3.dist-info}/WHEEL +1 -1
- qase/commons/models/suite.py +0 -13
- qase_python_commons-3.1.3.dist-info/RECORD +0 -40
- {qase_python_commons-3.1.3.dist-info → qase_python_commons-4.1.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import platform
|
|
3
|
+
import subprocess
|
|
4
|
+
import json
|
|
5
|
+
import re
|
|
6
|
+
import sys
|
|
7
|
+
from typing import Optional, Dict
|
|
8
|
+
|
|
9
|
+
HostData = Dict[str, str]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def exec_command(command: str, default_value: str = "") -> str:
|
|
13
|
+
try:
|
|
14
|
+
result = subprocess.run(
|
|
15
|
+
command,
|
|
16
|
+
shell=True,
|
|
17
|
+
check=True,
|
|
18
|
+
stdout=subprocess.PIPE,
|
|
19
|
+
stderr=subprocess.PIPE,
|
|
20
|
+
text=True
|
|
21
|
+
)
|
|
22
|
+
return result.stdout.strip()
|
|
23
|
+
except Exception as e:
|
|
24
|
+
print(f"Error executing command '{command}': {e}", file=sys.stderr)
|
|
25
|
+
return default_value
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_detailed_os_info() -> str:
|
|
29
|
+
system = platform.system().lower()
|
|
30
|
+
try:
|
|
31
|
+
if system == "windows":
|
|
32
|
+
return exec_command("ver")
|
|
33
|
+
elif system == "darwin":
|
|
34
|
+
return exec_command("sw_vers -productVersion")
|
|
35
|
+
else:
|
|
36
|
+
try:
|
|
37
|
+
if os.path.exists("/etc/os-release"):
|
|
38
|
+
with open("/etc/os-release", "r") as f:
|
|
39
|
+
os_release = f.read()
|
|
40
|
+
match = re.search(r'PRETTY_NAME="(.+?)"', os_release)
|
|
41
|
+
if match:
|
|
42
|
+
return match.group(1)
|
|
43
|
+
except Exception:
|
|
44
|
+
pass
|
|
45
|
+
return platform.release()
|
|
46
|
+
except Exception as e:
|
|
47
|
+
print(f"Error getting detailed OS info: {e}", file=sys.stderr)
|
|
48
|
+
return platform.release()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def get_package_version(package_name: Optional[str]) -> Optional[str]:
|
|
52
|
+
if not package_name:
|
|
53
|
+
return ""
|
|
54
|
+
try:
|
|
55
|
+
pip_output = exec_command(f"pip show {package_name}")
|
|
56
|
+
if pip_output:
|
|
57
|
+
version_match = re.search(r'Version:\s*(\S+)', pip_output)
|
|
58
|
+
if version_match:
|
|
59
|
+
return version_match.group(1)
|
|
60
|
+
pip_list_output = exec_command("pip list --format=json")
|
|
61
|
+
if pip_list_output:
|
|
62
|
+
packages = json.loads(pip_list_output)
|
|
63
|
+
for pkg in packages:
|
|
64
|
+
if pkg.get("name", "").lower() == package_name.lower():
|
|
65
|
+
return pkg.get("version")
|
|
66
|
+
try:
|
|
67
|
+
import importlib.metadata
|
|
68
|
+
return importlib.metadata.version(package_name)
|
|
69
|
+
except (ImportError, importlib.metadata.PackageNotFoundError):
|
|
70
|
+
pass
|
|
71
|
+
return ""
|
|
72
|
+
except Exception as e:
|
|
73
|
+
print(f"Error getting version for package {package_name}: {e}", file=sys.stderr)
|
|
74
|
+
return ""
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def find_package_in_requirements(package_name: Optional[str]) -> Optional[str]:
|
|
78
|
+
if not package_name:
|
|
79
|
+
return ""
|
|
80
|
+
try:
|
|
81
|
+
possible_req_files = ['requirements.txt', 'requirements/base.txt', 'requirements/dev.txt']
|
|
82
|
+
for req_file in possible_req_files:
|
|
83
|
+
if os.path.exists(req_file):
|
|
84
|
+
with open(req_file, 'r') as f:
|
|
85
|
+
for line in f:
|
|
86
|
+
if line.startswith(package_name):
|
|
87
|
+
version_match = re.search(r'[=<>~]{1,2}([\d.]+)', line)
|
|
88
|
+
if version_match:
|
|
89
|
+
return version_match.group(1)
|
|
90
|
+
return ""
|
|
91
|
+
except Exception as e:
|
|
92
|
+
print(f"Error reading requirements for {package_name}: {e}", file=sys.stderr)
|
|
93
|
+
return ""
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def get_host_info(framework: Optional[str], reporter_name: Optional[str]) -> HostData:
|
|
97
|
+
try:
|
|
98
|
+
python_version = platform.python_version()
|
|
99
|
+
pip_version = exec_command("pip --version")
|
|
100
|
+
if pip_version:
|
|
101
|
+
pip_match = re.search(r'pip\s+(\S+)', pip_version)
|
|
102
|
+
pip_version = pip_match.group(1) if pip_match else ""
|
|
103
|
+
framework_version = get_package_version(framework) or find_package_in_requirements(framework) or ""
|
|
104
|
+
reporter_version = get_package_version(reporter_name) or find_package_in_requirements(reporter_name) or ""
|
|
105
|
+
commons_version = get_package_version("qase-python-commons") or find_package_in_requirements(
|
|
106
|
+
"qase-python-commons") or ""
|
|
107
|
+
api_client_version_1 = get_package_version("qase-api-client") or find_package_in_requirements(
|
|
108
|
+
"qase-api-client") or ""
|
|
109
|
+
api_client_version_2 = get_package_version("qase-api-v2-client") or find_package_in_requirements(
|
|
110
|
+
"qase-api-v2-client") or ""
|
|
111
|
+
return {
|
|
112
|
+
"system": platform.system().lower(),
|
|
113
|
+
"machineName": platform.node(),
|
|
114
|
+
"release": platform.release(),
|
|
115
|
+
"version": get_detailed_os_info(),
|
|
116
|
+
"arch": platform.machine(),
|
|
117
|
+
"python": python_version,
|
|
118
|
+
"pip": pip_version,
|
|
119
|
+
"framework": framework_version,
|
|
120
|
+
"reporter": reporter_version,
|
|
121
|
+
"commons": commons_version,
|
|
122
|
+
"apiClientV1": api_client_version_1,
|
|
123
|
+
"apiClientV2": api_client_version_2
|
|
124
|
+
}
|
|
125
|
+
except Exception as e:
|
|
126
|
+
print(f"Error getting host info: {e}", file=sys.stderr)
|
|
127
|
+
return {
|
|
128
|
+
"system": platform.system().lower(),
|
|
129
|
+
"machineName": platform.node(),
|
|
130
|
+
"release": platform.release(),
|
|
131
|
+
"version": "",
|
|
132
|
+
"arch": platform.machine(),
|
|
133
|
+
"python": "",
|
|
134
|
+
"pip": "",
|
|
135
|
+
"framework": "",
|
|
136
|
+
"reporter": "",
|
|
137
|
+
"commons": "",
|
|
138
|
+
"apiClientV1": "",
|
|
139
|
+
"apiClientV2": ""
|
|
140
|
+
}
|
qase/commons/utils.py
CHANGED
|
@@ -2,13 +2,92 @@ import os
|
|
|
2
2
|
import platform
|
|
3
3
|
import threading
|
|
4
4
|
import sys
|
|
5
|
+
from typing import Union, List
|
|
5
6
|
import pip
|
|
6
7
|
import string
|
|
7
8
|
import uuid
|
|
9
|
+
import time
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
class QaseUtils:
|
|
11
13
|
|
|
14
|
+
@staticmethod
|
|
15
|
+
def get_real_time() -> float:
|
|
16
|
+
"""
|
|
17
|
+
Get real system time, bypassing time mocking libraries like freezegun.
|
|
18
|
+
|
|
19
|
+
This is necessary when reporting test results to external systems that validate
|
|
20
|
+
timestamps against current time, even when tests are using time mocking.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
float: Current Unix timestamp in seconds with microsecond precision
|
|
24
|
+
"""
|
|
25
|
+
# Try to get the original time function if it was wrapped by freezegun
|
|
26
|
+
# freezegun stores the original function in __wrapped__ attribute
|
|
27
|
+
if hasattr(time.time, '__wrapped__'):
|
|
28
|
+
return time.time.__wrapped__()
|
|
29
|
+
|
|
30
|
+
# Fallback: use direct system call via ctypes
|
|
31
|
+
# This works on Unix-like systems and Windows
|
|
32
|
+
try:
|
|
33
|
+
import ctypes
|
|
34
|
+
import ctypes.util
|
|
35
|
+
|
|
36
|
+
if sys.platform == 'win32':
|
|
37
|
+
# Windows: use GetSystemTimeAsFileTime
|
|
38
|
+
class FILETIME(ctypes.Structure):
|
|
39
|
+
_fields_ = [("dwLowDateTime", ctypes.c_uint32),
|
|
40
|
+
("dwHighDateTime", ctypes.c_uint32)]
|
|
41
|
+
|
|
42
|
+
kernel32 = ctypes.windll.kernel32
|
|
43
|
+
ft = FILETIME()
|
|
44
|
+
kernel32.GetSystemTimeAsFileTime(ctypes.byref(ft))
|
|
45
|
+
|
|
46
|
+
# Convert FILETIME to Unix timestamp
|
|
47
|
+
# FILETIME is 100-nanosecond intervals since January 1, 1601
|
|
48
|
+
timestamp = (ft.dwHighDateTime << 32) + ft.dwLowDateTime
|
|
49
|
+
# Convert to seconds and adjust epoch (1601 -> 1970)
|
|
50
|
+
return (timestamp / 10000000.0) - 11644473600.0
|
|
51
|
+
else:
|
|
52
|
+
# Unix-like systems: use gettimeofday for microsecond precision
|
|
53
|
+
# Try multiple approaches to find libc
|
|
54
|
+
libc = None
|
|
55
|
+
|
|
56
|
+
# Method 1: Use find_library (works on most systems)
|
|
57
|
+
libc_path = ctypes.util.find_library('c')
|
|
58
|
+
if libc_path:
|
|
59
|
+
try:
|
|
60
|
+
libc = ctypes.CDLL(libc_path)
|
|
61
|
+
except OSError:
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
# Method 2: Try common library names directly (for Alpine Linux, musl libc, etc.)
|
|
65
|
+
if libc is None:
|
|
66
|
+
for lib_name in ['libc.so.6', 'libc.so', 'libc.dylib']:
|
|
67
|
+
try:
|
|
68
|
+
libc = ctypes.CDLL(lib_name)
|
|
69
|
+
break
|
|
70
|
+
except OSError:
|
|
71
|
+
continue
|
|
72
|
+
|
|
73
|
+
if libc is None:
|
|
74
|
+
raise OSError("Could not load C library")
|
|
75
|
+
|
|
76
|
+
class timeval(ctypes.Structure):
|
|
77
|
+
_fields_ = [("tv_sec", ctypes.c_long),
|
|
78
|
+
("tv_usec", ctypes.c_long)]
|
|
79
|
+
|
|
80
|
+
tv = timeval()
|
|
81
|
+
libc.gettimeofday(ctypes.byref(tv), None)
|
|
82
|
+
|
|
83
|
+
return float(tv.tv_sec) + (float(tv.tv_usec) / 1000000.0)
|
|
84
|
+
except Exception:
|
|
85
|
+
# Last resort: return the potentially mocked time
|
|
86
|
+
# This will still work in normal cases without freezegun
|
|
87
|
+
# If freezegun is active, the user might see timestamp validation errors
|
|
88
|
+
# but the core functionality will continue to work
|
|
89
|
+
return time.time()
|
|
90
|
+
|
|
12
91
|
@staticmethod
|
|
13
92
|
def build_tree(items):
|
|
14
93
|
nodes = {item.id: item for item in items}
|
|
@@ -64,6 +143,22 @@ class QaseUtils:
|
|
|
64
143
|
def get_filename(path) -> str:
|
|
65
144
|
return os.path.basename(path)
|
|
66
145
|
|
|
146
|
+
@staticmethod
|
|
147
|
+
def get_signature(testops_ids: Union[List[int], None], suites: List[str], params: dict) -> str:
|
|
148
|
+
signature_parts = []
|
|
149
|
+
|
|
150
|
+
if testops_ids:
|
|
151
|
+
signature_parts.append(
|
|
152
|
+
f"{'-'.join(map(str, testops_ids))}")
|
|
153
|
+
|
|
154
|
+
for suite in suites:
|
|
155
|
+
signature_parts.append(suite.lower().replace(" ", "_"))
|
|
156
|
+
|
|
157
|
+
for key, val in params.items():
|
|
158
|
+
signature_parts.append(f"{{{key}:{val}}}")
|
|
159
|
+
|
|
160
|
+
return "::".join(signature_parts)
|
|
161
|
+
|
|
67
162
|
|
|
68
163
|
class StringFormatter(string.Formatter):
|
|
69
164
|
"""
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: qase-python-commons
|
|
3
|
-
Version:
|
|
3
|
+
Version: 4.1.3
|
|
4
4
|
Summary: A library for Qase TestOps and Qase Report
|
|
5
5
|
Author-email: Qase Team <support@qase.io>
|
|
6
|
-
Project-URL: Homepage, https://github.com/qase-tms/qase-python/tree/
|
|
6
|
+
Project-URL: Homepage, https://github.com/qase-tms/qase-python/tree/main/qase-python-commons
|
|
7
7
|
Classifier: Development Status :: 5 - Production/Stable
|
|
8
8
|
Classifier: Programming Language :: Python
|
|
9
9
|
Classifier: Intended Audience :: Developers
|
|
@@ -12,32 +12,37 @@ Classifier: Topic :: Software Development :: Quality Assurance
|
|
|
12
12
|
Classifier: Topic :: Software Development :: Testing
|
|
13
13
|
Classifier: Programming Language :: Python :: 3
|
|
14
14
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
17
15
|
Classifier: Programming Language :: Python :: 3.9
|
|
18
16
|
Classifier: Programming Language :: Python :: 3.10
|
|
19
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
-
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Requires-Python: >=3.9
|
|
22
21
|
Description-Content-Type: text/markdown
|
|
23
22
|
Requires-Dist: certifi>=2024.2.2
|
|
24
23
|
Requires-Dist: attrs>=23.2.0
|
|
25
|
-
Requires-Dist: qase-api-client~=
|
|
26
|
-
Requires-Dist: qase-api-v2-client~=
|
|
27
|
-
Requires-Dist:
|
|
24
|
+
Requires-Dist: qase-api-client~=2.0.1
|
|
25
|
+
Requires-Dist: qase-api-v2-client~=2.0.0
|
|
26
|
+
Requires-Dist: more_itertools
|
|
28
27
|
Provides-Extra: testing
|
|
29
28
|
Requires-Dist: pytest; extra == "testing"
|
|
30
29
|
Requires-Dist: pytest-cov; extra == "testing"
|
|
31
30
|
Requires-Dist: mock; extra == "testing"
|
|
32
|
-
Requires-Dist:
|
|
31
|
+
Requires-Dist: more_itertools; extra == "testing"
|
|
33
32
|
Requires-Dist: requests; extra == "testing"
|
|
34
33
|
Requires-Dist: urllib3; extra == "testing"
|
|
34
|
+
Requires-Dist: freezegun; extra == "testing"
|
|
35
35
|
|
|
36
36
|
# Qase Python Commons
|
|
37
37
|
|
|
38
38
|
## Description
|
|
39
39
|
|
|
40
|
-
This package contains reporters for Qase TestOps and Qase Report that are used in
|
|
40
|
+
This package contains reporters for Qase TestOps and Qase Report that are used in following projects:
|
|
41
|
+
|
|
42
|
+
- [qase-pytest](https://github.com/qase-tms/qase-python/tree/main/qase-pytest)
|
|
43
|
+
- [qase-robotframework](https://github.com/qase-tms/qase-python/tree/main/qase-robotframework)
|
|
44
|
+
- [qase-behave](https://github.com/qase-tms/qase-python/tree/main/qase-behave)
|
|
45
|
+
- [qase-tavern](https://github.com/qase-tms/qase-python/tree/main/qase-tavern)
|
|
41
46
|
|
|
42
47
|
## How to install
|
|
43
48
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
qase/__init__.py,sha256=FLefSJnT6MTsTfZSDjMbMImI6674fAoJ5ZT3PNWGcRo,37
|
|
2
|
+
qase/commons/__init__.py,sha256=3HI65PJES4Q6YvtkSuRPh6tZboTETJo8wbdHlNYaePU,323
|
|
3
|
+
qase/commons/config.py,sha256=SyG1-2RfKQAhQLUbq7szbUUp9ABYvbSiaT8WdQEjMcA,15556
|
|
4
|
+
qase/commons/loader.py,sha256=-MMY4HgSI6q1xq3NaJoq_w4liM73qdFKjYLVCT1E7Pc,1064
|
|
5
|
+
qase/commons/logger.py,sha256=V_QTSDWNnUgd0j58rydYYN1AYOu3wa9T2fWjpOyxyuA,3430
|
|
6
|
+
qase/commons/utils.py,sha256=0TtpLvyAdh7fLQW4HA_6aQM8kWy4a8VtSD_KdkRVZlw,6775
|
|
7
|
+
qase/commons/client/api_v1_client.py,sha256=BaE9Ix-k5Xc7Wiz8ILKKsWb5G5J3hqgjwaIcrocvCdY,12879
|
|
8
|
+
qase/commons/client/api_v2_client.py,sha256=4iZ3RA-PPUHaW_X1llA7Gvsr4i-5Oq5k8PbffXI2tg8,10271
|
|
9
|
+
qase/commons/client/base_api_client.py,sha256=4NtXhUxrxEPOBIzEAE-b50KHMwlhxwnSLGcYx8NMjbY,2961
|
|
10
|
+
qase/commons/exceptions/reporter.py,sha256=dP-Mwcq8HKBOjgu3YqhyULDmDGU09BmT6Fh9HjICaUc,45
|
|
11
|
+
qase/commons/models/__init__.py,sha256=FTt5dYASBX4r6-tQi-_JAUVx4uvJs9GTxROdAZEV6Jo,272
|
|
12
|
+
qase/commons/models/attachment.py,sha256=cGfB0BaTDVfA7euJubKvi2cXXNvlSm_dy5x-ak3H3ec,1625
|
|
13
|
+
qase/commons/models/basemodel.py,sha256=0j8E-LE6hxAKQPYLNM9qThor9s2ZndZys_kibeoLImo,426
|
|
14
|
+
qase/commons/models/external_link.py,sha256=bdXj7pNHHkfb3dcYtXN8sNp-HFxHvZeYz8QIPGcvX0w,1317
|
|
15
|
+
qase/commons/models/relation.py,sha256=HymHeh1uBcoQnTs4Vra7WJ_KFkhryj5o7cShjoGQImI,511
|
|
16
|
+
qase/commons/models/result.py,sha256=53udABcu_Gzm-vvnvvb9mFui8-el-N41vCU2Dsual84,4047
|
|
17
|
+
qase/commons/models/run.py,sha256=ANbljW1mgua4JF1wGZG9S-jnUpI7FC4F15sAQOoNnko,3096
|
|
18
|
+
qase/commons/models/runtime.py,sha256=h0kJcPYRo8dglIQVFyzh-cFpWb3bAaQaIq5wV8VfClM,1508
|
|
19
|
+
qase/commons/models/step.py,sha256=rHzJ_B5APgW0TDgDO2oftOsnrmpPrQcIbyW7Yr1unAg,5866
|
|
20
|
+
qase/commons/models/config/api.py,sha256=IyYY2f3ncESUAEGvkE3-meatebBFJdvgo7KNOQnxLE0,288
|
|
21
|
+
qase/commons/models/config/batch.py,sha256=X0H8SVOCCD2pV6LSMqjI-tIjRcLifnrM5MareK2FhQw,321
|
|
22
|
+
qase/commons/models/config/connection.py,sha256=wK2fGjc0G0rMVVhPnjw_t_M1YWZwANlhwl-awmI7XSo,516
|
|
23
|
+
qase/commons/models/config/framework.py,sha256=sSWKQp18zxiS_79_XDH2hkHLpYEQnyH3bRquaT8XYYY,1803
|
|
24
|
+
qase/commons/models/config/plan.py,sha256=JbAY7qfGXYreXOLa32OLxw6z0paeCCf87-2b1m8xkks,137
|
|
25
|
+
qase/commons/models/config/qaseconfig.py,sha256=oWc03PKV8-jb3JNgs_tqQP-22wsKZW25eSaAacYl4no,2838
|
|
26
|
+
qase/commons/models/config/report.py,sha256=g3Z2B3Tewaasjc1TMj2mkXxz0Zc1C39sHeTXH0MRM2Y,497
|
|
27
|
+
qase/commons/models/config/run.py,sha256=UGE5PA_EyiFpfIev-TOob1BocxT1vdUdWW3ELMD58zQ,1239
|
|
28
|
+
qase/commons/models/config/testops.py,sha256=LdylcNG1ctxjNHXwrwcerAKY3h0WByKWYIrKOzEV2K8,2133
|
|
29
|
+
qase/commons/profilers/__init__.py,sha256=-ZuUylfpYeh5YinSnbyZyAZfmS9fUGOGlyooD4KQ-lE,293
|
|
30
|
+
qase/commons/profilers/db.py,sha256=DpHr7DktiBBiCv_9i4v-0lzKCsJiDdC4_A0mkDTqDMs,40438
|
|
31
|
+
qase/commons/profilers/network.py,sha256=zKNBnTQG4BMg8dn8O--tQzQLpu-qs5ADhHEnqIas0gM,4950
|
|
32
|
+
qase/commons/profilers/sleep.py,sha256=HT6h0R-2XHZAoBYRxS2T_KC8RrnEoVjP7MXusaE4Nec,1624
|
|
33
|
+
qase/commons/reporters/__init__.py,sha256=J0aNLzb_MPPT_zF8BtX_w9nj_U7Ad06RGpyWK5Pxq1o,169
|
|
34
|
+
qase/commons/reporters/core.py,sha256=Td4F8jlzTe3Ilti_IvD_ZMPdoDe0NILna1b_T71CTt4,9631
|
|
35
|
+
qase/commons/reporters/report.py,sha256=2hrpQGhtgEaDphRIiAiVtC1C1YWz3--jy4mw-kvO8lY,4838
|
|
36
|
+
qase/commons/reporters/testops.py,sha256=k3c91l_xuLq6NRLkzfwRqRTLfnpSxEQe38HNH8XMOTk,8161
|
|
37
|
+
qase/commons/status_mapping/__init__.py,sha256=NPsWKDC7rGSCYfVunnGnHxL0_HmKWH7RBaMjWTH_Mtk,322
|
|
38
|
+
qase/commons/status_mapping/status_mapping.py,sha256=kohSLNK6_qbMSP-M8gxHTTmOECgzDE3XvLqOzidPlYI,7213
|
|
39
|
+
qase/commons/util/__init__.py,sha256=0sRRfrMOIPCHpk9tXM94Pj10qrk18B61qEcbLpRjw_I,74
|
|
40
|
+
qase/commons/util/host_data.py,sha256=n8o5PDs8kELCZZ5GR7Jug6LsgZHWJudU7iRmZHRdrlw,5264
|
|
41
|
+
qase/commons/validators/base.py,sha256=wwSn-4YiuXtfGMGnSKgo9Vm5hAKevVmmfd2Ro6Q7MYQ,173
|
|
42
|
+
qase_python_commons-4.1.3.dist-info/METADATA,sha256=gf_ALF0O_WTlumZ4DuL89Pnt8ZanNq0JvRLnUV6yW98,2027
|
|
43
|
+
qase_python_commons-4.1.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
44
|
+
qase_python_commons-4.1.3.dist-info/top_level.txt,sha256=Mn5aFk7H7Uia4s1NRDsvebu8vCrFy9nOuRIBfkIY5kQ,5
|
|
45
|
+
qase_python_commons-4.1.3.dist-info/RECORD,,
|
qase/commons/models/suite.py
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import uuid
|
|
2
|
-
|
|
3
|
-
from typing import List, Optional
|
|
4
|
-
|
|
5
|
-
from .basemodel import BaseModel
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class Suite(BaseModel):
|
|
9
|
-
def __init__(self, title: str, description: Optional[str] = None, parent_id: Optional[str] = None):
|
|
10
|
-
self.title = title
|
|
11
|
-
self.description = description
|
|
12
|
-
self.parent_id = parent_id
|
|
13
|
-
self.id = str(uuid.uuid4())
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
qase/commons/__init__.py,sha256=3HI65PJES4Q6YvtkSuRPh6tZboTETJo8wbdHlNYaePU,323
|
|
2
|
-
qase/commons/config.py,sha256=meRRgDrsA9qQ9fZR4fnP0VdngrKiGcHF9nnJkf3eJpg,8320
|
|
3
|
-
qase/commons/loader.py,sha256=-MMY4HgSI6q1xq3NaJoq_w4liM73qdFKjYLVCT1E7Pc,1064
|
|
4
|
-
qase/commons/logger.py,sha256=ka5chQYBXLUB5pM4YHDBo3QCZfBTGMtC3H33tI4NbPQ,1027
|
|
5
|
-
qase/commons/utils.py,sha256=OOr6kQ5hPZEyHXwbwiTOTkonRxmmtkyZPPGqXQKp5vY,2799
|
|
6
|
-
qase/commons/client/api_v1_client.py,sha256=NVluiG_pBZL4u2D34WtgXaPkA4TdJhmHUNd6rnfcDeg,11178
|
|
7
|
-
qase/commons/client/api_v2_client.py,sha256=F3wU_2EKe6eUjNRahvnDmpbx99PwZB6Lxc4VPRj7w58,7247
|
|
8
|
-
qase/commons/client/base_api_client.py,sha256=H8JnjqSrBFNfghDd3T3zxYOyKYHYe9QiJQXol1JqdQk,2613
|
|
9
|
-
qase/commons/exceptions/reporter.py,sha256=dP-Mwcq8HKBOjgu3YqhyULDmDGU09BmT6Fh9HjICaUc,45
|
|
10
|
-
qase/commons/models/__init__.py,sha256=66rxcTqtfbx_zPshJW3f5JxtC4aoaDSCC0izyY_9GGI,308
|
|
11
|
-
qase/commons/models/attachment.py,sha256=Rjq1mAP11uk7TN2RrtImntw6DUMV7U0R-44TYj8O5j0,1432
|
|
12
|
-
qase/commons/models/basemodel.py,sha256=nyDSXhpQUecKdzhB-eWqujmso20oXB9p_42qpOsGVuQ,213
|
|
13
|
-
qase/commons/models/relation.py,sha256=Hscui14vuSdKVdPPej4V1-SF4XHvJ2Tqg0KH8d49dH0,321
|
|
14
|
-
qase/commons/models/result.py,sha256=im6L5F44yXAyD6HQy8kP9fncjrKn-7HN30ZnezSdi_Q,4423
|
|
15
|
-
qase/commons/models/run.py,sha256=KkplvlHJNvVLORzVkdz5mHsLFBTUAdtuEYCqCy_RcvU,2469
|
|
16
|
-
qase/commons/models/runtime.py,sha256=1euzotexy7iVjJghg_eVaL1F7gRrB3SV8tq8IRNu0P0,1200
|
|
17
|
-
qase/commons/models/step.py,sha256=M-btRYZ4febYavDhwFqmKcCdLAgrhtuv7E_M3TKZdfg,4281
|
|
18
|
-
qase/commons/models/suite.py,sha256=Z2tlxdeIsuzjIoPnuyVq23pt59Yt6LVmofcew5Njk_s,348
|
|
19
|
-
qase/commons/models/config/api.py,sha256=IyYY2f3ncESUAEGvkE3-meatebBFJdvgo7KNOQnxLE0,288
|
|
20
|
-
qase/commons/models/config/batch.py,sha256=X0H8SVOCCD2pV6LSMqjI-tIjRcLifnrM5MareK2FhQw,321
|
|
21
|
-
qase/commons/models/config/connection.py,sha256=wK2fGjc0G0rMVVhPnjw_t_M1YWZwANlhwl-awmI7XSo,516
|
|
22
|
-
qase/commons/models/config/framework.py,sha256=upGHFwmJ-i-VA_OLPgJiwgJRjB7vusuk-dhJMhgdYDM,416
|
|
23
|
-
qase/commons/models/config/plan.py,sha256=JbAY7qfGXYreXOLa32OLxw6z0paeCCf87-2b1m8xkks,137
|
|
24
|
-
qase/commons/models/config/qaseconfig.py,sha256=-tuTsd6s4YSAkSca7vvNaFZbqhbWkxuw-mjeqhwmjlc,1722
|
|
25
|
-
qase/commons/models/config/report.py,sha256=g3Z2B3Tewaasjc1TMj2mkXxz0Zc1C39sHeTXH0MRM2Y,497
|
|
26
|
-
qase/commons/models/config/run.py,sha256=QPOPq0__J5Pey2MfjnEgTuCCDYgjog-rjMJBjiMBgz4,540
|
|
27
|
-
qase/commons/models/config/testops.py,sha256=O5aFtZHYt3Uj8wRT3Vg_U4qBFINy9Dn6lKTDamuK3QE,822
|
|
28
|
-
qase/commons/profilers/__init__.py,sha256=GhKT5hRbHbhAC4GhdyChA8XoAsGQOnIb8S2Z4-fdS7Q,222
|
|
29
|
-
qase/commons/profilers/db.py,sha256=Am1tvvLgJq4_A8JsuSeBGf47BD2lnSX-5KiMjSgr-Ko,391
|
|
30
|
-
qase/commons/profilers/network.py,sha256=zxW_sErcMgHjzVGxk6Njp23YzhZrGgh7trC1r2zHHjU,4784
|
|
31
|
-
qase/commons/profilers/sleep.py,sha256=HT6h0R-2XHZAoBYRxS2T_KC8RrnEoVjP7MXusaE4Nec,1624
|
|
32
|
-
qase/commons/reporters/__init__.py,sha256=J0aNLzb_MPPT_zF8BtX_w9nj_U7Ad06RGpyWK5Pxq1o,169
|
|
33
|
-
qase/commons/reporters/core.py,sha256=0x5G-KVfEOWyXiXaX5__7JBIr3Rxy8vhy0cByUSZUc0,8021
|
|
34
|
-
qase/commons/reporters/report.py,sha256=MPsFv3k2l4652NyXEGFiSmwsSpwZT3Is-lLRXvsniz4,4606
|
|
35
|
-
qase/commons/reporters/testops.py,sha256=f5BcorFwIK5BSeA4Rv4IKDddkWrAXL_w-Y5Xn--NdYs,6264
|
|
36
|
-
qase/commons/validators/base.py,sha256=wwSn-4YiuXtfGMGnSKgo9Vm5hAKevVmmfd2Ro6Q7MYQ,173
|
|
37
|
-
qase_python_commons-3.1.3.dist-info/METADATA,sha256=gPr1b6ZR6Qn1Ma4VCR_wBb5htebpF_0k6DJupUOqSCc,1859
|
|
38
|
-
qase_python_commons-3.1.3.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
|
|
39
|
-
qase_python_commons-3.1.3.dist-info/top_level.txt,sha256=Mn5aFk7H7Uia4s1NRDsvebu8vCrFy9nOuRIBfkIY5kQ,5
|
|
40
|
-
qase_python_commons-3.1.3.dist-info/RECORD,,
|
|
File without changes
|