def _alphanum_check(whitelist): description = "characters a-z, A-Z, 0-9%s allowed" description %= (", and %r" % whitelist, ) if whitelist else "" whitelist += string.ascii_letters + string.digits return And(IsStr(), ValuesSubsetOf(whitelist, description=description))
return _validate_makefiles(config, makefiles) def _alphanum_check(whitelist): description = "characters a-z, A-Z, 0-9%s allowed" description %= (", and %r" % whitelist, ) if whitelist else "" whitelist += string.ascii_letters + string.digits return And(IsStr(), ValuesSubsetOf(whitelist, description=description)) # Valid names for prefixes _VALID_PREFIX_NAME = \ And(_alphanum_check(whitelist="._-*"), Not(StringIn(["Options"] + [(s + "Reads") for s in _READ_TYPES]))) # Valid paths for prefixes; avoids some problems with e.g. Bowtie2 _VALID_PREFIX_PATH = \ And(IsStr(), Not(ValuesIntersect("\\:?\"<>|() \t\n\v\f\r")), default=REQUIRED_VALUE) # Valid strings for targets / samples / libraries / lanes _VALID_TARGET_NAME = \ And(_alphanum_check(whitelist="._-"), ValueGE(2, key=len, description="at least two characters long")) _VALID_FEATURES_DICT = { "Coverage": IsBoolean(default=True), "Depths":
return _validate_makefiles(makefiles) def _alphanum_check(whitelist, min_len=1): description = "characters a-z, A-Z, 0-9%s allowed" description %= (", and %r" % whitelist, ) if whitelist else "" whitelist += string.ascii_letters + string.digits return And(IsStr(min_len=min_len), ValuesSubsetOf(whitelist, description=description)) # Valid names for prefixes _VALID_PREFIX_NAME = And( _alphanum_check(whitelist="._-*"), Not(StringIn(["Options"] + [(s + "Reads") for s in _READ_TYPES])), ) # Valid paths for prefixes; avoids some problems with e.g. Bowtie2 _VALID_PREFIX_PATH = And(IsStr(), Not(ValuesIntersect('\\:?"<>|() \t\n\v\f\r')), default=REQUIRED_VALUE) # Valid strings for targets / samples / libraries / lanes _VALID_TARGET_NAME = _alphanum_check(whitelist="._-", min_len=2) _VALID_FEATURES_DICT = { "Coverage": IsBoolean(default=True), "Depths": IsBoolean(default=True), "DuplicateHist": RemovedOption(), "RawBAM": RemovedOption(),
msa = mkfile["MultipleSequenceAlignment"] defaults = msa.pop("Defaults") defaults.setdefault("Program", "MAFFT") defaults["MAFFT"].setdefault("Algorithm", "MAFFT") for key in mkfile["Project"]["Regions"]: msa[key] = fill_dict(msa.get(key, {}), defaults) unknown_regions = set(msa) - set(mkfile["Project"]["Regions"]) if unknown_regions: raise MakefileError("Unknown Regions of Interest in Genotyping: %s" \ % (", ".join(unknown_regions),)) # Recursive definition of sample tree _VALIDATION_SUBSAMPLE_KEY = And(StringStartsWith("<"), StringEndsWith(">")) _VALIDATION_SAMPLES_KEY = And(IsStr, Not(_VALIDATION_SUBSAMPLE_KEY)) _VALIDATION_SAMPLES = { _VALIDATION_SAMPLES_KEY: { "GenotypingMethod": StringIn(("reference sequence", "random sampling", "samtools"), default="samtools"), "SpeciesName": IsStr, # Not used; left for backwards compatibility "CommonName": IsStr, # Not used; left for backwards compatibility "Sex": IsStr(), "Gender": IsStr(), } } _VALIDATION_SAMPLES[_VALIDATION_SUBSAMPLE_KEY] = _VALIDATION_SAMPLES
def test_and__default_set__must_meet_spec(): with pytest.raises(ValueError): And(IsInt, ValueIn((1, )), default=5)
def test_and__defaults_not_set_in_specs(): with pytest.raises(ValueError): And(IsInt(default=10), ValueIn((list(range(100)))))
def test_and__default_not_set(): spec = And(IsInt, ValueIn(list(range(10)))) assert spec.default is DEFAULT_NOT_SET
def test_and__default_set__valid_value(): spec = And(IsInt, ValueIn(list(range(30))), default=20) assert spec.default == 20
def test_and__rejects_non_spec_tests(): with pytest.raises(TypeError): And(id)
def test_and__rejects_no_tests(): with pytest.raises(ValueError): And()
def test_and__rejects_when_both_is_false(): spec = And(IsFloat, ValueIn((0.0, 1, 2))) with pytest.raises(MakefileError): spec(_DUMMY_PATH, 3)
def test_and__accepts_when_all_true(): spec = And(IsFloat, ValueIn((0.0, 1, 2))) spec(_DUMMY_PATH, 0.0)
############################################################################### ############################################################################### # Path is displayed in exception _PATH_IN_EXCEPTION_VALUES = ( (IsInt(), "foo"), (IsUnsignedInt(), -1), (IsFloat(), "abc"), (IsBoolean(), 1), (IsStr(), 1), (IsNone(), 1), (ValueIn([1]), 2), (ValuesIntersect([1]), [2]), (ValuesSubsetOf([1]), [2]), (ValueMissing(), True), (And(IsStr), 1), (Or(IsStr), 1), (Not(IsInt), 1), (StringIn("abc"), 1), (StringStartsWith("FOO"), 1), (StringEndsWith("FOO"), 1), (IsListOf(IsInt), "foo"), (IsDictOf(IsInt, IsInt), 1), ) @pytest.mark.parametrize("spec, value", _PATH_IN_EXCEPTION_VALUES) def test_specs__path_is_displayed_in_exception(spec, value): with pytest.raises(MakefileError, match=_DUMMY_PATH_STR): spec(_DUMMY_PATH, value)