Skip to content

Commit c87c458

Browse files
committed
Update dev version
Update dev version - Add GUI
1 parent c2ee1df commit c87c458

File tree

10 files changed

+220
-2
lines changed

10 files changed

+220
-2
lines changed

je_load_density/gui/__init__.py

Whitespace-only changes.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from PySide6.QtCore import QThread
2+
from je_load_density.wrapper.start_wrapper.start_test import start_test
3+
4+
5+
class LoadDensityThread(QThread):
6+
7+
def __init__(self):
8+
super().__init__()
9+
self.url = None
10+
self.test_time = None
11+
self.user_count = None
12+
self.spawn_rate = None
13+
self.method = None
14+
15+
def run(self):
16+
start_test(
17+
{
18+
"user": "fast_http_user",
19+
},
20+
self.user_count, self.spawn_rate, self.test_time,
21+
**{
22+
"tasks": {
23+
self.method: {"request_url": self.url},
24+
}
25+
}
26+
)

je_load_density/gui/language_wrapper/__init__.py

Whitespace-only changes.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
english_word_dict = {
2+
# Main
3+
"application_name": "LoadDensity",
4+
# Widget
5+
"url": "URL",
6+
"test_time": "Test Time: ",
7+
"user_count": "User Count: ",
8+
"spawn_rate": "Spawn Rate: ",
9+
"test_method": "Test Method: ",
10+
"start_button": "Start: ",
11+
"log": "Log: ",
12+
# Test method
13+
"get": "GET",
14+
"post": "POST",
15+
"put": "PUT",
16+
"patch": "PATCH",
17+
"delete": "DELETE",
18+
"head": "HEAD",
19+
"options": "OPTIONS",
20+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from je_load_density.gui.language_wrapper.english import english_word_dict
2+
from je_load_density.gui.language_wrapper.traditional_chinese import traditional_chinese_word_dict
3+
from je_load_density.utils.logging.loggin_instance import load_density_logger
4+
5+
6+
7+
class LanguageWrapper(object):
8+
9+
def __init__(
10+
self
11+
):
12+
load_density_logger.info("Init LanguageWrapper")
13+
self.language: str = "English"
14+
self.choose_language_dict = {
15+
"English": english_word_dict,
16+
"Traditional_Chinese": traditional_chinese_word_dict
17+
}
18+
self.language_word_dict: dict = self.choose_language_dict.get(self.language)
19+
20+
def reset_language(self, language) -> None:
21+
load_density_logger.info(f"LanguageWrapper reset_language language: {language}")
22+
if language in [
23+
"English",
24+
"Traditional_Chinese"
25+
]:
26+
self.language = language
27+
self.language_word_dict = self.choose_language_dict.get(self.language)
28+
29+
30+
language_wrapper = LanguageWrapper()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
traditional_chinese_word_dict = {
2+
# Main
3+
"application_name": "LoadDensity",
4+
# Widget
5+
"url": "連結: ",
6+
"test_time": "測試時間: ",
7+
"user_count": "測試使用者總數: ",
8+
"spawn_rate": "產生速率: ",
9+
"test_method": "測試 HTTP 方法: ",
10+
"start_button": "開始: ",
11+
"log": "日誌: ",
12+
# Test method
13+
"get": "GET",
14+
"post": "POST",
15+
"put": "PUT",
16+
"patch": "PATCH",
17+
"delete": "DELETE",
18+
"head": "HEAD",
19+
"options": "OPTIONS",
20+
}

je_load_density/gui/main_widget.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import logging
2+
3+
from PySide6.QtCore import QTimer
4+
from PySide6.QtGui import QIntValidator
5+
from PySide6.QtWidgets import QWidget, QFormLayout, QLineEdit, QComboBox, QPushButton, QTextEdit, QVBoxLayout, QLabel
6+
7+
from je_load_density.gui.execute_thread import LoadDensityThread
8+
from je_load_density.gui.language_wrapper.multi_language_wrapper import language_wrapper
9+
from je_load_density.log_to_ui_filter import InterceptAllFilter, locust_log_queue
10+
11+
12+
class LoadDensityWidget(QWidget):
13+
14+
def __init__(self, parent=None):
15+
super().__init__(parent)
16+
# from
17+
form_layout = QFormLayout()
18+
self.url_input = QLineEdit()
19+
self.test_time_input = QLineEdit()
20+
self.test_time_input.setValidator(QIntValidator())
21+
self.user_count_input = QLineEdit()
22+
self.user_count_input.setValidator(QIntValidator())
23+
self.spawn_rate_input = QLineEdit()
24+
self.spawn_rate_input.setValidator(QIntValidator())
25+
self.method_combobox = QComboBox()
26+
self.method_combobox.addItems([
27+
language_wrapper.language_word_dict.get("get"),
28+
language_wrapper.language_word_dict.get("post"),
29+
language_wrapper.language_word_dict.get("put"),
30+
language_wrapper.language_word_dict.get("patch"),
31+
language_wrapper.language_word_dict.get("delete"),
32+
language_wrapper.language_word_dict.get("head"),
33+
language_wrapper.language_word_dict.get("options"),
34+
])
35+
form_layout.addRow(language_wrapper.language_word_dict.get("url"), self.url_input)
36+
form_layout.addRow(language_wrapper.language_word_dict.get("test_time"), self.test_time_input)
37+
form_layout.addRow(language_wrapper.language_word_dict.get("user_count"), self.user_count_input)
38+
form_layout.addRow(language_wrapper.language_word_dict.get("spawn_rate"), self.spawn_rate_input)
39+
form_layout.addRow(language_wrapper.language_word_dict.get("test_method"), self.method_combobox)
40+
41+
self.start_button = QPushButton(language_wrapper.language_word_dict.get("start_button"))
42+
self.start_button.clicked.connect(self.run_load_density)
43+
44+
# Log panel
45+
self.log_panel = QTextEdit()
46+
self.log_panel.setReadOnly(True)
47+
48+
# Add widget to vertical layout
49+
main_layout = QVBoxLayout()
50+
main_layout.addLayout(form_layout)
51+
main_layout.addWidget(self.start_button)
52+
main_layout.addWidget(QLabel(language_wrapper.language_word_dict.get("log")))
53+
main_layout.addWidget(self.log_panel)
54+
55+
# Param
56+
self.run_load_density_thread = None
57+
self.pull_log_timer = QTimer()
58+
self.pull_log_timer.setInterval(20)
59+
self.pull_log_timer.timeout.connect(self.add_text_to_log)
60+
61+
self.setLayout(main_layout)
62+
63+
def run_load_density(self):
64+
self.run_load_density_thread = LoadDensityThread()
65+
self.run_load_density_thread.url = self.url_input.text()
66+
self.run_load_density_thread.test_time = int(self.test_time_input.text())
67+
self.run_load_density_thread.user_count = int(self.user_count_input.text())
68+
self.run_load_density_thread.spawn_rate = int(self.spawn_rate_input.text())
69+
self.run_load_density_thread.method = self.method_combobox.currentText().lower()
70+
log_handler_list = [handler for handler in logging.getLogger("root").handlers if handler.name == "log_reader"]
71+
if log_handler_list:
72+
log_handler = log_handler_list[0]
73+
log_handler.addFilter(InterceptAllFilter())
74+
self.run_load_density_thread.start()
75+
self.pull_log_timer.stop()
76+
self.pull_log_timer.start()
77+
self.log_panel.clear()
78+
79+
def add_text_to_log(self):
80+
if not locust_log_queue.empty():
81+
self.log_panel.append(locust_log_queue.get_nowait())

je_load_density/gui/main_window.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import sys
2+
3+
from PySide6.QtWidgets import QMainWindow, QApplication
4+
from qt_material import QtStyleTools
5+
6+
from je_load_density.gui.language_wrapper.multi_language_wrapper import language_wrapper
7+
from je_load_density.gui.main_widget import LoadDensityWidget
8+
9+
10+
class LoadDensityUI(QMainWindow, QtStyleTools):
11+
12+
def __init__(self):
13+
super().__init__()
14+
self.id = language_wrapper.language_word_dict.get("application_name")
15+
if sys.platform in ["win32", "cygwin", "msys"]:
16+
from ctypes import windll
17+
windll.shell32.SetCurrentProcessExplicitAppUserModelID(self.id)
18+
self.setStyleSheet(
19+
f"font-size: 12pt;"
20+
f"font-family: 'Lato';"
21+
)
22+
self.apply_stylesheet(self, "dark_amber.xml")
23+
self.load_density_widget = LoadDensityWidget()
24+
self.setCentralWidget(self.load_density_widget)
25+
26+
27+
if __name__ == "__main__":
28+
app = QApplication(sys.argv)
29+
window = LoadDensityUI()
30+
window.show()
31+
sys.exit(app.exec())
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import logging
2+
import queue
3+
4+
locust_log_queue = queue.Queue()
5+
6+
class InterceptAllFilter(logging.Filter):
7+
8+
def filter(self, record):
9+
locust_log_queue.put(record.getMessage())
10+
return False

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
66

77
[project]
88
name = "je_load_density_dev"
9-
version = "0.0.69"
9+
version = "0.0.71"
1010
authors = [
1111
{ name = "JE-Chen", email = "[email protected]" },
1212
]
@@ -38,4 +38,4 @@ content-type = "text/markdown"
3838
find = { namespaces = false }
3939

4040
[project.optional-dependencies]
41-
gui = ["PySide6==6.9.0"]
41+
gui = ["PySide6==6.9.1", "qt-material"]

0 commit comments

Comments
 (0)