Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Support for Tuple of Prefixes #306

Open
ImplyingICheck opened this issue Aug 10, 2023 · 1 comment
Open

Adding Support for Tuple of Prefixes #306

ImplyingICheck opened this issue Aug 10, 2023 · 1 comment

Comments

@ImplyingICheck
Copy link

Problem

In a project I am working on, I recently came across a need for referring to cases with differing prefixes. That is,

prefix1_id():
    pass

prefix2_id():
    pass

Present Solution

One could rename the case functions with a common prefix—e.g., case_prefix1... and case_prefix2.... However, this removes the customization of having support for custom prefixes in pytest_cases. Additionally, it would involve refactoring any pre-existing test code.

My Solution

After digging through the source code of pytest_cases, I modified a few lines to support tuples of prefixes:

First, I altered the validation code in get_all_cases() to support tuple[str].
pytest_cases/case_parametrizer_new.py::251

    # validate prefix
    if not isinstance(prefix, str):
        if not (isinstance(prefix, tuple) and all(isinstance(val, str) for val in prefix)):
            raise TypeError("`prefix` should be a string, found: %r" % prefix)
    if isinstance(prefix, tuple):
        # Reverse sort prefix to guarantee greedy prefix completion
        prefix = sorted(tuple, reverse=True)

Then, I modified get_case_id() to return the appropriate id when a tuple of prefixes is given.
pytest_cases/case_funcs.py::162

    if _id is None:
        # default case id from function name based on prefix
        if isinstance(prefix_for_default_ids, str):
            _id = case_func.__name__.removeprefix(prefix_for_default_ids)
        else:
            original = case_func.__name__
            for prefix in prefix_for_default_ids:
                modified_id = original.removeprefix(prefix)
                if not original == modified_id:
                    _id = modified_id
                    break

From my brief testing, the changes seem to cover all the use cases of prefix and performed as expected.

Usage:

@pytest_cases.parametrize_with_cases('case', prefix=('prefix1_', 'prefix2_')...)
def test_foo(case):
    pass

Proposal

Would support for tuples of prefixes be desirable behaviour for pytest_cases? If so, I would be more than happy to draft up a pull request and formalize these code changes with the appropriate refactors.

@smarie
Copy link
Owner

smarie commented Nov 18, 2023

Thanks @ImplyingICheck for your proposal and first tests ! The changes seem limited in scope so I would be happy to consider this feature for inclusion. Still, that would require a few tests combining a tuple of prefixes AND a filters/tags/both (I let you check whichever is relevant as interacting with the prefix, if any)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants