You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.9 KiB

#
# Copyright 2025 Splunk Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Normalisers
"""
__all__ = ["Normaliser", "Boolean", "StringLower", "StringUpper"]
class Normaliser:
"""Base class of Normaliser."""
_name = None
def __init__(self):
pass
def normalize(self, value):
"""Normalize a given value.
:param value: value to normalize.
:returns: normalized value.
"""
raise NotImplementedError
@property
def name(self):
"""name of normaliser."""
return self._name or self.__class__.__name__
class Userdefined(Normaliser):
"""A Normaliser that defined by user itself.
The user-defined normaliser function should be in form:
``def fun(value, *args, **kwargs): ...``
It will return the original data if any exception occurred.
"""
def __init__(self, normaliser, *args, **kwargs):
"""
:param values: The collection of valid values
"""
super().__init__()
self._normaliser, self._args, self._kwargs = normaliser, args, kwargs
def normalize(self, value):
try:
return self._normaliser(value, *self._args, **self._kwargs)
except:
return value
class Boolean(Normaliser):
"""Normalize a boolean field.
Normalize given value to boolean: ``0`` or ``1``.
``default`` means the return for unrecognizable input of boolean.
"""
def __init__(self, default=True):
super().__init__()
self._default = "1" if default else "0"
def normalize(self, value):
if isinstance(value, (bool, int)):
return value and "1" or "0"
if not isinstance(value, str):
return self._default
value = value.strip().lower()
vals = {
"1": {"true", "t", "1", "yes", "y"},
"0": {"false", "f", "0", "no", "n"},
}
revDef = {"1": "0", "0": "1"}[self._default]
return revDef if value in vals[revDef] else self._default
class StringLower(Normaliser):
"""Normalize a string to all lower cases."""
def normalize(self, value):
if isinstance(value, str):
return value.strip().lower()
return value
class StringUpper(Normaliser):
"""Normalize a string to all upper cases."""
def normalize(self, value):
if isinstance(value, str):
return value.strip().upper()
return value