From 6fd9be3c649dce1253ab23bc2d579c63fa2c7bf5 Mon Sep 17 00:00:00 2001 From: Thomas Schaffter Date: Thu, 25 Feb 2021 19:43:33 -0800 Subject: [PATCH] Release 1.0.1 (#43) * Update README and package.json * Re-generate server for API version 1.0.1 * Update API and tool version in Tool object --- README.md | 5 ++-- package.json | 1 + .../controllers/tool_controller.py | 4 +-- server/openapi_server/models/license.py | 1 + .../openapi_server/models/text_annotation.py | 2 ++ .../models/text_person_name_annotation.py | 2 ++ server/openapi_server/openapi/openapi.yaml | 29 +++++++++++++------ 7 files changed, 30 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 81b030b..2611dda 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ [![GitHub License](https://img.shields.io/github/license/nlpsandbox/person-name-annotator-example.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/nlpsandbox/person-name-annotator-example/blob/develop/LICENSE) [![Docker Pulls](https://img.shields.io/docker/pulls/nlpsandbox/person-name-annotator-example.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=pulls&logo=docker)](https://hub.docker.com/r/nlpsandbox/person-name-annotator-example) [![Discord](https://img.shields.io/discord/770484164393828373.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Discord&logo=discord)](https://discord.gg/Zb4ymtF "Realtime support / chat with the community and the team") -[![nlpsandbox.io](https://img.shields.io/badge/OpenAPI-nlpsandbox.io-blue?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjMxIiBoZWlnaHQ9IjMxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogPGcgY2xhc3M9ImxheWVyIj4KICA8dGl0bGU+U3luYXBzZSBMb2dvPC90aXRsZT4KICA8ZyBpZD0ic3ZnXzkiPgogICA8cmVjdCBmaWxsPSIjNUM5NEI5IiBoZWlnaHQ9IjIuNDg2MDUiIGlkPSJzdmdfMSIgdHJhbnNmb3JtPSJtYXRyaXgoMC43ODU4MTUgLTAuNDU1Nzg3IDAuNDU1Nzg3IDAuNzg1ODE1IC01LjQ0MzQ3IDguMDYyOTcpIiB3aWR0aD0iMTIiIHg9IjkuMjM5NTM3IiB5PSIxMi41NDQyNTQiLz4KICAgPHJlY3QgZmlsbD0iIzYyQUM2MiIgaGVpZ2h0PSIyLjQ5NjUyIiBpZD0ic3ZnXzIiIHRyYW5zZm9ybT0ibWF0cml4KDAuNzg4NzI2IDAuNDUwNzMxIC0wLjQ1NDU0NyAwLjc4NjUzMyA5LjI4Mjc0IDE4LjgzMjYpIiB3aWR0aD0iMTEuOTQ5OCIgeD0iLTIuMTE0ODg0IiB5PSItMS4zNTIwNjkiLz4KICAgPHJlY3QgZmlsbD0iI0U4NzYyQiIgaGVpZ2h0PSIyLjQ5NjUyIiBpZD0ic3ZnXzMiIHRyYW5zZm9ybT0ibWF0cml4KC0wLjAwMDM4OTA3OSAwLjkwODQzMSAwLjkwODQyMiAtMC4wMDQwMTI0MiAyMC44ODgzIDEyLjEwMTkpIiB3aWR0aD0iMTEuOTQ5OCIgeD0iLTIuMjI1MDk4IiB5PSItMS4xNjA2NCIvPgogICA8cGF0aCBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im03LjUwMzIwMSwxOS45OTIyMjdjMi4xNjk5NDMsLTEuMjU4ODU4IDIuOTE0MjQ5LC00LjAyODUxIDEuNjYyNDkxLC02LjE4NjAzMWMtMS4yNTA4NjQsLTIuMTU4NDA2IC00LjAyNDk1NSwtMi44ODc2NDEgLTYuMTk0ODk3LC0xLjYyODc4M2MtMi4xNjk5NDMsMS4yNTg4NTggLTIuOTE0MjUzLDQuMDI4NTAyIC0xLjY2MjQ5Niw2LjE4NjAyM2MxLjI1MDg2OSwyLjE1ODQxNCA0LjAyNDk1NywyLjg4Njc1OCA2LjE5NDkwMiwxLjYyODc5MXptLTEuMTMyODgsLTEuOTUzNDg4YzEuMDg0OTcyLC0wLjYyOTg3MSAxLjQ1NzU2MywtMi4wMTQ2OTMgMC44MzEyNDUsLTMuMDkzNDUxYy0wLjYyNTQzMiwtMS4wNzg3NjggLTIuMDEyOTIyLC0xLjQ0MzM3NCAtMy4wOTc4ODYsLTAuODEzNTA4Yy0xLjA4NDk3NSwwLjYyODk3OSAtMS40NTY2OSwyLjAxMzgwOSAtMC44MzEyNTEsMy4wOTI1NzJjMC42MjYzMTgsMS4wNzg3NTcgMi4wMTI5MjIsMS40NDMzNzQgMy4wOTc4OTIsMC44MTQzODd6IiBmaWxsPSIjQzRDNEM0IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGlkPSJzdmdfNCIvPgogICA8cGF0aCBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMy4yMTk3ODYsMTAuODc1OTM5YzIuMTY5OTQzLC0xLjI1ODg1OCAyLjkxNDI0OSwtNC4wMjg1MSAxLjY2MjQ5MSwtNi4xODYwMzFjLTEuMjUwODY0LC0yLjE1ODQwNiAtNC4wMjQ5NTUsLTIuODg3NjQxIC02LjE5NDg5NywtMS42Mjg3ODNjLTIuMTY5OTQzLDEuMjU4ODU4IC0yLjkxNDI1Myw0LjAyODUwMiAtMS42NjI0OTYsNi4xODYwMjNjMS4yNTA4NjksMi4xNTg0MTQgNC4wMjQ5NTcsMi44ODY3NTggNi4xOTQ5MDIsMS42Mjg3OTF6bS0xLjEzMjg4LC0xLjk1MzQ4OGMxLjA4NDk3MiwtMC42Mjk4NzEgMS40NTc1NjMsLTIuMDE0NjkzIDAuODMxMjQ1LC0zLjA5MzQ1MWMtMC42MjU0MzIsLTEuMDc4NzY4IC0yLjAxMjkyMiwtMS40NDMzNzQgLTMuMDk3ODg2LC0wLjgxMzUwOGMtMS4wODQ5NzUsMC42Mjg5NzkgLTEuNDU2NjksMi4wMTM4MDkgLTAuODMxMjUxLDMuMDkyNTcyYzAuMTUxNjk3LDAuMjYxNzAyIDAuMzQ4NjQsMC40ODE3MTIgMC41NzQ4NjYsMC42NTU1OTVjMC43MDYxNjQsMC41NDIwNDMgMS43MDE1MywwLjYzNTE5IDIuNTIzMDI2LDAuMTU4NzkxeiIgZmlsbD0iI0M0QzRDNCIgZmlsbC1ydWxlPSJldmVub2RkIiBpZD0ic3ZnXzUiLz4KICAgPHBhdGggY2xpcC1ydWxlPSJldmVub2RkIiBkPSJtMjMuMjE5MTk0LDEwLjg3NjgyOWMyLjE2OTk0MiwtMS4yNTg4NDkgMi45MTQyMzgsLTQuMDI4NTAxIDEuNjYyNTAyLC02LjE4NjAyNWMtMS4yNTA4NjQsLTIuMTU4NDA1IC00LjAyNDk1LC0yLjg4NzYzOSAtNi4xOTQ5MDEsLTEuNjI4NzljLTIuMTY5OTQyLDEuMjU4ODU4IC0yLjkxNDI0Nyw0LjAyODUxMSAtMS42NjI1MDIsNi4xODYwMzVjMS4yNTA4NzMsMi4xNTg0MDUgNC4wMjQ5NTksMi44ODY3OTQgNi4xOTQ5MDEsMS42Mjg3ODF6bS0xLjEzMjg3NywtMS45NTQzNjJjMS4wODQ5NzYsLTAuNjI5ODcgMS40NTc1NjksLTIuMDE0NyAwLjgzMTI1MSwtMy4wOTM0NjJjLTAuNjI1NDM3LC0xLjA3ODc2MiAtMi4wMTI5MiwtMS40NDMzNyAtMy4wOTc4OTYsLTAuODEzNWMtMS4wODQ5NjcsMC42Mjg5OCAtMS40NTY2NzgsMi4wMTM4MDEgLTAuODMxMjUxLDMuMDkyNTYzYzAuMTUxNzA4LDAuMjYxNzEgMC4zNDg2NDcsMC40ODE3MjMgMC41NzQ4NzMsMC42NTU1OTdjMC43MDYxNiwwLjU0MjA0MyAxLjcwMTUyOCwwLjYzNTE5MyAyLjUyMzAyMiwwLjE1ODgwM3oiIGZpbGw9IiM1Qzk0QjkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgaWQ9InN2Z182Ii8+CiAgIDxwYXRoIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTE4LjQxMTg5NiwyOC4xNDE4MThjMi4xNjkwNTIsMS4yMzkzMzYgNC45NDMxMzcsMC40ODYxNTYgNi4xOTY2NzIsLTEuNjgyOTA1YzEuMjUzNTE3LC0yLjE2OTA1MiAwLjUxMTg3NCwtNC45MzE2MDkgLTEuNjU3MTc4LC02LjE3MDk0NWMtMi4xNjkwNjEsLTEuMjM5MzI3IC00Ljk0MzE0NiwtMC40ODYxNDcgLTYuMTk2NjcyLDEuNjgyOTA1Yy0xLjI1MzUyNiwyLjE2OTA2MSAtMC41MTE4ODMsNC45MzE2MDkgMS42NTcxNzgsNi4xNzA5NDV6bTEuMTM0NjQ5LC0xLjk2MzIzOGMxLjA4NDA4NSwwLjYxOTIyMyAyLjQ3MTU2OSwwLjI0MzA3OCAzLjA5ODc3NywtMC44NDE4OThjMC42MjYzMjcsLTEuMDg0MDg1IDAuMjU1NDk2LC0yLjQ2NjI0NSAtMC44Mjk0NywtMy4wODU0NjhjLTEuMDg0MDg1LC0wLjYyMDExMyAtMi40NzE1NzgsLTAuMjQzMDc4IC0zLjA5Nzg5NiwwLjg0MTAwN2MtMC42MjcyMDgsMS4wODQ5NjcgLTAuMjU1NDk2LDIuNDY2MjQ1IDAuODI4NTg5LDMuMDg2MzU4eiIgZmlsbD0iI0U4NzYyQiIgZmlsbC1ydWxlPSJldmVub2RkIiBpZD0ic3ZnXzciLz4KICAgPHBhdGggY2xpcC1ydWxlPSJldmVub2RkIiBkPSJtNy41MDI2MDksMTkuOTYxMTU4YzIuMTY5OTQyLC0xLjI1ODg0OSAyLjkxNDIzOCwtNC4wMjg1MDEgMS42NjI1MDIsLTYuMTg2MDI1Yy0xLjI1MDg2NCwtMi4xNTg0MDUgLTQuMDI0OTUsLTIuODg3NjM5IC02LjE5NDkwMSwtMS42Mjg3OWMtMi4xNjk5NDIsMS4yNTg4NTggLTIuOTE0MjQ3LDQuMDI4NTExIC0xLjY2MjUwMiw2LjE4NjAzNWMxLjI1MDg3MywyLjE1ODQwNSA0LjAyNDk1OSwyLjg4Njc5NCA2LjE5NDkwMSwxLjYyODc4MXptLTAuMTM1NzI5LC0zLjE0MjI0NWMwLjIyMTc4NCwtMC42MDc2OTUgMC4xODM2MzksLTEuMzA0MDk4IC0wLjE2NTg5OCwtMS45MDU1OGMtMC4zMzA5MDUsLTAuNTcwNDMxIC0wLjg3NDcxOSwtMC45NDEyNTMgLTEuNDczNTM5LC0xLjA3MDc3N2MtMC41MzQwNTgsLTAuMTE1MzI1IC0xLjExMjQ3NCwtMC4wMzk5MTYgLTEuNjI0MzU3LDAuMjU3Mjc3Yy0wLjU0NzM2NiwwLjMxNzU5NyAtMC45MTM3NTUsMC44Mjc2OTkgLTEuMDYxOTAxLDEuMzkzNjk3Yy0wLjE0NDYwNCwwLjU1NTM0MiAtMC4wNzg5NjEsMS4xNjQ4MDkgMC4yMzA2NTEsMS42OTg4NjZjMC42MjYzMjcsMS4wNzg3NjIgMi4wMTI5MiwxLjQ0MzM3OSAzLjA5Nzg5NiwwLjgxNDM5OWMwLjQ3OTk0MiwtMC4yNzg1NjEgMC44MjA2MDQsLTAuNzA1Mjc5IDAuOTk3MTQ5LC0xLjE4Nzg4M3oiIGZpbGw9IiM2MkFDNjIiIGZpbGwtcnVsZT0iZXZlbm9kZCIgaWQ9InN2Z184Ii8+CiAgPC9nPgogPC9nPgo8L3N2Zz4=&label=)](https://www.nlpsandbox.io/tools/person-name-annotator/leaderboards "View the performance of this NLP Tool on nlpsandbox.io") Example implementation of the [NLP Sandbox Person Name Annotator] @@ -19,8 +18,8 @@ found in the clinical note. ### Specification -- Person Name Annotator API version: 1.0.0 -- Tool version: 1.0.0 +- Person Name Annotator API version: 1.0.1 +- Tool version: 1.0.1 - Docker image: [nlpsandbox/person-name-annotator-example] ## Model diff --git a/package.json b/package.json index beb229d..2066979 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ }, "scripts": { "generate:server": "openapi-generator-cli generate -g python-flask -o server -i $npm_config_specification", + "generate:server:latest": "openapi-generator-cli generate -g python-flask -o server -i https://nlpsandbox.github.io/nlpsandbox-schemas/person-name-annotator/latest/openapi.json", "lint": "cd server && flake8", "test": "cd server && tox" } diff --git a/server/openapi_server/controllers/tool_controller.py b/server/openapi_server/controllers/tool_controller.py index 2c498ea..2549257 100644 --- a/server/openapi_server/controllers/tool_controller.py +++ b/server/openapi_server/controllers/tool_controller.py @@ -13,7 +13,7 @@ def get_tool(): # noqa: E501 """ tool = Tool( name="person-name-annotator-example", - version="1.0.0", + version="1.0.1", license=License.APACHE_2_0, repository="github:nlpsandbox/person-name-annotator-example", description="Example implementation of the NLP Sandbox Person " + @@ -22,7 +22,7 @@ def get_tool(): # noqa: E501 author_email="thomas.schaffter@sagebionetworks.org", url="https://github.com/nlpsandbox/person-name-annotator-example", tool_type="nlpsandbox:person-name-annotator", - tool_api_version="1.0.0" + tool_api_version="1.0.1" ) return tool, 200 diff --git a/server/openapi_server/models/license.py b/server/openapi_server/models/license.py index 8811cc7..42df981 100644 --- a/server/openapi_server/models/license.py +++ b/server/openapi_server/models/license.py @@ -52,6 +52,7 @@ class License(Model): NCSA = "ncsa" UNLICENSE = "unlicense" ZLIB = "zlib" + NONE = "none" def __init__(self): # noqa: E501 """License - a model defined in OpenAPI diff --git a/server/openapi_server/models/text_annotation.py b/server/openapi_server/models/text_annotation.py index b9bcd68..0effae4 100644 --- a/server/openapi_server/models/text_annotation.py +++ b/server/openapi_server/models/text_annotation.py @@ -152,6 +152,8 @@ def confidence(self, confidence): :param confidence: The confidence of this TextAnnotation. :type confidence: float """ + if confidence is None: + raise ValueError("Invalid value for `confidence`, must not be `None`") # noqa: E501 if confidence is not None and confidence > 100: # noqa: E501 raise ValueError("Invalid value for `confidence`, must be a value less than or equal to `100`") # noqa: E501 if confidence is not None and confidence < 0: # noqa: E501 diff --git a/server/openapi_server/models/text_person_name_annotation.py b/server/openapi_server/models/text_person_name_annotation.py index 8bb6f8e..53bd37d 100644 --- a/server/openapi_server/models/text_person_name_annotation.py +++ b/server/openapi_server/models/text_person_name_annotation.py @@ -154,6 +154,8 @@ def confidence(self, confidence): :param confidence: The confidence of this TextPersonNameAnnotation. :type confidence: float """ + if confidence is None: + raise ValueError("Invalid value for `confidence`, must not be `None`") # noqa: E501 if confidence is not None and confidence > 100: # noqa: E501 raise ValueError("Invalid value for `confidence`, must be a value less than or equal to `100`") # noqa: E501 if confidence is not None and confidence < 0: # noqa: E501 diff --git a/server/openapi_server/openapi/openapi.yaml b/server/openapi_server/openapi/openapi.yaml index 52f9c8a..9cc18b0 100644 --- a/server/openapi_server/openapi/openapi.yaml +++ b/server/openapi_server/openapi/openapi.yaml @@ -5,19 +5,28 @@ info: name: The NLP Sandbox Team url: https://nlpsandbox.io description: | - # Overview + # Introduction + The Person Name Annotator is one of the first type of NLP Tools that can be benchmarked on [nlpsandbox.io](https://nlpsandbox.io). A Person Name Annotator takes as input a clinical note and outputs a list of predicted person name annotations found in the clinical note. This OpenAPI document describes the specification of a Person Name Annotator. This specification includes the schemas of the input and output data, and the conditions that this annotator must meet if you want to benchmark its performance on [nlpsandbox.io](https://nlpsandbox.io). + # Getting Started + The GitHub repository [nlpsandbox/person-name-annotator-example](https://github.com/nlpsandbox/person-name-annotator-example) provides a simple example implementation of a Python-Flask Person Name Annotator. By the end of the tutorial available in this repository, you will have built a Docker image for a simple Person Name Annotator. You will then be able to submit this image to [nlpsandbox.io](https://nlpsandbox.io) to benchmark its performance. + # Benchmarking Requirements + The following conditions must be met by your Person Name Annotator if you want to benchmark its performance on [nlpsandbox.io](https://nlpsandbox.io). + - The endpoint `/` must redirect to `/api/v1/tool`. + - The endpoint `/ui` must redirect to the web interface (UI). + - The output of this tool must be reproducible: a given input should always + generate the same output. - This NLP tool detects references of person names in the clinical note given - as input and returns a list of person name annotations. + - This tool must not attempt to connect to remote server for reproducibility, + robustness, and security reasons. When benchmarked on [nlpsandbox.io](https://nlpsandbox.io), + this tool will not be able to connect to remote servers. # Examples - - - [NLP Sandbox Person Name Annotator (Python)](https://github.com/nlpsandbox/person-name-annotator-example) + - [Person Name Annotator Example (Python)](https://github.com/nlpsandbox/person-name-annotator-example) license: name: Apache 2.0 url: https://github.com/nlpsandbox/nlpsandbox-schemas/blob/develop/LICENSE title: NLP Sandbox Person Name Annotator API - version: 1.0.0 + version: 1.0.1 x-logo: url: https://nlpsandbox.github.io/nlpsandbox-schemas/logo.png servers: @@ -290,6 +299,7 @@ components: minimum: 0 type: number required: + - confidence - length - start - text @@ -362,6 +372,7 @@ components: - ncsa - unlicense - zlib + - none example: apache-2.0 type: string ToolType: @@ -383,7 +394,7 @@ components: authorEmail: author@example.com url: https://example.com toolType: nlpsandbox:date-annotator - toolApiVersion: 1.0.0 + toolApiVersion: 1.0.1 properties: name: description: The tool name @@ -453,7 +464,7 @@ components: authorEmail: author@example.com url: https://example.com toolType: nlpsandbox:date-annotator - toolApiVersion: 1.0.0 + toolApiVersion: 1.0.1 - name: awesome-nlp-tool version: 1.0.6 license: apache-2.0 @@ -463,7 +474,7 @@ components: authorEmail: author@example.com url: https://example.com toolType: nlpsandbox:date-annotator - toolApiVersion: 1.0.0 + toolApiVersion: 1.0.1 properties: toolDependencies: description: A list of tools