def test_apply_argspec_transforms(): def curie(fname, when, where, field1='Physics', field2='Chemistry'): pass xforms = pm.compile_argspec_transforms( curie, {'population': 0, 'generator_name': ['field1', 'field2']}) assert ['when', 'where'] == xforms['required_names'] log = lambda: None log.generator_name = 'genny' (dargs, dkwargs) = pm.apply_argspec_transforms( log, xforms, ('one', 'two'), {'field1': 'zip!'}) assert [log, 'one', 'two', 'zip!', 'genny'] == dargs assert {} == dkwargs # Only using dkwargs for varkw at this point. (dargs, dkwargs) = pm.apply_argspec_transforms( log, xforms, ('when', 'where', 'f_one', 'f_two'), {}) assert [log, 'when', 'where', 'f_one', 'f_two'] == dargs assert {} == dkwargs
def test_variable_arglengths(): pop = quickstart('foo', df=pandas.DataFrame({'a': [11, 22]}), session_capture_name='test_population.py') spec = pm.compile_argspec_transforms(hasvarargs, {'population_name': 0}) assert ['_u'] == spec['required_names'] assert 2 == len(spec['required_transformers']) assert ['pop'] == spec['optional_names'] assert 1 == len(spec['optional_transformers']) xfm = spec['optional_transformers']['pop'] assert None == xfm(pop, {}) assert 7 == xfm(pop, {'pop': 7}) assert None == xfm(pop, {'zip': 7}) assert 'args' == spec['varargs'] assert None == spec['varkw'] assert ('foo', 1, 3) == pop.hasvarargs("U", 1, 2, 3, 4) assert ('foo', 'pip', 3) == pop.hasvarkw("U", pop='pip', a=1, b=2, c=3) assert ('foo', None, 0, 0) == pop.hasboth_arg('U', 'V') assert ('foo', 'W', 1, 2) == pop.hasboth_arg("U", "V", "W", "X", y="Y", z="Z") assert ('foo', 'foo', 0, 0) == pop.hasboth_argkwarg('U', 'V') assert ('foo', 'W', 1, 2) == pop.hasboth_argkwarg("U", "V", "W", "X", y="Y", z="Z") assert ('foo', 'fizz', 0, 0) == pop.hasboth_haspop('U', 'V') with pytest.raises(TypeError) as exc: pop.hasvarargs("U", 1, 2, 3, 4, pop='pip') assert "multiple values for keyword argument 'pop'" in str(exc.value) with pytest.raises(TypeError): pop.hasvarargs("U", 1, 2, a=1, b=2) with pytest.raises(TypeError): pop.hasvarkw("U", 1, 2, 3, 4, 5, 6, 7) with pytest.raises(TypeError): pop.hasboth_arg() with pytest.raises(TypeError): pop.hasboth_argkwarg() # Can only fill named parameters with population-implicit values. with pytest.raises(IndexError): @pm.population_method(population_name='0') def cannot_fill_unnamed_kwargs(*args, **kwargs): pass with pytest.raises(IndexError): @pm.population_method(population_name='pop') def cannot_fill_unnamed_args(*args, **kwargs): pass
def test_variable_arglengths(): pop = Population('foo', df=pandas.DataFrame({'a': [11, 22]}), session_capture_name='test_population.py') spec = pm.compile_argspec_transforms(hasvarargs, {'population_name': 0}) assert ['_u'] == spec['required_names'] assert 2 == len(spec['required_transformers']) assert ['pop'] == spec['optional_names'] assert 1 == len(spec['optional_transformers']) xfm = spec['optional_transformers']['pop'] assert None == xfm(pop, {}) assert 7 == xfm(pop, {'pop': 7}) assert None == xfm(pop, {'zip': 7}) assert 'args' == spec['varargs'] assert None == spec['varkw'] assert ('foo', 1, 3) == pop.hasvarargs("U", 1, 2, 3, 4) assert ('foo', 'pip', 3) == pop.hasvarkw("U", pop='pip', a=1, b=2, c=3) assert ('foo', None, 0, 0) == pop.hasboth_arg('U', 'V') assert ('foo', 'W', 1, 2) == pop.hasboth_arg("U", "V", "W", "X", y="Y", z="Z") assert ('foo', 'foo', 0, 0) == pop.hasboth_argkwarg('U', 'V') assert ('foo', 'W', 1, 2) == pop.hasboth_argkwarg("U", "V", "W", "X", y="Y", z="Z") assert ('foo', 'fizz', 0, 0) == pop.hasboth_haspop('U', 'V') with pytest.raises(TypeError) as exc: pop.hasvarargs("U", 1, 2, 3, 4, pop='pip') assert "multiple values for keyword argument 'pop'" in str(exc.value) with pytest.raises(TypeError): pop.hasvarargs("U", 1, 2, a=1, b=2) with pytest.raises(TypeError): pop.hasvarkw("U", 1, 2, 3, 4, 5, 6, 7) with pytest.raises(TypeError): pop.hasboth_arg() with pytest.raises(TypeError): pop.hasboth_argkwarg() # Can only fill named parameters with population-implicit values. with pytest.raises(IndexError): @pm.population_method(population_name='0') def cannot_fill_unnamed_kwargs(*args, **kwargs): pass with pytest.raises(IndexError): @pm.population_method(population_name='pop') def cannot_fill_unnamed_args(*args, **kwargs): pass
def test_compile_argspec_transforms(): def curie(fname, when, where, field1='Physics', field2='Chemistry'): pass xforms = pm.compile_argspec_transforms(curie, {}) assert ['fname', 'when', 'where'] == xforms['required_names'] assert 3 == len(xforms['required_transformers']) for i, xform in enumerate(xforms['required_transformers']): assert i+1 == xform(None, [1, 2, 3]) assert 2 == len(xforms['optional_transformers']) xforms = pm.compile_argspec_transforms( curie, {'population': 0, 'generator_name': ['field1', 'field2']}) assert ['when', 'where'] == xforms['required_names'] dummy_self = lambda: None # Can set attrs on this, unlike an object(). assert 3 == len(xforms['required_transformers']) assert dummy_self == xforms['required_transformers'][0](dummy_self, []) assert 'boo' == xforms['required_transformers'][1](dummy_self, ['boo']) assert 'bee' == xforms['required_transformers'][2](dummy_self, [1, 'bee']) assert 2 == len(xforms['optional_transformers']) assert 'good' == xforms['optional_transformers']['field1']( dummy_self, {'field1': 'good'}) dummy_self.generator_name = 'great' assert 'great' == xforms['optional_transformers']['field2']( dummy_self, {'field1': 'bad'}) with pytest.raises(IndexError): xforms = pm.compile_argspec_transforms( curie, {'population': -1, 'generator_name': ['field1', 'field2']}) with pytest.raises(IndexError): xforms = pm.compile_argspec_transforms( curie, {'population': 1, 'population_to_bdb': 1}) with pytest.raises(IndexError): xforms = pm.compile_argspec_transforms( curie, {'population': 'field1', 'population_to_bdb': ['field1']}) with pytest.raises(IndexError): xforms = pm.compile_argspec_transforms( curie, {'population': 'no_such_option'}) with pytest.raises(IndexError): xforms = pm.compile_argspec_transforms( curie, {'population': 1, 'population_to_bdb': 1})