argus-alm 0.15.2__py3-none-any.whl → 0.15.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.
Files changed (114) hide show
  1. argus/_version.py +2 -2
  2. argus/client/base.py +14 -8
  3. argus/client/generic/cli.py +3 -2
  4. argus/client/generic/client.py +2 -1
  5. argus/client/generic_result.py +6 -1
  6. argus/client/sct/client.py +2 -1
  7. argus/common/enums.py +16 -0
  8. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/METADATA +4 -4
  9. argus_alm-0.15.5.dist-info/RECORD +22 -0
  10. argus/backend/.gitkeep +0 -0
  11. argus/backend/__init__.py +0 -0
  12. argus/backend/cli.py +0 -57
  13. argus/backend/controller/__init__.py +0 -0
  14. argus/backend/controller/admin.py +0 -20
  15. argus/backend/controller/admin_api.py +0 -355
  16. argus/backend/controller/api.py +0 -589
  17. argus/backend/controller/auth.py +0 -67
  18. argus/backend/controller/client_api.py +0 -109
  19. argus/backend/controller/main.py +0 -316
  20. argus/backend/controller/notification_api.py +0 -72
  21. argus/backend/controller/notifications.py +0 -13
  22. argus/backend/controller/planner_api.py +0 -194
  23. argus/backend/controller/team.py +0 -129
  24. argus/backend/controller/team_ui.py +0 -19
  25. argus/backend/controller/testrun_api.py +0 -513
  26. argus/backend/controller/view_api.py +0 -188
  27. argus/backend/controller/views_widgets/__init__.py +0 -0
  28. argus/backend/controller/views_widgets/graphed_stats.py +0 -54
  29. argus/backend/controller/views_widgets/graphs.py +0 -68
  30. argus/backend/controller/views_widgets/highlights.py +0 -135
  31. argus/backend/controller/views_widgets/nemesis_stats.py +0 -26
  32. argus/backend/controller/views_widgets/summary.py +0 -43
  33. argus/backend/db.py +0 -98
  34. argus/backend/error_handlers.py +0 -41
  35. argus/backend/events/event_processors.py +0 -34
  36. argus/backend/models/__init__.py +0 -0
  37. argus/backend/models/argus_ai.py +0 -24
  38. argus/backend/models/github_issue.py +0 -60
  39. argus/backend/models/plan.py +0 -24
  40. argus/backend/models/result.py +0 -187
  41. argus/backend/models/runtime_store.py +0 -58
  42. argus/backend/models/view_widgets.py +0 -25
  43. argus/backend/models/web.py +0 -403
  44. argus/backend/plugins/__init__.py +0 -0
  45. argus/backend/plugins/core.py +0 -248
  46. argus/backend/plugins/driver_matrix_tests/controller.py +0 -66
  47. argus/backend/plugins/driver_matrix_tests/model.py +0 -429
  48. argus/backend/plugins/driver_matrix_tests/plugin.py +0 -21
  49. argus/backend/plugins/driver_matrix_tests/raw_types.py +0 -62
  50. argus/backend/plugins/driver_matrix_tests/service.py +0 -61
  51. argus/backend/plugins/driver_matrix_tests/udt.py +0 -42
  52. argus/backend/plugins/generic/model.py +0 -86
  53. argus/backend/plugins/generic/plugin.py +0 -15
  54. argus/backend/plugins/generic/types.py +0 -14
  55. argus/backend/plugins/loader.py +0 -39
  56. argus/backend/plugins/sct/controller.py +0 -224
  57. argus/backend/plugins/sct/plugin.py +0 -37
  58. argus/backend/plugins/sct/resource_setup.py +0 -177
  59. argus/backend/plugins/sct/service.py +0 -682
  60. argus/backend/plugins/sct/testrun.py +0 -288
  61. argus/backend/plugins/sct/udt.py +0 -100
  62. argus/backend/plugins/sirenada/model.py +0 -118
  63. argus/backend/plugins/sirenada/plugin.py +0 -16
  64. argus/backend/service/admin.py +0 -26
  65. argus/backend/service/argus_service.py +0 -696
  66. argus/backend/service/build_system_monitor.py +0 -185
  67. argus/backend/service/client_service.py +0 -127
  68. argus/backend/service/event_service.py +0 -18
  69. argus/backend/service/github_service.py +0 -233
  70. argus/backend/service/jenkins_service.py +0 -269
  71. argus/backend/service/notification_manager.py +0 -159
  72. argus/backend/service/planner_service.py +0 -608
  73. argus/backend/service/release_manager.py +0 -229
  74. argus/backend/service/results_service.py +0 -690
  75. argus/backend/service/stats.py +0 -610
  76. argus/backend/service/team_manager_service.py +0 -82
  77. argus/backend/service/test_lookup.py +0 -172
  78. argus/backend/service/testrun.py +0 -489
  79. argus/backend/service/user.py +0 -308
  80. argus/backend/service/views.py +0 -219
  81. argus/backend/service/views_widgets/__init__.py +0 -0
  82. argus/backend/service/views_widgets/graphed_stats.py +0 -180
  83. argus/backend/service/views_widgets/highlights.py +0 -374
  84. argus/backend/service/views_widgets/nemesis_stats.py +0 -34
  85. argus/backend/template_filters.py +0 -27
  86. argus/backend/tests/__init__.py +0 -0
  87. argus/backend/tests/client_service/__init__.py +0 -0
  88. argus/backend/tests/client_service/test_submit_results.py +0 -79
  89. argus/backend/tests/conftest.py +0 -180
  90. argus/backend/tests/results_service/__init__.py +0 -0
  91. argus/backend/tests/results_service/test_best_results.py +0 -178
  92. argus/backend/tests/results_service/test_cell.py +0 -65
  93. argus/backend/tests/results_service/test_chartjs_additional_functions.py +0 -259
  94. argus/backend/tests/results_service/test_create_chartjs.py +0 -220
  95. argus/backend/tests/results_service/test_result_metadata.py +0 -100
  96. argus/backend/tests/results_service/test_results_service.py +0 -203
  97. argus/backend/tests/results_service/test_validation_rules.py +0 -213
  98. argus/backend/tests/view_widgets/__init__.py +0 -0
  99. argus/backend/tests/view_widgets/test_highlights_api.py +0 -532
  100. argus/backend/util/common.py +0 -65
  101. argus/backend/util/config.py +0 -38
  102. argus/backend/util/encoders.py +0 -56
  103. argus/backend/util/logsetup.py +0 -80
  104. argus/backend/util/module_loaders.py +0 -30
  105. argus/backend/util/send_email.py +0 -91
  106. argus/client/tests/__init__.py +0 -0
  107. argus/client/tests/conftest.py +0 -19
  108. argus/client/tests/test_package.py +0 -45
  109. argus/client/tests/test_results.py +0 -224
  110. argus_alm-0.15.2.dist-info/RECORD +0 -122
  111. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/WHEEL +0 -0
  112. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/entry_points.txt +0 -0
  113. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/licenses/LICENSE +0 -0
  114. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/top_level.txt +0 -0
@@ -1,80 +0,0 @@
1
- import logging
2
- from logging.config import dictConfig
3
- from flask import has_request_context, request
4
-
5
- LOG_FORMAT_REQUEST = "[%(levelcolor)s%(levelname)s%(colorreset)s] %(grey)s<%(remote_addr)s - %(url)s - %(endpoint)s>%(colorreset)s - %(module)s::%(funcName)s - %(message)s"
6
-
7
-
8
- class ArgusRequestLogFormatter(logging.Formatter):
9
- yellow = "\x1b[33;20m"
10
- red = "\x1b[31;20m"
11
- blue = "\x1b[34;20m"
12
- bold_red = "\x1b[31;1m"
13
- reset = "\x1b[0m"
14
- grey = "\x1b[38;2;200;200;200m"
15
- color_map = {
16
- logging.DEBUG: grey,
17
- logging.INFO: blue,
18
- logging.WARNING: yellow,
19
- logging.ERROR: red,
20
- logging.CRITICAL: bold_red
21
- }
22
-
23
- def format(self, record: logging.LogRecord) -> str:
24
- record.grey = self.grey
25
- record.colorreset = self.reset
26
- record.levelcolor = self.color_map.get(record.levelno, self.grey)
27
- if has_request_context():
28
- record.url = request.url
29
- record.remote_addr = request.remote_addr
30
- record.endpoint = request.endpoint
31
- else:
32
- record.url = ''
33
- record.remote_addr = ''
34
- record.endpoint = ''
35
- return super().format(record)
36
-
37
-
38
- def setup_application_logging(log_level=logging.INFO):
39
- dictConfig({
40
- 'version': 1,
41
- 'formatters': {
42
- 'request': {
43
- 'class': f"{__name__}.{ArgusRequestLogFormatter.__name__}",
44
- 'format': LOG_FORMAT_REQUEST,
45
- }
46
- },
47
- 'handlers': {
48
- 'main': {
49
- 'class': 'logging.StreamHandler',
50
- 'stream': 'ext://sys.stderr',
51
- 'formatter': 'request'
52
- }
53
- },
54
- 'loggers': {
55
- 'cassandra': {
56
- 'level': log_level,
57
- 'handlers': ['main']
58
- },
59
- 'argus': {
60
- 'level': log_level,
61
- 'handlers': ['main']
62
- },
63
- 'argus_backend': {
64
- 'level': log_level,
65
- 'handlers': ['main']
66
- },
67
- 'werkzeug': {
68
- 'level': log_level,
69
- 'handlers': ['main']
70
- },
71
- 'uwsgi': {
72
- 'level': log_level,
73
- 'handlers': ['main']
74
- },
75
- '__main__': {
76
- 'level': log_level,
77
- 'handlers': ['main']
78
- },
79
- }
80
- })
@@ -1,30 +0,0 @@
1
- import sys
2
- from functools import wraps
3
- from typing import Callable
4
-
5
-
6
- def is_filter(filter_name: str) -> Callable:
7
- def outer_wrapper(func):
8
- func.is_filter = True
9
- func.filter_name = filter_name
10
-
11
- @wraps(func)
12
- def wrapper(*args, **kwargs):
13
- return func(*args, **kwargs)
14
-
15
- return wrapper
16
-
17
- return outer_wrapper
18
-
19
-
20
- def export_functions(module_name: str, attr: str) -> list[Callable]:
21
- module = sys.modules[module_name]
22
- funcs = []
23
-
24
- for member in dir(module):
25
- export = getattr(module, member)
26
- applicable_export = getattr(export, attr, False)
27
- if applicable_export:
28
- funcs.append(export)
29
-
30
- return funcs
@@ -1,91 +0,0 @@
1
- import smtplib
2
- from typing import List, Set
3
- from smtplib import SMTPException
4
-
5
- from email.mime.multipart import MIMEMultipart
6
- from email.mime.text import MIMEText
7
- from flask import current_app
8
- from flask import render_template
9
-
10
-
11
- class Email:
12
- """
13
- Responsible for sending emails
14
- """
15
- _attachments_size_limit = 10485760 # 10Mb = 20 * 1024 * 1024
16
- _body_size_limit = 26214400 # 25Mb = 20 * 1024 * 1024
17
-
18
- def __init__(self, init_connection=True):
19
- self.sender: str = ""
20
- self._password: str = ""
21
- self._user: str = ""
22
- self._server_host: str = ""
23
- self._server_port: int = 0
24
- self._connection: smtplib.SMTP | None = None
25
- self._retrieve_credentials()
26
- if init_connection:
27
- self._connect()
28
-
29
- def _retrieve_credentials(self):
30
- self.sender = current_app.config["EMAIL_SENDER"]
31
- self._password = current_app.config["EMAIL_SENDER_PASS"]
32
- self._user = current_app.config["EMAIL_SENDER_USER"]
33
- self._server_host = current_app.config["EMAIL_SERVER"]
34
- self._server_port = int(current_app.config["EMAIL_SERVER_PORT"])
35
-
36
- def _connect(self):
37
- try:
38
- self._connection = smtplib.SMTP(host=self._server_host, port=self._server_port)
39
- self._connection.ehlo()
40
- self._connection.starttls()
41
- self._connection.login(user=self._user, password=self._password)
42
- except SMTPException as details:
43
- current_app.logger.error("Failed to initialize smtp session %s", details)
44
-
45
- def _is_connection_open(self):
46
- if not self._connection:
47
- return False
48
- try:
49
- status, _ = self._connection.noop()
50
- except SMTPException:
51
- status = -1
52
-
53
- return True if status == 250 else False
54
-
55
- def _prepare_email(self, subject: str,
56
- content: str,
57
- recipients: List[str],
58
- html: bool = True):
59
- msg = MIMEMultipart()
60
- msg['subject'] = subject
61
- msg['from'] = self.sender
62
- assert recipients, "No recipients provided"
63
- msg['to'] = ','.join(recipients)
64
- if html:
65
- text_part = MIMEText(content, "html")
66
- else:
67
- text_part = MIMEText(content, "plain")
68
- msg.attach(text_part)
69
- email = msg.as_string()
70
- return email
71
-
72
- def send(self, subject, content, recipients, html=True):
73
- """
74
- :param subject: text
75
- :param content: text/html
76
- :param recipients: iterable, list of recipients
77
- :param html: True/False
78
- :param files: paths of the files that will be attached to the email
79
- :return:
80
- """
81
- email = self._prepare_email(subject, content, recipients, html)
82
- self._send_email(recipients, email)
83
-
84
- def _send_email(self, recipients, email):
85
- if not self._is_connection_open():
86
- self._connect()
87
- self._connection.sendmail(self.sender, recipients, email)
88
-
89
- def __del__(self):
90
- if self._connection:
91
- self._connection.quit()
File without changes
@@ -1,19 +0,0 @@
1
- import shutil
2
- from pathlib import Path
3
-
4
- import pytest
5
-
6
-
7
- @pytest.fixture(scope="module", autouse=True)
8
- def test_dir():
9
- return Path(__file__).parent
10
-
11
-
12
- @pytest.fixture(scope="module", autouse=True)
13
- def env_dir(test_dir):
14
- env_dir = test_dir / 'test_env'
15
- if env_dir.exists():
16
- shutil.rmtree(env_dir)
17
- yield env_dir
18
- if env_dir.exists():
19
- shutil.rmtree(env_dir)
@@ -1,45 +0,0 @@
1
- import subprocess
2
- import venv
3
- from pathlib import Path
4
-
5
- import pytest
6
-
7
-
8
- def run_command(command: list[str], cwd: str = None, env=None) -> subprocess.CompletedProcess:
9
- result = subprocess.run(command, cwd=cwd, check=True, stdout=subprocess.PIPE,
10
- stderr=subprocess.PIPE, text=True, env=env)
11
- print(result.stdout)
12
- return result
13
-
14
-
15
- @pytest.fixture(scope='module', name='build_and_install')
16
- def fixture_build_and_install(test_dir: Path, env_dir: Path):
17
- """Fixture to build and install the package."""
18
- dist_dir = env_dir / 'dist'
19
-
20
- # Build the package
21
- run_command(['uv', 'build', '-o', str(dist_dir)], cwd=str(test_dir.parent.parent.parent))
22
-
23
- package_path = next(dist_dir.glob("argus_alm-*-py3-none-any.whl"))
24
-
25
- # install
26
- run_command(['uv', 'tool', 'install', str(package_path)])
27
-
28
- yield package_path
29
-
30
- run_command(['uv', 'tool', 'uninstall', 'argus-alm'])
31
-
32
-
33
- def test_should_import_installed_package(env_dir):
34
-
35
- python_exec = ['uv', 'tool', 'run', '--from', 'argus-alm', 'python']
36
- run_command(python_exec + ['-c', 'import argus.client; import argus.common; '
37
- 'from argus.client.sct.client import ArgusSCTClient'])
38
- with pytest.raises(subprocess.CalledProcessError):
39
- run_command(python_exec + ['-c', 'import argus.client.tests.test_package'])
40
-
41
-
42
- def test_should_run_cli(build_and_install):
43
- """Test that the CLI can be run successfully."""
44
- run_command(['uv', 'tool', 'run', '--from', 'argus-alm', 'argus-client-generic', '--help'])
45
- run_command(['uv', 'tool', 'run', '--from', 'argus-alm', 'argus-driver-matrix-client', '--help'])
@@ -1,224 +0,0 @@
1
- import pytest
2
-
3
- from argus.client.generic_result import (
4
- StaticGenericResultTable,
5
- Status,
6
- ColumnMetadata,
7
- ResultType,
8
- ValidationRule,
9
- GenericResultTable,
10
- )
11
-
12
-
13
- class TestStaticResults(StaticGenericResultTable):
14
- """
15
- Testing Results, which contain all the information in Meta class
16
- """
17
-
18
- class Meta:
19
- name = "Important Static Results"
20
- description = "This is a test for important static results."
21
- columns = [
22
- ColumnMetadata(name="column1", unit="unit1", type=ResultType.INTEGER, higher_is_better=True),
23
- ]
24
- validation_rules = {"column1": ValidationRule(best_pct=10, best_abs=20, fixed_limit=30)}
25
-
26
-
27
- class TestDynamicResults(GenericResultTable):
28
- """
29
- Testing Results, which pass all the information in the constructor
30
- """
31
-
32
- def __init__(self, operation):
33
- super().__init__(
34
- name=f"{operation} - Dynamic Results",
35
- description=f"Dynamic results for {operation}",
36
- columns=[
37
- ColumnMetadata(name="column1", unit="unit1", type=ResultType.INTEGER, higher_is_better=True),
38
- ColumnMetadata(name="column2", unit="unit2", type=ResultType.FLOAT, higher_is_better=False),
39
- ],
40
- validation_rules={"column1": ValidationRule(best_pct=10, best_abs=20, fixed_limit=30)},
41
- )
42
-
43
-
44
- class TestMixedResults(StaticGenericResultTable):
45
- """
46
- Testing Results, which combine Meta class with some dynamic information
47
- """
48
-
49
- def __init__(self, operation):
50
- super().__init__(name=f"{operation} - Dynamic Results")
51
-
52
- class Meta:
53
- description = "This is a test for mixed results."
54
- columns = [
55
- ColumnMetadata(name="column1", unit="unit1", type=ResultType.INTEGER, higher_is_better=True),
56
- ColumnMetadata(name="column2", unit="unit2", type=ResultType.FLOAT, higher_is_better=False),
57
- ]
58
- validation_rules = {"column1": ValidationRule(best_pct=10, best_abs=20, fixed_limit=30)}
59
-
60
-
61
- class TestVisibilityResults(StaticGenericResultTable):
62
- """
63
- Testing Results with mixed visible and invisible columns
64
- """
65
-
66
- class Meta:
67
- name = "Visibility Test Results"
68
- description = "Testing column visibility feature"
69
- columns = [
70
- ColumnMetadata(name="visible_col", unit="unit1", type=ResultType.INTEGER, higher_is_better=True, visible=True),
71
- ColumnMetadata(name="invisible_col", unit="unit2", type=ResultType.FLOAT, higher_is_better=False, visible=False),
72
- ColumnMetadata(name="default_col", unit="unit3", type=ResultType.DURATION, higher_is_better=True), # Should default to visible=True
73
- ]
74
-
75
-
76
- def test_static_results():
77
- """
78
- Tests that you can create Results with all the information in the Meta class
79
- """
80
- results = TestStaticResults()
81
- serialized = results.as_dict()
82
- assert serialized["meta"]["name"] == TestStaticResults.Meta.name
83
- assert serialized["meta"]["description"] == TestStaticResults.Meta.description
84
- assert len(serialized["meta"]["rows_meta"]) == 0
85
- assert len(serialized["meta"]["columns_meta"]) == 1
86
- assert len(serialized["meta"]["validation_rules"]) == 1
87
- assert len(serialized["results"]) == 0
88
-
89
-
90
- def test_dynamic_results():
91
- """
92
- Tests that you can create Results with all the information in the constructor
93
- """
94
- results = TestDynamicResults("Write")
95
- serialized = results.as_dict()
96
- assert serialized["meta"]["name"] == "Write - Dynamic Results"
97
- assert serialized["meta"]["description"] == "Dynamic results for Write"
98
- assert len(serialized["meta"]["rows_meta"]) == 0
99
- assert len(serialized["meta"]["columns_meta"]) == 2
100
- assert len(serialized["meta"]["validation_rules"]) == 1
101
- assert len(serialized["results"]) == 0
102
-
103
-
104
- def test_mixed_results():
105
- """
106
- Tests that you can create Results, which combine Meta class with some dynamic information
107
- """
108
- results = TestMixedResults("Write")
109
- serialized = results.as_dict()
110
- assert serialized["meta"]["name"] == "Write - Dynamic Results"
111
- assert serialized["meta"]["description"] == "This is a test for mixed results."
112
-
113
- assert len(serialized["meta"]["rows_meta"]) == 0
114
- assert len(serialized["meta"]["columns_meta"]) == 2
115
- assert len(serialized["meta"]["validation_rules"]) == 1
116
- assert len(serialized["results"]) == 0
117
-
118
-
119
- def test_add_results():
120
- """Tests add results method"""
121
- results = TestStaticResults()
122
- results.add_result(column="column1", row="row1", value=10, status=Status.UNSET)
123
- results.add_result(column="column1", row="row2", value=20, status=Status.UNSET)
124
- serialized = results.as_dict()
125
-
126
- assert len(serialized["meta"]["rows_meta"]) == 2
127
- assert len(serialized["results"]) == 2
128
-
129
-
130
- def test_column_metadata_as_dict_includes_visibility():
131
- """Test that ColumnMetadata.as_dict() includes visibility field"""
132
- # Test explicitly visible column
133
- visible_col = ColumnMetadata(name="test", unit="unit", type=ResultType.INTEGER, visible=True)
134
- visible_dict = visible_col.as_dict()
135
- assert "visible" in visible_dict
136
- assert visible_dict["visible"] is True
137
-
138
- # Test explicitly invisible column
139
- invisible_col = ColumnMetadata(name="test", unit="unit", type=ResultType.INTEGER, visible=False)
140
- invisible_dict = invisible_col.as_dict()
141
- assert "visible" in invisible_dict
142
- assert invisible_dict["visible"] is False
143
-
144
- # Test default visibility
145
- default_col = ColumnMetadata(name="test", unit="unit", type=ResultType.INTEGER)
146
- default_dict = default_col.as_dict()
147
- assert "visible" in default_dict
148
- assert default_dict["visible"] is True
149
-
150
-
151
- def test_mixed_visibility_dynamic_results():
152
- """Test dynamic results with mixed column visibility"""
153
- class TestDynamicVisibility(GenericResultTable):
154
- def __init__(self):
155
- super().__init__(
156
- name="Dynamic Visibility Test",
157
- description="Testing dynamic column visibility",
158
- columns=[
159
- ColumnMetadata(name="visible1", unit="unit1", type=ResultType.INTEGER, visible=True),
160
- ColumnMetadata(name="invisible1", unit="unit2", type=ResultType.FLOAT, visible=False),
161
- ColumnMetadata(name="visible2", unit="unit3", type=ResultType.TEXT), # Default visible
162
- ],
163
- )
164
-
165
- results = TestDynamicVisibility()
166
- serialized = results.as_dict()
167
-
168
- columns_meta = serialized["meta"]["columns_meta"]
169
- assert len(columns_meta) == 3
170
-
171
- visible_columns = [col for col in columns_meta if col["visible"]]
172
- invisible_columns = [col for col in columns_meta if not col["visible"]]
173
-
174
- assert len(visible_columns) == 2
175
- assert len(invisible_columns) == 1
176
- assert invisible_columns[0]["name"] == "invisible1"
177
-
178
-
179
- def test_no_column():
180
- """Tests validation for validation rule with nonexistent column"""
181
-
182
- class NoColumnRule(StaticGenericResultTable):
183
- class Meta:
184
- name = "Testing results"
185
- description = ""
186
- columns = [
187
- ColumnMetadata(name="column1", unit="unit1", type=ResultType.INTEGER, higher_is_better=True),
188
- ]
189
- validation_rules = {"nonexistent": ValidationRule(best_pct=10, best_abs=20, fixed_limit=30)}
190
-
191
- with pytest.raises(ValueError, match="not found"):
192
- NoColumnRule()
193
-
194
-
195
- def test_different_type():
196
- """Tests validation of validation rule type"""
197
-
198
- class BadType(StaticGenericResultTable):
199
- class Meta:
200
- name = "Testing results"
201
- description = ""
202
- columns = [
203
- ColumnMetadata(name="column1", unit="unit1", type=ResultType.INTEGER, higher_is_better=True),
204
- ]
205
- validation_rules = {"nonexistent": "test"}
206
-
207
- with pytest.raises(ValueError, match="ValidationRule"):
208
- BadType()
209
-
210
-
211
- def test_text_rule():
212
- """Test validation of rules for TEXT types"""
213
-
214
- class TextType(StaticGenericResultTable):
215
- class Meta:
216
- name = "Testing results"
217
- description = ""
218
- columns = [
219
- ColumnMetadata(name="column1", unit="unit1", type=ResultType.TEXT, higher_is_better=True),
220
- ]
221
- validation_rules = {"column1": ValidationRule(best_pct=10, best_abs=20, fixed_limit=30)}
222
-
223
- with pytest.raises(ValueError, match="TEXT"):
224
- TextType()
@@ -1,122 +0,0 @@
1
- argus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- argus/_version.py,sha256=KRKlaCoLoYRe3lmREqbhkmA_Yhx41a2BsvZ95EM3lt0,513
3
- argus/backend/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- argus/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- argus/backend/cli.py,sha256=BU8QHxyLkF4omKpSVEkLO8priJ4Ku7_JT5Ni6y4qcRA,1678
6
- argus/backend/db.py,sha256=-zCTfajatRQVTQWBDIjos2tn7FOer7aWO-Tfi2DP9mY,3941
7
- argus/backend/error_handlers.py,sha256=UNzfknKPcE0CBIAiTHBHJqgooEGLbLr_DSWpqgcThjA,1510
8
- argus/backend/template_filters.py,sha256=04PHl0DiN4PBHQ82HMAmTfww09fGMXcYy-I5BU_b1s4,682
9
- argus/backend/controller/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- argus/backend/controller/admin.py,sha256=2z29RX7ZQO_VTklSKH9RrEj-Ag2SsvyOaIzWDKr0ahQ,575
11
- argus/backend/controller/admin_api.py,sha256=S4yhUORbrmO30F-hX0YQq7ZH3Ov3nAINdImqHRRgPVI,8560
12
- argus/backend/controller/api.py,sha256=pPIoQI_9lxcTBHPNYU_dbUC2Jyr4pugnlzAPXFdycAc,17034
13
- argus/backend/controller/auth.py,sha256=A2AV9yLj2d60syju-KjBwiE0qwg_vYJZjkLXqgljHNw,2283
14
- argus/backend/controller/client_api.py,sha256=ama7Zb1fNaFh3CBxSZSJctwBK6LzpOvPrDo8z6_98XI,3575
15
- argus/backend/controller/main.py,sha256=Dk1RCcsARFyXh8bL7yhWObmiA8dfS-5Rq5XuD9uQOd4,10570
16
- argus/backend/controller/notification_api.py,sha256=wz7V4nE6Mxclpq78P8gNnCyeQ7xA9BBJjZ-dPhLLd2I,1964
17
- argus/backend/controller/notifications.py,sha256=zMSJln72BGU6Q_nQvJesMnuvJ57Ucbov4M2ZI-37Bxo,290
18
- argus/backend/controller/planner_api.py,sha256=ikT0qa5Qtp6TjChF3q1NmP1Mb9-gzd61Rw4AEeOZesg,4680
19
- argus/backend/controller/team.py,sha256=hcMy5eGNtsO6033IQC-bxRXB8cFNT4bz9_YMQlGIEO0,3103
20
- argus/backend/controller/team_ui.py,sha256=cO9z1gsU-VT4GS0PvleDW9jWj-gRKDAtdmZhUhToH7M,590
21
- argus/backend/controller/testrun_api.py,sha256=X2ZNR-xIEEuM69rwSuuQ08rjg2nHUvfLq-hvLwogyDo,13615
22
- argus/backend/controller/view_api.py,sha256=rvgTL-XbhBHMxIzduY65bhOpuuDV9k1SAUzF0owF8Dk,5092
23
- argus/backend/controller/views_widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- argus/backend/controller/views_widgets/graphed_stats.py,sha256=j9c-GwRgSXUxG3WzWmhNyaBxZqy7nU3APFFb9Vgavdg,1611
25
- argus/backend/controller/views_widgets/graphs.py,sha256=_zECoH_amPYGl4Blv1nXh0WPuTP7tSDK9YCGqkFL8WI,2514
26
- argus/backend/controller/views_widgets/highlights.py,sha256=aa8v5TBuhjLx5q_6Xut_N3avMnwNDaxkcfyYd76udj0,4436
27
- argus/backend/controller/views_widgets/nemesis_stats.py,sha256=BJ3QuB-ymf3CGaiBC_wNnRSJNlRwbJgjxLbqQOuawAM,780
28
- argus/backend/controller/views_widgets/summary.py,sha256=H4naGArXWhsBoI4vd5N5UNOXa_ZqC7iRmn8eQ7tqU8A,1526
29
- argus/backend/events/event_processors.py,sha256=bsmBayiXvlGn3aqiT2z9WgwnVBRtn2cRqkgn4pLodck,1291
30
- argus/backend/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- argus/backend/models/argus_ai.py,sha256=MGMUfpFHcNdXolpMrVfAPCIV-tW20JcqbfT7wvWANHU,1079
32
- argus/backend/models/github_issue.py,sha256=Rz2oirxYHervsRcuo-Ltq_5gsro-ARyj6RmZd0RlBOg,2121
33
- argus/backend/models/plan.py,sha256=x5cCO3MlV1qBnFtclPN0DS9KQTNulk88w6K8nnBy0lo,1142
34
- argus/backend/models/result.py,sha256=bFKQ3IlTc5pBa8Gxx3fVadVShBNEiw05qrJLFHfoLxo,7726
35
- argus/backend/models/runtime_store.py,sha256=f_bE4CDhtTIn7Wgrxr3rgr5AMHFDQwbGpH8DRvmmbPQ,1920
36
- argus/backend/models/view_widgets.py,sha256=ONSwMc5oUedAkd_kl9dvGW5ZoZKfimjrvH7KEwDNGTg,1053
37
- argus/backend/models/web.py,sha256=olvwMEWtsUy1agqVN3S_ULs3OHNcHLAWyX-oEJAq62E,13649
38
- argus/backend/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- argus/backend/plugins/core.py,sha256=PdRR2n_3avRBjWLEP3KD75cN5y_9NmjTTWAXyimfHDs,9716
40
- argus/backend/plugins/loader.py,sha256=_LHVTEba_db4V2NaLbUewGrx9jlxxprF0ozf3ESj_VM,1345
41
- argus/backend/plugins/driver_matrix_tests/controller.py,sha256=ro7S3kwRzuqvDROAvusRrp2vw8q5kVbXkilpMR5f1V4,2323
42
- argus/backend/plugins/driver_matrix_tests/model.py,sha256=WK_2ix9-WbCB95dn4U_cyDeRQCIfUhMjq1CsUfOqh5I,15615
43
- argus/backend/plugins/driver_matrix_tests/plugin.py,sha256=FT0Y6nuj_7HKxRoGL00rasEQgKlHnico8GLVqwawcck,700
44
- argus/backend/plugins/driver_matrix_tests/raw_types.py,sha256=KwbwsvS52RzOZb7_PT7kkYkChNzRH-MpKoO_eeZNDIk,1153
45
- argus/backend/plugins/driver_matrix_tests/service.py,sha256=nYe_7PfCgclmFrYXTmn3iwPFQQ8KtXSfkXBehlbf8A8,2533
46
- argus/backend/plugins/driver_matrix_tests/udt.py,sha256=WRtnJU1dZcLXZJQgfU0mgjNzK_DyVhNgLTzr-aXX8K8,1394
47
- argus/backend/plugins/generic/model.py,sha256=XtLnBlJrOT9yxmlTzzO1Zeo4yFZv3ryWypi8_MtpJWs,3552
48
- argus/backend/plugins/generic/plugin.py,sha256=FEF_kBe1pXEud17cA6CXZ_3gSdtB04P_BPzQQWttLBQ,362
49
- argus/backend/plugins/generic/types.py,sha256=xfIjQPX4ZDHnAA5tRX21jcpuWy_tcyKTYsiTC10CS2g,268
50
- argus/backend/plugins/sct/controller.py,sha256=vt0nc2dMN0-CU8HcHqcnb3_S99oPC6VQiDOsJvUym_k,6692
51
- argus/backend/plugins/sct/plugin.py,sha256=sHd0fkmFOXTv60Sj7WRHDYqmvXGVdYFTBI9yRpvKTLI,962
52
- argus/backend/plugins/sct/resource_setup.py,sha256=xQSMhJYHIb2v-T41odMygjcOj9khIiO8JyV3D02Fhwo,10075
53
- argus/backend/plugins/sct/service.py,sha256=zzVBcQJg5WqngTLaxaKSyVapwM6vyG3d4tgW1UpGZ4E,30331
54
- argus/backend/plugins/sct/testrun.py,sha256=APbPc-Chh_4PduLwXWPK3yupxHDidjz4d0QkhdL6mPk,11134
55
- argus/backend/plugins/sct/udt.py,sha256=PJ5EDkjUDuem-ipkplHIXzBwrTwgc_CBvID6S0ycN04,3118
56
- argus/backend/plugins/sirenada/model.py,sha256=q3YofzagyEHo0SEsUeuCxaR2JkDf4cXiE2cg5MYFkrE,4885
57
- argus/backend/plugins/sirenada/plugin.py,sha256=6rwKiY2aZwJG0bLZciDWYzFB2Zij_l6aVaTXt5u6vU0,402
58
- argus/backend/service/admin.py,sha256=pZe8N0hbDSmHZxC9EsFhAdRkquLmXHRHSebeJ1Hmxro,615
59
- argus/backend/service/argus_service.py,sha256=lYzoyxEkDwabNtSwfnqDs-5eieEdCLm5t2c-H1bmTXg,29612
60
- argus/backend/service/build_system_monitor.py,sha256=Dj5mEqsDeZIcFhNVAwug1CmzB_cFm9PYhXj_o2pfK9s,8173
61
- argus/backend/service/client_service.py,sha256=zunnpSfS0NlvgeIpOzmCzvkDAJyN8zUwy_4Yh7QF4Lg,4976
62
- argus/backend/service/event_service.py,sha256=iYeqxN2QCYTjYB1WPPv4BEFLXG0Oz3TvskkaK4v9pVY,654
63
- argus/backend/service/github_service.py,sha256=1BWd_1w_nQrq5jfWWAsVigqmjVt7LMFdNgcJT24WYKg,9422
64
- argus/backend/service/jenkins_service.py,sha256=NkVaR_o-StfAtC1d977qHBUiWrOH8zJQRltktZRsdEY,11264
65
- argus/backend/service/notification_manager.py,sha256=BSDucHz5rNtS7mvQeReKoMqAyK_HUxG2ce_3szBXWn0,8077
66
- argus/backend/service/planner_service.py,sha256=OqyvmVUXX0OA1lES2Jb5_dsw3uzTlCFkKIf3iuHDU50,24963
67
- argus/backend/service/release_manager.py,sha256=sRo1y0_8ckRISvsVqUMZv_BYyuFBq7OPzrkEv9ESVUg,7770
68
- argus/backend/service/results_service.py,sha256=E3EC9a4R67-tbDRPn4QACe_3rIkVk-olBDnnL16npRE,30618
69
- argus/backend/service/stats.py,sha256=OnUfKV-qOZqJ8pUB3cZ2FXIyR0oxbGssZA1X9DYyh-c,25650
70
- argus/backend/service/team_manager_service.py,sha256=z__RxpdasWIDMJI1ddie02qP6E_q_xVAG2x_zc7vIZA,2976
71
- argus/backend/service/test_lookup.py,sha256=NrhspMyTfg3p0H-C-6GKNwzQlTpUmX9Bw-DUaSdOrG0,6528
72
- argus/backend/service/testrun.py,sha256=vcAE--tSfxGlCyVC20w9qMFSPK-J-6jAnVLP2LrnoHQ,20128
73
- argus/backend/service/user.py,sha256=Sj4jnFb5bl9lsAVclPkII9Otyis60RFQYWGvj3F6hAU,10760
74
- argus/backend/service/views.py,sha256=eVpgvXeUaFeVyBjKXif4Brmq2n7eggtSWdpGxwEJHJ8,9404
75
- argus/backend/service/views_widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
- argus/backend/service/views_widgets/graphed_stats.py,sha256=RrvzcWglHNFcF9OsYgNjOI6w138BtTzBSKkaKaNLhYQ,7175
77
- argus/backend/service/views_widgets/highlights.py,sha256=pSZT6P2W0ce3qefOc1FJ9zbXIEo9ZvlOdi_dyCLqugk,13767
78
- argus/backend/service/views_widgets/nemesis_stats.py,sha256=wlu7bbTCbmoBClrFvv8Xnm9INIkuNG7hJmDduGkuSWU,1426
79
- argus/backend/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- argus/backend/tests/conftest.py,sha256=WytICjkH5-Sb0LqSqQlwuXFVIXo-SaeOufxK4bBrud8,6797
81
- argus/backend/tests/client_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- argus/backend/tests/client_service/test_submit_results.py,sha256=BtCGmqogmRguc1yMm87OFYD19XnVTCdFVKTnJ8yWBW0,3176
83
- argus/backend/tests/results_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- argus/backend/tests/results_service/test_best_results.py,sha256=EF4beEYQq6bBDRPTESpn9qGFbLmsNsp4g35KDR1JNGE,9214
85
- argus/backend/tests/results_service/test_cell.py,sha256=lVgD2V4Hx1Ycf-G0SSvU8u7IXaft1VlQEprEEUn2lIM,2448
86
- argus/backend/tests/results_service/test_chartjs_additional_functions.py,sha256=k9EhJ8vO_ghAsXxBzAsB3EvsElY_vUkPx9Qk2EURQv4,10642
87
- argus/backend/tests/results_service/test_create_chartjs.py,sha256=wYidZEFaC70gZC917UYWGzcfouxwrQ9yY2C8h6VqCuE,7914
88
- argus/backend/tests/results_service/test_result_metadata.py,sha256=IhhY9eIGG-SO726KG9a0jTZv6KQ3BOcqxPrxCw3Ot_4,4394
89
- argus/backend/tests/results_service/test_results_service.py,sha256=G5RRPAuTWkpT2aHUl0PE4OoIu7LC3mfvKn4eJHnccmU,6952
90
- argus/backend/tests/results_service/test_validation_rules.py,sha256=jwD-vIMZLM6n_vus9SmqTdWk9XrrjDigVIrA6a1wAEo,11798
91
- argus/backend/tests/view_widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
- argus/backend/tests/view_widgets/test_highlights_api.py,sha256=J7jT8tmNi5hPPCPKg4hSG1GEWHTbvz1dSsDIf38u5YA,17933
93
- argus/backend/util/common.py,sha256=lWvfvcBRV7njJu0wwdme9hvB0Lpd4wfIGwgaSEVVVtA,1721
94
- argus/backend/util/config.py,sha256=1HpHm8Du6yz61gwAE1vR6uwuHCStaSerirbEhBLnDws,927
95
- argus/backend/util/encoders.py,sha256=sv1kxa4X4t_k2FiFFLqW8M9emwqxgZplQ4f82odgR68,1612
96
- argus/backend/util/logsetup.py,sha256=RQTrfl1CLfl2moZxqbCdJM7PGyZl2HEBxG5LYTDDCNc,2406
97
- argus/backend/util/module_loaders.py,sha256=AcIlX-VRmUQ2THFKT8DLefLSE62Eub2hCxIosg3WgE0,698
98
- argus/backend/util/send_email.py,sha256=b3ZVx3bbBxArlyM2al-WgM_BDQtnXvjXs_-uGVNxGsg,3093
99
- argus/client/__init__.py,sha256=bO9_j5_jK5kvTHR46KEZ0Y-p0li7CBW8QSd-K5Ez4vA,42
100
- argus/client/base.py,sha256=QlJDC-E6OXf33FtPagOuH1wWsTd9NEBJO2lBUL5eAqE,8143
101
- argus/client/generic_result.py,sha256=iwQiZLKVRDfSprGp2C8_v28bTSWxW5pp3k1kIjjH4dI,6128
102
- argus/client/driver_matrix_tests/cli.py,sha256=JpI0v1hzRQr9KkrxO7D4hEbkzumexFFC_iRM8558zHU,8375
103
- argus/client/driver_matrix_tests/client.py,sha256=fFucqwog6WnDnje1xB-4ERfwHXblXP4upmtt9RtOkls,2806
104
- argus/client/generic/cli.py,sha256=0mTTjbeB0iDiR5kKim9JYu_0PetCHiJUf8VYvdvmLHo,4570
105
- argus/client/generic/client.py,sha256=D9j2047guXO0SgkcWQSftuntvj3LtTSAxBMBr4-4v58,1915
106
- argus/client/sct/client.py,sha256=q5W0RL1BhA6Foc9rA10jLsnQ7MNGWgjbmy3_E0ePjeI,11436
107
- argus/client/sct/types.py,sha256=VLgVe7qPmJtCLqtPnuX8N8kMKZq-iY3SKz68nvU6nJ4,371
108
- argus/client/sirenada/client.py,sha256=lzhmBFAUnvPSAJfCjeQ0L5nbp50Q0YLHwIondO9rvt4,6321
109
- argus/client/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
- argus/client/tests/conftest.py,sha256=du-l80SCRcDsZWQk-yHg5YlfMFofu62Bv5OwwNhlUbo,388
111
- argus/client/tests/test_package.py,sha256=ml5it_LFdj3GPsKdGt_VQN3ivFtOG2jkYtApzs6NSVM,1652
112
- argus/client/tests/test_results.py,sha256=ep3qdFMWra7UbcnH1R7UOiaii3yUrPllQU_8G-bWYGM,8404
113
- argus/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
- argus/common/enums.py,sha256=EhTQrgedlEz5sDYJ1gFnE2eC2nc1neQCRgzOgssQvWY,749
115
- argus/common/sct_types.py,sha256=csRkFdYkjLw1qaJhikW2NKvzdA1DQ1a93nwtKUB1gRs,1329
116
- argus/common/sirenada_types.py,sha256=CZH2JXA1KYUj29eXYe8rIAAWdN1XPqOsDPAXvM25bVQ,698
117
- argus_alm-0.15.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
118
- argus_alm-0.15.2.dist-info/METADATA,sha256=2whW37cy0137WYwNDiWYx8KdVTdZyOzwTEXb6onLjFk,4860
119
- argus_alm-0.15.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
120
- argus_alm-0.15.2.dist-info/entry_points.txt,sha256=5mSBLLPndhFHKY5M9SCF8WhDBAArrj-S2IL-uoiaJiE,140
121
- argus_alm-0.15.2.dist-info/top_level.txt,sha256=Pea173vTU-Et8xmNCctS34REW4cH0Xmjyiztu0HuM0c,6
122
- argus_alm-0.15.2.dist-info/RECORD,,