Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc5e26843a | ||
|
|
e5d0e91e93 | ||
|
|
e58f0b1d04 | ||
|
|
ea0fff5662 | ||
|
|
70f4d666e3 | ||
|
|
dc76f1b732 | ||
|
|
f374cb7e46 | ||
|
|
9481e8f921 | ||
|
|
c8d4080ef5 |
@@ -1,6 +1,6 @@
|
||||
from os.path import dirname, realpath, join
|
||||
|
||||
from setuptools import setup
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
here = dirname(realpath(__file__))
|
||||
|
||||
@@ -17,7 +17,7 @@ setup(
|
||||
author='Avatao.com Innovative Learning Kft.',
|
||||
author_email='support@avatao.com',
|
||||
license='custom',
|
||||
packages=['tfw'],
|
||||
packages=find_packages(),
|
||||
package_dir={'tfw': 'tfw'},
|
||||
install_requires=requirements,
|
||||
extras_require={
|
||||
|
||||
@@ -27,14 +27,15 @@ class MessageQueueHandler:
|
||||
|
||||
def _dispatch_messages(self):
|
||||
for message in iter(self._queue.get, None):
|
||||
message['typing'] = not self._queue.empty()
|
||||
is_queue_empty = self._queue.empty()
|
||||
message['typing'] = not is_queue_empty
|
||||
self.connector.send_message(message)
|
||||
self._sleep(self._get_sleep_time(message))
|
||||
self._sleep(self._get_sleep_time(message, is_queue_empty))
|
||||
|
||||
def _get_sleep_time(self, message):
|
||||
def _get_sleep_time(self, message, is_queue_empty):
|
||||
words_per_min = message['wpm'] if 'wpm' in message else self.wpm
|
||||
chars_per_min = self.avg_word_len * words_per_min / 60
|
||||
return len(message['message']) / chars_per_min
|
||||
return 0 if is_queue_empty else len(message['message']) / chars_per_min
|
||||
|
||||
def _sleep(self, seconds):
|
||||
poll_freq = self.drain_poll_freq
|
||||
|
||||
@@ -1,17 +1,22 @@
|
||||
DEFAULT_ORIGINATOR = 'avataobot'
|
||||
|
||||
|
||||
class MessageSender:
|
||||
def __init__(self, uplink):
|
||||
self.uplink = uplink
|
||||
|
||||
def send(self, message, originator=None):
|
||||
def send(self, message, originator=DEFAULT_ORIGINATOR, buttons=None):
|
||||
message = {
|
||||
'key': 'message.send',
|
||||
'message': message
|
||||
}
|
||||
if originator:
|
||||
message['originator'] = originator
|
||||
if buttons:
|
||||
message['buttons'] = buttons
|
||||
self.uplink.send_message(message)
|
||||
|
||||
def queue_messages(self, messages, originator=None):
|
||||
def queue_messages(self, messages, originator=DEFAULT_ORIGINATOR, buttons=None):
|
||||
message_queue = {
|
||||
'key': 'message.queue',
|
||||
'messages': []
|
||||
@@ -21,10 +26,6 @@ class MessageSender:
|
||||
if originator:
|
||||
next_message['originator'] = originator
|
||||
message_queue['messages'].append(next_message)
|
||||
if buttons and message_queue['messages']:
|
||||
message_queue['messages'][-1]['buttons'] = buttons
|
||||
self.uplink.send_message(message_queue)
|
||||
|
||||
def set_originator(self, originator):
|
||||
self.uplink.send_message({
|
||||
'key': 'message.config',
|
||||
'originator': originator
|
||||
})
|
||||
|
||||
@@ -79,6 +79,7 @@ class IdeHandler:
|
||||
def read(self, message):
|
||||
if 'patterns' in message:
|
||||
self.filemanager.patterns = message['patterns']
|
||||
self.monitor.paths = self.filemanager.parents
|
||||
try:
|
||||
message['filename'] = self.filemanager.find_file(
|
||||
message.get('filename') or self.initial_file
|
||||
|
||||
@@ -16,17 +16,20 @@ class ProcessLogHandler:
|
||||
self._initial_log_tail = log_tail
|
||||
|
||||
self.command_handlers = {
|
||||
'process.log.set': self.handle_set
|
||||
'process.log.set': self.handle_set,
|
||||
'process.log.start': self.handle_start,
|
||||
'process.log.stop': self.handle_stop
|
||||
}
|
||||
|
||||
def start(self):
|
||||
self._monitor = LogInotifyObserver(
|
||||
connector=self.connector,
|
||||
process_name=self.process_name,
|
||||
supervisor_uri=self._supervisor_uri,
|
||||
log_tail=self._initial_log_tail
|
||||
)
|
||||
self._monitor.start()
|
||||
if not self._monitor:
|
||||
self._monitor = LogInotifyObserver(
|
||||
connector=self.connector,
|
||||
process_name=self.process_name,
|
||||
supervisor_uri=self._supervisor_uri,
|
||||
log_tail=self._initial_log_tail
|
||||
)
|
||||
self._monitor.start()
|
||||
|
||||
def handle_event(self, message, _):
|
||||
try:
|
||||
@@ -40,5 +43,16 @@ class ProcessLogHandler:
|
||||
if data.get('tail'):
|
||||
self._monitor.log_tail = data['tail']
|
||||
|
||||
def handle_start(self, _):
|
||||
self.start()
|
||||
|
||||
def handle_stop(self, _):
|
||||
self._stop_monitor()
|
||||
|
||||
def _stop_monitor(self):
|
||||
if self._monitor:
|
||||
self._monitor.stop()
|
||||
self._monitor = None
|
||||
|
||||
def cleanup(self):
|
||||
self._monitor.stop()
|
||||
self._stop_monitor()
|
||||
|
||||
@@ -17,7 +17,7 @@ class TerminadoMiniServer:
|
||||
url,
|
||||
TerminadoMiniServer.ResetterTermSocket,
|
||||
{'term_manager': self._term_manager}
|
||||
)])
|
||||
)], websocket_ping_interval=30)
|
||||
|
||||
@property
|
||||
def term_manager(self):
|
||||
@@ -33,10 +33,6 @@ class TerminadoMiniServer:
|
||||
def check_origin(self, origin):
|
||||
return True
|
||||
|
||||
def on_close(self):
|
||||
self.term_manager.terminal = None
|
||||
self.term_manager.get_terminal()
|
||||
|
||||
def listen(self):
|
||||
self.application.listen(self.port)
|
||||
|
||||
|
||||
+6
-7
@@ -1,6 +1,7 @@
|
||||
import logging
|
||||
from collections import defaultdict
|
||||
from datetime import datetime
|
||||
from contextlib import suppress
|
||||
|
||||
from transitions import Machine, MachineError
|
||||
|
||||
@@ -62,14 +63,12 @@ class FSMBase(Machine, CallbackMixin):
|
||||
)
|
||||
|
||||
if all(predicate_results):
|
||||
try:
|
||||
with suppress(AttributeError, MachineError):
|
||||
from_state = self.state
|
||||
self.trigger(trigger)
|
||||
self.update_event_log(from_state, trigger)
|
||||
return True
|
||||
except (AttributeError, MachineError):
|
||||
LOG.debug('FSM failed to execute nonexistent trigger: "%s"', trigger)
|
||||
return False
|
||||
if self.trigger(trigger):
|
||||
self.update_event_log(from_state, trigger)
|
||||
return True
|
||||
LOG.debug('FSM failed to execute nonexistent trigger: "%s"', trigger)
|
||||
|
||||
def update_event_log(self, from_state, trigger):
|
||||
self.event_log.append({
|
||||
|
||||
@@ -42,7 +42,8 @@ def deserialize_tfw_msg(*args):
|
||||
"""
|
||||
Return message from TFW multipart data
|
||||
"""
|
||||
return _deserialize_all(*args)[1]
|
||||
envelope = _deserialize_all(*args)
|
||||
return _repair_if_needed(envelope)
|
||||
|
||||
|
||||
def _serialize_all(*args):
|
||||
@@ -84,6 +85,18 @@ def _deserialize_single(data):
|
||||
return _decode_if_needed(data)
|
||||
|
||||
|
||||
def _repair_if_needed(envelope):
|
||||
"""
|
||||
Quick fix for broken messages received from separate processes.
|
||||
"""
|
||||
if len(envelope) == 2:
|
||||
return envelope[1]
|
||||
for part in envelope:
|
||||
if isinstance(part, dict):
|
||||
return part
|
||||
return {}
|
||||
|
||||
|
||||
def _encode_if_needed(value):
|
||||
"""
|
||||
Return input as bytes
|
||||
|
||||
@@ -28,7 +28,7 @@ class TFWServer:
|
||||
r'/ws', ZMQWebSocketRouter, {
|
||||
'listener': self._listener,
|
||||
}
|
||||
)])
|
||||
)], websocket_ping_interval=30)
|
||||
|
||||
def listen(self):
|
||||
self.application.listen(TFWENV.WEB_PORT)
|
||||
|
||||
Reference in New Issue
Block a user