mirror of
https://github.com/bendtherules/pytest_gui_status.git
synced 2026-08-18 13:42:26 +00:00
Revert "Add minimal template+ add --gui_minimal + update docs"
This reverts commit 73a9af6e78.
This commit is contained in:
@@ -8,7 +8,6 @@ import humanfriendly
|
|||||||
import os.path
|
import os.path
|
||||||
from ..utils import s
|
from ..utils import s
|
||||||
from ..utils import REDIS_PORT
|
from ..utils import REDIS_PORT
|
||||||
from PyQt4.QtGui import QApplication
|
|
||||||
|
|
||||||
|
|
||||||
class Controller(htmlPy.Object):
|
class Controller(htmlPy.Object):
|
||||||
@@ -20,35 +19,12 @@ class Controller(htmlPy.Object):
|
|||||||
"end": "Finished Tests"
|
"end": "Finished Tests"
|
||||||
}
|
}
|
||||||
|
|
||||||
dict_tmpl = {
|
|
||||||
"default": "index.html",
|
|
||||||
"minimal": "minimal.html",
|
|
||||||
}
|
|
||||||
|
|
||||||
dict_tmpl_size = {
|
|
||||||
"default": (150, 80),
|
|
||||||
"minimal": (50, 50)
|
|
||||||
}
|
|
||||||
|
|
||||||
def __init__(self, app_gui):
|
def __init__(self, app_gui):
|
||||||
super(Controller, self).__init__()
|
super(Controller, self).__init__()
|
||||||
self.i = 0
|
self.i = 0
|
||||||
self.app_gui = app_gui
|
self.app_gui = app_gui
|
||||||
self.last_state = None
|
self.last_state = None
|
||||||
|
# Initialize the class here, if required.
|
||||||
self.tmpl_name_full = self.dict_tmpl.get(self.app_gui.tmpl_name)
|
|
||||||
if self.tmpl_name_full is None:
|
|
||||||
raise TypeError("template name must be valid, one of these: {allowed_tmpl_names}".format(
|
|
||||||
allowed_tmpl_names=(", ".join(self.dict_tmpl.keys()))))
|
|
||||||
|
|
||||||
# set correct width, height
|
|
||||||
# self.app_gui.window.minimumWidth, self.app_gui.window.minimumHeight = (0, 0)
|
|
||||||
self.app_gui.width, self.app_gui.height = self.dict_tmpl_size.get(self.app_gui.tmpl_name)
|
|
||||||
|
|
||||||
screen_geo = QApplication.desktop().availableGeometry()
|
|
||||||
screen_topright = screen_geo.topRight()
|
|
||||||
self.app_gui.x_pos = (screen_topright.x() - 20) - self.app_gui.width
|
|
||||||
self.app_gui.y_pos = (screen_topright.y() + 20)
|
|
||||||
|
|
||||||
@htmlPy.Slot()
|
@htmlPy.Slot()
|
||||||
def redraw(self):
|
def redraw(self):
|
||||||
@@ -102,8 +78,6 @@ class Controller(htmlPy.Object):
|
|||||||
dict_state["skip"] = s(redis_db.lrange("{hash_a}_skip".format(hash_a=hash_dir_name), 0, -1))
|
dict_state["skip"] = s(redis_db.lrange("{hash_a}_skip".format(hash_a=hash_dir_name), 0, -1))
|
||||||
|
|
||||||
if (not self.last_state) or (self.last_state != dict_state):
|
if (not self.last_state) or (self.last_state != dict_state):
|
||||||
self.app_gui.title = u"{dir_name_topfolder} - Test Status".format(
|
self.app_gui.html = render_template(self.app_gui, "index.html", dict_state)
|
||||||
dir_name_topfolder=dict_state["dir_name_topfolder"])
|
|
||||||
self.app_gui.html = render_template(self.app_gui, self.tmpl_name_full, dict_state)
|
|
||||||
|
|
||||||
self.last_state = dict_state
|
self.last_state = dict_state
|
||||||
|
|||||||
@@ -1,46 +1,36 @@
|
|||||||
import htmlPy
|
import htmlPy
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
from PyQt4.QtGui import QApplication
|
||||||
import PyQt4.QtCore as QtCore
|
import PyQt4.QtCore as QtCore
|
||||||
import argparse
|
|
||||||
|
|
||||||
# Import back-end functionalities
|
# Import back-end functionalities
|
||||||
from gui_backend import Controller
|
from gui_backend import Controller
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
arg_parser = argparse.ArgumentParser()
|
if len(sys.argv) > 1:
|
||||||
arg_parser.add_argument("--dir_name", help="root directory where py.test was executed")
|
dir_name_raw = sys.argv[1]
|
||||||
arg_parser.add_argument("--minimal", help="use minimal template", action="store_true")
|
else:
|
||||||
parsed_args = arg_parser.parse_args()
|
|
||||||
|
|
||||||
dir_name_raw = parsed_args.dir_name
|
|
||||||
if dir_name_raw is None:
|
|
||||||
dir_name_raw = "."
|
dir_name_raw = "."
|
||||||
dir_name = os.path.abspath(dir_name_raw)
|
dir_name = os.path.abspath(dir_name_raw)
|
||||||
|
|
||||||
if parsed_args.minimal:
|
|
||||||
app_tmpl = "minimal"
|
|
||||||
else:
|
|
||||||
app_tmpl = "default"
|
|
||||||
|
|
||||||
# GUI initializations
|
# GUI initializations
|
||||||
app = htmlPy.AppGUI(title=u"to_be_set_later",
|
app = htmlPy.AppGUI(title=u"{dir_name} - Test Status".format(dir_name=dir_name),
|
||||||
developer_mode=True, width=1, height=1)
|
developer_mode=True, width=150, height=80)
|
||||||
|
app.window.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
|
||||||
app.window.setWindowFlags(QtCore.Qt.WindowTitleHint)
|
screen_geo = QApplication.desktop().availableGeometry()
|
||||||
# app.window.setWindowFlags(app.window.windowFlags() & ~QtCore.Qt.WindowMaximizeButtonHint)
|
screen_topright = screen_geo.topRight()
|
||||||
app.window.setWindowFlags(app.window.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
|
app.x_pos = (screen_topright.x() - 20) - app.width
|
||||||
|
app.y_pos = (screen_topright.y() + 20)
|
||||||
|
|
||||||
# GUI configarg
|
# GUI configarg
|
||||||
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
|
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
|
||||||
app.static_path = os.path.join(BASE_DIR, "static/")
|
app.static_path = os.path.join(BASE_DIR, "static/")
|
||||||
app.template_path = os.path.join(BASE_DIR, "tmpl/")
|
app.template_path = os.path.join(BASE_DIR, "tmpl/")
|
||||||
app.dir_name = dir_name
|
app.dir_name = dir_name
|
||||||
app.tmpl_name = app_tmpl
|
|
||||||
|
|
||||||
# Register back-end functionalities
|
# Register back-end functionalities
|
||||||
# allow minimal tmpl with sys.arg
|
|
||||||
app_backend = Controller(app)
|
app_backend = Controller(app)
|
||||||
app.bind(app_backend)
|
app.bind(app_backend)
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title></title>
|
<title>{{dir_name}}</title>
|
||||||
<style>
|
<style>
|
||||||
*
|
*
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,112 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title></title>
|
|
||||||
<style>
|
|
||||||
*
|
|
||||||
{
|
|
||||||
-webkit-box-sizing: border-box;
|
|
||||||
-moz-box-sizing: border-box;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
body
|
|
||||||
{
|
|
||||||
margin: 2px;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.last-test-statusviz
|
|
||||||
{
|
|
||||||
width: 100%;
|
|
||||||
height: 1.5em;
|
|
||||||
}
|
|
||||||
.statusdot
|
|
||||||
{
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
/*width: 1em;*/
|
|
||||||
padding: 1px;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.statusdot-fill
|
|
||||||
{
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.nostatusdot
|
|
||||||
{
|
|
||||||
padding: 1px;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background-color: yellow;
|
|
||||||
}
|
|
||||||
.fill-pass
|
|
||||||
{
|
|
||||||
background-color: green;
|
|
||||||
}
|
|
||||||
.fill-fail
|
|
||||||
{
|
|
||||||
background-color: red;
|
|
||||||
}
|
|
||||||
.last-test-statusviz
|
|
||||||
{
|
|
||||||
overflow: hidden;
|
|
||||||
border: 2px solid black;
|
|
||||||
}
|
|
||||||
.last-test-timerelative
|
|
||||||
{
|
|
||||||
font-size: 0.75em;
|
|
||||||
height: 1em;
|
|
||||||
}
|
|
||||||
.last-test-dirname
|
|
||||||
{
|
|
||||||
font-size: 1em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<!-- <script type="text/javascript" src="./refresh.js"></script> -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
// debugger
|
|
||||||
document.onload = setInterval(function(){Controller.redraw()},1000)
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="section-last-test">
|
|
||||||
<!-- <div class="state">
|
|
||||||
{{ state_desc }}
|
|
||||||
</div>
|
|
||||||
<div class="last-test-statusviz">
|
|
||||||
{% for testname in collect %}
|
|
||||||
<div class="statusdot statusdot-{{loop.index0}}">
|
|
||||||
{% if testname in pass %}
|
|
||||||
<div class="statusdot-fill fill-pass"></div>
|
|
||||||
{% elif testname in fail %}
|
|
||||||
<div class="statusdot-fill fill-fail"></div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
<div class="last-test-timerelative">
|
|
||||||
Got {{ last_updated_friendly }} ago
|
|
||||||
</div> -->
|
|
||||||
<div class="last-test-dirname">
|
|
||||||
{{ dir_name_topfolder }}
|
|
||||||
</div>
|
|
||||||
<div class="last-test-statusviz">
|
|
||||||
{% if state == "end" %}
|
|
||||||
<div class="statusdot statusdot-{{loop.index0}}">
|
|
||||||
{% if (fail|length) == 0 %}
|
|
||||||
<div class="statusdot-fill fill-pass"></div>
|
|
||||||
{% else %}
|
|
||||||
<div class="statusdot-fill fill-fail"></div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="nostatusdot"></div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
Todo
|
Todo
|
||||||
------
|
------
|
||||||
|
|
||||||
6. Allow config for template
|
|
||||||
1. test template path available after install
|
1. test template path available after install
|
||||||
2. test option --show_status_gui available
|
2. test option --show_status_gui available
|
||||||
3. add details of --show_status_gui in addoption
|
3. add details of --show_status_gui in addoption
|
||||||
4. Release on pypi
|
4. Release on pypi
|
||||||
5. Add well-explained readme
|
5. Add well-explained readme
|
||||||
|
6. Allow config for template
|
||||||
|
|
||||||
7. use logging.debug / log file for more prints
|
7. use logging.debug / log file for more prints
|
||||||
8. Tests with setup/teardown/class when needed
|
8. Tests with setup/teardown/class when needed
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ class Helpers(object):
|
|||||||
Helpers.modify_last_updated(dir_name)
|
Helpers.modify_last_updated(dir_name)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def start_gui(dir_name, extra_args=None):
|
def start_gui(dir_name):
|
||||||
'''
|
'''
|
||||||
Init status_gui at start
|
Init status_gui at start
|
||||||
'''
|
'''
|
||||||
@@ -88,9 +88,6 @@ class Helpers(object):
|
|||||||
if not (existing_gui_pid and psutil.pid_exists(existing_gui_pid)):
|
if not (existing_gui_pid and psutil.pid_exists(existing_gui_pid)):
|
||||||
norm_dir_name = os.path.normpath(dir_name)
|
norm_dir_name = os.path.normpath(dir_name)
|
||||||
command_status_gui = command_status_gui_gen.format(norm_dir_name=norm_dir_name)
|
command_status_gui = command_status_gui_gen.format(norm_dir_name=norm_dir_name)
|
||||||
if extra_args:
|
|
||||||
command_status_gui = command_status_gui + " " + extra_args
|
|
||||||
# print("Starting gui as: {cmd_gui}".format(cmd_gui=command_status_gui))
|
|
||||||
gui_popen_obj = subprocess.Popen(command_status_gui)
|
gui_popen_obj = subprocess.Popen(command_status_gui)
|
||||||
gui_pid = gui_popen_obj.pid
|
gui_pid = gui_popen_obj.pid
|
||||||
redis_db.set("{hash_a}_gui_pid".format(hash_a=hash_dir_name), gui_pid)
|
redis_db.set("{hash_a}_gui_pid".format(hash_a=hash_dir_name), gui_pid)
|
||||||
@@ -205,8 +202,7 @@ class PYTEST_DATA(object):
|
|||||||
|
|
||||||
|
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser):
|
||||||
parser.addoption("--gui", dest="show_status_gui", action="store_true")
|
parser.addoption("--show_status_gui", dest="show_status_gui", action="store_true")
|
||||||
parser.addoption("--gui_minimal", dest="show_status_gui_minimal", action="store_true")
|
|
||||||
|
|
||||||
|
|
||||||
def pytest_configure(config):
|
def pytest_configure(config):
|
||||||
@@ -222,8 +218,6 @@ def pytest_sessionstart(session):
|
|||||||
|
|
||||||
if config.getoption("show_status_gui"):
|
if config.getoption("show_status_gui"):
|
||||||
Helpers.start_gui(PYTEST_DATA.data["dir_name_start"])
|
Helpers.start_gui(PYTEST_DATA.data["dir_name_start"])
|
||||||
elif config.getoption("show_status_gui_minimal"):
|
|
||||||
Helpers.start_gui(PYTEST_DATA.data["dir_name_start"], extra_args="--minimal")
|
|
||||||
|
|
||||||
|
|
||||||
def pytest_collectstart(collector):
|
def pytest_collectstart(collector):
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ command_redis_server = command_redis_server_gen.format(REDIS_PATH=REDIS_PATH,
|
|||||||
REDIS_ARGS=REDIS_ARGS,
|
REDIS_ARGS=REDIS_ARGS,
|
||||||
REDIS_PORT=REDIS_PORT)
|
REDIS_PORT=REDIS_PORT)
|
||||||
|
|
||||||
command_status_gui_gen = "pytest_gui_status --dir_name=\"{norm_dir_name}\""
|
command_status_gui_gen = "pytest_gui_status \"{norm_dir_name}\""
|
||||||
|
|
||||||
|
|
||||||
def s(input_):
|
def s(input_):
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ Pytest Status GUI
|
|||||||
Also, install `PySide` and `Redis` manually via apt-get or installers.
|
Also, install `PySide` and `Redis` manually via apt-get or installers.
|
||||||
|
|
||||||
#### How to use?
|
#### How to use?
|
||||||
`py.test --gui`
|
`py.test --show_status_gui`
|
||||||
|
|
||||||
**Recommended** : Use with [pytest-watch][ptw_gh_link] using `ptw -- --gui`
|
**Recommended** : Use with [pytest-watch][ptw_gh_link] using `ptw -- --show_status_gui`
|
||||||
|
|
||||||
pytest-watch re-runs py.test on any change to your code
|
pytest-watch re-runs py.test on any change to your code
|
||||||
|
|
||||||
@@ -49,13 +49,11 @@ The result is that you get some nifty **test status windows that update as you k
|
|||||||
##### Template:
|
##### Template:
|
||||||
###### Minimal Window:
|
###### Minimal Window:
|
||||||
|
|
||||||
Use `--gui_minimal` instead of `--gui` i.e. call using `py.test --gui_minimal`
|
//TODO
|
||||||
|
|
||||||
The minimal window is closer to what pytddmon does, but is somewhat different. It shows yellow while tests are running or being collected, and only full red or full green bar when tests complete.
|
|
||||||
|
|
||||||
###### Use your own template:
|
###### Use your own template:
|
||||||
|
|
||||||
// Not Supported now, maybe I can add if someone needs it.
|
//TODO
|
||||||
|
|
||||||
##### Redis:
|
##### Redis:
|
||||||
###### Custom Redis Command:
|
###### Custom Redis Command:
|
||||||
|
|||||||
Reference in New Issue
Block a user