From bcb9d2c6793b39b165caf9e63c4803d2a28e9876 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Sun, 27 May 2018 15:45:03 -0700 Subject: batch POST methods --- rust/fatcat-api/api/swagger.yaml | 487 +++++++++++++++++++++++++++++++-------- 1 file changed, 391 insertions(+), 96 deletions(-) (limited to 'rust/fatcat-api/api/swagger.yaml') diff --git a/rust/fatcat-api/api/swagger.yaml b/rust/fatcat-api/api/swagger.yaml index d9c03d42..8f491528 100644 --- a/rust/fatcat-api/api/swagger.yaml +++ b/rust/fatcat-api/api/swagger.yaml @@ -13,20 +13,20 @@ consumes: produces: - "application/json" paths: - /creator: + /container: post: parameters: - in: "body" name: "entity" required: true schema: - $ref: "#/definitions/creator_entity" - uppercase_data_type: "CREATORENTITY" - refName: "creator_entity" + $ref: "#/definitions/container_entity" + uppercase_data_type: "CONTAINERENTITY" + refName: "container_entity" formatString: "{:?}" example: "???" model_key: "changelogentries_inner" - uppercase_operation_id: "CREATOR_POST" + uppercase_operation_id: "CONTAINER_POST" consumesJson: true responses: 201: @@ -35,7 +35,7 @@ paths: $ref: "#/definitions/entity_edit" x-responseId: "CreatedEntity" x-uppercaseResponseId: "CREATED_ENTITY" - uppercase_operation_id: "CREATOR_POST" + uppercase_operation_id: "CONTAINER_POST" uppercase_data_type: "ENTITYEDIT" producesJson: true 400: @@ -44,7 +44,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "BadRequest" x-uppercaseResponseId: "BAD_REQUEST" - uppercase_operation_id: "CREATOR_POST" + uppercase_operation_id: "CONTAINER_POST" uppercase_data_type: "ERRORRESPONSE" producesJson: true 404: @@ -53,7 +53,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "NotFound" x-uppercaseResponseId: "NOT_FOUND" - uppercase_operation_id: "CREATOR_POST" + uppercase_operation_id: "CONTAINER_POST" uppercase_data_type: "ERRORRESPONSE" producesJson: true default: @@ -62,16 +62,75 @@ paths: $ref: "#/definitions/error_response" x-responseId: "GenericError" x-uppercaseResponseId: "GENERIC_ERROR" - uppercase_operation_id: "CREATOR_POST" + uppercase_operation_id: "CONTAINER_POST" uppercase_data_type: "ERRORRESPONSE" producesJson: true - operation_id: "creator_post" - uppercase_operation_id: "CREATOR_POST" - path: "/creator" + operation_id: "container_post" + uppercase_operation_id: "CONTAINER_POST" + path: "/container" HttpMethod: "Post" httpmethod: "post" noClientExample: true - /creator/{id}: + /container/batch: + post: + parameters: + - in: "body" + name: "entity_list" + required: true + schema: + type: "array" + items: + $ref: "#/definitions/container_entity" + formatString: "{:?}" + example: "&Vec::new()" + model_key: "changelogentries_inner" + uppercase_operation_id: "CONTAINER_BATCH_POST" + consumesJson: true + responses: + 201: + description: "Created Entities" + schema: + type: "array" + items: + $ref: "#/definitions/entity_edit" + x-responseId: "CreatedEntities" + x-uppercaseResponseId: "CREATED_ENTITIES" + uppercase_operation_id: "CONTAINER_BATCH_POST" + uppercase_data_type: "VEC" + producesJson: true + 400: + description: "Bad Request" + schema: + $ref: "#/definitions/error_response" + x-responseId: "BadRequest" + x-uppercaseResponseId: "BAD_REQUEST" + uppercase_operation_id: "CONTAINER_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + 404: + description: "Not Found" + schema: + $ref: "#/definitions/error_response" + x-responseId: "NotFound" + x-uppercaseResponseId: "NOT_FOUND" + uppercase_operation_id: "CONTAINER_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + default: + description: "Generic Error" + schema: + $ref: "#/definitions/error_response" + x-responseId: "GenericError" + x-uppercaseResponseId: "GENERIC_ERROR" + uppercase_operation_id: "CONTAINER_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + operation_id: "container_batch_post" + uppercase_operation_id: "CONTAINER_BATCH_POST" + path: "/container/batch" + HttpMethod: "Post" + httpmethod: "post" + /container/{id}: get: parameters: - name: "id" @@ -84,11 +143,11 @@ paths: 200: description: "Found Entity" schema: - $ref: "#/definitions/creator_entity" + $ref: "#/definitions/container_entity" x-responseId: "FoundEntity" x-uppercaseResponseId: "FOUND_ENTITY" - uppercase_operation_id: "CREATOR_ID_GET" - uppercase_data_type: "CREATORENTITY" + uppercase_operation_id: "CONTAINER_ID_GET" + uppercase_data_type: "CONTAINERENTITY" producesJson: true 400: description: "Bad Request" @@ -96,7 +155,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "BadRequest" x-uppercaseResponseId: "BAD_REQUEST" - uppercase_operation_id: "CREATOR_ID_GET" + uppercase_operation_id: "CONTAINER_ID_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true 404: @@ -105,7 +164,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "NotFound" x-uppercaseResponseId: "NOT_FOUND" - uppercase_operation_id: "CREATOR_ID_GET" + uppercase_operation_id: "CONTAINER_ID_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true default: @@ -114,32 +173,32 @@ paths: $ref: "#/definitions/error_response" x-responseId: "GenericError" x-uppercaseResponseId: "GENERIC_ERROR" - uppercase_operation_id: "CREATOR_ID_GET" + uppercase_operation_id: "CONTAINER_ID_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true - operation_id: "creator_id_get" - uppercase_operation_id: "CREATOR_ID_GET" - path: "/creator/:id" + operation_id: "container_id_get" + uppercase_operation_id: "CONTAINER_ID_GET" + path: "/container/:id" HttpMethod: "Get" httpmethod: "get" - /creator/lookup: + /container/lookup: get: parameters: - - name: "orcid" + - name: "issnl" in: "query" required: true type: "string" formatString: "\\\"{}\\\"" - example: "\"orcid_example\".to_string()" + example: "\"issnl_example\".to_string()" responses: 200: description: "Found Entity" schema: - $ref: "#/definitions/creator_entity" + $ref: "#/definitions/container_entity" x-responseId: "FoundEntity" x-uppercaseResponseId: "FOUND_ENTITY" - uppercase_operation_id: "CREATOR_LOOKUP_GET" - uppercase_data_type: "CREATORENTITY" + uppercase_operation_id: "CONTAINER_LOOKUP_GET" + uppercase_data_type: "CONTAINERENTITY" producesJson: true 400: description: "Bad Request" @@ -147,7 +206,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "BadRequest" x-uppercaseResponseId: "BAD_REQUEST" - uppercase_operation_id: "CREATOR_LOOKUP_GET" + uppercase_operation_id: "CONTAINER_LOOKUP_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true 404: @@ -156,7 +215,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "NotFound" x-uppercaseResponseId: "NOT_FOUND" - uppercase_operation_id: "CREATOR_LOOKUP_GET" + uppercase_operation_id: "CONTAINER_LOOKUP_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true default: @@ -165,28 +224,28 @@ paths: $ref: "#/definitions/error_response" x-responseId: "GenericError" x-uppercaseResponseId: "GENERIC_ERROR" - uppercase_operation_id: "CREATOR_LOOKUP_GET" + uppercase_operation_id: "CONTAINER_LOOKUP_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true - operation_id: "creator_lookup_get" - uppercase_operation_id: "CREATOR_LOOKUP_GET" - path: "/creator/lookup" + operation_id: "container_lookup_get" + uppercase_operation_id: "CONTAINER_LOOKUP_GET" + path: "/container/lookup" HttpMethod: "Get" httpmethod: "get" - /container: + /creator: post: parameters: - in: "body" name: "entity" required: true schema: - $ref: "#/definitions/container_entity" - uppercase_data_type: "CONTAINERENTITY" - refName: "container_entity" + $ref: "#/definitions/creator_entity" + uppercase_data_type: "CREATORENTITY" + refName: "creator_entity" formatString: "{:?}" example: "???" model_key: "changelogentries_inner" - uppercase_operation_id: "CONTAINER_POST" + uppercase_operation_id: "CREATOR_POST" consumesJson: true responses: 201: @@ -195,7 +254,7 @@ paths: $ref: "#/definitions/entity_edit" x-responseId: "CreatedEntity" x-uppercaseResponseId: "CREATED_ENTITY" - uppercase_operation_id: "CONTAINER_POST" + uppercase_operation_id: "CREATOR_POST" uppercase_data_type: "ENTITYEDIT" producesJson: true 400: @@ -204,7 +263,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "BadRequest" x-uppercaseResponseId: "BAD_REQUEST" - uppercase_operation_id: "CONTAINER_POST" + uppercase_operation_id: "CREATOR_POST" uppercase_data_type: "ERRORRESPONSE" producesJson: true 404: @@ -213,7 +272,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "NotFound" x-uppercaseResponseId: "NOT_FOUND" - uppercase_operation_id: "CONTAINER_POST" + uppercase_operation_id: "CREATOR_POST" uppercase_data_type: "ERRORRESPONSE" producesJson: true default: @@ -222,16 +281,75 @@ paths: $ref: "#/definitions/error_response" x-responseId: "GenericError" x-uppercaseResponseId: "GENERIC_ERROR" - uppercase_operation_id: "CONTAINER_POST" + uppercase_operation_id: "CREATOR_POST" uppercase_data_type: "ERRORRESPONSE" producesJson: true - operation_id: "container_post" - uppercase_operation_id: "CONTAINER_POST" - path: "/container" + operation_id: "creator_post" + uppercase_operation_id: "CREATOR_POST" + path: "/creator" HttpMethod: "Post" httpmethod: "post" noClientExample: true - /container/{id}: + /creator/batch: + post: + parameters: + - in: "body" + name: "entity_list" + required: true + schema: + type: "array" + items: + $ref: "#/definitions/creator_entity" + formatString: "{:?}" + example: "&Vec::new()" + model_key: "changelogentries_inner" + uppercase_operation_id: "CREATOR_BATCH_POST" + consumesJson: true + responses: + 201: + description: "Created Entities" + schema: + type: "array" + items: + $ref: "#/definitions/entity_edit" + x-responseId: "CreatedEntities" + x-uppercaseResponseId: "CREATED_ENTITIES" + uppercase_operation_id: "CREATOR_BATCH_POST" + uppercase_data_type: "VEC" + producesJson: true + 400: + description: "Bad Request" + schema: + $ref: "#/definitions/error_response" + x-responseId: "BadRequest" + x-uppercaseResponseId: "BAD_REQUEST" + uppercase_operation_id: "CREATOR_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + 404: + description: "Not Found" + schema: + $ref: "#/definitions/error_response" + x-responseId: "NotFound" + x-uppercaseResponseId: "NOT_FOUND" + uppercase_operation_id: "CREATOR_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + default: + description: "Generic Error" + schema: + $ref: "#/definitions/error_response" + x-responseId: "GenericError" + x-uppercaseResponseId: "GENERIC_ERROR" + uppercase_operation_id: "CREATOR_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + operation_id: "creator_batch_post" + uppercase_operation_id: "CREATOR_BATCH_POST" + path: "/creator/batch" + HttpMethod: "Post" + httpmethod: "post" + /creator/{id}: get: parameters: - name: "id" @@ -244,11 +362,11 @@ paths: 200: description: "Found Entity" schema: - $ref: "#/definitions/container_entity" + $ref: "#/definitions/creator_entity" x-responseId: "FoundEntity" x-uppercaseResponseId: "FOUND_ENTITY" - uppercase_operation_id: "CONTAINER_ID_GET" - uppercase_data_type: "CONTAINERENTITY" + uppercase_operation_id: "CREATOR_ID_GET" + uppercase_data_type: "CREATORENTITY" producesJson: true 400: description: "Bad Request" @@ -256,7 +374,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "BadRequest" x-uppercaseResponseId: "BAD_REQUEST" - uppercase_operation_id: "CONTAINER_ID_GET" + uppercase_operation_id: "CREATOR_ID_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true 404: @@ -265,7 +383,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "NotFound" x-uppercaseResponseId: "NOT_FOUND" - uppercase_operation_id: "CONTAINER_ID_GET" + uppercase_operation_id: "CREATOR_ID_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true default: @@ -274,32 +392,32 @@ paths: $ref: "#/definitions/error_response" x-responseId: "GenericError" x-uppercaseResponseId: "GENERIC_ERROR" - uppercase_operation_id: "CONTAINER_ID_GET" + uppercase_operation_id: "CREATOR_ID_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true - operation_id: "container_id_get" - uppercase_operation_id: "CONTAINER_ID_GET" - path: "/container/:id" + operation_id: "creator_id_get" + uppercase_operation_id: "CREATOR_ID_GET" + path: "/creator/:id" HttpMethod: "Get" httpmethod: "get" - /container/lookup: + /creator/lookup: get: parameters: - - name: "issnl" + - name: "orcid" in: "query" required: true type: "string" formatString: "\\\"{}\\\"" - example: "\"issnl_example\".to_string()" + example: "\"orcid_example\".to_string()" responses: 200: description: "Found Entity" schema: - $ref: "#/definitions/container_entity" + $ref: "#/definitions/creator_entity" x-responseId: "FoundEntity" x-uppercaseResponseId: "FOUND_ENTITY" - uppercase_operation_id: "CONTAINER_LOOKUP_GET" - uppercase_data_type: "CONTAINERENTITY" + uppercase_operation_id: "CREATOR_LOOKUP_GET" + uppercase_data_type: "CREATORENTITY" producesJson: true 400: description: "Bad Request" @@ -307,7 +425,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "BadRequest" x-uppercaseResponseId: "BAD_REQUEST" - uppercase_operation_id: "CONTAINER_LOOKUP_GET" + uppercase_operation_id: "CREATOR_LOOKUP_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true 404: @@ -316,7 +434,7 @@ paths: $ref: "#/definitions/error_response" x-responseId: "NotFound" x-uppercaseResponseId: "NOT_FOUND" - uppercase_operation_id: "CONTAINER_LOOKUP_GET" + uppercase_operation_id: "CREATOR_LOOKUP_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true default: @@ -325,12 +443,12 @@ paths: $ref: "#/definitions/error_response" x-responseId: "GenericError" x-uppercaseResponseId: "GENERIC_ERROR" - uppercase_operation_id: "CONTAINER_LOOKUP_GET" + uppercase_operation_id: "CREATOR_LOOKUP_GET" uppercase_data_type: "ERRORRESPONSE" producesJson: true - operation_id: "container_lookup_get" - uppercase_operation_id: "CONTAINER_LOOKUP_GET" - path: "/container/lookup" + operation_id: "creator_lookup_get" + uppercase_operation_id: "CREATOR_LOOKUP_GET" + path: "/creator/lookup" HttpMethod: "Get" httpmethod: "get" /file: @@ -391,6 +509,65 @@ paths: HttpMethod: "Post" httpmethod: "post" noClientExample: true + /file/batch: + post: + parameters: + - in: "body" + name: "entity_list" + required: true + schema: + type: "array" + items: + $ref: "#/definitions/file_entity" + formatString: "{:?}" + example: "&Vec::new()" + model_key: "changelogentries_inner" + uppercase_operation_id: "FILE_BATCH_POST" + consumesJson: true + responses: + 201: + description: "Created Entities" + schema: + type: "array" + items: + $ref: "#/definitions/entity_edit" + x-responseId: "CreatedEntities" + x-uppercaseResponseId: "CREATED_ENTITIES" + uppercase_operation_id: "FILE_BATCH_POST" + uppercase_data_type: "VEC" + producesJson: true + 400: + description: "Bad Request" + schema: + $ref: "#/definitions/error_response" + x-responseId: "BadRequest" + x-uppercaseResponseId: "BAD_REQUEST" + uppercase_operation_id: "FILE_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + 404: + description: "Not Found" + schema: + $ref: "#/definitions/error_response" + x-responseId: "NotFound" + x-uppercaseResponseId: "NOT_FOUND" + uppercase_operation_id: "FILE_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + default: + description: "Generic Error" + schema: + $ref: "#/definitions/error_response" + x-responseId: "GenericError" + x-uppercaseResponseId: "GENERIC_ERROR" + uppercase_operation_id: "FILE_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + operation_id: "file_batch_post" + uppercase_operation_id: "FILE_BATCH_POST" + path: "/file/batch" + HttpMethod: "Post" + httpmethod: "post" /file/{id}: get: parameters: @@ -551,6 +728,65 @@ paths: HttpMethod: "Post" httpmethod: "post" noClientExample: true + /release/batch: + post: + parameters: + - in: "body" + name: "entity_list" + required: true + schema: + type: "array" + items: + $ref: "#/definitions/release_entity" + formatString: "{:?}" + example: "&Vec::new()" + model_key: "changelogentries_inner" + uppercase_operation_id: "RELEASE_BATCH_POST" + consumesJson: true + responses: + 201: + description: "Created Entities" + schema: + type: "array" + items: + $ref: "#/definitions/entity_edit" + x-responseId: "CreatedEntities" + x-uppercaseResponseId: "CREATED_ENTITIES" + uppercase_operation_id: "RELEASE_BATCH_POST" + uppercase_data_type: "VEC" + producesJson: true + 400: + description: "Bad Request" + schema: + $ref: "#/definitions/error_response" + x-responseId: "BadRequest" + x-uppercaseResponseId: "BAD_REQUEST" + uppercase_operation_id: "RELEASE_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + 404: + description: "Not Found" + schema: + $ref: "#/definitions/error_response" + x-responseId: "NotFound" + x-uppercaseResponseId: "NOT_FOUND" + uppercase_operation_id: "RELEASE_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + default: + description: "Generic Error" + schema: + $ref: "#/definitions/error_response" + x-responseId: "GenericError" + x-uppercaseResponseId: "GENERIC_ERROR" + uppercase_operation_id: "RELEASE_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + operation_id: "release_batch_post" + uppercase_operation_id: "RELEASE_BATCH_POST" + path: "/release/batch" + HttpMethod: "Post" + httpmethod: "post" /release/{id}: get: parameters: @@ -711,6 +947,65 @@ paths: HttpMethod: "Post" httpmethod: "post" noClientExample: true + /work/batch: + post: + parameters: + - in: "body" + name: "entity_list" + required: true + schema: + type: "array" + items: + $ref: "#/definitions/work_entity" + formatString: "{:?}" + example: "&Vec::new()" + model_key: "changelogentries_inner" + uppercase_operation_id: "WORK_BATCH_POST" + consumesJson: true + responses: + 201: + description: "Created Entities" + schema: + type: "array" + items: + $ref: "#/definitions/entity_edit" + x-responseId: "CreatedEntities" + x-uppercaseResponseId: "CREATED_ENTITIES" + uppercase_operation_id: "WORK_BATCH_POST" + uppercase_data_type: "VEC" + producesJson: true + 400: + description: "Bad Request" + schema: + $ref: "#/definitions/error_response" + x-responseId: "BadRequest" + x-uppercaseResponseId: "BAD_REQUEST" + uppercase_operation_id: "WORK_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + 404: + description: "Not Found" + schema: + $ref: "#/definitions/error_response" + x-responseId: "NotFound" + x-uppercaseResponseId: "NOT_FOUND" + uppercase_operation_id: "WORK_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + default: + description: "Generic Error" + schema: + $ref: "#/definitions/error_response" + x-responseId: "GenericError" + x-uppercaseResponseId: "GENERIC_ERROR" + uppercase_operation_id: "WORK_BATCH_POST" + uppercase_data_type: "ERRORRESPONSE" + producesJson: true + operation_id: "work_batch_post" + uppercase_operation_id: "WORK_BATCH_POST" + path: "/work/batch" + HttpMethod: "Post" + httpmethod: "post" /work/{id}: get: parameters: @@ -1020,17 +1315,24 @@ definitions: example: message: "The computers did the thing successfully!" upperCaseName: "SUCCESS" - creator_entity: + container_entity: type: "object" required: - - "full_name" + - "name" properties: - orcid: + coden: type: "string" - example: "0000-0002-1825-0097" - full_name: + abbrev: type: "string" - example: "Grace Hopper" + issnl: + type: "string" + example: "1234-5678" + publisher: + type: "string" + example: "Society of Curious Students" + name: + type: "string" + example: "Journal of Important Results" extra: type: "object" editgroup_id: @@ -1056,32 +1358,28 @@ definitions: - "deleted" example: redirect: "f1f046a3-45c9-4b99-adce-000000000002" - full_name: "Grace Hopper" + coden: "coden" ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" + name: "Journal of Important Results" + publisher: "Society of Curious Students" editgroup_id: 16 - orcid: "0000-0002-1825-0097" + issnl: "1234-5678" + abbrev: "abbrev" state: "wip" revision: 42 - upperCaseName: "CREATOR_ENTITY" - container_entity: + upperCaseName: "CONTAINER_ENTITY" + creator_entity: type: "object" required: - - "name" + - "full_name" properties: - coden: - type: "string" - abbrev: - type: "string" - issnl: - type: "string" - example: "1234-5678" - publisher: + orcid: type: "string" - example: "Society of Curious Students" - name: + example: "0000-0002-1825-0097" + full_name: type: "string" - example: "Journal of Important Results" + example: "Grace Hopper" state: type: "string" enum: @@ -1107,17 +1405,14 @@ definitions: type: "object" example: redirect: "f1f046a3-45c9-4b99-adce-000000000002" - coden: "coden" + full_name: "Grace Hopper" ident: "f1f046a3-45c9-4b99-adce-000000000001" extra: "{}" - name: "Journal of Important Results" - publisher: "Society of Curious Students" editgroup_id: 16 - issnl: "1234-5678" - abbrev: "abbrev" + orcid: "0000-0002-1825-0097" state: "wip" revision: 42 - upperCaseName: "CONTAINER_ENTITY" + upperCaseName: "CREATOR_ENTITY" file_entity: type: "object" properties: -- cgit v1.2.3