aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbozo.kopic <bozo.kopic@gmail.com>2017-08-24 17:51:14 +0200
committerbozo.kopic <bozo.kopic@gmail.com>2017-08-24 17:51:14 +0200
commitc594b1fca854a7b9fb73d854a9830143cd1032fc (patch)
tree8c8b63cb4899238cf0f73a3f7bd08d9b70b16e81
parentd736cd1392a56ad5103867c72761cfcb4ccd4f1b (diff)
frontend
-rw-r--r--README.rst1
-rw-r--r--schemas_json/message.yaml19
-rw-r--r--src_js/hatter/common.js66
-rw-r--r--src_js/hatter/main.js29
-rw-r--r--src_py/hatter/backend.py9
-rw-r--r--src_py/hatter/main.py3
-rw-r--r--src_py/hatter/server.py6
7 files changed, 124 insertions, 9 deletions
diff --git a/README.rst b/README.rst
index eb6e390..b9ae60e 100644
--- a/README.rst
+++ b/README.rst
@@ -68,7 +68,6 @@ TODO
* user interface - frontend
- * implement communication with backend
* create user interface
* other
diff --git a/schemas_json/message.yaml b/schemas_json/message.yaml
index 0c79507..7f89ed3 100644
--- a/schemas_json/message.yaml
+++ b/schemas_json/message.yaml
@@ -53,7 +53,9 @@ definitions:
enum:
- active_job
job:
- "$ref": "hatter://message.yaml#/definitions/job"
+ oneOf:
+ - type: 'null'
+ - "$ref": "hatter://message.yaml#/definitions/job"
- title: Job queue
type: object
required:
@@ -71,6 +73,7 @@ definitions:
type: object
required:
- type
+ - entries
properties:
type:
enum:
@@ -79,6 +82,20 @@ definitions:
type: array
items:
"$ref": "hatter://message.yaml#/definitions/log_entry"
+ - title: repositories
+ type: object
+ required:
+ - type
+ - repositories
+ properties:
+ type:
+ enum:
+ - repositories
+ repositories:
+ type: array
+ items:
+ type: string
+
job:
type: object
required:
diff --git a/src_js/hatter/common.js b/src_js/hatter/common.js
index 829685b..c6dcfcc 100644
--- a/src_js/hatter/common.js
+++ b/src_js/hatter/common.js
@@ -1,2 +1,66 @@
-export const defaultState = {};
+import r from 'hatter/renderer';
+import * as util from 'hatter/util';
+
+
+export const defaultState = {
+ conn: null,
+ log: {
+ offset: 0,
+ offsetText: '0',
+ limit: 0,
+ limitText: '0',
+ entries: []
+ },
+ job: {
+ active: null,
+ queue: []
+ },
+ repositories: []
+};
+
+
+export function processMsg(msg) {
+ if (msg.type == 'repositories') {
+ r.set('repositories', msg.repositories);
+ } else if (msg.type == 'active_job') {
+ r.set(['job', 'active'], msg.job);
+ } else if (msg.type == 'job_queue') {
+ r.set(['job', 'queue'], msg.jobs);
+ } else if (msg.type == 'log_entries') {
+ r.set(['log', 'entires'], msg.entries);
+ }
+}
+
+
+export function addJob(repository) {
+ r.get('conn').send(JSON.stringify({
+ type: 'add_job',
+ repository: repository,
+ commit: 'HEAD'
+ }));
+}
+
+
+bean.on(r, 'change', state => {
+ let newOffset = parseInt(state.log.offsetText);
+ let newLimit = parseInt(state.log.limitText);
+ if (util.isInteger(newOffset) && newOffset != state.log.offset) {
+ r.set(['log', 'offset'], newOffset).then(sendSetLog);
+ }
+ if (util.isInteger(newLimit) && newLimit != state.log.limit) {
+ r.set(['log', 'limit'], newLimit).then(sendSetLog);
+ }
+});
+
+
+function sendSetLog() {
+ let conn = r.get('conn');
+ if (!conn)
+ return;
+ conn.send(JSON.stringify({
+ type: 'set_log',
+ offset: r.get('offset'),
+ limit: r.get('limit')
+ }));
+}
diff --git a/src_js/hatter/main.js b/src_js/hatter/main.js
index 892b6af..3f64ed3 100644
--- a/src_js/hatter/main.js
+++ b/src_js/hatter/main.js
@@ -1,7 +1,7 @@
import bean from 'bean';
-import R from 'ramda';
import r from 'hatter/renderer';
+import * as util from 'hatter/util';
import * as common from 'hatter/common';
import * as vt from 'hatter/vt';
@@ -10,8 +10,31 @@ import 'style/main.scss';
function main() {
- let root = document.body.appendChild(document.createElement('div'));
- r.init(root, common.defaultState, vt.main);
+ let conn = new WebSocket(wsAddress);
+
+ conn.onopen = () => {
+ let root = document.body.appendChild(document.createElement('div'));
+ let state = util.set('conn', conn, common.defaultState);
+ r.init(root, state, vt.main);
+ };
+
+ conn.onclose = () => {
+ alert("Disconnected from server");
+ };
+
+ conn.onerror = () => {
+ alert("Couldn't connect to server");
+ };
+
+ conn.onmessage = (evt) => {
+ try {
+ let msg = JSON.parse(evt.data);
+ common.processMsg(msg);
+ } catch(e) {
+ conn.close();
+ throw e;
+ }
+ };
}
diff --git a/src_py/hatter/backend.py b/src_py/hatter/backend.py
index 57c5192..8b78570 100644
--- a/src_py/hatter/backend.py
+++ b/src_py/hatter/backend.py
@@ -27,7 +27,8 @@ Job = util.namedtuple('Job',
class Backend:
- def __init__(self, db_path):
+ def __init__(self, db_path, repositories):
+ self._repositories = repositories
self._next_job_id = 0
self._active = None
self._queue = []
@@ -40,8 +41,12 @@ class Backend:
self._run_loop_future = asyncio.ensure_future(self._run_loop())
@property
+ def repositories(self):
+ return self._repositories
+
+ @property
def active(self):
- self._active
+ return self._active
@property
def queue(self):
diff --git a/src_py/hatter/main.py b/src_py/hatter/main.py
index 87bc32c..71245a2 100644
--- a/src_py/hatter/main.py
+++ b/src_py/hatter/main.py
@@ -37,7 +37,8 @@ async def async_main(conf, web_path):
backend = None
web_server = None
try:
- backend = Backend(pathlib.Path(conf.get('db_path', 'hatter.db')))
+ backend = Backend(pathlib.Path(conf.get('db_path', 'hatter.db')),
+ conf['repositories'])
web_server = await create_web_server(
backend, conf.get('host', '0.0.0.0'), conf.get('port', 24000),
conf.get('webhook_path', '/webhook'), web_path)
diff --git a/src_py/hatter/server.py b/src_py/hatter/server.py
index 8263eea..baeffac 100644
--- a/src_py/hatter/server.py
+++ b/src_py/hatter/server.py
@@ -85,6 +85,7 @@ class _Client:
with self._backend.register_queue_change_cb(self._on_queue_change):
with self._backend.register_log_change_cb(self._on_log_change):
try:
+ self._send_repositories()
self._send_active_job()
self._send_job_queue()
self._send_log_entries()
@@ -127,6 +128,11 @@ class _Client:
self._log_entries = log_entries
self._send_log_entries()
+ def _send_repositories(self):
+ self._ws.send_str(json.dumps({
+ 'type': 'repositories',
+ 'repositories': self._backend.repositories}))
+
def _send_active_job(self):
self._ws.send_str(json.dumps({
'type': 'active_job',