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.

Files changed (36) hide show
  1. qase/__init__.py +3 -0
  2. qase/commons/client/api_v1_client.py +169 -143
  3. qase/commons/client/api_v2_client.py +77 -23
  4. qase/commons/client/base_api_client.py +12 -1
  5. qase/commons/config.py +159 -20
  6. qase/commons/logger.py +82 -13
  7. qase/commons/models/__init__.py +0 -2
  8. qase/commons/models/attachment.py +11 -8
  9. qase/commons/models/basemodel.py +12 -3
  10. qase/commons/models/config/framework.py +61 -0
  11. qase/commons/models/config/qaseconfig.py +34 -0
  12. qase/commons/models/config/run.py +19 -0
  13. qase/commons/models/config/testops.py +45 -3
  14. qase/commons/models/external_link.py +41 -0
  15. qase/commons/models/relation.py +16 -6
  16. qase/commons/models/result.py +16 -31
  17. qase/commons/models/run.py +17 -2
  18. qase/commons/models/runtime.py +15 -1
  19. qase/commons/models/step.py +43 -11
  20. qase/commons/profilers/__init__.py +4 -3
  21. qase/commons/profilers/db.py +965 -5
  22. qase/commons/profilers/network.py +5 -1
  23. qase/commons/reporters/core.py +50 -9
  24. qase/commons/reporters/report.py +11 -6
  25. qase/commons/reporters/testops.py +56 -22
  26. qase/commons/status_mapping/__init__.py +12 -0
  27. qase/commons/status_mapping/status_mapping.py +237 -0
  28. qase/commons/util/__init__.py +9 -0
  29. qase/commons/util/host_data.py +140 -0
  30. qase/commons/utils.py +95 -0
  31. {qase_python_commons-3.1.3.dist-info → qase_python_commons-4.1.3.dist-info}/METADATA +16 -11
  32. qase_python_commons-4.1.3.dist-info/RECORD +45 -0
  33. {qase_python_commons-3.1.3.dist-info → qase_python_commons-4.1.3.dist-info}/WHEEL +1 -1
  34. qase/commons/models/suite.py +0 -13
  35. qase_python_commons-3.1.3.dist-info/RECORD +0 -40
  36. {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
1
+ Metadata-Version: 2.4
2
2
  Name: qase-python-commons
3
- Version: 3.1.3
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/master/qase-python-commons
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
- Requires-Python: >=3.7
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~=1.1.0
26
- Requires-Dist: qase-api-v2-client~=1.0.0
27
- Requires-Dist: more-itertools
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: more-itertools; extra == "testing"
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 [qase-pytest](https://github.com/qase-tms/qase-python/tree/master/qase-pytest) and [qase-robotframework](https://github.com/qase-tms/qase-python/tree/master/qase-robotframework).
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.2)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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,,