Repository: HTTP-APIs/hydra-python-core

Issue:
Update the core repo with the latest spec changes
We need to have a detailed analysis about what changes have been made to the spec in the last two years and how do we include them here. We might need a report on current attributes of the spec and what core is missing.

As far as I can see, now that we have separated the repos, all changes to the spec can be done here without having any changes in `hydrus` itself. We expose interfaces for `hydrus` to use core to understand the API, but all spec related changes will be made here from now on.

Discussion:

Patch:
diff --git a/hydra_python_core/doc_maker.py b/hydra_python_core/doc_maker.py
index 38afa4f..83f02b1 100644
--- a/hydra_python_core/doc_maker.py
+++ b/hydra_python_core/doc_maker.py
@@ -104,8 +104,13 @@ def create_doc(doc: Dict[str, Any], HYDRUS_SERVER_URL: str = None,
         class_obj, collection, collection_path = create_class(
             entrypoint_obj, class_)
         if class_obj:
-            apidoc.add_supported_class(
-                class_obj, collection=collection, collection_path=collection_path)
+            if "manages" in class_:
+                apidoc.add_supported_class(
+                    class_obj, collection=collection, collection_path=collection_path,
+                    collection_manages=class_["manages"])
+            else:
+                apidoc.add_supported_class(
+                    class_obj, collection=collection, collection_path=collection_path)
 
     # add possibleStatus
     for status in result["possibleStatus"]:
@@ -234,8 +239,8 @@ def create_property(supported_prop: Dict[str, Any]) -> HydraClassProp:
     doc_keys = {
         "property": False,
         "title": False,
-        "readonly": True,
-        "writeonly": True,
+        "readable": True,
+        "writeable": True,
         "required": True
     }
     result = {}
@@ -244,7 +249,7 @@ def create_property(supported_prop: Dict[str, Any]) -> HydraClassProp:
             supported_prop, k, "supported_prop", literal)
     # Create the HydraClassProp object
     prop = HydraClassProp(result["property"], result["title"], required=result["required"],
-                          read=result["readonly"], write=result["writeonly"])
+                          read=result["readable"], write=result["writeable"])
     return prop
 
 
@@ -329,6 +334,8 @@ def create_operation(supported_op: Dict[str, Any]) -> HydraClassOp:
         "method": False,
         "expects": True,
         "returns": True,
+        "expectsHeader": False,
+        "returnsHeader": False,
         "possibleStatus": False
     }
     result = {}
@@ -338,9 +345,12 @@ def create_operation(supported_op: Dict[str, Any]) -> HydraClassOp:
     for status in result["possibleStatus"]:
         status_obj = create_status(status)
         possible_statuses.append(status_obj)
+
     # Create the HydraClassOp object
     op_ = HydraClassOp(result["title"], result["method"],
-                       result["expects"], result["returns"], possible_statuses)
+                       result["expects"], result["returns"],
+                       result["expectsHeader"], result["returnsHeader"],
+                       possible_statuses)
     return op_
 
 
diff --git a/hydra_python_core/doc_writer.py b/hydra_python_core/doc_writer.py
index cac0c10..d52f00e 100644
--- a/hydra_python_core/doc_writer.py
+++ b/hydra_python_core/doc_writer.py
@@ -22,8 +22,8 @@ class HydraDoc():
 
     def add_supported_class(
             self, class_: 'HydraClass', collection: Union[bool, 'HydraCollection']=False,
-            collection_path: str=None, collectionGet: bool=True, collectionPost: bool=True
-            ) -> None:
+            collection_path: str=None, collectionGet: bool=True, collectionPost: bool=True,
+            collection_manages: Union[Dict[str, Any], List]=None) -> None:
         """Add a new supportedClass.
 
         Raises:
@@ -40,7 +40,7 @@ class HydraDoc():
         }
         if collection:
             collection = HydraCollection(
-                class_, collection_path, collectionGet, collectionPost)
+                class_, collection_path, collection_manages, collectionGet, collectionPost)
             self.collections[collection.path] = {
                 "context": Context(address="{}{}".format(self.base_url, self.API),
                                    collection=collection), "collection": collection}
@@ -191,8 +191,8 @@ class HydraClassProp():
             "title": self.title,
             "property": self.prop,
             "required": self.required,
-            "readonly": self.read,
-            "writeonly": self.write
+            "readable": self.read,
+            "writeable": self.write
         }
         if len(self.desc) > 0:
             prop["description"] = self.desc
@@ -207,6 +207,8 @@ class HydraClassOp():
                  method: str,
                  expects: Optional[str],
                  returns: Optional[str],
+                 expects_header: List[str] = [],
+                 returns_header: List[str] = [],
                  possible_status: List[Union['HydraStatus', 'HydraError']]=[],
                  ) -> None:
         """Initialize the Hydra_Prop."""
@@ -214,6 +216,8 @@ class HydraClassOp():
         self.method = method
         self.expects = expects
         self.returns = returns
+        self.expects_header = expects_header
+        self.returns_header = returns_header
         self.possible_status = possible_status
 
     def get_type(self, method: str) -> str:
@@ -235,6 +239,8 @@ class HydraClassOp():
             "method": self.method,
             "expects": self.expects,
             "returns": self.returns,
+            "expectsHeader": self.expects_header,
+            "returnsHeader": self.returns_header,
             "possibleStatus": [status.generate() for status in self.possible_status]
         }
         return op
@@ -245,11 +251,13 @@ class HydraCollection():
 
     def __init__(
             self, class_: HydraClass,
-            collection_path: str=None, get: bool=True, post: bool=True) -> None:
+            collection_path: str=None, manages: Union[Dict[str, Any], List]=None,
+            get: bool=True, post: bool=True) -> None:
         """Generate Collection for a given class."""
         self.class_ = class_
         self.name = "{}Collection".format(class_.title)
         self.path = collection_path if collection_path else self.name
+        self.manages = manages
         self.supportedOperation = list()  # type: List
         self.supportedProperty = [HydraClassProp("http://www.w3.org/ns/hydra/core#member",
                                                  "members",
@@ -261,7 +269,7 @@ class HydraCollection():
                                        "http://schema.org/FindAction",
                                        "GET", "Retrieves all {} entities".format(
                                            self.class_.title),
-                                       None, "vocab:{}".format(self.name), [])
+                                       None, "vocab:{}".format(self.name), [], [], [])
             self.supportedOperation.append(get_op)
 
         if post:
@@ -269,7 +277,7 @@ class HydraCollection():
                                         "http://schema.org/AddAction",
                                         "PUT", "Create new {} entity".format(
                                             self.class_.title),
-                                        self.class_.id_, self.class_.id_,
+                                        self.class_.id_, self.class_.id_, [], [],
                                         [HydraStatus(code=201, desc="If the {} entity was created"
                                                      "successfully.".format(self.class_.title))]
                                         )
@@ -286,6 +294,8 @@ class HydraCollection():
             "supportedOperation": [x.generate() for x in self.supportedOperation],
             "supportedProperty": [x.generate() for x in self.supportedProperty]
         }
+        if self.manages is not None:
+            collection["manages"] = self.manages
         return collection
 
 
@@ -298,7 +308,9 @@ class HydraCollectionOp():
                  method: str,
                  desc: str,
                  expects: Optional[str],
-                 returns: str,
+                 returns: Optional[str],
+                 expects_header: List[str] = [],
+                 returns_header: List[str] = [],
                  possible_status: List[Union['HydraStatus', 'HydraError']]=[],
                  ) -> None:
         """Create method."""
@@ -306,8 +318,10 @@ class HydraCollectionOp():
         self.type_ = type_
         self.method = method
         self.desc = desc
-        self.returns = returns
         self.expects = expects
+        self.returns = returns
+        self.expects_header = expects_header
+        self.returns_header = returns_header
         self.possible_status = possible_status
 
     def generate(self) -> Dict[str, Any]:
@@ -319,6 +333,8 @@ class HydraCollectionOp():
             "description": self.desc,
             "expects": self.expects,
             "returns": self.returns,
+            "expectsHeader": self.expects_header,
+            "returnsHeader": self.returns_header,
             "possibleStatus": [status.generate() for status in self.possible_status]
         }
         return object_
@@ -416,12 +432,14 @@ class EntryPointCollection():
             "hydra:title": self.name.lower(),
             "hydra:description": "The {} collection".format(self.name,),
             "required": None,
-            "readonly": True,
-            "writeonly": False
+            "readable": True,
+            "writeable": False
         }  # type: Dict[str, Any]
         for op in self.supportedOperation:
             operation = EntryPointOp(op.id_.lower(), op.method,
-                                     op.desc, op.expects, op.returns, op.possible_status,
+                                     op.desc, op.expects, op.returns,
+                                     op.expects_header, op.returns_header,
+                                     op.possible_status,
                                      type_=op.type_)
             object_["property"]["supportedOperation"].append(
                 operation.generate())
@@ -456,12 +474,13 @@ class EntryPointClass():
             "hydra:title": self.name.lower(),
             "hydra:description": "The {} Class".format(self.name),
             "required": None,
-            "readonly": True,
-            "writeonly": False
+            "readable": True,
+            "writeable": False
         }  # type: Dict[str, Any]
         for op in self.supportedOperation:
             operation = EntryPointOp(op.title.lower(), op.method,
-                                     None, op.expects, op.returns, op.possible_status,
+                                     None, op.expects, op.returns, op.expects_header,
+                                     op.returns_header, op.possible_status,
                                      label=op.title)
             object_["property"]["supportedOperation"].append(
                 operation.generate())
@@ -477,6 +496,8 @@ class EntryPointOp():
                  desc: str,
                  expects: Optional[str],
                  returns: Optional[str],
+                 expects_header: List[str] = [],
+                 returns_header: List[str] = [],
                  possible_status: List[Union['HydraStatus', 'HydraError']]=[],
                  type_: Optional[str] = None,
                  label: str = "",
@@ -487,6 +508,8 @@ class EntryPointOp():
         self.desc = desc
         self.expects = expects
         self.returns = returns
+        self.expects_header = expects_header
+        self.returns_header = returns_header
         self.possible_status = possible_status
         self.label = label
         self.type_ = type_
@@ -511,6 +534,8 @@ class EntryPointOp():
             "description": self.desc,
             "expects": self.expects,
             "returns": self.returns,
+            "expectsHeader": self.expects_header,
+            "returnsHeader": self.returns_header,
             "possibleStatus": [status.generate() for status in self.possible_status]
         }
         if self.type_ is not None:
@@ -676,13 +701,16 @@ class Context():
                     "@id": "hydra:returns",
                     "@type": "@id"
                 },
-                "readonly": "hydra:readonly",
-                "writeonly": "hydra:writeonly",
+                "readable": "hydra:readable",
+                "writeable": "hydra:writeable",
                 "possibleStatus": "hydra:possibleStatus",
                 "required": "hydra:required",
                 "method": "hydra:method",
                 "statusCode": "hydra:statusCode",
                 "description": "hydra:description",
+                "expectsHeader": "hydra:expectsHeader",
+                "returnsHeader": "hydra:returnsHeader",
+                "manages": "hydra:manages",
                 "subClassOf": {
                     "@id": "rdfs:subClassOf",
                     "@type": "@id"
diff --git a/samples/doc_writer_sample.py b/samples/doc_writer_sample.py
index bbd3d83..ec1a67c 100644
--- a/samples/doc_writer_sample.py
+++ b/samples/doc_writer_sample.py
@@ -77,6 +77,8 @@ op_method = "POST"  # The method of the Operation [GET, POST, PUT, DELETE]
 # URI of the object that is expected for the operation
 op_expects = "vocab:dummyClass"
 op_returns = None   # URI of the object that is returned by the operation
+op_returns_header = ["Content-Type", "Content-Length"]
+op_expects_header = []
 # List of statusCode for the operation
 op_status = [HydraStatus(code=200, desc="dummyClass updated.")]
 
@@ -84,33 +86,35 @@ op1 = HydraClassOp(op_name,
                    op_method,
                    op_expects,
                    op_returns,
+                   op_expects_header,
+                   op_returns_header,
                    op_status)
 
 # Same way add DELETE, PUT and GET operations
 op2_status = [HydraStatus(code=200, desc="dummyClass deleted.")]
-op2 = HydraClassOp("DeleteClass", "DELETE", None, None, op2_status)
+op2 = HydraClassOp("DeleteClass", "DELETE", None, None, [], [], op2_status)
 op3_status = [HydraStatus(code=201, desc="dummyClass successfully added.")]
-op3 = HydraClassOp("AddClass", "PUT", "vocab:dummyClass", None, op3_status)
+op3 = HydraClassOp("AddClass", "PUT", "vocab:dummyClass", None, [], [], op3_status)
 op4_status = [HydraStatus(code=200, desc="dummyClass returned.")]
-op4 = HydraClassOp("GetClass", "GET", None, "vocab:dummyClass", op4_status)
+op4 = HydraClassOp("GetClass", "GET", None, "vocab:dummyClass", [], [], op4_status)
 
 # Operations for non collection class
 class_2_op1_status = [HydraStatus(code=200, desc="singleClass changed.")]
 class_2_op1 = HydraClassOp("UpdateClass", "POST",
-                           "vocab:singleClass", None, class_2_op1_status)
+                           "vocab:singleClass", None, [], [], class_2_op1_status)
 class_2_op2_status = [HydraStatus(code=200, desc="singleClass deleted.")]
 class_2_op2 = HydraClassOp("DeleteClass", "DELETE",
-                           None, None, class_2_op2_status)
+                           None, None, [], [], class_2_op2_status)
 class_2_op3_status = [HydraStatus(code=201, desc="singleClass successfully added.")]
 class_2_op3 = HydraClassOp(
-    "AddClass", "PUT", "vocab:singleClass", None, class_2_op3_status)
+    "AddClass", "PUT", "vocab:singleClass", None, [], [], class_2_op3_status)
 class_2_op4_status = [HydraStatus(code=200, desc="singleClass returned.")]
 class_2_op4 = HydraClassOp("GetClass", "GET", None,
-                           "vocab:singleClass", class_2_op4_status)
+                           "vocab:singleClass", [], [], class_2_op4_status)
 
 class_1_op1_status = [HydraStatus(code=200, desc="anotherSingleClass returned.")]
 class_1_op1 = HydraClassOp("GetClass", "GET", None,
-                           "vocab:anotherSingleClass", class_1_op1_status)
+                           "vocab:anotherSingleClass", [], [], class_1_op1_status)
 # Add the properties to the classes
 class_.add_supported_prop(dummyProp1)
 class_.add_supported_prop(dummyProp2)
diff --git a/samples/doc_writer_sample_output.py b/samples/doc_writer_sample_output.py
index efff4f2..ec11739 100644
--- a/samples/doc_writer_sample_output.py
+++ b/samples/doc_writer_sample_output.py
@@ -12,8 +12,10 @@ doc = {
             "@id": "hydra:expects",
             "@type": "@id"
         },
+        "expectsHeader": "hydra:expectsHeader",
         "hydra": "http://www.w3.org/ns/hydra/core#",
         "label": "rdfs:label",
+        "manages": "hydra:manages",
         "method": "hydra:method",
         "possibleStatus": "hydra:possibleStatus",
         "property": {
@@ -26,12 +28,13 @@ doc = {
         },
         "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
         "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
-        "readonly": "hydra:readonly",
+        "readable": "hydra:readable",
         "required": "hydra:required",
         "returns": {
             "@id": "hydra:returns",
             "@type": "@id"
         },
+        "returnsHeader": "hydra:returnsHeader",
         "statusCode": "hydra:statusCode",
         "subClassOf": {
             "@id": "rdfs:subClassOf",
@@ -42,7 +45,7 @@ doc = {
         "supportedProperty": "hydra:supportedProperty",
         "title": "hydra:title",
         "vocab": "https://hydrus.com/api/vocab#",
-        "writeonly": "hydra:writeonly"
+        "writeable": "hydra:writeable"
     },
     "@id": "https://hydrus.com/api/vocab",
     "@type": "ApiDocumentation",
@@ -50,72 +53,88 @@ doc = {
     "possibleStatus": [],
     "supportedClass": [
         {
-            "@id": "vocab:dummyClass",
+            "@id": "vocab:extraClass",
             "@type": "hydra:Class",
-            "description": "A dummyClass for demo",
+            "description": "Class without any explicit methods",
+            "supportedOperation": [],
+            "supportedProperty": [],
+            "title": "extraClass"
+        },
+        {
+            "@id": "vocab:singleClass",
+            "@type": "hydra:Class",
+            "description": "A non collection class",
             "supportedOperation": [
                 {
                     "@type": "http://schema.org/UpdateAction",
-                    "expects": "vocab:dummyClass",
+                    "expects": "vocab:singleClass",
+                    "expectsHeader": [],
                     "method": "POST",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "dummyClass updated.",
+                            "description": "singleClass changed.",
                             "statusCode": 200,
                             "title": ""
                         }
                     ],
                     "returns": "null",
+                    "returnsHeader": [],
                     "title": "UpdateClass"
                 },
                 {
                     "@type": "http://schema.org/DeleteAction",
                     "expects": "null",
+                    "expectsHeader": [],
                     "method": "DELETE",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "dummyClass deleted.",
+                            "description": "singleClass deleted.",
                             "statusCode": 200,
                             "title": ""
                         }
                     ],
                     "returns": "null",
+                    "returnsHeader": [],
                     "title": "DeleteClass"
                 },
                 {
                     "@type": "http://schema.org/AddAction",
-                    "expects": "vocab:dummyClass",
+                    "expects": "vocab:singleClass",
+                    "expectsHeader": [],
                     "method": "PUT",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "dummyClass successfully added.",
+                            "description": "singleClass successfully added.",
                             "statusCode": 201,
                             "title": ""
                         }
                     ],
                     "returns": "null",
+                    "returnsHeader": [],
                     "title": "AddClass"
                 },
                 {
                     "@type": "http://schema.org/FindAction",
                     "expects": "null",
+                    "expectsHeader": [],
                     "method": "GET",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "dummyClass returned.",
+                            "description": "singleClass returned.",
                             "statusCode": 200,
                             "title": ""
                         }
                     ],
-                    "returns": "vocab:dummyClass",
+                    "returns": "vocab:singleClass",
+                    "returnsHeader": [],
                     "title": "GetClass"
                 }
             ],
@@ -123,21 +142,37 @@ doc = {
                 {
                     "@type": "SupportedProperty",
                     "property": "http://props.hydrus.com/prop1",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "false",
                     "title": "Prop1",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "http://props.hydrus.com/prop1",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "false",
                     "title": "Prop2",
-                    "writeonly": "true"
+                    "writeable": "true"
+                },
+                {
+                    "@type": "SupportedProperty",
+                    "property": "vocab:dummyClass",
+                    "readable": "false",
+                    "required": "false",
+                    "title": "dummyProp",
+                    "writeable": "true"
+                },
+                {
+                    "@type": "SupportedProperty",
+                    "property": "vocab:anotherSingleClass",
+                    "readable": "false",
+                    "required": "false",
+                    "title": "singleClassProp",
+                    "writeable": "true"
                 }
             ],
-            "title": "dummyClass"
+            "title": "singleClass"
         },
         {
             "@id": "vocab:anotherSingleClass",
@@ -147,6 +182,7 @@ doc = {
                 {
                     "@type": "http://schema.org/FindAction",
                     "expects": "null",
+                    "expectsHeader": [],
                     "method": "GET",
                     "possibleStatus": [
                         {
@@ -158,6 +194,7 @@ doc = {
                         }
                     ],
                     "returns": "vocab:anotherSingleClass",
+                    "returnsHeader": [],
                     "title": "GetClass"
                 }
             ],
@@ -165,89 +202,92 @@ doc = {
                 {
                     "@type": "SupportedProperty",
                     "property": "http://props.hydrus.com/prop1",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "false",
                     "title": "Prop1",
-                    "writeonly": "true"
+                    "writeable": "true"
                 }
             ],
             "title": "anotherSingleClass"
         },
         {
-            "@id": "vocab:extraClass",
-            "@type": "hydra:Class",
-            "description": "Class without any explicit methods",
-            "supportedOperation": [],
-            "supportedProperty": [],
-            "title": "extraClass"
-        },
-        {
-            "@id": "vocab:singleClass",
+            "@id": "vocab:dummyClass",
             "@type": "hydra:Class",
-            "description": "A non collection class",
+            "description": "A dummyClass for demo",
             "supportedOperation": [
                 {
                     "@type": "http://schema.org/UpdateAction",
-                    "expects": "vocab:singleClass",
+                    "expects": "vocab:dummyClass",
+                    "expectsHeader": [],
                     "method": "POST",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "singleClass changed.",
+                            "description": "dummyClass updated.",
                             "statusCode": 200,
                             "title": ""
                         }
                     ],
                     "returns": "null",
+                    "returnsHeader": [
+                        "Content-Type",
+                        "Content-Length"
+                    ],
                     "title": "UpdateClass"
                 },
                 {
                     "@type": "http://schema.org/DeleteAction",
                     "expects": "null",
+                    "expectsHeader": [],
                     "method": "DELETE",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "singleClass deleted.",
+                            "description": "dummyClass deleted.",
                             "statusCode": 200,
                             "title": ""
                         }
                     ],
                     "returns": "null",
+                    "returnsHeader": [],
                     "title": "DeleteClass"
                 },
                 {
                     "@type": "http://schema.org/AddAction",
-                    "expects": "vocab:singleClass",
+                    "expects": "vocab:dummyClass",
+                    "expectsHeader": [],
                     "method": "PUT",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "singleClass successfully added.",
+                            "description": "dummyClass successfully added.",
                             "statusCode": 201,
                             "title": ""
                         }
                     ],
                     "returns": "null",
+                    "returnsHeader": [],
                     "title": "AddClass"
                 },
                 {
                     "@type": "http://schema.org/FindAction",
                     "expects": "null",
+                    "expectsHeader": [],
                     "method": "GET",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "singleClass returned.",
+                            "description": "dummyClass returned.",
                             "statusCode": 200,
                             "title": ""
                         }
                     ],
-                    "returns": "vocab:singleClass",
+                    "returns": "vocab:dummyClass",
+                    "returnsHeader": [],
                     "title": "GetClass"
                 }
             ],
@@ -255,37 +295,21 @@ doc = {
                 {
                     "@type": "SupportedProperty",
                     "property": "http://props.hydrus.com/prop1",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "false",
                     "title": "Prop1",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "http://props.hydrus.com/prop1",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "false",
                     "title": "Prop2",
-                    "writeonly": "true"
-                },
-                {
-                    "@type": "SupportedProperty",
-                    "property": "vocab:dummyClass",
-                    "readonly": "false",
-                    "required": "false",
-                    "title": "dummyProp",
-                    "writeonly": "true"
-                },
-                {
-                    "@type": "SupportedProperty",
-                    "property": "vocab:anotherSingleClass",
-                    "readonly": "false",
-                    "required": "false",
-                    "title": "singleClassProp",
-                    "writeonly": "true"
+                    "writeable": "true"
                 }
             ],
-            "title": "singleClass"
+            "title": "dummyClass"
         },
         {
             "@id": "http://www.w3.org/ns/hydra/core#Resource",
@@ -304,105 +328,113 @@ doc = {
                 {
                     "@type": "SupportedProperty",
                     "property": "http://www.w3.org/ns/hydra/core#member",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "null",
                     "title": "members",
-                    "writeonly": "false"
+                    "writeable": "false"
                 }
             ],
             "title": "Collection"
         },
         {
-            "@id": "vocab:extraClassCollection",
+            "@id": "vocab:dummyClassCollection",
             "@type": "hydra:Class",
-            "description": "A collection of extraclass",
+            "description": "A collection of dummyclass",
             "subClassOf": "http://www.w3.org/ns/hydra/core#Collection",
             "supportedOperation": [
                 {
-                    "@id": "_:extraclass_collection_retrieve",
+                    "@id": "_:dummyclass_collection_retrieve",
                     "@type": "http://schema.org/FindAction",
-                    "description": "Retrieves all extraClass entities",
+                    "description": "Retrieves all dummyClass entities",
                     "expects": "null",
+                    "expectsHeader": [],
                     "method": "GET",
                     "possibleStatus": [],
-                    "returns": "vocab:extraClassCollection"
+                    "returns": "vocab:dummyClassCollection",
+                    "returnsHeader": []
                 },
                 {
-                    "@id": "_:extraclass_create",
+                    "@id": "_:dummyclass_create",
                     "@type": "http://schema.org/AddAction",
-                    "description": "Create new extraClass entity",
-                    "expects": "vocab:extraClass",
+                    "description": "Create new dummyClass entity",
+                    "expects": "vocab:dummyClass",
+                    "expectsHeader": [],
                     "method": "PUT",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "If the extraClass entity was createdsuccessfully.",
+                            "description": "If the dummyClass entity was createdsuccessfully.",
                             "statusCode": 201,
                             "title": ""
                         }
                     ],
-                    "returns": "vocab:extraClass"
+                    "returns": "vocab:dummyClass",
+                    "returnsHeader": []
                 }
             ],
             "supportedProperty": [
                 {
                     "@type": "SupportedProperty",
-                    "description": "The extraclass",
+                    "description": "The dummyclass",
                     "property": "http://www.w3.org/ns/hydra/core#member",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "false",
                     "title": "members",
-                    "writeonly": "false"
+                    "writeable": "false"
                 }
             ],
-            "title": "extraClassCollection"
+            "title": "dummyClassCollection"
         },
         {
-            "@id": "vocab:dummyClassCollection",
+            "@id": "vocab:extraClassCollection",
             "@type": "hydra:Class",
-            "description": "A collection of dummyclass",
+            "description": "A collection of extraclass",
             "subClassOf": "http://www.w3.org/ns/hydra/core#Collection",
             "supportedOperation": [
                 {
-                    "@id": "_:dummyclass_collection_retrieve",
+                    "@id": "_:extraclass_collection_retrieve",
                     "@type": "http://schema.org/FindAction",
-                    "description": "Retrieves all dummyClass entities",
+                    "description": "Retrieves all extraClass entities",
                     "expects": "null",
+                    "expectsHeader": [],
                     "method": "GET",
                     "possibleStatus": [],
-                    "returns": "vocab:dummyClassCollection"
+                    "returns": "vocab:extraClassCollection",
+                    "returnsHeader": []
                 },
                 {
-                    "@id": "_:dummyclass_create",
+                    "@id": "_:extraclass_create",
                     "@type": "http://schema.org/AddAction",
-                    "description": "Create new dummyClass entity",
-                    "expects": "vocab:dummyClass",
+                    "description": "Create new extraClass entity",
+                    "expects": "vocab:extraClass",
+                    "expectsHeader": [],
                     "method": "PUT",
                     "possibleStatus": [
                         {
                             "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                             "@type": "Status",
-                            "description": "If the dummyClass entity was createdsuccessfully.",
+                            "description": "If the extraClass entity was createdsuccessfully.",
                             "statusCode": 201,
                             "title": ""
                         }
                     ],
-                    "returns": "vocab:dummyClass"
+                    "returns": "vocab:extraClass",
+                    "returnsHeader": []
                 }
             ],
             "supportedProperty": [
                 {
                     "@type": "SupportedProperty",
-                    "description": "The dummyclass",
+                    "description": "The extraclass",
                     "property": "http://www.w3.org/ns/hydra/core#member",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "false",
                     "title": "members",
-                    "writeonly": "false"
+                    "writeable": "false"
                 }
             ],
-            "title": "dummyClassCollection"
+            "title": "extraClassCollection"
         },
         {
             "@id": "vocab:EntryPoint",
@@ -414,47 +446,14 @@ doc = {
                     "@type": "vocab:EntryPoint",
                     "description": "The APIs main entry point.",
                     "expects": "null",
+                    "expectsHeader": [],
                     "method": "GET",
                     "possibleStatus": [],
-                    "returns": "null"
+                    "returns": "null",
+                    "returnsHeader": []
                 }
             ],
             "supportedProperty": [
-                {
-                    "hydra:description": "The anotherSingleClass Class",
-                    "hydra:title": "anothersingleclass",
-                    "property": {
-                        "@id": "vocab:EntryPoint/anotherSingleClass",
-                        "@type": "hydra:Link",
-                        "description": "An another non collection class",
-                        "domain": "vocab:EntryPoint",
-                        "label": "anotherSingleClass",
-                        "range": "vocab:anotherSingleClass",
-                        "supportedOperation": [
-                            {
-                                "@id": "getclass",
-                                "@type": "http://schema.org/FindAction",
-                                "description": "null",
-                                "expects": "null",
-                                "label": "GetClass",
-                                "method": "GET",
-                                "possibleStatus": [
-                                    {
-                                        "@context": "http://www.w3.org/ns/hydra/context.jsonld",
-                                        "@type": "Status",
-                                        "description": "anotherSingleClass returned.",
-                                        "statusCode": 200,
-                                        "title": ""
-                                    }
-                                ],
-                                "returns": "vocab:anotherSingleClass"
-                            }
-                        ]
-                    },
-                    "readonly": "true",
-                    "required": "null",
-                    "writeonly": "false"
-                },
                 {
                     "hydra:description": "The singleClass Class",
                     "hydra:title": "singleclass",
@@ -471,6 +470,7 @@ doc = {
                                 "@type": "http://schema.org/UpdateAction",
                                 "description": "null",
                                 "expects": "vocab:singleClass",
+                                "expectsHeader": [],
                                 "label": "UpdateClass",
                                 "method": "POST",
                                 "possibleStatus": [
@@ -482,13 +482,15 @@ doc = {
                                         "title": ""
                                     }
                                 ],
-                                "returns": "null"
+                                "returns": "null",
+                                "returnsHeader": []
                             },
                             {
                                 "@id": "deleteclass",
                                 "@type": "http://schema.org/DeleteAction",
                                 "description": "null",
                                 "expects": "null",
+                                "expectsHeader": [],
                                 "label": "DeleteClass",
                                 "method": "DELETE",
                                 "possibleStatus": [
@@ -500,13 +502,15 @@ doc = {
                                         "title": ""
                                     }
                                 ],
-                                "returns": "null"
+                                "returns": "null",
+                                "returnsHeader": []
                             },
                             {
                                 "@id": "addclass",
                                 "@type": "http://schema.org/AddAction",
                                 "description": "null",
                                 "expects": "vocab:singleClass",
+                                "expectsHeader": [],
                                 "label": "AddClass",
                                 "method": "PUT",
                                 "possibleStatus": [
@@ -518,13 +522,15 @@ doc = {
                                         "title": ""
                                     }
                                 ],
-                                "returns": "null"
+                                "returns": "null",
+                                "returnsHeader": []
                             },
                             {
                                 "@id": "getclass",
                                 "@type": "http://schema.org/FindAction",
                                 "description": "null",
                                 "expects": "null",
+                                "expectsHeader": [],
                                 "label": "GetClass",
                                 "method": "GET",
                                 "possibleStatus": [
@@ -536,56 +542,51 @@ doc = {
                                         "title": ""
                                     }
                                 ],
-                                "returns": "vocab:singleClass"
+                                "returns": "vocab:singleClass",
+                                "returnsHeader": []
                             }
                         ]
                     },
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "null",
-                    "writeonly": "false"
+                    "writeable": "false"
                 },
                 {
-                    "hydra:description": "The extraClassCollection collection",
-                    "hydra:title": "extraclasscollection",
+                    "hydra:description": "The anotherSingleClass Class",
+                    "hydra:title": "anothersingleclass",
                     "property": {
-                        "@id": "vocab:EntryPoint/EcTest",
+                        "@id": "vocab:EntryPoint/anotherSingleClass",
                         "@type": "hydra:Link",
-                        "description": "The extraClassCollection collection",
+                        "description": "An another non collection class",
                         "domain": "vocab:EntryPoint",
-                        "label": "extraClassCollection",
-                        "range": "vocab:extraClassCollection",
+                        "label": "anotherSingleClass",
+                        "range": "vocab:anotherSingleClass",
                         "supportedOperation": [
                             {
-                                "@id": "_:extraclass_collection_retrieve",
+                                "@id": "getclass",
                                 "@type": "http://schema.org/FindAction",
-                                "description": "Retrieves all extraClass entities",
+                                "description": "null",
                                 "expects": "null",
+                                "expectsHeader": [],
+                                "label": "GetClass",
                                 "method": "GET",
-                                "possibleStatus": [],
-                                "returns": "vocab:extraClassCollection"
-                            },
-                            {
-                                "@id": "_:extraclass_create",
-                                "@type": "http://schema.org/AddAction",
-                                "description": "Create new extraClass entity",
-                                "expects": "vocab:extraClass",
-                                "method": "PUT",
                                 "possibleStatus": [
                                     {
                                         "@context": "http://www.w3.org/ns/hydra/context.jsonld",
                                         "@type": "Status",
-                                        "description": "If the extraClass entity was createdsuccessfully.",
-                                        "statusCode": 201,
+                                        "description": "anotherSingleClass returned.",
+                                        "statusCode": 200,
                                         "title": ""
                                     }
                                 ],
-                                "returns": "vocab:extraClass"
+                                "returns": "vocab:anotherSingleClass",
+                                "returnsHeader": []
                             }
                         ]
                     },
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "null",
-                    "writeonly": "false"
+                    "writeable": "false"
                 },
                 {
                     "hydra:description": "The dummyClassCollection collection",
@@ -603,15 +604,18 @@ doc = {
                                 "@type": "http://schema.org/FindAction",
                                 "description": "Retrieves all dummyClass entities",
                                 "expects": "null",
+                                "expectsHeader": [],
                                 "method": "GET",
                                 "possibleStatus": [],
-                                "returns": "vocab:dummyClassCollection"
+                                "returns": "vocab:dummyClassCollection",
+                                "returnsHeader": []
                             },
                             {
                                 "@id": "_:dummyclass_create",
                                 "@type": "http://schema.org/AddAction",
                                 "description": "Create new dummyClass entity",
                                 "expects": "vocab:dummyClass",
+                                "expectsHeader": [],
                                 "method": "PUT",
                                 "possibleStatus": [
                                     {
@@ -622,13 +626,61 @@ doc = {
                                         "title": ""
                                     }
                                 ],
-                                "returns": "vocab:dummyClass"
+                                "returns": "vocab:dummyClass",
+                                "returnsHeader": []
+                            }
+                        ]
+                    },
+                    "readable": "true",
+                    "required": "null",
+                    "writeable": "false"
+                },
+                {
+                    "hydra:description": "The extraClassCollection collection",
+                    "hydra:title": "extraclasscollection",
+                    "property": {
+                        "@id": "vocab:EntryPoint/EcTest",
+                        "@type": "hydra:Link",
+                        "description": "The extraClassCollection collection",
+                        "domain": "vocab:EntryPoint",
+                        "label": "extraClassCollection",
+                        "range": "vocab:extraClassCollection",
+                        "supportedOperation": [
+                            {
+                                "@id": "_:extraclass_collection_retrieve",
+                                "@type": "http://schema.org/FindAction",
+                                "description": "Retrieves all extraClass entities",
+                                "expects": "null",
+                                "expectsHeader": [],
+                                "method": "GET",
+                                "possibleStatus": [],
+                                "returns": "vocab:extraClassCollection",
+                                "returnsHeader": []
+                            },
+                            {
+                                "@id": "_:extraclass_create",
+                                "@type": "http://schema.org/AddAction",
+                                "description": "Create new extraClass entity",
+                                "expects": "vocab:extraClass",
+                                "expectsHeader": [],
+                                "method": "PUT",
+                                "possibleStatus": [
+                                    {
+                                        "@context": "http://www.w3.org/ns/hydra/context.jsonld",
+                                        "@type": "Status",
+                                        "description": "If the extraClass entity was createdsuccessfully.",
+                                        "statusCode": 201,
+                                        "title": ""
+                                    }
+                                ],
+                                "returns": "vocab:extraClass",
+                                "returnsHeader": []
                             }
                         ]
                     },
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "null",
-                    "writeonly": "false"
+                    "writeable": "false"
                 }
             ],
             "title": "EntryPoint"
diff --git a/samples/hydra_doc_sample.py b/samples/hydra_doc_sample.py
index 8ce592a..de178f1 100644
--- a/samples/hydra_doc_sample.py
+++ b/samples/hydra_doc_sample.py
@@ -27,14 +27,13 @@ doc = {
         },
         "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
         "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
-        "readonly": "hydra:readonly",
+        "readable": "hydra:readable",
         "required": "hydra:required",
         "returns": {
             "@id": "hydra:returns",
             "@type": "@id"
         },
         "statusCode": "hydra:statusCode",
-        "statusCodes": "hydra:statusCodes",
         "subClassOf": {
             "@id": "rdfs:subClassOf",
             "@type": "@id"
@@ -44,7 +43,10 @@ doc = {
         "supportedProperty": "hydra:supportedProperty",
         "title": "hydra:title",
         "vocab": "http://petstore.swagger.io/v2/vocab#",
-        "writeonly": "hydra:writeonly"
+        "writeable": "hydra:writeable",
+        "expectsHeader": "hydra:expectsHeader",
+        "returnsHeader": "hydra:returnsHeader",
+        "manages": "hydra:manages"
     },
     "@id": "http://petstore.swagger.io/v2/vocab",
     "@type": "ApiDocumentation",
@@ -67,11 +69,14 @@ doc = {
                     "method": "POST",
                     "possibleStatus": [
                         {
-                            "description": "successful operation",
+                            "title": "Operation successful.",
+                            "description": "",
                             "statusCode": 200
                         }
                     ],
                     "returns": "vocab:ApiResponse",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "uploads an image"
                 }
             ],
@@ -79,26 +84,26 @@ doc = {
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "code",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "type",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "message",
-                    "writeonly": "true"
+                    "writeable": "true"
                 }
             ],
             "title": "ApiResponse"
@@ -114,11 +119,14 @@ doc = {
                     "method": "POST",
                     "possibleStatus": [
                         {
-                            "description": "Successful Operation",
+                            "title": "Successful Operation.",
+                            "description": "",
                             "statusCode": 200
                         }
                     ],
                     "returns": "null",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "Create user"
                 },
                 {
@@ -127,19 +135,24 @@ doc = {
                     "method": "GET",
                     "possibleStatus": [
                         {
-                            "description": "successful operation",
+                            "title": "Successful operation.",
+                            "description": "",
                             "statusCode": 200
                         },
                         {
-                            "description": "Invalid username supplied",
+                            "title": "Invalid username supplied",
+                            "description": "",
                             "statusCode": 400
                         },
                         {
-                            "description": "User not found",
+                            "title": "User not found",
+                            "description": "",
                             "statusCode": 404
                         }
                     ],
                     "returns": "vocab:User",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "Get user by user name"
                 },
                 {
@@ -148,11 +161,14 @@ doc = {
                     "method": "PUT",
                     "possibleStatus": [
                         {
-                            "description": "Invalid user supplied",
+                            "title": "Invalid user supplied",
+                            "description": "",
                             "statusCode": 400
                         }
                     ],
                     "returns": "null",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "Updated user"
                 }
             ],
@@ -160,66 +176,66 @@ doc = {
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "id",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "username",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "firstName",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "lastName",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "email",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "password",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "phone",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "userStatus",
-                    "writeonly": "true"
+                    "writeable": "true"
                 }
             ],
             "title": "User"
@@ -235,15 +251,19 @@ doc = {
                     "method": "POST",
                     "possibleStatus": [
                         {
-                            "description": "successful operation",
+                            "title": "Successful operation",
+                            "description": "",
                             "statusCode": 200
                         },
                         {
-                            "description": "Invalid Order",
+                            "title": "Invalid Order",
+                            "description": "",
                             "statusCode": 400
                         }
                     ],
                     "returns": "vocab:Order",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "Place an order for a pet"
                 },
                 {
@@ -252,19 +272,24 @@ doc = {
                     "method": "GET",
                     "possibleStatus": [
                         {
-                            "description": "successful operation",
+                            "title": "Successful operation",
+                            "description": "",
                             "statusCode": 200
                         },
                         {
-                            "description": "Invalid ID supplied",
+                            "title": "Invalid ID supplied",
+                            "description": "",
                             "statusCode": 400
                         },
                         {
-                            "description": "Order not found",
+                            "title": "Order not found",
+                            "description": "",
                             "statusCode": 404
                         }
                     ],
                     "returns": "vocab:Order",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "Find purchase order by ID"
                 }
             ],
@@ -272,50 +297,50 @@ doc = {
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "id",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "petId",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "quantity",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "shipDate",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "status",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "complete",
-                    "writeonly": "true"
+                    "writeable": "true"
                 }
             ],
             "title": "Order"
@@ -331,11 +356,14 @@ doc = {
                     "method": "POST",
                     "possibleStatus": [
                         {
-                            "description": "Invalid input",
+                            "title": "Invalid input",
+                            "description": "",
                             "statusCode": 405
                         }
                     ],
                     "returns": "null",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "Add a new pet to the store"
                 },
                 {
@@ -344,11 +372,14 @@ doc = {
                     "method": "PUT",
                     "possibleStatus": [
                         {
-                            "description": "Invalid ID supplied",
+                            "title": "Invalid ID supplied",
+                            "description": "",
                             "statusCode": 400
                         }
                     ],
                     "returns": "null",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "Update an existing pet"
                 },
                 {
@@ -357,11 +388,14 @@ doc = {
                     "method": "GET",
                     "possibleStatus": [
                         {
-                            "description": "successful operation",
+                            "title": "Successful operation",
+                            "description": "",
                             "statusCode": 200
                         }
                     ],
                     "returns": "vocab:Pet",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "get all pets"
                 }
             ],
@@ -369,50 +403,50 @@ doc = {
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "id",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "category",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "true",
                     "title": "name",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "true",
                     "title": "photoUrls",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "tags",
-                    "writeonly": "true"
+                    "writeable": "true"
                 },
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "status",
-                    "writeonly": "true"
+                    "writeable": "true"
                 }
             ],
             "title": "Pet"
@@ -426,10 +460,10 @@ doc = {
                 {
                     "@type": "SupportedProperty",
                     "property": "http://www.w3.org/ns/hydra/core#member",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "null",
                     "title": "members",
-                    "writeonly": "false"
+                    "writeable": "false"
                 }
             ],
             "title": "Collection"
@@ -455,7 +489,9 @@ doc = {
                     "expects": "null",
                     "method": "GET",
                     "returns": "vocab:UserCollection",
-                    "statusCodes": []
+                    "expectsHeader": [],
+                    "returnsHeader": [],
+                    "possibleStatus": []
                 },
                 {
                     "@id": "_:user_create",
@@ -464,9 +500,12 @@ doc = {
                     "expects": "vocab:User",
                     "method": "PUT",
                     "returns": "vocab:User",
-                    "statusCodes": [
+                    "expectsHeader": [],
+                    "returnsHeader": [],
+                    "possibleStatus": [
                         {
-                            "description": "If the User entity was created successfully.",
+                            "title": "If the User entity was created successfully.",
+                            "description": "",
                             "statusCode": 201
                         }
                     ]
@@ -477,10 +516,10 @@ doc = {
                     "@type": "SupportedProperty",
                     "description": "The user",
                     "property": "http://www.w3.org/ns/hydra/core#member",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "false",
                     "title": "members",
-                    "writeonly": "false"
+                    "writeable": "false"
                 }
             ],
             "title": "UserCollection"
@@ -498,7 +537,9 @@ doc = {
                     "expects": "null",
                     "method": "GET",
                     "returns": "vocab:PetCollection",
-                    "statusCodes": []
+                    "expectsHeader": [],
+                    "returnsHeader": [],
+                    "possibleStatus": []
                 },
                 {
                     "@id": "_:pet_create",
@@ -507,9 +548,12 @@ doc = {
                     "expects": "vocab:Pet",
                     "method": "PUT",
                     "returns": "vocab:Pet",
-                    "statusCodes": [
+                    "expectsHeader": [],
+                    "returnsHeader": [],
+                    "possibleStatus": [
                         {
-                            "description": "If the Pet entity was created successfully.",
+                            "title": "If the Pet entity was created successfully.",
+                            "description": "",
                             "statusCode": 201
                         }
                     ]
@@ -520,10 +564,10 @@ doc = {
                     "@type": "SupportedProperty",
                     "description": "The pet",
                     "property": "http://www.w3.org/ns/hydra/core#member",
-                    "readonly": "false",
+                    "readable": "false",
                     "required": "false",
                     "title": "members",
-                    "writeonly": "false"
+                    "writeable": "false"
                 }
             ],
             "title": "PetCollection"
@@ -540,7 +584,9 @@ doc = {
                     "expects": "null",
                     "method": "GET",
                     "returns": "null",
-                    "statusCodes": "vocab:EntryPoint"
+                    "expectsHeader": [],
+                    "returnsHeader": [],
+                    "possibleStatus": "vocab:EntryPoint"
                 }
             ],
             "supportedProperty": [
@@ -563,18 +609,21 @@ doc = {
                                 "label": "uploads an image",
                                 "method": "POST",
                                 "returns": "vocab:ApiResponse",
-                                "statusCodes": [
+                                "expectsHeader": [],
+                                "returnsHeader": [],
+                                "possibleStatus": [
                                     {
-                                        "description": "successful operation",
+                                        "title": "successful operation",
+                                        "description": "",
                                         "statusCode": 200
                                     }
                                 ]
                             }
                         ]
                     },
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "null",
-                    "writeonly": "false"
+                    "writeable": "false"
                 },
                 {
                     "hydra:description": "The Order Class",
@@ -595,13 +644,17 @@ doc = {
                                 "label": "Place an order for a pet",
                                 "method": "POST",
                                 "returns": "vocab:Order",
-                                "statusCodes": [
+                                "expectsHeader": [],
+                                "returnsHeader": [],
+                                "possibleStatus": [
                                     {
-                                        "description": "successful operation",
+                                        "title": "Successful operation",
+                                        "description": "",
                                         "statusCode": 200
                                     },
                                     {
-                                        "description": "Invalid Order",
+                                        "title": "Invalid Order",
+                                        "description": "",
                                         "statusCode": 400
                                     }
                                 ]
@@ -614,26 +667,31 @@ doc = {
                                 "label": "Find purchase order by ID",
                                 "method": "GET",
                                 "returns": "vocab:Order",
-                                "statusCodes": [
+                                "expectsHeader": [],
+                                "returnsHeader": [],
+                                "possibleStatus": [
                                     {
-                                        "description": "successful operation",
+                                        "title": "successful operation",
+                                        "description": "",
                                         "statusCode": 200
                                     },
                                     {
-                                        "description": "Invalid ID supplied",
+                                        "title": "Invalid ID supplied",
+                                        "description": "",
                                         "statusCode": 400
                                     },
                                     {
-                                        "description": "Order not found",
+                                        "title": "Order not found",
+                                        "description": "",
                                         "statusCode": 404
                                     }
                                 ]
                             }
                         ]
                     },
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "null",
-                    "writeonly": "false"
+                    "writeable": "false"
                 },
                 {
                     "hydra:description": "The UserCollection collection",
@@ -653,7 +711,9 @@ doc = {
                                 "expects": "null",
                                 "method": "GET",
                                 "returns": "vocab:UserCollection",
-                                "statusCodes": []
+                                "expectsHeader": [],
+                                "returnsHeader": [],
+                                "possibleStatus": []
                             },
                             {
                                 "@id": "_:user_create",
@@ -662,18 +722,21 @@ doc = {
                                 "expects": "vocab:User",
                                 "method": "PUT",
                                 "returns": "vocab:User",
-                                "statusCodes": [
+                                "expectsHeader": [],
+                                "returnsHeader": [],
+                                "possibleStatus": [
                                     {
-                                        "description": "If the User entity was created successfully.",
+                                        "title": "If the User entity was created successfully.",
+                                        "description": "",
                                         "statusCode": 201
                                     }
                                 ]
                             }
                         ]
                     },
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "null",
-                    "writeonly": "false"
+                    "writeable": "false"
                 },
                 {
                     "hydra:description": "The PetCollection collection",
@@ -693,7 +756,9 @@ doc = {
                                 "expects": "null",
                                 "method": "GET",
                                 "returns": "vocab:PetCollection",
-                                "statusCodes": []
+                                "expectsHeader": [],
+                                "returnsHeader": [],
+                                "possibleStatus": []
                             },
                             {
                                 "@id": "_:pet_create",
@@ -702,18 +767,21 @@ doc = {
                                 "expects": "vocab:Pet",
                                 "method": "PUT",
                                 "returns": "vocab:Pet",
-                                "statusCodes": [
+                                "expectsHeader": [],
+                                "returnsHeader": [],
+                                "possibleStatus": [
                                     {
-                                        "description": "If the Pet entity was created successfully.",
+                                        "title": "If the Pet entity was created successfully.",
+                                        "description": "",
                                         "statusCode": 201
                                     }
                                 ]
                             }
                         ]
                     },
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "null",
-                    "writeonly": "false"
+                    "writeable": "false"
                 }
             ],
             "title": "EntryPoint"


Test patch:
diff --git a/tests/test_doc_maker.py b/tests/test_doc_maker.py
index 73136a2..0d64129 100644
--- a/tests/test_doc_maker.py
+++ b/tests/test_doc_maker.py
@@ -1,7 +1,7 @@
 import unittest
 import re
 
-from unittest.mock import patch
+from unittest.mock import patch, ANY
 from hydra_python_core import doc_maker, doc_writer
 from samples import hydra_doc_sample
 
@@ -84,10 +84,10 @@ class TestCreateClass(unittest.TestCase):
                 {
                     "@type": "SupportedProperty",
                     "property": "",
-                    "readonly": "true",
+                    "readable": "true",
                     "required": "false",
                     "title": "id",
-                    "writeonly": "true"
+                    "writeable": "true"
                 }
             ],
             "supportedOperation": [
@@ -97,11 +97,14 @@ class TestCreateClass(unittest.TestCase):
                     "method": "POST",
                     "possibleStatus": [
                         {
+                            "title": "Invalid input",
                             "description": "Invalid input",
                             "statusCode": 405
                         }
                     ],
                     "returns": "null",
+                    "expectsHeader": [],
+                    "returnsHeader": [],
                     "title": "Add a new pet to the store"
                 }
             ],
@@ -305,9 +308,12 @@ class TestCreateDoc(unittest.TestCase):
             mock_doc.return_value.add_supported_class.call_count, class_count - 2)
 
         # check if all base resource and classes has been added
-        mock_doc.return_value.add_baseResource.assert_called_once()
-        mock_doc.return_value.add_baseCollection.assert_called_once()
-        mock_doc.return_value.gen_EntryPoint.assert_called_once()
+        self.assertEqual(
+            mock_doc.return_value.add_baseResource.call_count, 1)
+        self.assertEqual(
+            mock_doc.return_value.add_baseCollection.call_count, 1)
+        self.assertEqual(
+            mock_doc.return_value.gen_EntryPoint.call_count, 1)
 
         self.assertIsInstance(apidoc, doc_writer.HydraDoc)
 
@@ -327,10 +333,10 @@ class TestCreateProperty(unittest.TestCase):
         property_ = {
             "@type": "SupportedProperty",
             "property": "",
-            "readonly": "true",
+            "readable": "true",
             "required": "false",
             "title": "code",
-            "writeonly": "true"
+            "writeable": "true"
         }
 
         doc_maker.create_property(property_)
@@ -338,7 +344,7 @@ class TestCreateProperty(unittest.TestCase):
                                           required=False, read=True, write=True)
 
         mock_prop.reset_mock()
-        property_["readonly"] = "false"
+        property_["readable"] = "false"
         doc_maker.create_property(property_)
         mock_prop.assert_called_once_with(property_["property"], property_["title"],
                                           required=False, read=False, write=True)
@@ -363,13 +369,15 @@ class TestCreateOperation(unittest.TestCase):
             Test method to check if HydraClassOp is instantiated with proper agruments with
             different input
         """
-
         op = {
             "@type": "http://schema.org/UpdateAction",
             "expects": "null",
             "method": "POST",
+            "expectsHeader": [],
+            "returnsHeader": [],
             "possibleStatus": [
                 {
+                    "title": "Operation successful.",
                     "description": "successful operation",
                     "statusCode": 200
                 }
@@ -379,19 +387,19 @@ class TestCreateOperation(unittest.TestCase):
         }
         doc_maker.create_operation(op)
         mock_op.assert_called_once_with(
-            op["title"], op["method"], None, None, op["possibleStatus"])
+            op["title"], op["method"], None, None, [], [], ANY)
 
         mock_op.reset_mock()
         op["expects"] = "test"
         doc_maker.create_operation(op)
         mock_op.assert_called_once_with(
-            op["title"], op["method"], "test", None, op["possibleStatus"])
+            op["title"], op["method"], "test", None, [], [], ANY)
 
         mock_op.reset_mock()
         op["returns"] = "test"
         obj = doc_maker.create_operation(op)
         mock_op.assert_called_once_with(
-            op["title"], op["method"], "test", "test", op["possibleStatus"])
+            op["title"], op["method"], "test", "test", [], [], ANY)
 
         self.assertIsInstance(obj, doc_writer.HydraClassOp)
 
diff --git a/tests/test_doc_writer.py b/tests/test_doc_writer.py
index dfc0c2c..d373dd9 100644
--- a/tests/test_doc_writer.py
+++ b/tests/test_doc_writer.py
@@ -21,7 +21,6 @@ class TestDocWriter(unittest.TestCase):
             "supportedClass": "hydra:supportedClass",
             "supportedProperty": "hydra:supportedProperty",
             "supportedOperation": "hydra:supportedOperation",
-            "statusCodes": "hydra:statusCodes",
             "label": "rdfs:label",
             "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
             "vocab": "https://hydrus.com/api/vocab#",
@@ -45,13 +44,16 @@ class TestDocWriter(unittest.TestCase):
                 "@id": "hydra:returns",
                 "@type": "@id"
             },
-            "readonly": "hydra:readonly",
-            "writeonly": "hydra:writeonly",
+            "readable": "hydra:readable",
+            "writeable": "hydra:writeable",
             "possibleStatus": "hydra:possibleStatus",
             "required": "hydra:required",
             "method": "hydra:method",
             "statusCode": "hydra:statusCode",
             "description": "hydra:description",
+            "expectsHeader": "hydra:expectsHeader",
+            "returnsHeader": "hydra:returnsHeader",
+            "manages": "hydra:manages",
             "subClassOf": {
                 "@id": "rdfs:subClassOf",
                 "@type": "@id"
@@ -97,10 +99,10 @@ class TestDocWriter(unittest.TestCase):
             with patch('hydra_python_core.doc_writer.HydraClassProp', mocked_hydra_property,
                        spec_set=doc_writer.HydraClassProp):
                 mocked_hydra_property.prop = ""
-                mocked_hydra_property.readonly = "true"
+                mocked_hydra_property.readable = "true"
                 mocked_hydra_property.required = "false"
                 mocked_hydra_property.title = "id"
-                mocked_hydra_property.writeonly = "true"
+                mocked_hydra_property.writeable = "true"
 
                 mocked_hydra_class.supportedProperty = [mocked_hydra_property]