def project_json(app, request, project_name): # fail early if callback is invalid callback = request.args.get("callback") if callback: if not is_valid_json_callback_name(callback): raise BadRequest("invalid JSONP callback name") # Get the real project name for this project project = app.db.packaging.get_project(project_name) if project is None: raise NotFound("{} does not exist".format(project_name)) # we're looking for the latest version versions = app.db.packaging.get_project_versions(project) if not versions: raise NotFound("{} has no releases".format(project)) version = versions[0] rpc = xmlrpc.Interface(app, request) d = dict(info=rpc.release_data(project, version), urls=rpc.release_urls(project, version)) for url in d["urls"]: url["upload_time"] = url["upload_time"].strftime("%Y-%m-%dT%H:%M:%S") data = json.dumps(d, sort_keys=True) # write the JSONP extra crap if necessary if callback: data = "/**/ %s(%s);" % (callback, data) response = Response(data, mimetype="application/json") response.headers["Content-Disposition"] = "inline" return response
def project_json(app, request, project_name, version=None): # fail early if callback is invalid callback = request.args.get('callback') if callback: if not is_valid_json_callback_name(callback): raise BadRequest('invalid JSONP callback name') # Get the real project name for this project project = app.db.packaging.get_project(project_name) if project is None: raise NotFound("{} does not exist".format(project_name)) # we're looking for the latest version versions = app.db.packaging.get_project_versions(project['name']) if version is None: if not versions: raise NotFound("{} has no releases".format(project_name)) version = versions[0] elif version not in versions: raise NotFound("{} has no release {}".format(project_name, version)) rpc = xmlrpc.Interface(app, request) d = dict( info=rpc.release_data(project['name'], version), urls=rpc.release_urls(project['name'], version), releases=rpc.all_release_urls(project['name']), ) time_format = '%Y-%m-%dT%H:%M:%S' for url in d['urls']: url['upload_time'] = url['upload_time'].strftime(time_format) for release, urls in d['releases'].items(): for url in urls: url['upload_time'] = url['upload_time'].strftime(time_format) data = json.dumps(d, sort_keys=True) # write the JSONP extra crap if necessary if callback: data = '/**/ %s(%s);' % (callback, data) serial = app.db.packaging.get_last_serial() response = Response(data, mimetype="application/json") response.headers['Content-Disposition'] = 'inline' response.headers.add("X-PyPI-Last-Serial", serial) return response
def test_is_valid_json_callback_name(callback, expected): assert is_valid_json_callback_name(callback) == expected