================================
Payload Validator
================================
To validate the payload data.
Quick Start
============
pip install payload-validator
Example Code
=============
CodeSandBox Link:
https://codesandbox.io/p/sandbox/payload-validator-zngckp?file=%2Fmain.py%3A1%2C1
More Example
==============
Example List:
https://github.com/cwadven/payload-validator/blob/master/examples/example1.py
Explain
============
Normal ValidatorErrorContext Usage
using_this_payload.py::
from datetime import datetime
from payload_validator.exceptions import (
InvalidValueError,
ValidationException,
)
from utils import validate_date_parsing
from payload_validator.validators import PayloadValidator
def validate_date_parsing(date_str):
try:
datetime.strptime(date_str, '%Y-%m-%d')
return True
except (TypeError, ValueError):
return False
# [ Examples of using validators ]
# 1. Inherit 'PayloadValidator' and define 'Meta class'
# 2. Define 'DEFAULT_MANDATORY_ERROR_MESSAGE' in 'PayloadValidator'
# 3-1. Define 'mandatory_keys' and 'type_of_keys' in 'Meta class'
# 3-2. 'mandatory_keys' is a 'dictionary' that contains key and error message
# 3-3. 'type_of_keys' is a 'dictionary' that contains key and type of key
# 3-4. 'type_of_keys' value of first index can contain 'function' returning 'boolean' accepted
# 4-1. Define 'validate_{key}' method in 'PayloadValidator'
# 4-2. 'validate_{key}' validating sequence is top to bottom code written in 'PayloadValidator'
# 4-3. If 'validate_{key}' raise 'InvalidValueError', it will be added to 'error_context'
# 4-4. 'InvalidValueError' 'error_value_by_key' input should be 'dictionary' that contains payload key and error message (this message could be iterator)
# 4-5. 'InvalidValueError' input can contain 'ignore_existing_error_keys' which skip if there is already payload key of error
# 5. Can override 'common_validate' method to add 'common_validation'
# 6. Validating Sequence: Mandatory Check -> Type Check -> validate_{key} (top from bottom code) -> common_validate
# 7. Use 'validate()' method to validate payload or execute 'is_valid()' method to check validation even once
# 8. 'ValidationException' will raise when error exists
# [ Extra Information ]
# you can use 'add_error_context' or 'add_error_and_skip_validation_key'
# instead of 'InvalidValueError' to define errors
# 1
class NewPayloadValidator(PayloadValidator):
# 2
DEFAULT_MANDATORY_ERROR_MESSAGE = 'mandatory data missing2'
class Meta:
# 3-1, 3-2
mandatory_keys = {
'displayable': 'displayable is required',
'mode': 'mode is always required',
'amount': 'why are you not setting amount?',
'minimum_order_value': 'minimum order value is required',
'applicable_order_types': 'really you are not setting applicable order types?',
'start_date': 'start date is required',
'end_date': 'end date is required for your job',
}
# 3-1, 3-3
type_of_keys = {
'amount': [int, 'integer_type_needs'],
'minimum_order_value': [int, 'integer_type_needs'],
'maximum_download_count': [(int, type(None)), 'integer_type_needs or NoneType'],
# 3-4
'start_date': [validate_date_parsing, 'need to be date type'],
'end_date': [validate_date_parsing, 'need to be date type'],
}
# 4-1, 4-2
def validate_hello_world(self):
if not self.get_payload('displayable'):
# 4-3, 4-4
raise InvalidValueError({'displayable': 'displayable is false'})
# 4-1, 4-2
def validate_max_length(self):
if self.get_payload('max_length') <= 0:
# 4-3, 4-4, 4-5
raise InvalidValueError(
{
'max_length': 'min_length should be greater than 0'
},
ignore_existing_error_keys=['max_length']
)
# 5
def common_validate(self):
if self.get_payload('max_length') < self.get_payload('min_length'):
raise InvalidValueError(
{
'max_length': 'max_length should be greater than min_length',
'min_length': 'min_length should be lesser than max_length'
},
)
validator = NewPayloadValidator({'displayable': True, 'start_date': 1, 'min_length': 10, 'max_length': 0})
try:
# 7
validator.validate()
except ValidationException as e:
print(validator.error_context)
# 8
if not validator.is_valid():
print(validator.error_context)
# [ Result ]
# {
# 'mode': ['mode is always required'],
# 'amount': ['why are you not setting amount?'],
# 'minimum_order_value': ['minimum order value is required'],
# 'applicable_order_types': ['really you are not setting applicable order types?'],
# 'end_date': ['end date is required for your job'],
# 'start_date': ['need to be date type'],
# 'max_length': ['min_length should be greater than 0'],
# 'min_length': ['min_length should be lesser than max_length']
# }
Custom ValidatorErrorContext Usage
custom_using_this_payload.py::
from datetime import datetime
from payload_validator.exceptions import (
InvalidValueError,
ValidationException,
)
from utils import validate_date_parsing
from payload_validator.validators import PayloadValidator, ValidatorErrorContext
def validate_date_parsing(date_str):
try:
datetime.strptime(date_str, '%Y-%m-%d')
return True
except (TypeError, ValueError):
return False
# [ Examples of using validators ]
# 1. Inherit 'PayloadValidator' and define 'Meta class'
# 2. Define 'DEFAULT_MANDATORY_ERROR_MESSAGE' in 'PayloadValidator'
# 3-1. Define 'mandatory_keys' and 'type_of_keys' in 'Meta class'
# 3-2. 'mandatory_keys' is a 'dictionary' that contains key and error message
# 3-3. 'type_of_keys' is a 'dictionary' that contains key and type of key
# 3-4. 'type_of_keys' value of first index can contain 'function' returning 'boolean' accepted
# 4-1. Define 'validate_{key}' method in 'PayloadValidator'
# 4-2. 'validate_{key}' validating sequence is top to bottom code written in 'PayloadValidator'
# 4-3. If 'validate_{key}' raise 'InvalidValueError', it will be added to 'error_context'
# 4-4. 'InvalidValueError' 'error_value_by_key' input should be 'dictionary' that contains payload key and error message (this message could be iterator)
# 4-5. 'InvalidValueError' input can contain 'ignore_existing_error_keys' which skip if there is already payload key of error
# 5. Can override 'common_validate' method to add 'common_validation'
# 6. Validating Sequence: Mandatory Check -> Type Check -> validate_{key} (top from bottom code) -> common_validate
# 7. Use 'validate()' method to validate payload or execute 'is_valid()' method to check validation even once
# 8. 'ValidationException' will raise when error exists
# [ Extra Information ]
# you can use 'add_error_context' or 'add_error_and_skip_validation_key'
# instead of 'InvalidValueError' to define errors
# Extra: Customize Error Context
# 'ColorValidatorErrorContext' is a 'PayloadValidator' can return error message with color
class ColorValidatorErrorContext(ValidatorErrorContext):
DEFAULT_COLOR = '#FFFFFF'
def add_error(self, field: str, error: str):
value = self.setdefault(field, [])
try:
error, color = error.split(',')
except (IndexError, ValueError):
color = self.DEFAULT_COLOR
value.append([error, color])
# 1
class ColorPayloadValidator(PayloadValidator):
# 2
DEFAULT_MANDATORY_ERROR_MESSAGE = 'mandatory data missing2'
class Meta:
# 3-1, 3-2
mandatory_keys = {
'displayable': 'displayable is required',
'mode': 'mode is always required',
'amount': 'why are you not setting amount?',
'minimum_order_value': 'minimum order value is required',
'applicable_order_types': 'really you are not setting applicable order types?',
'start_date': 'start date is required',
'end_date': 'end date is required for your job',
}
# 3-1, 3-3
type_of_keys = {
'amount': [int, 'integer_type_needs'],
'minimum_order_value': [int, 'integer_type_needs'],
'maximum_download_count': [(int, type(None)), 'integer_type_needs or NoneType'],
# 3-4
'start_date': [validate_date_parsing, 'need to be date type'],
'end_date': [validate_date_parsing, 'need to be date type'],
}
# 4-1, 4-2
def validate_hello_world(self):
if not self.get_payload('displayable'):
# 4-3, 4-4
raise InvalidValueError({'displayable': 'displayable is false,#123456'})
# 4-1, 4-2
def validate_max_length(self):
if self.get_payload('max_length') <= 0:
# 4-3, 4-4, 4-5
raise InvalidValueError(
{
'max_length': 'min_length should be greater than 0,#000000'
},
ignore_existing_error_keys=['max_length']
)
# 5
def common_validate(self):
if self.get_payload('max_length') < self.get_payload('min_length'):
raise InvalidValueError(
{
'max_length': 'max_length should be greater than min_length,#000000',
'min_length': 'min_length should be lesser than max_length,#123123'
},
)
validator = ColorPayloadValidator(
{'displayable': True, 'start_date': 1, 'min_length': 10, 'max_length': 0},
ColorValidatorErrorContext(),
)
try:
# 7
validator.validate()
except ValidationException as e:
print(validator.error_context)
# 8
if not validator.is_valid():
print(validator.error_context)
# [ Result ]
# {
# 'mode': [['mode is always required', '#FFFFFF']],
# 'amount': [['why are you not setting amount?', '#FFFFFF']],
# 'minimum_order_value': [['minimum order value is required', '#FFFFFF']],
# 'applicable_order_types': [['really you are not setting applicable order types?', '#FFFFFF']],
# 'end_date': [['end date is required for your job', '#FFFFFF']],
# 'start_date': [['need to be date type', '#FFFFFF']],
# 'max_length': [['min_length should be greater than 0', '#000000']],
# 'min_length': [['min_length should be lesser than max_length', '#123123']]
# }
Extra
========
Issue or Pull Request are welcome.
Raw data
{
"_id": null,
"home_page": "https://github.com/cwadven/payload-validator",
"name": "payload-validator",
"maintainer": "cwadven",
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "input, payload, validator, validate, validation, data, datas, python, python3, python3.6, python3.7, python3.8, python3.11",
"author": "cwadven",
"author_email": "cwadven4@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/54/35/51b3293bc35e80b4e91c06efc4cd713c00e53fff7667d386c998dd23af9a/payload-validator-0.1.11.tar.gz",
"platform": null,
"description": "================================\r\nPayload Validator\r\n================================\r\n\r\nTo validate the payload data.\r\n\r\n\r\nQuick Start\r\n============\r\n\r\npip install payload-validator\r\n\r\n\r\nExample Code\r\n=============\r\nCodeSandBox Link:\r\n\r\nhttps://codesandbox.io/p/sandbox/payload-validator-zngckp?file=%2Fmain.py%3A1%2C1\r\n\r\n\r\nMore Example\r\n==============\r\nExample List:\r\n\r\nhttps://github.com/cwadven/payload-validator/blob/master/examples/example1.py\r\n\r\n\r\nExplain\r\n============\r\n\r\nNormal ValidatorErrorContext Usage\r\n\r\nusing_this_payload.py::\r\n\r\n from datetime import datetime\r\n from payload_validator.exceptions import (\r\n InvalidValueError,\r\n ValidationException,\r\n )\r\n from utils import validate_date_parsing\r\n from payload_validator.validators import PayloadValidator\r\n\r\n\r\n def validate_date_parsing(date_str):\r\n try:\r\n datetime.strptime(date_str, '%Y-%m-%d')\r\n return True\r\n except (TypeError, ValueError):\r\n return False\r\n\r\n\r\n # [ Examples of using validators ]\r\n # 1. Inherit 'PayloadValidator' and define 'Meta class'\r\n # 2. Define 'DEFAULT_MANDATORY_ERROR_MESSAGE' in 'PayloadValidator'\r\n # 3-1. Define 'mandatory_keys' and 'type_of_keys' in 'Meta class'\r\n # 3-2. 'mandatory_keys' is a 'dictionary' that contains key and error message\r\n # 3-3. 'type_of_keys' is a 'dictionary' that contains key and type of key\r\n # 3-4. 'type_of_keys' value of first index can contain 'function' returning 'boolean' accepted\r\n # 4-1. Define 'validate_{key}' method in 'PayloadValidator'\r\n # 4-2. 'validate_{key}' validating sequence is top to bottom code written in 'PayloadValidator'\r\n # 4-3. If 'validate_{key}' raise 'InvalidValueError', it will be added to 'error_context'\r\n # 4-4. 'InvalidValueError' 'error_value_by_key' input should be 'dictionary' that contains payload key and error message (this message could be iterator)\r\n # 4-5. 'InvalidValueError' input can contain 'ignore_existing_error_keys' which skip if there is already payload key of error\r\n # 5. Can override 'common_validate' method to add 'common_validation'\r\n # 6. Validating Sequence: Mandatory Check -> Type Check -> validate_{key} (top from bottom code) -> common_validate\r\n # 7. Use 'validate()' method to validate payload or execute 'is_valid()' method to check validation even once\r\n # 8. 'ValidationException' will raise when error exists\r\n\r\n # [ Extra Information ]\r\n # you can use 'add_error_context' or 'add_error_and_skip_validation_key'\r\n # instead of 'InvalidValueError' to define errors\r\n\r\n # 1\r\n class NewPayloadValidator(PayloadValidator):\r\n # 2\r\n DEFAULT_MANDATORY_ERROR_MESSAGE = 'mandatory data missing2'\r\n\r\n class Meta:\r\n # 3-1, 3-2\r\n mandatory_keys = {\r\n 'displayable': 'displayable is required',\r\n 'mode': 'mode is always required',\r\n 'amount': 'why are you not setting amount?',\r\n 'minimum_order_value': 'minimum order value is required',\r\n 'applicable_order_types': 'really you are not setting applicable order types?',\r\n 'start_date': 'start date is required',\r\n 'end_date': 'end date is required for your job',\r\n }\r\n # 3-1, 3-3\r\n type_of_keys = {\r\n 'amount': [int, 'integer_type_needs'],\r\n 'minimum_order_value': [int, 'integer_type_needs'],\r\n 'maximum_download_count': [(int, type(None)), 'integer_type_needs or NoneType'],\r\n # 3-4\r\n 'start_date': [validate_date_parsing, 'need to be date type'],\r\n 'end_date': [validate_date_parsing, 'need to be date type'],\r\n }\r\n\r\n # 4-1, 4-2\r\n def validate_hello_world(self):\r\n if not self.get_payload('displayable'):\r\n # 4-3, 4-4\r\n raise InvalidValueError({'displayable': 'displayable is false'})\r\n\r\n # 4-1, 4-2\r\n def validate_max_length(self):\r\n if self.get_payload('max_length') <= 0:\r\n # 4-3, 4-4, 4-5\r\n raise InvalidValueError(\r\n {\r\n 'max_length': 'min_length should be greater than 0'\r\n },\r\n ignore_existing_error_keys=['max_length']\r\n )\r\n\r\n # 5\r\n def common_validate(self):\r\n if self.get_payload('max_length') < self.get_payload('min_length'):\r\n raise InvalidValueError(\r\n {\r\n 'max_length': 'max_length should be greater than min_length',\r\n 'min_length': 'min_length should be lesser than max_length'\r\n },\r\n )\r\n\r\n\r\n\r\n validator = NewPayloadValidator({'displayable': True, 'start_date': 1, 'min_length': 10, 'max_length': 0})\r\n\r\n try:\r\n # 7\r\n validator.validate()\r\n except ValidationException as e:\r\n print(validator.error_context)\r\n\r\n # 8\r\n if not validator.is_valid():\r\n print(validator.error_context)\r\n\r\n # [ Result ]\r\n # {\r\n # 'mode': ['mode is always required'],\r\n # 'amount': ['why are you not setting amount?'],\r\n # 'minimum_order_value': ['minimum order value is required'],\r\n # 'applicable_order_types': ['really you are not setting applicable order types?'],\r\n # 'end_date': ['end date is required for your job'],\r\n # 'start_date': ['need to be date type'],\r\n # 'max_length': ['min_length should be greater than 0'],\r\n # 'min_length': ['min_length should be lesser than max_length']\r\n # }\r\n\r\n\r\nCustom ValidatorErrorContext Usage\r\n\r\ncustom_using_this_payload.py::\r\n\r\n from datetime import datetime\r\n from payload_validator.exceptions import (\r\n InvalidValueError,\r\n ValidationException,\r\n )\r\n from utils import validate_date_parsing\r\n from payload_validator.validators import PayloadValidator, ValidatorErrorContext\r\n\r\n def validate_date_parsing(date_str):\r\n try:\r\n datetime.strptime(date_str, '%Y-%m-%d')\r\n return True\r\n except (TypeError, ValueError):\r\n return False\r\n\r\n # [ Examples of using validators ]\r\n # 1. Inherit 'PayloadValidator' and define 'Meta class'\r\n # 2. Define 'DEFAULT_MANDATORY_ERROR_MESSAGE' in 'PayloadValidator'\r\n # 3-1. Define 'mandatory_keys' and 'type_of_keys' in 'Meta class'\r\n # 3-2. 'mandatory_keys' is a 'dictionary' that contains key and error message\r\n # 3-3. 'type_of_keys' is a 'dictionary' that contains key and type of key\r\n # 3-4. 'type_of_keys' value of first index can contain 'function' returning 'boolean' accepted\r\n # 4-1. Define 'validate_{key}' method in 'PayloadValidator'\r\n # 4-2. 'validate_{key}' validating sequence is top to bottom code written in 'PayloadValidator'\r\n # 4-3. If 'validate_{key}' raise 'InvalidValueError', it will be added to 'error_context'\r\n # 4-4. 'InvalidValueError' 'error_value_by_key' input should be 'dictionary' that contains payload key and error message (this message could be iterator)\r\n # 4-5. 'InvalidValueError' input can contain 'ignore_existing_error_keys' which skip if there is already payload key of error\r\n # 5. Can override 'common_validate' method to add 'common_validation'\r\n # 6. Validating Sequence: Mandatory Check -> Type Check -> validate_{key} (top from bottom code) -> common_validate\r\n # 7. Use 'validate()' method to validate payload or execute 'is_valid()' method to check validation even once\r\n # 8. 'ValidationException' will raise when error exists\r\n\r\n # [ Extra Information ]\r\n # you can use 'add_error_context' or 'add_error_and_skip_validation_key'\r\n # instead of 'InvalidValueError' to define errors\r\n\r\n # Extra: Customize Error Context\r\n # 'ColorValidatorErrorContext' is a 'PayloadValidator' can return error message with color\r\n class ColorValidatorErrorContext(ValidatorErrorContext):\r\n DEFAULT_COLOR = '#FFFFFF'\r\n\r\n def add_error(self, field: str, error: str):\r\n value = self.setdefault(field, [])\r\n try:\r\n error, color = error.split(',')\r\n except (IndexError, ValueError):\r\n color = self.DEFAULT_COLOR\r\n value.append([error, color])\r\n\r\n\r\n # 1\r\n class ColorPayloadValidator(PayloadValidator):\r\n # 2\r\n DEFAULT_MANDATORY_ERROR_MESSAGE = 'mandatory data missing2'\r\n\r\n class Meta:\r\n # 3-1, 3-2\r\n mandatory_keys = {\r\n 'displayable': 'displayable is required',\r\n 'mode': 'mode is always required',\r\n 'amount': 'why are you not setting amount?',\r\n 'minimum_order_value': 'minimum order value is required',\r\n 'applicable_order_types': 'really you are not setting applicable order types?',\r\n 'start_date': 'start date is required',\r\n 'end_date': 'end date is required for your job',\r\n }\r\n # 3-1, 3-3\r\n type_of_keys = {\r\n 'amount': [int, 'integer_type_needs'],\r\n 'minimum_order_value': [int, 'integer_type_needs'],\r\n 'maximum_download_count': [(int, type(None)), 'integer_type_needs or NoneType'],\r\n # 3-4\r\n 'start_date': [validate_date_parsing, 'need to be date type'],\r\n 'end_date': [validate_date_parsing, 'need to be date type'],\r\n }\r\n\r\n # 4-1, 4-2\r\n def validate_hello_world(self):\r\n if not self.get_payload('displayable'):\r\n # 4-3, 4-4\r\n raise InvalidValueError({'displayable': 'displayable is false,#123456'})\r\n\r\n # 4-1, 4-2\r\n def validate_max_length(self):\r\n if self.get_payload('max_length') <= 0:\r\n # 4-3, 4-4, 4-5\r\n raise InvalidValueError(\r\n {\r\n 'max_length': 'min_length should be greater than 0,#000000'\r\n },\r\n ignore_existing_error_keys=['max_length']\r\n )\r\n\r\n # 5\r\n def common_validate(self):\r\n if self.get_payload('max_length') < self.get_payload('min_length'):\r\n raise InvalidValueError(\r\n {\r\n 'max_length': 'max_length should be greater than min_length,#000000',\r\n 'min_length': 'min_length should be lesser than max_length,#123123'\r\n },\r\n )\r\n\r\n\r\n validator = ColorPayloadValidator(\r\n {'displayable': True, 'start_date': 1, 'min_length': 10, 'max_length': 0},\r\n ColorValidatorErrorContext(),\r\n )\r\n\r\n try:\r\n # 7\r\n validator.validate()\r\n except ValidationException as e:\r\n print(validator.error_context)\r\n\r\n # 8\r\n if not validator.is_valid():\r\n print(validator.error_context)\r\n\r\n # [ Result ]\r\n # {\r\n # 'mode': [['mode is always required', '#FFFFFF']],\r\n # 'amount': [['why are you not setting amount?', '#FFFFFF']],\r\n # 'minimum_order_value': [['minimum order value is required', '#FFFFFF']],\r\n # 'applicable_order_types': [['really you are not setting applicable order types?', '#FFFFFF']],\r\n # 'end_date': [['end date is required for your job', '#FFFFFF']],\r\n # 'start_date': [['need to be date type', '#FFFFFF']],\r\n # 'max_length': [['min_length should be greater than 0', '#000000']],\r\n # 'min_length': [['min_length should be lesser than max_length', '#123123']]\r\n # }\r\n\r\n\r\n\r\nExtra\r\n========\r\n\r\nIssue or Pull Request are welcome.\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Validating payload datas for Python",
"version": "0.1.11",
"project_urls": {
"Homepage": "https://github.com/cwadven/payload-validator"
},
"split_keywords": [
"input",
" payload",
" validator",
" validate",
" validation",
" data",
" datas",
" python",
" python3",
" python3.6",
" python3.7",
" python3.8",
" python3.11"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "17664c474e42a41e88af8bf4da69b10fef5a41b138e4a5c68e55a64edddde4f5",
"md5": "defd6459cf7a5f9478b4a3a63c06d41f",
"sha256": "83c47a44b08925ddd265deaa19d8d160d57ffeba84fb0c1af5b7dd76b3010d57"
},
"downloads": -1,
"filename": "payload_validator-0.1.11-py3-none-any.whl",
"has_sig": false,
"md5_digest": "defd6459cf7a5f9478b4a3a63c06d41f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 17832,
"upload_time": "2024-03-30T12:01:26",
"upload_time_iso_8601": "2024-03-30T12:01:26.309268Z",
"url": "https://files.pythonhosted.org/packages/17/66/4c474e42a41e88af8bf4da69b10fef5a41b138e4a5c68e55a64edddde4f5/payload_validator-0.1.11-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "543551b3293bc35e80b4e91c06efc4cd713c00e53fff7667d386c998dd23af9a",
"md5": "c931af53547c1574949ed7b2cbf3cc75",
"sha256": "426a8fa8fc5e331c085fdcd54c8822c437c7605cd25846f07f6b603f67c6ba50"
},
"downloads": -1,
"filename": "payload-validator-0.1.11.tar.gz",
"has_sig": false,
"md5_digest": "c931af53547c1574949ed7b2cbf3cc75",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 16618,
"upload_time": "2024-03-30T12:01:28",
"upload_time_iso_8601": "2024-03-30T12:01:28.033737Z",
"url": "https://files.pythonhosted.org/packages/54/35/51b3293bc35e80b4e91c06efc4cd713c00e53fff7667d386c998dd23af9a/payload-validator-0.1.11.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-03-30 12:01:28",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "cwadven",
"github_project": "payload-validator",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "flake8",
"specs": []
},
{
"name": "flake8-import-order",
"specs": []
},
{
"name": "twine",
"specs": []
}
],
"lcname": "payload-validator"
}