diff --git a/.gitignore b/.gitignore index 1418837..57c431b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ node_modules/ sass/scss *.egg-info/ build/ +.cache/ +.env/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7ab02e1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,4 @@ +3.1.0 +===== + +* Start a changelog diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ad785e5 --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +include Makefile.config +-include Makefile.custom.config + +all: install lint check-outdated run-debug + +install: + test -d $(VENV) || virtualenv $(VENV) + $(PIP) install --upgrade --no-cache pip setuptools -e .[lint] devcore + +clean: + rm -fr $(VENV) + rm -fr *.egg-info + +lint: + $(PYTEST) --flake8 -m flake8 $(PROJECT_NAME) + $(PYTEST) --isort -m isort $(PROJECT_NAME) + +check-outdated: + $(PIP) list --outdated --format=columns + +run-debug: + sleep 0.5 && $(BROWSER) http://localhost:1212& + $(PYTHON) ./butterfly.server.py --port=1212 --unsecure --debug + +release: + git pull + $(eval VERSION := $(shell PROJECT_NAME=$(PROJECT_NAME) $(VENV)/bin/devcore bump $(LEVEL))) + git commit -am "Bump $(VERSION)" + git tag $(VERSION) + $(PYTHON) setup.py sdist bdist_wheel upload + git push + git push --tags diff --git a/Makefile.config b/Makefile.config new file mode 100644 index 0000000..a21c304 --- /dev/null +++ b/Makefile.config @@ -0,0 +1,7 @@ +PROJECT_NAME = butterfly + +# Python env +VENV = $(PWD)/.env +PIP = $(VENV)/bin/pip +PYTHON = $(VENV)/bin/python +PYTEST = $(VENV)/bin/py.test diff --git a/butterfly/__init__.py b/butterfly/__init__.py index d9e19d4..c467b88 100644 --- a/butterfly/__init__.py +++ b/butterfly/__init__.py @@ -22,15 +22,6 @@ import tornado.options import tornado.web from logging import getLogger -try: - import pkg_resources -except ImportError: - __version__ = "pkg_resources not found on PYTHON_PATH" -else: - try: - __version__ = pkg_resources.require('butterfly')[0].version - except pkg_resources.DistributionNotFound: - __version__ = "butterfly is not installed" log = getLogger('butterfly') @@ -86,4 +77,4 @@ if hasattr(tornado.options.options, 'debug'): if tornado.options.options.uri_root_path else '') ) - import butterfly.routes + import butterfly.routes # noqa: F401 diff --git a/butterfly/bin/cat.py b/butterfly/bin/cat.py index d7c59ba..41643b3 100644 --- a/butterfly/bin/cat.py +++ b/butterfly/bin/cat.py @@ -1,11 +1,12 @@ #!/usr/bin/env python -import sys -import os +import argparse import base64 import mimetypes +import os import subprocess +import sys + from butterfly.escapes import image -import argparse parser = argparse.ArgumentParser(description='Butterfly cat wrapper.') parser.add_argument('-o', action="store_true", diff --git a/butterfly/bin/colors.py b/butterfly/bin/colors.py index fe9826e..6bbee70 100644 --- a/butterfly/bin/colors.py +++ b/butterfly/bin/colors.py @@ -2,7 +2,8 @@ import argparse import sys -parser = argparse.ArgumentParser(description='Butterfly terminal color tester.') +parser = argparse.ArgumentParser( + description='Butterfly terminal color tester.') parser.add_argument( '--colors', default='16', diff --git a/butterfly/bin/help.py b/butterfly/bin/help.py index 3f3a6e7..faf5605 100644 --- a/butterfly/bin/help.py +++ b/butterfly/bin/help.py @@ -1,11 +1,11 @@ #!/usr/bin/env python +import base64 +import os +import subprocess + +import butterfly from butterfly.escapes import image from butterfly.utils import ansi_colors -import os -import butterfly -import base64 -import shutil -import subprocess print(ansi_colors.white + "Welcome to the butterfly help." + ansi_colors.reset) path = os.getenv('BUTTERFLY_PATH') @@ -58,7 +58,6 @@ Butterfly is a xterm compliant terminal built with python and javascript. code=ansi_colors.light_yellow, comment=ansi_colors.light_magenta, reset=ansi_colors.reset, - rcol=int(subprocess.check_output(['stty','size']).split()[1]) - 31, + rcol=int(subprocess.check_output(['stty', 'size']).split()[1]) - 31, main=os.path.normpath(os.path.join( - os.path.abspath(os.path.dirname(butterfly.__file__)), - 'sass')))) + os.path.abspath(os.path.dirname(butterfly.__file__)), 'sass')))) diff --git a/butterfly/bin/html.py b/butterfly/bin/html.py index c033bab..4c5610f 100644 --- a/butterfly/bin/html.py +++ b/butterfly/bin/html.py @@ -1,9 +1,10 @@ #!/usr/bin/env python -from butterfly.escapes import html import argparse import fileinput import sys +from butterfly.escapes import html + parser = argparse.ArgumentParser( description="Butterfly html converter.\n\n" "Output in html standard input.\n" diff --git a/butterfly/bin/open.py b/butterfly/bin/open.py index aab2a13..447311a 100644 --- a/butterfly/bin/open.py +++ b/butterfly/bin/open.py @@ -1,7 +1,14 @@ #!/usr/bin/env python +import argparse import os import webbrowser -import argparse + +try: + from urllib.parse import urlparse, parse_qs, urlencode, urlunparse +except ImportError: + from urlparse import urlparse, parse_qs, urlunparse + from urllib import urlencode + parser = argparse.ArgumentParser(description='Butterfly tab opener.') parser.add_argument( @@ -11,6 +18,10 @@ parser.add_argument( help='Directory to open the new tab in. (Defaults to current)') args = parser.parse_args() -url = '%swd%s' % (os.getenv('LOCATION', '/'), os.path.abspath(args.location)) +url_parts = urlparse(os.getenv('LOCATION', '/')) +query = parse_qs(url_parts.query) +query['path'] = os.path.abspath(args.location) + +url = urlunparse(url_parts._replace(path='')._replace(query=urlencode(query))) if not webbrowser.open(url): print('Unable to open browser, please go to %s' % url) diff --git a/butterfly/bin/session.py b/butterfly/bin/session.py index 470b080..47fcc31 100644 --- a/butterfly/bin/session.py +++ b/butterfly/bin/session.py @@ -1,7 +1,7 @@ #!/usr/bin/env python +import argparse import os import webbrowser -import argparse parser = argparse.ArgumentParser(description='Butterfly session opener.') parser.add_argument( diff --git a/butterfly/escapes.py b/butterfly/escapes.py index bd0f7f7..01f58cf 100644 --- a/butterfly/escapes.py +++ b/butterfly/escapes.py @@ -1,8 +1,9 @@ -from contextlib import contextmanager -from butterfly.utils import ansi_colors as colors import sys -import termios import tty +from contextlib import contextmanager + +import termios +from butterfly.utils import ansi_colors as colors # noqa: F401 @contextmanager diff --git a/butterfly/pam.py b/butterfly/pam.py index cd6fb55..cfc8934 100644 --- a/butterfly/pam.py +++ b/butterfly/pam.py @@ -133,9 +133,9 @@ class PAM(): if isinstance(service, str): service = service.encode(encoding) else: - if isinstance(username, unicode): + if isinstance(username, unicode): # noqa: F821 username = username.encode(encoding) - if isinstance(service, unicode): + if isinstance(service, unicode): # noqa: F821 service = service.encode(encoding) if b'\x00' in username or b'\x00' in service: diff --git a/butterfly/routes.py b/butterfly/routes.py index d913c09..87eef17 100644 --- a/butterfly/routes.py +++ b/butterfly/routes.py @@ -30,7 +30,7 @@ import tornado.options import tornado.process import tornado.web import tornado.websocket -from butterfly import Route, __version__, url, utils +from butterfly import Route, url, utils from butterfly.terminal import Terminal diff --git a/butterfly/terminal.py b/butterfly/terminal.py index 4817142..f6ed9b9 100644 --- a/butterfly/terminal.py +++ b/butterfly/terminal.py @@ -24,14 +24,16 @@ import signal import string import struct import sys -import termios +from logging import getLogger + import tornado.ioloop import tornado.options import tornado.process import tornado.web import tornado.websocket -from logging import getLogger -from butterfly import utils, __version__ + +import termios +from butterfly import __version__, utils log = getLogger('butterfly') ioloop = tornado.ioloop.IOLoop.instance() diff --git a/butterfly/utils.py b/butterfly/utils.py index 3341bc0..3bf8645 100644 --- a/butterfly/utils.py +++ b/butterfly/utils.py @@ -18,13 +18,13 @@ import os import pwd -import time -import sys -import struct -from logging import getLogger -from collections import namedtuple -import subprocess import re +import struct +import subprocess +import sys +import time +from collections import namedtuple +from logging import getLogger log = getLogger('butterfly') @@ -294,11 +294,12 @@ def get_wtmp_file(): if os.path.exists(file): return file + UTmp = namedtuple( - 'UTmp', - ['type', 'pid', 'line', 'id', 'user', 'host', - 'exit0', 'exit1', 'session', - 'sec', 'usec', 'addr0', 'addr1', 'addr2', 'addr3', 'unused']) + 'UTmp', + ['type', 'pid', 'line', 'id', 'user', 'host', + 'exit0', 'exit1', 'session', + 'sec', 'usec', 'addr0', 'addr1', 'addr2', 'addr3', 'unused']) def utmp_line(id, type, pid, fd, user, host, ts): diff --git a/coffees/ext/new_term.coffee b/coffees/ext/new_term.coffee index 2b1f488..ece7111 100644 --- a/coffees/ext/new_term.coffee +++ b/coffees/ext/new_term.coffee @@ -1,4 +1,4 @@ document.addEventListener 'keydown', (e) -> return true unless e.altKey and e.keyCode is 79 - open(location.href) + open(location.origin) cancel e diff --git a/setup.cfg b/setup.cfg index 2a9acf1..0760cc2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,7 @@ [bdist_wheel] universal = 1 + +[tool:pytest] +flake8-ignore = + *.py E731 E402 + butterfly/bin/help.py E501 diff --git a/setup.py b/setup.py index 575dba4..69874a5 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,8 @@ setup( install_requires=["tornado>=3.2", "pyOpenSSL"], extras_require={ 'themes': ["libsass"], - 'systemd': ['tornado_systemd'] + 'systemd': ['tornado_systemd'], + 'lint': ['pytest', 'pytest-flake8', 'pytest-isort'] }, package_data={ 'butterfly': [