Skip to content

Commit

Permalink
Merge pull request #50 from CAVEconnectome/validate-table-names
Browse files Browse the repository at this point in the history
feat: validate table name; abort if not valid
  • Loading branch information
fcollman authored Mar 13, 2024
2 parents 3ff0d38 + 7f6df4d commit 8b33e77
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 6 deletions.
35 changes: 29 additions & 6 deletions annotationengine/api.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import re

import requests
from dynamicannotationdb.errors import (
Expand Down Expand Up @@ -115,6 +116,30 @@ def get_schema_from_service(annotation_type, endpoint):
return r.json()


def is_valid_table_name(table_name: str):
"""
Validates the table name against the allowed naming convention.
Table names can include lowercase letters,Tuple underscores, and numbers,
but cannot consist of numbers only and cannot be empty.
Args:
table_name (str): target table name
Returns:
(bool,str): if table name is valid and error message if not
"""


if not table_name:
return False, "Table name cannot be empty."

# Check if table name is valid: includes at least one lowercase letter,
# may contain numbers and underscores, but cannot be numbers only.
if not re.match(r'^[a-z_]+[a-z0-9_]*$', table_name):
return False, "Invalid table name. Table name must include at least one letter, and can only contain lowercase letters, numbers, and underscores (_)."

return True, ""

def trigger_supervoxel_lookup(
aligned_volume_name: str, table_name: str, inserted_ids: list
):
Expand Down Expand Up @@ -178,13 +203,11 @@ def post(self, aligned_volume_name: str):
else:
table_name = data.get("table_name")
headers = None
if not table_name.islower():
headers = {
"Warning": f'201 - "Table name "{table_name}" needs to be lower case. Table will be posted to the database as "{table_name.lower()}"'
}
table_name = table_name.lower()
is_valid, error_message = is_valid_table_name(table_name)
if not is_valid:
abort(400, f"Table name error: {error_message}")

schema_type = data.get("schema_type")
table_name = table_name.lower().replace(" ", "_")
try:
table_info = db.annotation.create_table(
table_name, schema_type, **metadata_dict
Expand Down
32 changes: 32 additions & 0 deletions test/test_validate_table_name.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import pytest
from annotationengine.api import is_valid_table_name

@pytest.mark.parametrize("table_name", [
"valid_table_name",
"another_valid_name",
"a",
"_valid",
"valid_",
"valid_table_1"
])
def test_valid_table_names(table_name):
is_valid, error_msg = is_valid_table_name(table_name)
assert is_valid == True
assert error_msg == ""

@pytest.mark.parametrize("table_name", [
"InvalidUpperCase",
"invalid space",
"invalid-table",
"invalid.table",
"@invalid",
"",
"123"
])
def test_invalid_table_names(table_name):
is_valid, error_msg = is_valid_table_name(table_name)
assert is_valid == False
if table_name == "":
assert error_msg == "Table name cannot be empty."
else:
assert error_msg == "Invalid table name. Table name must include at least one letter, and can only contain lowercase letters, numbers, and underscores (_)."

0 comments on commit 8b33e77

Please sign in to comment.