Skip to content

Commit

Permalink
Merge e19d51a into 8d3771f
Browse files Browse the repository at this point in the history
  • Loading branch information
dschep committed Jan 16, 2016
2 parents 8d3771f + e19d51a commit 3429241
Show file tree
Hide file tree
Showing 8 changed files with 117 additions and 44 deletions.
5 changes: 3 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ python:
- '3.5'
- pypy
install:
- pip install .
script: ntfy -v
- pip install coveralls
script: coverage run --source=ntfy setup.py test
after_success: coveralls
deploy:
- provider: pypi
distributions: sdist bdist_wheel
Expand Down
9 changes: 9 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,12 @@ Example Config
"backends": ["pushbullet"],
"pushbullet": {"access_token": "<redacted>"}
}

Testing
~~~~~~~
Tests require the mock library and are standare python unittest tests

::

pip install mock
python -m unittest tests
5 changes: 4 additions & 1 deletion ntfy/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
import pkg_resources
__version__ = pkg_resources.get_distribution(__name__).version
try:
__version__ = pkg_resources.get_distribution(__name__).version
except:
__version__ = 'unknown'
84 changes: 44 additions & 40 deletions ntfy/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from importlib import import_module
from socket import gethostname
from subprocess import call
from sys import stderr, exit
from sys import stderr, exit, argv
from time import time

from requests import HTTPError
Expand All @@ -16,9 +16,10 @@
def load_config(args):
try:
config = json.load(open(expanduser(args.config)))
except IOError:
except Exception as e:
stderr.write(
"Warning: Couldn't open config file '{.config}'.\n".format(args))
"Warning: there was a problem loading {.config} ({})".format(
args, e))
config = {'backends': ['default']}

if 'backend' in config:
Expand Down Expand Up @@ -63,43 +64,46 @@ def send_notification(message, args, config):

return ret


def main():
parser = argparse.ArgumentParser(
description='Send push notification when command finishes')

parser.add_argument('-c', '--config',
default='~/.ntfy.json',
help='config file to use (default: ~/.ntfy.json)')
parser.add_argument('-b', '--backend', action='append',
help='override backend specified in config')
parser.add_argument('-o', '--option', nargs=2, action='append',
metavar=('key', 'value'), default=[],
help='backend specific options')
parser.add_argument('-v', '--version', action='version',
version=__version__)

default_title = '{}@{}'.format(getuser(), gethostname())

parser.add_argument('-t', '--title', default=default_title,
help='a title for the notification (default: {})'
.format(default_title))
parser.add_argument('-d', '--device', help='device to notify')

subparsers = parser.add_subparsers()

send_parser = subparsers.add_parser('send', help='send a notification')
send_parser.add_argument('message',
help='notification message')
send_parser.set_defaults(func=lambda args: args.message)

done_parser = subparsers.add_parser(
'done', help='run a command and send a notification when done')
done_parser.add_argument('command',
nargs=argparse.REMAINDER,
help='command to run')
done_parser.set_defaults(func=run_cmd)
args = parser.parse_args()
parser = argparse.ArgumentParser(
description='Send push notification when command finishes')

parser.add_argument('-c', '--config',
default='~/.ntfy.json',
help='config file to use (default: ~/.ntfy.json)')
parser.add_argument('-b', '--backend', action='append',
help='override backend specified in config')
parser.add_argument('-o', '--option', nargs=2, action='append',
metavar=('key', 'value'), default=[],
help='backend specific options')
parser.add_argument('-v', '--version', action='version',
version=__version__)

default_title = '{}@{}'.format(getuser(), gethostname())

parser.add_argument('-t', '--title', default=default_title,
help='a title for the notification (default: {})'
.format(default_title))
parser.add_argument('-d', '--device', help='device to notify')

subparsers = parser.add_subparsers()

send_parser = subparsers.add_parser('send', help='send a notification')
send_parser.add_argument('message',
help='notification message')
send_parser.set_defaults(func=lambda args: args.message)

done_parser = subparsers.add_parser(
'done', help='run a command and send a notification when done')
done_parser.add_argument('command',
nargs=argparse.REMAINDER,
help='command to run')
done_parser.set_defaults(func=run_cmd)

def main(cli_args=None):
if cli_args is not None:
args = parser.parse_args(cli_args)
else:
args = parser.parse_args()

config = load_config(args)

Expand Down
5 changes: 4 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
from os import environ

deps = ['requests', 'sleekxmpp']

if platform == 'win32':
deps.append('pypiwin32')
test_deps = ['mock']

try:
version_output = check_output(['git', 'describe',
Expand Down Expand Up @@ -61,6 +61,9 @@

install_requires=deps,

tests_require=test_deps,
test_suite='tests',

entry_points={
'console_scripts': [
'ntfy = ntfy.cli:main',
Expand Down
Empty file added tests/__init__.py
Empty file.
28 changes: 28 additions & 0 deletions tests/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from os import devnull
from unittest import TestCase, main
from sys import version_info

from mock import patch, mock_open

from ntfy.cli import load_config, parser


py = version_info.major

class TestLoadConfig(TestCase):

@patch('ntfy.cli.stderr')
def test_default_config(self, *mocks):
config = load_config(parser.parse_args(['-c', devnull, 'send', '']))
self.assertEqual(config, {'backends': ['default']})

@patch(('__builtin__' if py == 2 else 'builtins') +'.open', mock_open())
@patch('ntfy.cli.json.load', lambda x: {'backend': 'foobar'})
def test_backwards_compat(self, *mocks):
config = load_config(parser.parse_args(['-c', devnull, 'send', '']))
self.assertIn('backends', config)
self.assertEqual(config['backends'], ['foobar'])


if __name__ == '__main__':
main()
25 changes: 25 additions & 0 deletions tests/integration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from os import devnull
from unittest import TestCase, main
from sys import version_info

from mock import patch, mock_open, MagicMock

from ntfy.cli import main as ntfy_main


py = version_info.major

class TestIntegration(TestCase):
@patch(('__builtin__' if py == 2 else 'builtins') +'.open', mock_open())
@patch('ntfy.cli.json.load')
@patch('ntfy.backends.pushover.requests.post')
def test_pushover(self, mock_jsonload, mock_post):
mock_jsonload.return_value = {
'backends': ['pushover'],
'pushover': {'user_key': MagicMock()},
}
ntfy_main(['send', 'foobar'])


if __name__ == '__main__':
main()

0 comments on commit 3429241

Please sign in to comment.