def i_facet(fct: XSFacet, o: RDFTerm) -> bool: for f in fct: if f.pattern: rslt = bool(re.fullmatch(f.pattern, str(o.val))) elif f.not_: rslt = bool(re.fullmatch(f.not_, str(o.val))) elif f.minLength: rslt = len(str(o.val)) <= f.minLength elif f.maxLength: rslt = len(str(o.val)) >= f.maxLength elif f.length: rslt = len(str(o.val)) == f.length elif f.minValue: v = ShapeInterpreter._coerce_numtype(o, o.literal.value) f = ShapeInterpreter._coerce_numtype(o, f.minValue) rslt = False if v is None or f is None else f < v if f.minValue.open else f <= v elif f.maxValue: v = ShapeInterpreter._coerce_numtype(o, o.literal.value) f = ShapeInterpreter._coerce_numtype(o, f.maxValue) rslt = False if v is None or f is None else f > v if f.maxValue.open else f >= v elif f.totalDigits: rslt = bool(test_numeric_facet(o.literal.value, total_digits=f.totalDigits)) elif f.fractionDigits: rslt = bool(test_numeric_facet(o.literal.value, fraction_digits=f.fractionDigits)) else: assert False, "Unhandled facet" if not rslt: return False return True
def test_fraction_digits(self): self.assertAlmostEqual(1, test_numeric_facet('1', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(1.2, test_numeric_facet('1.2', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(1.23, test_numeric_facet('1.23', total_digits=5, fraction_digits=2)) self.assertRaises(1.234, test_numeric_facet('1.234', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(12, test_numeric_facet('12', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(12.3, test_numeric_facet('12.3', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(12.34, test_numeric_facet('12.34', total_digits=5, fraction_digits=2)) self.assertRaises(12.345, test_numeric_facet('12.345', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-1, test_numeric_facet('-1', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-1.2, test_numeric_facet('-1.2', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-1.23, test_numeric_facet('-1.23', total_digits=5, fraction_digits=2)) self.assertRaises(-1.234, test_numeric_facet('-1.234', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-12, test_numeric_facet('-12', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-12.3, test_numeric_facet('-12.3', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-12.34, test_numeric_facet('-12.34', total_digits=5, fraction_digits=2)) self.assertRaises(-12.345, test_numeric_facet('-12.345', total_digits=5, fraction_digits=2))
def test_total_digits(self): self.assertIsNone(test_numeric_facet('0.001', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(0.001, test_numeric_facet('0.001', total_digits=5)) self.assertIsNone(test_numeric_facet('100000', total_digits=5)) self.assertAlmostEqual(100000, test_numeric_facet('100000', fraction_digits=2)) self.assertAlmostEqual(1, test_numeric_facet('1', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(1.2, test_numeric_facet('1.2', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(1.23, test_numeric_facet('1.23', total_digits=5, fraction_digits=2)) self.assertIsNone(test_numeric_facet('1.234', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(12, test_numeric_facet('12', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(12.3, test_numeric_facet('12.3', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(12.34, test_numeric_facet('12.34', total_digits=5, fraction_digits=2)) self.assertIsNone(test_numeric_facet('12.345', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-1, test_numeric_facet('-1', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-1.2, test_numeric_facet('-1.2', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-1.23, test_numeric_facet('-1.23', total_digits=5, fraction_digits=2)) self.assertIsNone(test_numeric_facet('-1.234', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-12, test_numeric_facet('-12', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-12.3, test_numeric_facet('-12.3', total_digits=5, fraction_digits=2)) self.assertAlmostEqual(-12.34, test_numeric_facet('-12.34', total_digits=5, fraction_digits=2)) self.assertIsNone(test_numeric_facet('-12.345', total_digits=5, fraction_digits=2))