Skip to content

Commit

Permalink
Parse args for features / datasources of interest
Browse files Browse the repository at this point in the history
 * A start on #101
  • Loading branch information
arlolra committed Jan 12, 2016
1 parent ec261f4 commit 977abab
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 12 deletions.
3 changes: 2 additions & 1 deletion ores/score_processors/score_processor.py
Expand Up @@ -161,7 +161,8 @@ def _score(self, context, model, rev_ids, caches=None):
try:
score = self._process(context, model, cache)
scores[rev_id] = score
self._store(context, model, rev_id, score)
if caches is None:
self._store(context, model, rev_id, score)
except Exception as error:
scores[rev_id] = {'error': jsonify_error(error)}

Expand Down
40 changes: 29 additions & 11 deletions ores/wsgi/routes/scores.py
Expand Up @@ -7,6 +7,8 @@
from ... import errors
from ..util import ParamError, read_bar_split_param

import json


def configure(config, bp, score_processor):

Expand Down Expand Up @@ -105,27 +107,43 @@ def score_revisions(context, model):
return jsonify(scores)

# /scores/enwiki/reverted/4567890
@bp.route("/scores/<context>/<model>/<int:rev_id>/", methods=["GET"])
@bp.route("/scores/<context>/<model>/<int:rev_id>/", methods=["GET", "POST"])
def score_revision(context, model, rev_id):

# Check to see if we have the context available in our score_processor
if context not in score_processor:
return responses.not_found("No models available for {0}"
.format(context))

precache = "precache" in request.args

# If the model exists, score revisions with it and return the result
if model not in score_processor[context]:
return responses.not_found("Model '{0}' not available for {1}."
.format(model, context))
else:
try:
scores = score_processor.score(context, model, [rev_id],
precache=precache)
except errors.ScoreProcessorOverloaded:
return responses.server_overloaded()

return jsonify(scores)
params = {}
# Parse values for features / datasources of interest.
try:
for k, v in request.values.items():
if k.startswith(("feature.", "datasource.")):
depth = params
path = k.split(".")
last = len(path) - 1
for i, key in enumerate(path):
if i == last:
depth[key] = json.loads(v)
else:
depth = depth.setdefault(key, {})
except Exception as e:
return responses.bad_request("Unabled to parse params: {0}"
.format(e))

precache = ("precache" in request.args) and (len(params) == 0)

try:
scores = score_processor.score(context, model, [rev_id],
caches=params, precache=precache)
except errors.ScoreProcessorOverloaded:
return responses.server_overloaded()

return jsonify(scores)

return bp

0 comments on commit 977abab

Please sign in to comment.