Skip to content

Commit

Permalink
Merge pull request openfusion-dev#33 from dmtucker/next
Browse files Browse the repository at this point in the history
Create ogre.cli from ogre.__main__
  • Loading branch information
dmtucker committed Aug 24, 2016
2 parents e0a6f0c + 2ba6553 commit e6e95a1
Show file tree
Hide file tree
Showing 5 changed files with 182 additions and 147 deletions.
2 changes: 1 addition & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
graft ogre
global-exclude *.py[cod] __pycache__
include LICENSE
graft ogre
146 changes: 5 additions & 141 deletions ogre/__main__.py
Original file line number Diff line number Diff line change
@@ -1,145 +1,9 @@
"""
Make queries using OGRe directly.
# coding: utf-8

See https://ogre.readthedocs.org/en/latest/ for more information.
"""
"""This module defines the behavior of python -m."""

import argparse
import json
import logging
import os
from ogre import OGRe
from __future__ import absolute_import

import ogre.cli

def main():

"""Process arguments and invoke OGRe to fetch some data."""

parser = argparse.ArgumentParser(description="OpenFusion GeoJSON Retriever")
parser.add_argument(
"--keys",
help="Specify API keys.",
default=None,
)
parser.add_argument(
"-s", "--sources",
help="Specify public APIs to get content from (required)." +
" 'Twitter' is currently the only supported source.",
action="append",
required=True,
)
parser.add_argument(
"-m", "--media",
help="Specify content mediums to fetch." +
" 'image', 'sound', 'text', and 'video' are supported.",
default=None,
action="append",
)
parser.add_argument(
"-k", "--keyword",
help="Specify search criteria.",
default="",
)
parser.add_argument(
"-q", "--quantity",
help="Specify a quota of results to fetch.",
type=int,
default=15,
)
parser.add_argument(
"-l", "--location",
help="Specify a place (latitude, longitude, radius, unit) to search." +
" 'km' and 'mi' are supported units.",
default=None,
nargs=4,
)
parser.add_argument(
"-i", "--interval",
help="Specify a period of time (earliest, latest) to search." +
" Each moment should be a POSIX timestamp.",
default=None,
nargs=2,
)
parser.add_argument(
"--hard",
help="Fail hard (Raise exceptions instead of returning empty).",
action="store_true",
default=False,
)
parser.add_argument(
"--insecure",
help="Prefer HTTP.",
action="store_true",
default=False,
)
parser.add_argument(
"--limit",
help="Specify a query limit.",
default=None,
)
parser.add_argument(
"--log",
help="Specify a log level.",
default=None,
)
parser.add_argument(
"--strict",
help="Ensure resulting media is specifically requested.",
action="store_true",
default=False,
)
args = parser.parse_args()

if args.keys is not None:
args.keys = json.loads(args.keys)
else:
args.keys = {
"Twitter": {
"consumer_key": os.environ.get("TWITTER_CONSUMER_KEY"),
"access_token": os.environ.get("TWITTER_ACCESS_TOKEN"),
},
}
if args.media is None:
args.media = ("image", "sound", "text", "video")
if args.location is not None:
args.location[0] = float(args.location[0])
args.location[1] = float(args.location[1])
args.location[2] = float(args.location[2])
if args.interval is not None:
args.interval[0] = float(args.interval[0])
args.interval[1] = float(args.interval[1])
if args.limit is not None:
args.limit = int(args.limit)
if args.log is not None:
args.log = getattr(logging, args.log.upper())
else:
args.log = logging.WARN

logging.basicConfig(
level=args.log,
format="%(asctime)s.%(msecs)03d %(name)s %(levelname)s: %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)

print(
json.dumps(
OGRe(args.keys).fetch(
sources=args.sources,
media=args.media,
keyword=args.keyword,
quantity=args.quantity,
location=args.location,
interval=args.interval,
fail_hard=args.hard,
query_limit=args.limit,
secure=args.insecure,
strict_media=args.strict,
),
indent=4,
separators=(",", ": "),
),
)


if __name__ == "__main__":
main()
ogre.cli.main()
150 changes: 150 additions & 0 deletions ogre/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
"""
Make queries using OGRe directly.
See https://ogre.readthedocs.org/en/latest/ for more information.
"""

import argparse
import json
import logging
import os
import sys

from ogre import OGRe


def cli(parser=None):
"""Define a CLI."""
if parser is None:
parser = argparse.ArgumentParser(description="OpenFusion GeoJSON Retriever")
parser.add_argument(
"--keys",
help="Specify API keys.",
default=None,
)
parser.add_argument(
"-s", "--sources",
help="Specify public APIs to get content from (required)." +
" 'Twitter' is currently the only supported source.",
action="append",
required=True,
)
parser.add_argument(
"-m", "--media",
help="Specify content mediums to fetch." +
" 'image', 'sound', 'text', and 'video' are supported.",
default=None,
action="append",
)
parser.add_argument(
"-k", "--keyword",
help="Specify search criteria.",
default="",
)
parser.add_argument(
"-q", "--quantity",
help="Specify a quota of results to fetch.",
type=int,
default=15,
)
parser.add_argument(
"-l", "--location",
help="Specify a place (latitude, longitude, radius, unit) to search." +
" 'km' and 'mi' are supported units.",
default=None,
nargs=4,
)
parser.add_argument(
"-i", "--interval",
help="Specify a period of time (earliest, latest) to search." +
" Each moment should be a POSIX timestamp.",
default=None,
nargs=2,
)
parser.add_argument(
"--hard",
help="Fail hard (Raise exceptions instead of returning empty).",
action="store_true",
default=False,
)
parser.add_argument(
"--insecure",
help="Prefer HTTP.",
action="store_true",
default=False,
)
parser.add_argument(
"--limit",
help="Specify a query limit.",
default=None,
)
parser.add_argument(
"--log",
help="Specify a log level.",
default=None,
)
parser.add_argument(
"--strict",
help="Ensure resulting media is specifically requested.",
action="store_true",
default=False,
)
return parser


def main(argv=None):
"""Process arguments and invoke OGRe to fetch some data."""

if argv is None:
argv = sys.argv[1:]
args = cli().parse_args(argv)

if args.keys is not None:
args.keys = json.loads(args.keys)
else:
args.keys = {
"Twitter": {
"consumer_key": os.environ.get("TWITTER_CONSUMER_KEY"),
"access_token": os.environ.get("TWITTER_ACCESS_TOKEN"),
},
}
if args.media is None:
args.media = ("image", "sound", "text", "video")
if args.location is not None:
args.location[0] = float(args.location[0])
args.location[1] = float(args.location[1])
args.location[2] = float(args.location[2])
if args.interval is not None:
args.interval[0] = float(args.interval[0])
args.interval[1] = float(args.interval[1])
if args.limit is not None:
args.limit = int(args.limit)
if args.log is not None:
args.log = getattr(logging, args.log.upper())
else:
args.log = logging.WARN

logging.basicConfig(
level=args.log,
format="%(asctime)s.%(msecs)03d %(name)s %(levelname)s: %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)

print(
json.dumps(
OGRe(args.keys).fetch(
sources=args.sources,
media=args.media,
keyword=args.keyword,
quantity=args.quantity,
location=args.location,
interval=args.interval,
fail_hard=args.hard,
query_limit=args.limit,
secure=args.insecure,
strict_media=args.strict,
),
indent=4,
separators=(",", ": "),
),
)
23 changes: 23 additions & 0 deletions ogre/test/test_cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# coding: utf-8

"""Tests for ogre.cli"""

from __future__ import absolute_import

import pytest

import ogre.cli


def test___main__():
"""Test python -m functionality."""
with pytest.raises(SystemExit) as excinfo:
import ogre.__main__ # pylint: disable=redefined-outer-name, unused-variable
assert excinfo.value != 0


def test_empty():
"""Test invocation with no arguments."""
with pytest.raises(SystemExit) as excinfo:
ogre.cli.main()
assert excinfo.value != 0
8 changes: 3 additions & 5 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,17 @@
author_email='dmtucker@ucsc.edu',
license='LGPLv2+',
url='https://github.com/dmtucker/ogre',
packages=find_packages(exclude=['contrib', 'docs', 'tests']),
packages=find_packages(exclude=['docs']),
include_package_data=True,
test_suite="ogre.test",
install_requires=[
'mock ~= 1.0.1',
'twython ~= 3.4',
],
entry_points={'console_scripts': ['ogre = ogre.__main__:main']},
entry_points={'console_scripts': ['ogre = ogre.cli:main']},
keywords='OpenFusion Twitter GeoJSON geotag',
classifiers=[
'License :: OSI Approved :: '
'GNU Lesser General Public License v2 or later (LGPLv2+)',
'Intended Audience :: Developers',
'License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
Expand Down

0 comments on commit e6e95a1

Please sign in to comment.