diff options
| author | bozo.kopic <bozo.kopic@gmail.com> | 2017-08-24 17:51:14 +0200 |
|---|---|---|
| committer | bozo.kopic <bozo.kopic@gmail.com> | 2017-08-24 17:51:14 +0200 |
| commit | c594b1fca854a7b9fb73d854a9830143cd1032fc (patch) | |
| tree | 8c8b63cb4899238cf0f73a3f7bd08d9b70b16e81 | |
| parent | d736cd1392a56ad5103867c72761cfcb4ccd4f1b (diff) | |
frontend
| -rw-r--r-- | README.rst | 1 | ||||
| -rw-r--r-- | schemas_json/message.yaml | 19 | ||||
| -rw-r--r-- | src_js/hatter/common.js | 66 | ||||
| -rw-r--r-- | src_js/hatter/main.js | 29 | ||||
| -rw-r--r-- | src_py/hatter/backend.py | 9 | ||||
| -rw-r--r-- | src_py/hatter/main.py | 3 | ||||
| -rw-r--r-- | src_py/hatter/server.py | 6 |
7 files changed, 124 insertions, 9 deletions
@@ -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', |
