Skip to content

Commit

Permalink
Merge branch 'hotfix/0.1.2'
Browse files Browse the repository at this point in the history
  • Loading branch information
lambdalisue committed Jan 16, 2013
2 parents 91256e2 + b209dbf commit 578a6d8
Show file tree
Hide file tree
Showing 9 changed files with 284 additions and 246 deletions.
92 changes: 43 additions & 49 deletions scripts/shareboard
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
#
# Author: lambdalisue (lambdalisue@hashnote.net)
# URL: http://hashnote.net/
# License: MIT license
# Created: 2013-01-16
#
import argparse
import socket
import requests
from shareboard.server import RequestServer
from shareboard.parser import ShellParser
from shareboard.server import RequestServer


HOST = 'localhost'
PORT = 8081
ENCODING = 'utf-8'
DEFAULT_TIMEOUT = 5.0


def is_running(host, port):
Expand All @@ -21,64 +29,48 @@ def is_running(host, port):
return False


def start_share_server(host, port, command, silent, viewer=False):
if is_running(host, port):
print "%s:%s is already taken" % (host, port)
def start(args):
if is_running(args.host, args.port):
print "%s:%s is already taken" % (args.host, args.port)
exit(1)

# Create command if it's specified
if command:
command = ShellParser(command).parse
if args.command:
command = ShellParser(args.command).parse
else:
command = None

server = RequestServer(host, port, callback=command, silent=silent)
server = RequestServer(args.host, args.port, args.encoding,
callback=command, silent=args.silent)

if not viewer:
if not args.viewer:
# simply start shareboard server
server.start()
else:
from PySide.QtNetwork import QNetworkProxyFactory
from shareboard.server import create_server_thread
from shareboard.viewer import Viewer
# Use system proxy settings
QNetworkProxyFactory.setUseSystemConfiguration(True)
# start shareboard server within QThread
server_thread = create_server_thread(server)
server_thread.start()
# start shareboard viewer
viewer = Viewer(server)
viewer.start()


def setshare(host, port, data, method='POST'):
url = 'http://%s:%s/' % (host, port)
# pass data as utf-8
params = {'data': data.encode('utf-8')}
if method == 'GET':
r = requests.get(url, params=params)
else:
r = requests.post(url, data=params)
return r
from shareboard.gui.main import start_with
start_with(server)


def getshare(host, port):
url = 'http://%s:%s/' % (host, port)
r = requests.get(url)
return r
def set(args):
url = 'http://%s:%s/' % (args.host, args.port)
kwargs = {
'data': {'text': args.text},
'timeout': args.timeout,
}
requests.post(url, **kwargs)


def main():
def start(args):
start_share_server(args.host, args.port, args.command, args.silent, args.viewer)

def set(args):
data = unicode(args.data, args.encoding)
setshare(args.host, args.port, data, args.method)
def get(args):
url = 'http://%s:%s/' % (args.host, args.port)
# text should be passed as encoded text
kwargs = {
'timeout': args.timeout,
}
res = requests.get(url, timeout=args.timeout)
print res.text

def get(args):
r = getshare(args.host, args.port)
data = r.text.encode(args.encoding)
return data

def main():
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--host', dest='host', default=HOST,
help='IP or Name of shareboard server')
Expand All @@ -101,14 +93,16 @@ def main():
# create the subparser for the 'set' command
parser_set = subparsers.add_parser('set',
help='Post new data to the shareboard')
parser_set.add_argument('data',
help='Data to be seted to the shareboard')
parser_set.add_argument('-m', '--method', default='POST', choices=['GET', 'POST'],
help='Method to communicate with the shareboard')
parser_set.add_argument('text', type=unicode,
help='Text data to be seted to the shareboard')
parser_set.add_argument('-t', '--timeout', default=DEFAULT_TIMEOUT, type=float,
help='Seconds to timeout the connection')
parser_set.set_defaults(func=set)
# create the subparser for the 'get' command
parser_get = subparsers.add_parser('get',
help='Get data from the shareboard')
parser_get.add_argument('-t', '--timeout', default=DEFAULT_TIMEOUT, type=float,
help='Seconds to timeout the connection')
parser_get.set_defaults(func=get)

args = parser.parse_args()
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
from setuptools import setup, find_packages

version = "0.1.1"
version = "0.1.2"

def read(filename):
import os.path
Expand Down
Empty file added src/shareboard/gui/__init__.py
Empty file.
55 changes: 55 additions & 0 deletions src/shareboard/gui/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
#
# Author: lambdalisue (lambdalisue@hashnote.net)
# URL: http://hashnote.net/
# License: MIT license
# Created: 2013-01-16
#
try:
from PySide import QtCore
from PySide import QtGui
except ImportError:
from PyQt4 import QtCore
from PyQt4 import QtGui

from viewer import HTMLViewer
from server import RequestServer


class MainWindow(QtGui.QMainWindow):
def __init__(self, title, parent=None):
super(MainWindow, self).__init__(parent)

self.setWindowTitle(title)

self.viewer = HTMLViewer(self)
self.setCentralWidget(self.viewer)

status = self.statusBar()
status.setSizeGripEnabled(True)


def start_with(cui_server, title='Shareboard'):
try:
import sys
app = QtGui.QApplication(sys.argv)

server = RequestServer(cui_server)
viewer = MainWindow(title)

# server -> viewer
server.request_recieved.connect(viewer.viewer.update)

server.start()
viewer.show()
sys.exit(app.exec_())
except KeyboardInterrupt:
sys.exit(0)

if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = MainWindow('Shareboard [DEBUG]')
window.show()
sys.exit(app.exec_())
30 changes: 30 additions & 0 deletions src/shareboard/gui/server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
#
# Author: lambdalisue (lambdalisue@hashnote.net)
# URL: http://hashnote.net/
# License: MIT license
# Created: 2013-01-16
#
try:
from PySide import QtCore
from PySide import QtGui
except ImportError:
from PyQt4 import QtCore
from PyQt4 import QtGui


class RequestServer(QtCore.QThread):
def __init__(self, cui_server):
super(RequestServer, self).__init__()
self.cui_server = cui_server
self.cui_server.httpd.emitter = self

def run(self):
self.cui_server.start()

def emit_request_recieved(self, value):
self.request_recieved.emit(value)

# --- signal
request_recieved = QtCore.Signal(unicode)
93 changes: 93 additions & 0 deletions src/shareboard/gui/viewer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
#
# Author: lambdalisue (lambdalisue@hashnote.net)
# URL: http://hashnote.net/
# License: MIT license
# Created: 2013-01-16
#
try:
from PySide import QtCore
from PySide import QtGui
from PySide.QtWebKit import QWebView
from PySide.QtNetwork import QNetworkProxyFactory
except ImportError:
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtWebKit import QWebView
from PyQt4.QtNetwork import QNetworkProxyFactory


# Use system proxy settings
QNetworkProxyFactory.setUseSystemConfiguration(True)


class HTMLViewer(QtGui.QWidget):
def __init__(self, parent=None):
super(HTMLViewer, self).__init__(parent)

self.view = QWebView(self)
layout = QtGui.QVBoxLayout(self)
layout.setSpacing(0)
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self.view)

# Create ContextMenu
context_menu = QtGui.QMenu(self.view)
def open_context_menu(point):
context_menu.exec_(self.view.mapToGlobal(point))
self.view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.view.customContextMenuRequested.connect(open_context_menu)

action = QtGui.QAction('&Back', self,
shortcut=QtGui.QKeySequence.Back,
statusTip="Click to go back",
triggered=self.view.back)
action.setShortcut('Backspace')
context_menu.addAction(action)

action = QtGui.QAction('&Forward', self,
shortcut=QtGui.QKeySequence.Forward,
statusTip="Click to go forward",
triggered=self.view.forward)
action.setShortcut('Shift + Backspace')
context_menu.addAction(action)

action = QtGui.QAction('&Reload', self,
shortcut=QtGui.QKeySequence.Refresh,
statusTip="Click to refresh",
triggered=self.view.reload)
context_menu.addAction(action)
context_menu.addSeparator()

action = QtGui.QAction('&Print', self,
shortcut=QtGui.QKeySequence.Print,
statusTip="Click to print",
triggered=self.print_)
context_menu.addAction(action)

def contextMenuEvent(self, event):
self.context_menu.exec_(event.globalPos())

def print_(self):
printer = QtGui.QPrinter()
printer_dialog = QtGui.QPrintDialog(printer, self.view)
if printer_dialog.exec_() != QtGui.QDialog.Accepted:
# do nothing
return
# printout the view with selected printer
self.view.print_(printer)

# --- slots
@QtCore.Slot(unicode)
def update(self, value):
# save vertical/horizontal scrollbar value
m = self.view.page().mainFrame()
v = m.scrollBarValue(QtCore.Qt.Vertical)
h = m.scrollBarValue(QtCore.Qt.Horizontal)
# set new HTML (value should be unicode)
self.view.setHtml(value)
# update vertical/horizontal scrollbar value
m = self.view.page().mainFrame()
m.setScrollBarValue(QtCore.Qt.Vertical, v)
m.setScrollBarValue(QtCore.Qt.Horizontal, h)
8 changes: 5 additions & 3 deletions src/shareboard/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ class ShellParser(object):
def __init__(self, command):
self.command = command

def parse(self, data):
def parse(self, text, encoding='utf-8'):
p = subprocess.Popen(self.command, shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
stdout, stderr = p.communicate(data.encode('utf-8'))
return unicode(stdout, 'utf-8')
# the text should be encoded to use in Shell
stdout, stderr = p.communicate(data.encode(encoding))
# the text should be decoded to use in Python
return unicode(stdout, encoding)

0 comments on commit 578a6d8

Please sign in to comment.