Compare commits

...

5 commits

Author SHA1 Message Date
da271dcd52 Deleted deletion of modules 2017-05-31 15:30:45 +02:00
4bc9d7bd9b Version Bump 2017-05-31 15:23:26 +02:00
0c69977e61 Fixed store actions on 'false'
Send empty lines to frontend, if empty lines are sent
Emptied sys.modules when the module is executed
2017-05-31 00:24:55 +02:00
63e8059e94 Fixed groups inside subparsers 2017-05-30 19:22:25 +02:00
b589dd70f3 Fixed actions in subparsers 2017-05-30 19:17:48 +02:00
9 changed files with 57 additions and 21 deletions

View file

@ -1,6 +1,6 @@
from setuptools import setup, find_packages from setuptools import setup, find_packages
version = "0.1.1" version = "0.1.2"
setup( setup(
name='warped', name='warped',

View file

@ -90,7 +90,7 @@ class ActionContainer():
internal_dict = {} internal_dict = {}
internal_dict['uuid'] = str(self.uuid) internal_dict['uuid'] = str(self.uuid)
internal_dict['actions'] = [action.as_dict() for action in self.actions] internal_dict['actions'] = [action.as_dict() for action in self.actions]
internal_dict['groups'] = [[action.as_dict() for action in group] for group in self.groups] internal_dict['groups'] = [group.as_dict() for group in self.groups]
return internal_dict return internal_dict
class StoreAction(Action): class StoreAction(Action):
@ -98,6 +98,8 @@ class StoreAction(Action):
class StoreConstAction(Action): class StoreConstAction(Action):
def store_type_function(self, x): def store_type_function(self, x):
if x == 'false':
x = None
return self.const if x is not None else self.on_none return self.const if x is not None else self.on_none
def __init__(self, action, **kwargs): def __init__(self, action, **kwargs):
@ -110,4 +112,4 @@ class MutuallyExclusiveGroup(ActionContainer):
super().__init__() super().__init__()
def __repr__(self): def __repr__(self):
return "Group Object: ( Actions: {}, Groups: {} )".format(self.actions, self.mutex_groups) return "Group Object: ( Actions: {}, Groups: {} )".format(self.actions, self.groups)

View file

@ -1,6 +1,5 @@
import argparse import argparse
import sys import sys
import io
import runpy import runpy
from traceback import print_exc from traceback import print_exc
from contextlib import redirect_stdout, redirect_stderr from contextlib import redirect_stdout, redirect_stderr
@ -24,9 +23,10 @@ class Context(Process):
sys.argv = [''] + self.arguments sys.argv = [''] + self.arguments
else: else:
sys.argv = [''] sys.argv = ['']
#if not self.original_modules is None: # if not self.original_modules is None:
# sys.modules = self.original_modules # sys.modules.clear()
# print(sys.modules) # sys.modules.update(self.original_modules)
sys.modules.update(self.overwritten_modules) sys.modules.update(self.overwritten_modules)
with redirect_stdout(self.stdout): with redirect_stdout(self.stdout):
with redirect_stderr(self.stderr): with redirect_stderr(self.stderr):

View file

@ -1,3 +1,4 @@
from . import savemodules
import sys import sys
import io import io
@ -24,9 +25,15 @@ class QueuedOut(io.StringIO):
lines = b.split('\n') lines = b.split('\n')
for line in lines[:-1]: for line in lines[:-1]:
super().write(line) super().write(line)
self.flush() self.explflush()
super().write(lines[-1]) super().write(lines[-1])
def explflush(self):
value = self.getvalue()
self.queue.put((self.name, value))
self.seek(0)
self.truncate(0)
def flush(self): def flush(self):
value = self.getvalue() value = self.getvalue()
if len(value) > 1: if len(value) > 1:
@ -100,7 +107,7 @@ def start_module(name, is_module):
ioerr, ioerr,
overwritten_modules={'argparse': argparser}, overwritten_modules={'argparse': argparser},
is_module = is_module, is_module = is_module,
#original_modules = emptymodules original_modules = savemodules.savedmodules
) )
views.app.module_process.start() views.app.module_process.start()
views.app.output.start() views.app.output.start()
@ -112,6 +119,7 @@ def start_module(name, is_module):
views.app.output.stop() views.app.output.stop()
ioerr.write("Process stopped ({})\n".format(views.app.module_process.exitcode)) ioerr.write("Process stopped ({})\n".format(views.app.module_process.exitcode))
views.app.output.queue.put(("sig", "stop"))
views.app.restart.wait() views.app.restart.wait()

View file

@ -11,3 +11,4 @@ if __name__ == "__main__":
args = parser.parse_args() args = parser.parse_args()
print("Subparser %s was selected" % args.command) print("Subparser %s was selected" % args.command)
print(args)

2
warped/savemodules.py Normal file
View file

@ -0,0 +1,2 @@
import sys
savedmodules = dict(sys.modules)

View file

@ -7,6 +7,15 @@
display: block; display: block;
} }
.checkbox {
height:100%;
}
input[type=checkbox] {
width: 2em;
height: 2em;
-moz-appearance: none;
}
#output { #output {
flex:1; flex:1;

View file

@ -21,6 +21,9 @@ function createSubparserAction(action) {
var content_div = $("<div/>", { id: choice['uuid'] }) var content_div = $("<div/>", { id: choice['uuid'] })
.addClass("tabs-panel").appendTo(tab_content); .addClass("tabs-panel").appendTo(tab_content);
choice['groups'].forEach(function(group) {
content_div.append(createGroup(group));
});
choice['actions'].forEach(function(action) { choice['actions'].forEach(function(action) {
content_div.append(createAction(action)); content_div.append(createAction(action));
}); });
@ -31,13 +34,14 @@ function createSubparserAction(action) {
} }
function createCheckboxAction(action) { function createCheckboxAction(action) {
var switch_div = $("<div/>").addClass("switch"); //var switch_div = $("<div/>").addClass("switch");
var switch_div = $("<div/>").addClass("checkbox");
var input = $("<input/>", { var input = $("<input/>", {
id: action["uuid"], id: action["uuid"],
type: 'checkbox', type: 'checkbox',
name: action['uuid'] name: action['uuid']
}).addClass('switch-input').data("name", action['dest']).appendTo(switch_div); }).data("name", action['dest']).appendTo(switch_div);
var paddle = $("<label/>", {for: action["uuid"]}).addClass("switch-paddle") var paddle = $("<label/>", {for: action["uuid"]}).addClass("css-label")
.appendTo(switch_div); .appendTo(switch_div);
if(action['checked'] === true) { if(action['checked'] === true) {
input.attr('checked', true); input.attr('checked', true);

View file

@ -12,21 +12,33 @@ from flask import Flask, render_template, request, Response, \
app = Flask(__name__) app = Flask(__name__)
app.mutex_groups=[] app.mutex_groups=[]
def parse_argument(name, json, action): def parse_argument(name, json, action, namespace):
try: try:
argument = json[name] argument = json[name]
if type(argument) == list: if type(argument) == list:
if len(argument) == 1: if len(argument) == 1:
return action.type_function(argument[0]) setattr(namespace, action.name, action.type_function(argument[0]))
else: else:
return [action.type_function(elem) for elem in argument] setattr(namespace, action.name, [action.type_function(elem) for elem in argument])
else: else:
return action.type_function(argument) setattr(namespace, action.name, action.type_function(argument))
except (KeyError, ValueError): except (KeyError, ValueError):
if name.endswith("[]"): if name.endswith("[]"):
return action.on_none setattr(namespace, action.name, action.on_none)
else: else:
return parse_argument(name + "[]", json, action) parse_argument(name + "[]", json, action, namespace)
try:
for name, choice in action.choices.items():
actions = choice.actions
for group in choice.groups:
actions.extend(group.actions)
for act in actions:
parse_argument(act.name, json, act, namespace)
except AttributeError:
pass
@app.route("/arguments", methods=['POST']) @app.route("/arguments", methods=['POST'])
@ -39,8 +51,7 @@ def fill_namespace():
all_actions.extend(group.actions) all_actions.extend(group.actions)
for action in all_actions: for action in all_actions:
value = parse_argument(action.name, json, action) parse_argument(action.name, json, action, namespace)
setattr(namespace, action.name, value)
app.namespaceQueue.put(namespace) app.namespaceQueue.put(namespace)
app.output.queue.put(("sig", "start")) app.output.queue.put(("sig", "start"))
@ -57,7 +68,6 @@ def get_arguments():
def stop(): def stop():
os.kill(app.module_process.pid, signal.SIGCONT) os.kill(app.module_process.pid, signal.SIGCONT)
app.module_process.terminate() app.module_process.terminate()
app.output.queue.put(("sig", "stop"))
return "OK" return "OK"
@app.route("/resume") @app.route("/resume")