Re #117 Jsonpath based JSON change detection filter (#125)

* Re #117 - Experimental JSON selector support by using 'json:' prefix and any JSONpath rule
This commit is contained in:
dgtlmoon
2021-07-11 22:07:39 +10:00
committed by GitHub
parent f2643c1b65
commit e073521f4d
5 changed files with 171 additions and 10 deletions

View File

@@ -82,7 +82,7 @@ class StringDictKeyValue(StringField):
else:
self.data = {}
class ListRegex(object):
class ValidateListRegex(object):
"""
Validates that anything that looks like a regex passes as a regex
"""
@@ -102,6 +102,28 @@ class ListRegex(object):
message = field.gettext('RegEx \'%s\' is not a valid regular expression.')
raise ValidationError(message % (line))
class ValidateCSSJSONInput(object):
"""
Filter validation
@todo CSS validator ;)
"""
def __init__(self, message=None):
self.message = message
def __call__(self, form, field):
if 'json:' in field.data:
from jsonpath_ng.exceptions import JsonPathParserError
from jsonpath_ng import jsonpath, parse
input = field.data.replace('json:', '')
try:
parse(input)
except JsonPathParserError as e:
message = field.gettext('\'%s\' is not a valid JSONPath expression. (%s)')
raise ValidationError(message % (input, str(e)))
class watchForm(Form):
# https://wtforms.readthedocs.io/en/2.3.x/fields/#module-wtforms.fields.html5
@@ -111,10 +133,10 @@ class watchForm(Form):
tag = StringField('Tag', [validators.Optional(), validators.Length(max=35)])
minutes_between_check = html5.IntegerField('Maximum time in minutes until recheck',
[validators.Optional(), validators.NumberRange(min=1)])
css_filter = StringField('CSS Filter')
css_filter = StringField('CSS/JSON Filter', [ValidateCSSJSONInput()])
title = StringField('Title')
ignore_text = StringListField('Ignore Text', [ListRegex()])
ignore_text = StringListField('Ignore Text', [ValidateListRegex()])
notification_urls = StringListField('Notification URL List')
headers = StringDictKeyValue('Request Headers')
trigger_check = BooleanField('Send test notification on save')