NewsBlur/vendor/feedvalidator/opensearch.py

147 lines
5.3 KiB
Python

from validators import *
from logging import *
import re
class OpenSearchDescription(validatorBase):
def __init__(self):
self.exampleFound = 0
validatorBase.__init__(self)
def validate(self):
name=self.name.replace("opensearch_",'')
if not "ShortName" in self.children:
self.log(MissingElement({"parent":name, "element":"ShortName"}))
if not "Description" in self.children:
self.log(MissingElement({"parent":name, "element":"Description"}))
if not "Url" in self.children:
self.log(MissingElement({"parent":name, "element":"Url"}))
if not self.exampleFound:
self.log(ShouldIncludeExample({}))
def do_ShortName(self):
return lengthLimitedText(16), noduplicates()
def do_Description(self):
return lengthLimitedText(1024), noduplicates()
def do_Url(self):
return Url()
def do_Contact(self):
return addr_spec(), noduplicates()
def do_Tags(self):
return lengthLimitedText(256), noduplicates()
def do_LongName(self):
return lengthLimitedText(48), noduplicates()
def do_Image(self):
return Image()
def do_Query(self):
return Query()
def do_Developer(self):
return lengthLimitedText(64), noduplicates()
def do_Attribution(self):
return lengthLimitedText(256), noduplicates()
def do_SyndicationRight(self):
return SyndicationRight(), noduplicates()
def do_AdultContent(self):
return AdultContent(), noduplicates()
def do_Language(self):
return Language()
def do_InputEncoding(self):
return Charset()
def do_OutputEncoding(self):
return Charset()
class Url(validatorBase):
def getExpectedAttrNames(self):
return [(None,attr) for attr in ['template', 'type', 'indexOffset',
'pageOffset']]
def prevalidate(self):
self.validate_required_attribute((None,'template'), Template())
self.validate_required_attribute((None,'type'), MimeType)
self.validate_optional_attribute((None,'indexOffset'), Integer)
self.validate_optional_attribute((None,'pageOffset'), Integer)
class Template(rfc2396_full):
tparam = re.compile("{((?:[-a-zA-Z0-9._~]|%[a-fA-F0-9]{2})+:?(?:[-a-zA-Z0-9._~]|%[a-fA-F0-9]{2})*)\??}")
valuelist = ['searchTerms', 'count', 'startIndex', 'startPage', 'language',
'inputEncoding', 'outputEncoding']
def validate(self):
for pname in self.tparam.findall(self.value):
if pname.find(':')<0:
if pname not in self.valuelist:
self.log(InvalidLocalParameter({'value':pname}))
else:
prefix,name = pname.split(':',1)
if not self.parent.namespaceFor(prefix):
self.log(UndeclaredPrefix({'value':prefix}))
self.value = self.tparam.sub(r'\1',self.value)
rfc2396_full.validate(self)
class Image(rfc2396_full):
def getExpectedAttrNames(self):
return [(None,attr) for attr in ['height', 'width', 'type']]
def prevalidate(self):
self.validate_required_attribute((None,'height'), nonNegativeInteger)
self.validate_required_attribute((None,'width'), nonNegativeInteger)
self.validate_required_attribute((None,'type'), MimeType)
class Query(validatorBase):
def getExpectedAttrNames(self):
return [(None,attr) for attr in ['role', 'title', 'totalResults',
'searchTerms', 'count', 'startIndex', 'startPage', 'language',
'inputEncoding', 'xutputEncoding', 'parameter']]
def prevalidate(self):
self.validate_required_attribute((None,'role'), QueryRole)
self.validate_optional_attribute((None,'title'), lengthLimitedText(256))
self.validate_optional_attribute((None,'title'), nonhtml)
self.validate_optional_attribute((None,'totalResults'), nonNegativeInteger)
self.validate_optional_attribute((None,'searchTerms'), UrlEncoded)
self.validate_optional_attribute((None,'count'), nonNegativeInteger)
self.validate_optional_attribute((None,'startIndex'), Integer)
self.validate_optional_attribute((None,'startPage'), Integer)
self.validate_optional_attribute((None,'language'), iso639)
self.validate_optional_attribute((None,'inputEncoding'), Charset)
self.validate_optional_attribute((None,'outputEncoding'), Charset)
if self.attrs.has_key((None,"role")) and \
self.attrs.getValue((None,"role")) == "example":
self.parent.exampleFound = 1
class QueryRole(enumeration):
error = InvalidLocalRole
valuelist = ['request', 'example', 'related', 'correction', 'subset',
'superset']
def validate(self):
if self.value.find(':')<0:
enumeration.validate(self)
else:
prefix,name = self.value.split(':',1)
if not self.parent.namespaceFor(prefix):
self.log(UndeclaredPrefix({'value':prefix}))
class UrlEncoded(validatorBase):
def validate(self):
from urllib import quote, unquote
import re
for value in self.value.split():
value = re.sub('%\w\w', lambda x: x.group(0).upper(), value)
if value != quote(unquote(value)):
self.log(NotURLEncoded({}))
break
class SyndicationRight(enumeration):
error = InvalidSyndicationRight
valuelist = ['open','limited','private','closed']
def validate(self):
self.value = self.value.lower()
enumeration.validate(self)
class AdultContent(enumeration):
error = InvalidAdultContent
valuelist = ['false', 'FALSE', '0', 'no', 'NO',
'true', 'TRUE', '1', 'yes', 'YES']
class Language(iso639):
def validate(self):
if self.value != '*':
iso639.validate(self)