Skip to content

Commit

Permalink
Respond to feedback: convert hello request missed before
Browse files Browse the repository at this point in the history
  • Loading branch information
sadielbartholomew committed Feb 8, 2019
1 parent 98325ed commit c6f40f5
Showing 1 changed file with 47 additions and 44 deletions.
91 changes: 47 additions & 44 deletions lib/python/rosie/ws.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@
RosieDiscoServiceRoot - discovery service root web page request handler.
RosieDiscoService - discovery service request handler for a given prefix.
Sub-classes (for handling API points):
QueryHandler - inherits from RosieDiscoService, overrides HTTP GET method
SearchHandler - inherits from RosieDiscoService, overrides HTTP GET method
Sub-classes, for handling API points by inheriting from RosieDiscoService:
QueryHandler - overrides HTTP GET method to
SearchHandler - overrides HTTP GET method to
HelloHandler - overrides HTTP GET method to
"""

Expand Down Expand Up @@ -101,11 +102,14 @@ def __init__(self, *args, **kwargs):
})
handler = (service_root + key + r"/?$", RosieDiscoService,
prefix_class_args)
s_handler = (service_root + key + r"/search?(.*)",
hello_handler = (service_root + key + r"/hello/?$",
HelloHandler, prefix_class_args)
search_handler = (service_root + key + r"/search?(.*)",
SearchHandler, prefix_class_args)
q_handler = (service_root + key + r"/query?(.*)",
query_handler = (service_root + key + r"/query?(.*)",
QueryHandler, prefix_class_args)
prefix_handlers.extend([handler, s_handler, q_handler])
prefix_handlers.extend(
[handler, hello_handler, search_handler, query_handler])

handlers = [root_handler] + prefix_handlers
settings = dict(
Expand Down Expand Up @@ -170,16 +174,6 @@ def initialize(self, props, prefix, db_url, root_service_url):
self.dao = rosie.db.DAO(db_url)
self.root_service_url = root_service_url

# Arguments for API points and formatting
self.q_args = self.get_arguments("q")
self.s_args = self.get_arguments("s")
# Need to provide a default, else get MissingArgumentError w/ no arg:
self.format = self.get_argument("format", default=None)

def __call__(self):
"""Dummy."""
pass

# Decorator to ensure there is a trailing slash since buttons for keys
# otherwise go to wrong URLs for "/rosie/key" (e.g. -> "rosie/query?...")
@tornado.web.addslash
Expand All @@ -193,30 +187,19 @@ def get(self, *_):
except rosie.db.RosieDatabaseConnectError as exc:
raise tornado.web.HTTPError(404, str(exc))

def hello(self, format=None):
"""Say Hello on success."""
if self.get_current_user():
data = self.HELLO % self.get_current_user()
else:
data = self.HELLO % "user"
if self.format == "json":
self.write(json.dumps(data))
return
return data

def get_known_keys(self, format=None):
"""Return the names of the common fields."""
if self.format == "json":
if self.get_argument("format", default=None) == "json":
self.write(json.dumps(self.dao.get_known_keys()))

def get_query_operators(self, format=None):
"""Return the allowed query operators."""
if self.format == "json":
if self.get_argument("format", default=None) == "json":
self.write(json.dumps(self.dao.get_query_operators()))

def get_optional_keys(self, format=None):
"""Return the names of the optional fields."""
if self.format == "json":
if self.get_argument("format", default=None) == "json":
self.write(json.dumps(self.dao.get_optional_keys()))

def _render(self, all_revs=0, data=None, filters=None, s=None):
Expand Down Expand Up @@ -246,33 +229,51 @@ def _render(self, all_revs=0, data=None, filters=None, s=None):
)


class HelloHandler(RosieDiscoService):

"""Writes a 'Hello' message to the current logged-in user, else 'user'."""

def get(self):
"""Say Hello on success."""
if self.get_current_user():
data = self.HELLO % self.get_current_user()
else:
data = self.HELLO % "user"
if self.get_argument("format", default=None) == "json":
self.write(json.dumps(data))
else:
return self.write(data)


class SearchHandler(RosieDiscoService):

"""Serves a query of the database on the page of a given prefix."""
"""Serves a search of the database on the page of a given prefix."""

def get(self, _, all_revs=0, format=None):
"""Search database for rows with data matching the query string."""
def get(self, _, all_revs=0):
"""Search database for rows with data matching the search string."""
all_revs = int(all_revs)
data = self.dao.search(self.s_args, all_revs)
if self.format == "json":
s_args = self.get_arguments("s")
data = self.dao.search(s_args, all_revs)
if self.get_argument("format", default=None) == "json":
self.write(json.dumps(data))
return
self._render(all_revs, data, s=self.s_args)
self._render(all_revs, data, s=s_args)


class QueryHandler(RosieDiscoService):

"""Serves a search of the database on the page of a given prefix."""
"""Serves a query of the database on the page of a given prefix."""

def get(self, _, all_revs=0, format=None):
def get(self, _, all_revs=0):
"""Search database for rows with data matching the query string."""
all_revs = int(all_revs)
q_args = self.get_arguments("q")
filters = []
if not isinstance(self.q_args, list):
self.q_args = [self.q_args]
filters = [self._query_parse_string(q_str) for q_str in self.q_args]
if not isinstance(q_args, list):
q_args = [q_args]
filters = [self._query_parse_string(q_str) for q_str in q_args]
data = self.dao.query(filters, all_revs)
if self.format == "json":
if self.get_argument("format", default=None) == "json":
self.write(json.dumps(data))
return
self._render(all_revs, data, filters=filters)
Expand Down Expand Up @@ -304,11 +305,13 @@ def main():
arg_msg = "ad-hoc web service server"
# No value req for Boolean options e.g. --start equivalent to --start=True
define("start", type=bool, default=False,
help="start %s (on specified port, else on port 8080)" % arg_msg)
help="start %s (on specified port, else on port %s)" % (
arg_msg, DEFAULT_PORT))
define("port", type=int, default=DEFAULT_PORT, help="port to listen on")
define("stop", type=bool, default=False, help="stop %s" % arg_msg)
define("non-interactive", type=bool, default=False,
help="to stop %s w/o prompting" % arg_msg)
define("port", type=int, default=DEFAULT_PORT, help="port to listen on")

parse_command_line()

httpserver = tornado.httpserver.HTTPServer(app)
Expand Down

0 comments on commit c6f40f5

Please sign in to comment.