def test_alternatives(self): pattern = JSGPattern(r'iri|bnode|nonliteral|literal') self.assertTrue(pattern.matches('iri')) self.assertTrue(pattern.matches('literal')) self.assertTrue(pattern.matches('nonliteral')) self.assertTrue(pattern.matches('bnode')) self.assertFalse(pattern.matches('node')) self.assertFalse(pattern.matches('bnod')) self.assertFalse(pattern.matches('IRI')) self.assertFalse(pattern.matches(' iri')) self.assertFalse(pattern.matches('iri '))
def test_fixed_values(self): pattern = JSGPattern(r'http:\/\/www\.w3\.org\/ns\/shex\.jsonld') self.assertTrue(pattern.matches("http://www.w3.org/ns/shex.jsonld")) self.assertFalse(pattern.matches("http://www.w3.org/ns/shex/jsonldx")) self.assertFalse(pattern.matches("http://www.w3.org/ns/shex/jsonld ")) self.assertFalse(pattern.matches("http://www.w3.org/ns/shex/jsonld\n")) self.assertFalse(pattern.matches(" http://www.w3.org/ns/shex/jsonld"))
class LANGTAG(JSGString): pattern = JSGPattern(r'[a-zA-Z]+(\-([a-zA-Z0-9])+)*')
class HEX(JSGString): pattern = JSGPattern(r'[0-9]|[A-F]|[a-f]')
class WildCard(JSGString): pattern = JSGPattern(r'.*') python_type = object
class PN_CHARS_U(JSGString): pattern = JSGPattern(r'{PN_CHARS_BASE}|_'.format(PN_CHARS_BASE=PN_CHARS_BASE.pattern))
class PN_CHARS(JSGString): pattern = JSGPattern(r'{PN_CHARS_U}|\-|[0-9]|\\u00B7|[\u0300-\u036F]|[\u203F-\u2040]'.format(PN_CHARS_U=PN_CHARS_U.pattern))
class TP(JSGString): pattern = JSGPattern("[a-zA-Z]+")
class INCOMPAT(Integer): pattern = JSGPattern(r'[a-z]+')
class INT(JSGString): pattern = JSGPattern(r'[+-]?[0-9]+')
class NUM(JSGString): pattern = JSGPattern(r'[+-]?[0-9]*\.[0-9]+')
class BOOL(JSGString): pattern = JSGPattern(r'[Tt]rue|[Ff]alse') python_type = (str, bool)
class Alts(JSGString): pattern = JSGPattern(r'iri|bnode|nonliteral|literal')
class IRI(JSGString): pattern = JSGPattern(r'http:\/\/www\.w3\.org\/ns\/shex\.jsonld')
def test_assorted_patterns(self): pattern = JSGPattern(r'[+-]?[0-9]+') self.assertTrue(pattern.matches("0")) self.assertTrue(pattern.matches(str(-173))) self.assertTrue(pattern.matches("+11720000845197308888890")) self.assertTrue(pattern.matches("01")) self.assertFalse(pattern.matches("--17")) self.assertFalse(pattern.matches("1.0")) pattern = JSGPattern(r'[+-]?[0-9]*\.[0-9]+') self.assertFalse(pattern.matches("0")) self.assertTrue(pattern.matches("0.0")) self.assertTrue(pattern.matches(str(float(-173)))) self.assertTrue(pattern.matches("1.0")) self.assertTrue(pattern.matches("+11720000845197308888.0000000000")) PN_CHARS_BASE = r'[A-Z]|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]|' \ r'[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|' \ r'[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|[\u10000-\uEFFFF]' HEX = r'[0-9]|[A-F]|[a-f]' UCHAR = r'\\\\u{HEX}{HEX}{HEX}{HEX}|\\\\U{HEX}{HEX}{HEX}{HEX}{HEX}{HEX}{HEX}{HEX}'.format(HEX=HEX) PN_CHARS_U = r'{PN_CHARS_BASE}|_'.format(PN_CHARS_BASE=PN_CHARS_BASE) PN_CHARS = r'{PN_CHARS_U}|\-|[0-9]|\\u00B7|[\u0300-\u036F]|[\u203F-\u2040]'.format(PN_CHARS_U=PN_CHARS_U) pattern = JSGPattern(r'({PN_CHARS}|\.|\:|\/|\\\\|\#|\@|\%|\&|{UCHAR})*'.format(PN_CHARS=PN_CHARS, UCHAR=UCHAR)) self.assertTrue(pattern.matches("http://a.example/p\u0031")) self.assertTrue(IRI.pattern.matches("http://a.example/p\u0031"))
class PAT_STR(String): pattern = JSGPattern(r'[a-z][0-9]+')
def test_wild_card(self): pattern = JSGPattern(r'.*') self.assertTrue(pattern.matches("")) self.assertTrue(pattern.matches("any block of text")) self.assertTrue(pattern.matches("\n\uFDF0*"))
class INT_STR(String): pattern = JSGPattern(r'0|([1-9][0-9]*)')
class UCHAR(JSGString): pattern = JSGPattern(r'\\\\u{HEX}{HEX}{HEX}{HEX}|\\\\U{HEX}{HEX}{HEX}{HEX}{HEX}{HEX}{HEX}{HEX}'.format(HEX=HEX.pattern))
class POS_NUMBER(Number): pattern = JSGPattern( r'(0|[1-9][0-9]*)(.[0-9]+)?([eE][+-]?[0-9]+)?')
class IRI(JSGString): pattern = JSGPattern(r'({PN_CHARS}|\.|\:|\/|\\\\|\#|\@|\%|\&|{UCHAR})*'.format(PN_CHARS=PN_CHARS.pattern, UCHAR=UCHAR.pattern))
class NEG_INTEGER(Integer): pattern = JSGPattern(r'-(0|[1-9][0-9]*)')
class PN_CHARS_BASE(JSGString): pattern = JSGPattern(r'[A-Z]|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|[\u10000-\uEFFFF]')
class S(JSGString): pattern = JSGPattern(r'[a-zA-Z]+')