Skip to content

Commit

Permalink
Merge pull request ckan#8215 from ckan/extend-toolkit-with-validation
Browse files Browse the repository at this point in the history
Add logic.validate and schema.validator_args to toolkit
  • Loading branch information
wardi authored May 21, 2024
2 parents d77ceb7 + acde04b commit 5334bab
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 24 deletions.
2 changes: 2 additions & 0 deletions changes/8215.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add ``ckan.logic.schema.validator_args`` and ``ckan.logic.validate`` decorators
to toolkit.
19 changes: 17 additions & 2 deletions ckan/logic/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -665,8 +665,23 @@ def get_or_bust(

def validate(schema_func: Callable[[], Schema],
can_skip_validator: bool = False) -> Callable[[Action], Action]:
''' A decorator that validates an action function against a given schema
'''
"""A decorator that validates an action function against a given schema.
Example::
def schema_func():
return {
"a": [get_validator("int_validator")],
"__extras": [get_validator("ignore")]
}
@validate_action_data(schema_function)
def my_action(context, data_dict):
return data_dict
data = {"a": "1", "b": "2"}
assert my_action({}, data) == {"a": 1}
"""
def action_decorator(action: Action) -> Action:
@functools.wraps(action)
def wrapper(context: Context, data_dict: DataDict):
Expand Down
15 changes: 13 additions & 2 deletions ckan/logic/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,19 @@


def validator_args(fn: ComplexSchemaFunc) -> PlainSchemaFunc:
u'''collect validator names from argument names
and pass them to wrapped function'''
"""Collect validator names from argument names and pass them to wrapped
function.
Example::
@validator_args
def schema_function(not_empty, ignore):
return not_empty, ignore
ne, ig = schema_function()
assert ne is get_validator("not_empty")
assert ig is get_validator("ignore")
"""

args = inspect.signature(fn).parameters

Expand Down
85 changes: 65 additions & 20 deletions ckan/plugins/toolkit.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
auth_allow_anonymous_access,
auth_disallow_anonymous_access,
fresh_context,
validate,
schema,
)

import ckan.plugins.blanket as blanket
Expand Down Expand Up @@ -82,30 +84,73 @@
from ckan.model.base import BaseModel

__all__ = [
"ckan", "base", "render", "abort",
"get_action", "check_access",
"get_validator", "get_converter",
"chained_auth_function", "chained_action",
"ObjectNotFound", "NotAuthorized", "ValidationError", "UnknownValidator",
"get_or_bust",
"side_effect_free", "auth_sysadmins_check",
"auth_allow_anonymous_access", "auth_disallow_anonymous_access",
"blanket", "signals", "enqueue_job",
"Invalid", "navl_validate", "missing", "StopOnError",
"h", "literal", "chained_helper", "redirect_to", "url_for",
"CkanVersionException", "HelperError",
"config", "_", "ungettext", "g", "c", "request",
"asbool", "asint", "aslist", "login_user", "logout_user", "current_user",
"DefaultDatasetForm", "DefaultGroupForm", "DefaultOrganizationForm",
"error_shout",
"mail_recipient", "mail_user",
"render_snippet", "add_template_directory", "add_public_directory",
"BaseModel",
"CkanVersionException",
"DefaultDatasetForm",
"DefaultGroupForm",
"DefaultOrganizationForm",
"HelperError",
"Invalid",
"NotAuthorized",
"ObjectNotFound",
"StopOnError",
"UnknownValidator",
"ValidationError",
"_",
"abort",
"add_public_directory",
"add_resource",
"check_ckan_version", "requires_ckan_version", "get_endpoint",
"fresh_context", "BaseModel",
"add_template_directory",
"asbool",
"asint",
"aslist",
"auth_allow_anonymous_access",
"auth_disallow_anonymous_access",
"auth_sysadmins_check",
"base",
"blanket",
"c",
"chained_action",
"chained_auth_function",
"chained_helper",
"check_access",
"check_ckan_version",
"ckan",
"config",
"current_user",
"enqueue_job",
"error_shout",
"fresh_context",
"g",
"get_action",
"get_converter",
"get_endpoint",
"get_or_bust",
"get_validator",
"h",
"literal",
"login_user",
"logout_user",
"mail_recipient",
"mail_user",
"missing",
"navl_validate",
"redirect_to",
"render",
"render_snippet",
"request",
"requires_ckan_version",
"side_effect_free",
"signals",
"ungettext",
"url_for",
"validate_action_data",
"validator_args",
]

get_converter = get_validator
validate_action_data = validate
validator_args = schema.validator_args


# Wrapper for the render_snippet function as it uses keywords rather than
Expand Down

0 comments on commit 5334bab

Please sign in to comment.