Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

error response #17

Merged
merged 2 commits into from
Jun 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
212 changes: 106 additions & 106 deletions openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -298,97 +298,6 @@
}
}
},
"OptimadeProvider": {
"title": "OptimadeProvider",
"required": [
"name",
"description",
"prefix"
],
"type": "object",
"properties": {
"name": {
"title": "Name",
"type": "string",
"description": "a short name for the database provider"
},
"description": {
"title": "Description",
"type": "string",
"description": "a longer description of the database provider"
},
"prefix": {
"title": "Prefix",
"type": "string",
"description": "database-provider-specific prefix as found in Appendix 1."
},
"homepage": {
"title": "Homepage",
"anyOf": [
{
"minLength": 1,
"maxLength": 65536,
"type": "string",
"format": "uri"
},
{
"title": "Link",
"type": "object",
"properties": {
"href": {
"title": "Href",
"minLength": 1,
"maxLength": 65536,
"type": "string",
"format": "uri"
},
"meta": {
"title": "Meta",
"type": "object"
}
},
"required": [
"href"
]
}
],
"description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to homepage of the database provider, either directly as a string, or as a link object."
},
"index_base_url": {
"title": "Index_Base_Url",
"anyOf": [
{
"minLength": 1,
"maxLength": 65536,
"type": "string",
"format": "uri"
},
{
"title": "Link",
"type": "object",
"properties": {
"href": {
"title": "Href",
"minLength": 1,
"maxLength": 65536,
"type": "string",
"format": "uri"
},
"meta": {
"title": "Meta",
"type": "object"
}
},
"required": [
"href"
]
}
],
"description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to the base URL for the `index` meta-database as specified in Appendix 1, either directly as a string, or as a link object."
}
},
"description": "Stores information on the database provider of the\n implementation."
},
"Links": {
"title": "Links",
"type": "object",
Expand Down Expand Up @@ -678,6 +587,112 @@
}
}
},
"OptimadeProvider": {
"title": "OptimadeProvider",
"required": [
"name",
"description",
"prefix"
],
"type": "object",
"properties": {
"name": {
"title": "Name",
"type": "string",
"description": "a short name for the database provider"
},
"description": {
"title": "Description",
"type": "string",
"description": "a longer description of the database provider"
},
"prefix": {
"title": "Prefix",
"type": "string",
"description": "database-provider-specific prefix as found in Appendix 1."
},
"homepage": {
"title": "Homepage",
"anyOf": [
{
"minLength": 1,
"maxLength": 65536,
"type": "string",
"format": "uri"
},
{
"title": "Link",
"type": "object",
"properties": {
"href": {
"title": "Href",
"minLength": 1,
"maxLength": 65536,
"type": "string",
"format": "uri"
},
"meta": {
"title": "Meta",
"type": "object"
}
},
"required": [
"href"
]
}
],
"description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to homepage of the database provider, either directly as a string, or as a link object."
},
"index_base_url": {
"title": "Index_Base_Url",
"anyOf": [
{
"minLength": 1,
"maxLength": 65536,
"type": "string",
"format": "uri"
},
{
"title": "Link",
"type": "object",
"properties": {
"href": {
"title": "Href",
"minLength": 1,
"maxLength": 65536,
"type": "string",
"format": "uri"
},
"meta": {
"title": "Meta",
"type": "object"
}
},
"required": [
"href"
]
}
],
"description": "a [JSON API links object](http://jsonapi.org/format/1.0#document-links) pointing to the base URL for the `index` meta-database as specified in Appendix 1, either directly as a string, or as a link object."
}
},
"description": "Stores information on the database provider of the\n implementation."
},
"OptimadeResponseMetaQuery": {
"title": "OptimadeResponseMetaQuery",
"required": [
"representation"
],
"type": "object",
"properties": {
"representation": {
"title": "Representation",
"type": "string",
"description": "a string with the part of the URL that follows the base URL."
}
},
"description": "Information on the query that was requested."
},
"StructureResource": {
"title": "StructureResource",
"required": [
Expand Down Expand Up @@ -724,21 +739,6 @@
}
}
},
"OptimadeResponseMetaQuery": {
"title": "OptimadeResponseMetaQuery",
"required": [
"representation"
],
"type": "object",
"properties": {
"representation": {
"title": "Representation",
"type": "string",
"description": "a string with the part of the URL that follows the base URL."
}
},
"description": "Information on the query that was requested."
},
"ValidationError": {
"title": "ValidationError",
"required": [
Expand Down
1 change: 0 additions & 1 deletion optimade/server/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
from .models.baseinfo import BaseInfoResource, BaseInfoAttributes
from .models.toplevel import OptimadeResponseMeta, OptimadeResponseMetaQuery, OptimadeStructureResponseMany, OptimadeInfoResponse, OptimadeProvider


config = ConfigParser()
config.read(Path(__file__).resolve().parent.joinpath('config.ini'))
USE_REAL_MONGO = config['DEFAULT'].getboolean('USE_REAL_MONGO')
Expand Down
19 changes: 19 additions & 0 deletions optimade/server/models/errors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from typing import Dict, List, Optional, Union

from .jsonapi import Link, Links
from pydantic import BaseModel, UrlStr, Schema

class ErrorSource(BaseModel):
pointer: Optional[str]=Schema(..., description='a JSON Pointer [RFC6901] to the associated entity in the request document [e.g. "/data" for a primary data object, or "/data/attributes/title" for a specific attribute].')
parameter: Optional[str]=Schema(..., description='a string indicating which URI query parameter caused the error.')


class ErrorMsg(BaseModel):
id: str=Schema(..., description="a unique identifier for this particular occurrence of the problem.")
links: Dict[str, Union[str, Link]]=Schema(..., description="a list of links objects.")
status: str=Schema(..., description="the HTTP status code applicable to this problem, expressed as a string value.")
code: str=Schema(..., description="an application-specific error code, expressed as a string value.")
title: str=Schema(..., description="a short, human-readable summary of the problem that SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.")
detail: str=Schema(..., description="a human-readable explanation specific to this occurrence of the problem. Like title, this field’s value can be localized.")
source: ErrorSource=Schema(..., description="an object containing references to the source of the error")
meta: dict=Schema(..., description="a meta object containing non-standard meta-information about the error.")
7 changes: 7 additions & 0 deletions optimade/server/models/toplevel.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from optimade.server.models.structures import StructureResource
from .baseinfo import BaseInfoResource
from optimade.server.models.util import NonnegativeInt
from .errors import ErrorMsg


class OptimadeResponseMetaQuery(BaseModel):
Expand Down Expand Up @@ -149,6 +150,12 @@ class OptimadeStructureResponseMany(OptimadeResponseMany):
data: List[StructureResource]


class OptimadeErrorResponse(BaseModel):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The spec says:

If there were errors in producing the response all other fields MAY be skipped, and the following field MUST be present: errors

So, I guess, meta would also be optional.
And there's also included that's missing from above, right?
Do we actually need a subclass for this?
Can't we simply add errors as an optional field in OptimadeResponse1 and OptimadeResponseMany?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, meta would be optional as well. I'm not sure we need a subclass either. I would like to merge just so we get optimade/server/models/errors.py in and then follow-up PRs can refactor / correct misreadings of the spec.

links: Optional[Links]
meta: OptimadeResponseMeta
errors: List[ErrorMsg]


class OptimadeInfoResponse(OptimadeResponse1):
links: Optional[Links]
meta: Optional[OptimadeResponseMeta]
Expand Down