Skip to content
This repository has been archived by the owner on Aug 20, 2021. It is now read-only.

Commit

Permalink
Merge pull request #281 from jquast/develop
Browse files Browse the repository at this point in the history
2.0.14: deprecate getch, unify with new version of blessed.
  • Loading branch information
jquast committed Feb 28, 2017
2 parents aebaf81 + 61612e0 commit c46a97c
Show file tree
Hide file tree
Showing 20 changed files with 216 additions and 235 deletions.
8 changes: 8 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
2.0.15
- refactor: all example scripts now prefer getterminal().inkey() rather than
deprecated getch(), getch() returns multiple types, None for timeout,
keycode as integer for application keys, or string for characters.
inkey() interface always returns a string, sometimes empty, with
.code attribute for application keys.
- This refactoring allows us to use the latest version of 'blessed'
library.
2.0.14
- enhancement: ability to connect to irc servers with password protection
using 'password' setting in 'irc' section of default.ini
Expand Down
4 changes: 2 additions & 2 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@
# built documents.
#
# The short X.Y version.
version = '2.0.13'
version = '2.0.14'
# The full version, including alpha/beta/rc tags.
release = '2.0.9'
release = version

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
Expand Down
71 changes: 2 additions & 69 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,78 +11,15 @@
# No name 'core' in module 'distutils'
# Unable to import 'distutils.core'
from distutils.core import setup
from setuptools.command.develop import develop as _develop
from setuptools import Command

HERE = os.path.dirname(__file__)
README = 'README.rst'
DOC_URL = 'http://x84.rtfd.org'


def check_virtualenv():
""" Ensure a virtualenv is used. """
if not os.getenv('VIRTUAL_ENV'):
print('You must be in a virtualenv, See developer documentation '
'at filepath docs/developers.rst or online at {0}'
.format(DOC_URL), file=sys.stderr)
exit(1)


class Develop(_develop):

""" Ensure a virtualenv is used and install developer requirements. """

def finalize_options(self):
""" Validate options. """
check_virtualenv()
_develop.finalize_options(self)

def run(self):
""" Run develop command. """
cargs = ['pip', 'install', '--upgrade', 'sphinx', 'tox']
print('>>', ' '.join(map(pipes.quote, list(cargs))))
subprocess.check_call(cargs)
_develop.run(self)


class BuildDocs(Command):

""" Build documentation using sphinx. """

#: path to source documentation folder.
DOCS_SRC = os.path.join(HERE, 'docs')

#: path to output html documentation folder.
DOCS_DST = os.path.join(HERE, 'build', 'docs')

user_options = []

def initialize_options(self):
""" Initialize options. """
pass

def finalize_options(self):
""" Validation options. """
# pylint: disable=R0201
# Method could be a function
check_virtualenv()

def run(self):
""" Call sphinx-build. """
try:
subprocess.call(
('sphinx-build', '-v', '-n', '-E',
self.DOCS_SRC, self.DOCS_DST),
stdout=sys.stdout, stderr=sys.stderr)
except OSError as err:
if err.errno != errno.ENOENT:
raise
print("run '{0} develop' first".format(__file__), file=sys.stderr)
sys.exit(1)


setup(name='x84',
version='2.0.13',
version='2.0.14',
description=("Framework for Telnet and SSH BBS or MUD server "
"development with example default bbs board"),
long_description=open(os.path.join(HERE, README)).read(),
Expand All @@ -103,7 +40,7 @@ def run(self):
],
},
install_requires=[
'blessed==1.9.5',
'blessed>=1.9.5,<2.0.0',
'requests==2.5.1',
'irc==11.0.1',
'sqlitedict==1.1.0',
Expand Down Expand Up @@ -172,9 +109,5 @@ def run(self):
'Topic :: Terminals :: Telnet',
'Topic :: Terminals',
],
cmdclass={
'develop': Develop,
'docs': BuildDocs,
},
zip_safe=False,
)
27 changes: 17 additions & 10 deletions x84/bbs/editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

# local
from x84.bbs.ansiwin import AnsiWindow, GLYPHSETS
from x84.bbs.session import getterminal, getch
from x84.bbs.session import getterminal
from x84.bbs.output import echo

#: default command-key mapping.
Expand Down Expand Up @@ -188,8 +188,9 @@ def read(self):
self._carriage_returned = False
self._quit = False
echo(self.refresh())
term = getterminal()
while not (self.quit or self.carriage_returned):
inp = getch()
inp = term.inkey()
echo(self.process_keystroke(inp))
echo(self._term.normal)
if not self.quit:
Expand Down Expand Up @@ -394,20 +395,25 @@ def process_keystroke(self, keystroke):
"""
self._quit = False
rstr = u''
keystroke = hasattr(keystroke, 'code') and keystroke.code or keystroke
if keystroke in self.keyset['refresh']:
if (keystroke in self.keyset['refresh'] or
keystroke.code in self.keyset['refresh']):
rstr = self.refresh()
elif keystroke in self.keyset['backspace']:
elif (keystroke in self.keyset['backspace'] or
keystroke.code in self.keyset['backspace']):
rstr = self.backspace()
elif keystroke in self.keyset['backword']:
elif (keystroke in self.keyset['backword'] or
keystroke.code in self.keyset['backword']):
rstr = self.backword()
elif keystroke in self.keyset['enter']:
elif (keystroke in self.keyset['enter'] or
keystroke.code in self.keyset['enter']):
self._carriage_returned = True
rstr = u''
elif keystroke in self.keyset['exit']:
elif (keystroke in self.keyset['exit'] or
keystroke.code in self.keyset['exit']):
self._quit = True
rstr = u''
elif isinstance(keystroke, int):
elif keystroke.is_sequence:
# could beep also, (error)
rstr = u''
else:
if ord(keystroke) >= 0x20:
Expand All @@ -423,8 +429,9 @@ def read(self):
echo(self.refresh())
self._quit = False
self._carriage_returned = False
term = getterminal()
while not (self.quit or self.carriage_returned):
inp = getch()
inp = term.inkey()
echo(self.process_keystroke(inp))
if not self.quit:
return self.content
Expand Down
32 changes: 20 additions & 12 deletions x84/bbs/lightbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# local imports
from x84.bbs.ansiwin import AnsiWindow
from x84.bbs.session import getterminal, getch
from x84.bbs.session import getterminal
from x84.bbs.output import decode_pipe, echo


Expand Down Expand Up @@ -177,7 +177,7 @@ def refresh_quick(self):
return (self.refresh_row(self.vitem_idx))
return u''

def process_keystroke(self, key):
def process_keystroke(self, keystroke):
"""
Process the keystroke and return string to refresh.
Expand All @@ -190,22 +190,29 @@ def process_keystroke(self, key):
self._vitem_lastidx = self.vitem_idx
self._vitem_lastshift = self.vitem_shift
rstr = u''
keystroke = hasattr(key, 'code') and key.code or key
if keystroke in self.keyset['home']:
if (keystroke in self.keyset['home'] or
keystroke.code in self.keyset['home']):
rstr = self.move_home()
elif keystroke in self.keyset['end']:
elif (keystroke in self.keyset['end'] or
keystroke.code in self.keyset['end']):
rstr = self.move_end()
elif keystroke in self.keyset['pgup']:
elif (keystroke in self.keyset['pgup'] or
keystroke.code in self.keyset['pgup']):
rstr = self.move_pageup()
elif keystroke in self.keyset['pgdown']:
elif (keystroke in self.keyset['pgdown'] or
keystroke.code in self.keyset['pgdown']):
rstr = self.move_pagedown()
elif keystroke in self.keyset['up']:
elif (keystroke in self.keyset['up'] or
keystroke.code in self.keyset['up']):
rstr = self.move_up()
elif keystroke in self.keyset['down']:
elif (keystroke in self.keyset['down'] or
keystroke.code in self.keyset['down']):
rstr = self.move_down()
elif keystroke in self.keyset['enter']:
elif (keystroke in self.keyset['enter'] or
keystroke.code in self.keyset['enter']):
self.selected = True
elif keystroke in self.keyset['exit']:
elif (keystroke in self.keyset['exit'] or
keystroke.code in self.keyset['exit']):
self._quit = True
return rstr

Expand All @@ -218,8 +225,9 @@ def read(self):
self._selected = False
self._quit = False
echo(self.refresh())
term = getterminal()
while not (self.selected or self.quit):
echo(self.process_keystroke(getch()))
echo(self.process_keystroke(term.inkey()))
if self.quit:
return None
return self.selection[0]
Expand Down
30 changes: 19 additions & 11 deletions x84/bbs/pager.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
""" Pager package for x/84. """
from x84.bbs.ansiwin import AnsiWindow
from x84.bbs.output import encode_pipe, decode_pipe
from x84.bbs.session import getterminal, getch
from x84.bbs.session import getterminal
from x84.bbs.output import echo

VI_KEYSET = {
Expand Down Expand Up @@ -106,22 +106,29 @@ def process_keystroke(self, keystroke):
"""
self.moved = False
rstr = u''
keystroke = hasattr(keystroke, 'code') and keystroke.code or keystroke
if keystroke in self.keyset['refresh']:
if (keystroke in self.keyset['refresh'] or
keystroke.code in self.keyset['refresh']):
rstr += self.refresh()
elif keystroke in self.keyset['up']:
elif (keystroke in self.keyset['up'] or
keystroke.code in self.keyset['up']):
rstr += self.move_up()
elif keystroke in self.keyset['down']:
elif (keystroke in self.keyset['down'] or
keystroke.code in self.keyset['down']):
rstr += self.move_down()
elif keystroke in self.keyset['home']:
elif (keystroke in self.keyset['home'] or
keystroke.code in self.keyset['home']):
rstr += self.move_home()
elif keystroke in self.keyset['end']:
elif (keystroke in self.keyset['end'] or
keystroke.code in self.keyset['end']):
rstr += self.move_end()
elif keystroke in self.keyset['pgup']:
elif (keystroke in self.keyset['pgup'] or
keystroke.code in self.keyset['pgup']):
rstr += self.move_pgup()
elif keystroke in self.keyset['pgdown']:
elif (keystroke in self.keyset['pgdown'] or
keystroke.code in self.keyset['pgdown']):
rstr += self.move_pgdown()
elif keystroke in self.keyset['exit']:
elif (keystroke in self.keyset['exit'] or
keystroke.code in self.keyset['exit']):
self._quit = True
return rstr

Expand All @@ -136,8 +143,9 @@ def read(self):
"""
self._quit = False
echo(self.refresh())
term = getterminal()
while not self.quit:
echo(self.process_keystroke(getch()))
echo(self.process_keystroke(term.inkey()))

def move_home(self):
"""
Expand Down
24 changes: 15 additions & 9 deletions x84/bbs/selector.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,30 +77,36 @@ def process_keystroke(self, keystroke):
:returns: string sequence suitable for refresh.
"""
self._moved = False
keystroke = hasattr(keystroke, 'code') and keystroke.code or keystroke
if keystroke in self.keyset['refresh']:
if (keystroke in self.keyset['refresh'] or
keystroke.code in self.keyset['refresh']):
return self.refresh()
elif keystroke in self.keyset['left']:
elif (keystroke in self.keyset['left'] or
keystroke.code in self.keyset['left']):
return self.move_left()
elif keystroke in self.keyset['right']:
elif (keystroke in self.keyset['right'] or
keystroke.code in self.keyset['right']):
return self.move_right()
elif keystroke in self.keyset['toggle']:
elif (keystroke in self.keyset['toggle'] or
keystroke.code in self.keyset['toggle']):
return self.toggle()
elif keystroke in self.keyset['exit']:
elif (keystroke in self.keyset['exit'] or
keystroke.code in self.keyset['exit']):
self._quit = True
elif keystroke in self.keyset['enter']:
elif (keystroke in self.keyset['enter'] or
keystroke.code in self.keyset['enter']):
self._selected = True
return u''

def read(self):
""" Reads input until the ENTER or ESCAPE key is pressed (Blocking). """
from x84.bbs import getch
from x84.bbs import getterminal
from x84.bbs.output import echo
self._selected = False
self._quit = False
echo(self.refresh())
term = getterminal()
while not (self.selected or self.quit):
echo(self.process_keystroke(getch()) or u'')
echo(self.process_keystroke(term.inkey()) or u'')
if self.quit:
return None
return self.selection
Expand Down
13 changes: 10 additions & 3 deletions x84/bbs/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import collections
import traceback
import logging
import pickle
import time
import imp
import sys
Expand Down Expand Up @@ -51,9 +52,11 @@ def getch(timeout=None):
and definitely never an integer. However some internal UI libraries
were built upon getch(), and as such, this remains ...
"""
# mark deprecate in v2.1; remove entirely in v3.0
# warnings.warn('getch() is deprecated, use getterminal().inkey()')
keystroke = getterminal().inkey(timeout)
# and this is the purpose for deprecation; old versions used to
# return None to indicate timeout; but it is more correct to always
# return strings, so that .lower() and such operations are always
# successful without conditional 'is None' checks.
if keystroke == u'':
return None
if keystroke.is_sequence:
Expand Down Expand Up @@ -628,7 +631,11 @@ def read_events(self, events, timeout=None):
# ask engine process for new event data,
poll = min(0.5, waitfor) or 0.01
if self.reader.poll(poll):
event, data = self.reader.recv()
try:
event, data = self.reader.recv()
except pickle.UnpicklingError as err:
self.log.error(err)
disconnect(reason='{0}'.format(err))
# it is necessary to always buffer an event, as some
# side-effects may occur by doing so. When buffer_event
# returns True, those side-effects caused no data to be
Expand Down

0 comments on commit c46a97c

Please sign in to comment.