Best Python code snippet using pytest
python.py
Source:python.py  
...164def pytest_collect_file(path, parent):165    ext = path.ext166    if ext == ".py":167        if not parent.session.isinitpath(path):168            if not path_matches_patterns(169                path, parent.config.getini("python_files") + ["__init__.py"]170            ):171                return172        ihook = parent.session.gethookproxy(path)173        return ihook.pytest_pycollect_makemodule(path=path, parent=parent)174def path_matches_patterns(path, patterns):175    """Returns True if the given py.path.local matches one of the patterns in the list of globs given"""176    return any(path.fnmatch(pattern) for pattern in patterns)177def pytest_pycollect_makemodule(path, parent):178    if path.basename == "__init__.py":179        return Package(path, parent)180    return Module(path, parent)181@hookimpl(hookwrapper=True)182def pytest_pycollect_makeitem(collector, name, obj):183    outcome = yield184    res = outcome.get_result()185    if res is not None:186        return187    # nothing was collected elsewhere, let's do it here188    if safe_isclass(obj):189        if collector.istestclass(obj, name):190            outcome.force_result(Class(name, parent=collector))191    elif collector.istestfunction(obj, name):192        # mock seems to store unbound methods (issue473), normalize it193        obj = getattr(obj, "__func__", obj)194        # We need to try and unwrap the function if it's a functools.partial195        # or a funtools.wrapped.196        # We musn't if it's been wrapped with mock.patch (python 2 only)197        if not (isfunction(obj) or isfunction(get_real_func(obj))):198            filename, lineno = getfslineno(obj)199            warnings.warn_explicit(200                message=PytestCollectionWarning(201                    "cannot collect %r because it is not a function." % name202                ),203                category=None,204                filename=str(filename),205                lineno=lineno + 1,206            )207        elif getattr(obj, "__test__", True):208            if is_generator(obj):209                res = Function(name, parent=collector)210                reason = deprecated.YIELD_TESTS.format(name=name)211                res.add_marker(MARK_GEN.xfail(run=False, reason=reason))212                res.warn(PytestCollectionWarning(reason))213            else:214                res = list(collector._genfunctions(name, obj))215            outcome.force_result(res)216def pytest_make_parametrize_id(config, val, argname=None):217    return None218class PyobjContext(object):219    module = pyobj_property("Module")220    cls = pyobj_property("Class")221    instance = pyobj_property("Instance")222class PyobjMixin(PyobjContext):223    _ALLOW_MARKERS = True224    def __init__(self, *k, **kw):225        super(PyobjMixin, self).__init__(*k, **kw)226    @property227    def obj(self):228        """Underlying Python object."""229        obj = getattr(self, "_obj", None)230        if obj is None:231            self._obj = obj = self._getobj()232            # XXX evil hack233            # used to avoid Instance collector marker duplication234            if self._ALLOW_MARKERS:235                self.own_markers.extend(get_unpacked_marks(self.obj))236        return obj237    @obj.setter238    def obj(self, value):239        self._obj = value240    def _getobj(self):241        """Gets the underlying Python object. May be overwritten by subclasses."""242        return getattr(self.parent.obj, self.name)243    def getmodpath(self, stopatmodule=True, includemodule=False):244        """ return python path relative to the containing module. """245        chain = self.listchain()246        chain.reverse()247        parts = []248        for node in chain:249            if isinstance(node, Instance):250                continue251            name = node.name252            if isinstance(node, Module):253                name = os.path.splitext(name)[0]254                if stopatmodule:255                    if includemodule:256                        parts.append(name)257                    break258            parts.append(name)259        parts.reverse()260        s = ".".join(parts)261        return s.replace(".[", "[")262    def reportinfo(self):263        # XXX caching?264        obj = self.obj265        compat_co_firstlineno = getattr(obj, "compat_co_firstlineno", None)266        if isinstance(compat_co_firstlineno, int):267            # nose compatibility268            fspath = sys.modules[obj.__module__].__file__269            if fspath.endswith(".pyc"):270                fspath = fspath[:-1]271            lineno = compat_co_firstlineno272        else:273            fspath, lineno = getfslineno(obj)274        modpath = self.getmodpath()275        assert isinstance(lineno, int)276        return fspath, lineno, modpath277class PyCollector(PyobjMixin, nodes.Collector):278    def funcnamefilter(self, name):279        return self._matches_prefix_or_glob_option("python_functions", name)280    def isnosetest(self, obj):281        """ Look for the __test__ attribute, which is applied by the282        @nose.tools.istest decorator283        """284        # We explicitly check for "is True" here to not mistakenly treat285        # classes with a custom __getattr__ returning something truthy (like a286        # function) as test classes.287        return safe_getattr(obj, "__test__", False) is True288    def classnamefilter(self, name):289        return self._matches_prefix_or_glob_option("python_classes", name)290    def istestfunction(self, obj, name):291        if self.funcnamefilter(name) or self.isnosetest(obj):292            if isinstance(obj, staticmethod):293                # static methods need to be unwrapped294                obj = safe_getattr(obj, "__func__", False)295            return (296                safe_getattr(obj, "__call__", False)297                and fixtures.getfixturemarker(obj) is None298            )299        else:300            return False301    def istestclass(self, obj, name):302        return self.classnamefilter(name) or self.isnosetest(obj)303    def _matches_prefix_or_glob_option(self, option_name, name):304        """305        checks if the given name matches the prefix or glob-pattern defined306        in ini configuration.307        """308        for option in self.config.getini(option_name):309            if name.startswith(option):310                return True311            # check that name looks like a glob-string before calling fnmatch312            # because this is called for every name in each collected module,313            # and fnmatch is somewhat expensive to call314            elif ("*" in option or "?" in option or "[" in option) and fnmatch.fnmatch(315                name, option316            ):317                return True318        return False319    def collect(self):320        if not getattr(self.obj, "__test__", True):321            return []322        # NB. we avoid random getattrs and peek in the __dict__ instead323        # (XXX originally introduced from a PyPy need, still true?)324        dicts = [getattr(self.obj, "__dict__", {})]325        for basecls in inspect.getmro(self.obj.__class__):326            dicts.append(basecls.__dict__)327        seen = {}328        values = []329        for dic in dicts:330            for name, obj in list(dic.items()):331                if name in seen:332                    continue333                seen[name] = True334                res = self._makeitem(name, obj)335                if res is None:336                    continue337                if not isinstance(res, list):338                    res = [res]339                values.extend(res)340        values.sort(key=lambda item: item.reportinfo()[:2])341        return values342    def _makeitem(self, name, obj):343        # assert self.ihook.fspath == self.fspath, self344        return self.ihook.pytest_pycollect_makeitem(collector=self, name=name, obj=obj)345    def _genfunctions(self, name, funcobj):346        module = self.getparent(Module).obj347        clscol = self.getparent(Class)348        cls = clscol and clscol.obj or None349        fm = self.session._fixturemanager350        definition = FunctionDefinition(name=name, parent=self, callobj=funcobj)351        fixtureinfo = fm.getfixtureinfo(definition, funcobj, cls)352        metafunc = Metafunc(353            definition, fixtureinfo, self.config, cls=cls, module=module354        )355        methods = []356        if hasattr(module, "pytest_generate_tests"):357            methods.append(module.pytest_generate_tests)358        if hasattr(cls, "pytest_generate_tests"):359            methods.append(cls().pytest_generate_tests)360        if methods:361            self.ihook.pytest_generate_tests.call_extra(362                methods, dict(metafunc=metafunc)363            )364        else:365            self.ihook.pytest_generate_tests(metafunc=metafunc)366        if not metafunc._calls:367            yield Function(name, parent=self, fixtureinfo=fixtureinfo)368        else:369            # add funcargs() as fixturedefs to fixtureinfo.arg2fixturedefs370            fixtures.add_funcarg_pseudo_fixture_def(self, metafunc, fm)371            # add_funcarg_pseudo_fixture_def may have shadowed some fixtures372            # with direct parametrization, so make sure we update what the373            # function really needs.374            fixtureinfo.prune_dependency_tree()375            for callspec in metafunc._calls:376                subname = "%s[%s]" % (name, callspec.id)377                yield Function(378                    name=subname,379                    parent=self,380                    callspec=callspec,381                    callobj=funcobj,382                    fixtureinfo=fixtureinfo,383                    keywords={callspec.id: True},384                    originalname=name,385                )386class Module(nodes.File, PyCollector):387    """ Collector for test classes and functions. """388    def _getobj(self):389        return self._importtestmodule()390    def collect(self):391        self._inject_setup_module_fixture()392        self._inject_setup_function_fixture()393        self.session._fixturemanager.parsefactories(self)394        return super(Module, self).collect()395    def _inject_setup_module_fixture(self):396        """Injects a hidden autouse, module scoped fixture into the collected module object397        that invokes setUpModule/tearDownModule if either or both are available.398        Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with399        other fixtures (#517).400        """401        setup_module = _get_non_fixture_func(self.obj, "setUpModule")402        if setup_module is None:403            setup_module = _get_non_fixture_func(self.obj, "setup_module")404        teardown_module = _get_non_fixture_func(self.obj, "tearDownModule")405        if teardown_module is None:406            teardown_module = _get_non_fixture_func(self.obj, "teardown_module")407        if setup_module is None and teardown_module is None:408            return409        @fixtures.fixture(autouse=True, scope="module")410        def xunit_setup_module_fixture(request):411            if setup_module is not None:412                _call_with_optional_argument(setup_module, request.module)413            yield414            if teardown_module is not None:415                _call_with_optional_argument(teardown_module, request.module)416        self.obj.__pytest_setup_module = xunit_setup_module_fixture417    def _inject_setup_function_fixture(self):418        """Injects a hidden autouse, function scoped fixture into the collected module object419        that invokes setup_function/teardown_function if either or both are available.420        Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with421        other fixtures (#517).422        """423        setup_function = _get_non_fixture_func(self.obj, "setup_function")424        teardown_function = _get_non_fixture_func(self.obj, "teardown_function")425        if setup_function is None and teardown_function is None:426            return427        @fixtures.fixture(autouse=True, scope="function")428        def xunit_setup_function_fixture(request):429            if request.instance is not None:430                # in this case we are bound to an instance, so we need to let431                # setup_method handle this432                yield433                return434            if setup_function is not None:435                _call_with_optional_argument(setup_function, request.function)436            yield437            if teardown_function is not None:438                _call_with_optional_argument(teardown_function, request.function)439        self.obj.__pytest_setup_function = xunit_setup_function_fixture440    def _importtestmodule(self):441        # we assume we are only called once per module442        importmode = self.config.getoption("--import-mode")443        try:444            mod = self.fspath.pyimport(ensuresyspath=importmode)445        except SyntaxError:446            raise self.CollectError(447                _pytest._code.ExceptionInfo.from_current().getrepr(style="short")448            )449        except self.fspath.ImportMismatchError:450            e = sys.exc_info()[1]451            raise self.CollectError(452                "import file mismatch:\n"453                "imported module %r has this __file__ attribute:\n"454                "  %s\n"455                "which is not the same as the test file we want to collect:\n"456                "  %s\n"457                "HINT: remove __pycache__ / .pyc files and/or use a "458                "unique basename for your test file modules" % e.args459            )460        except ImportError:461            from _pytest._code.code import ExceptionInfo462            exc_info = ExceptionInfo.from_current()463            if self.config.getoption("verbose") < 2:464                exc_info.traceback = exc_info.traceback.filter(filter_traceback)465            exc_repr = (466                exc_info.getrepr(style="short")467                if exc_info.traceback468                else exc_info.exconly()469            )470            formatted_tb = safe_str(exc_repr)471            raise self.CollectError(472                "ImportError while importing test module '{fspath}'.\n"473                "Hint: make sure your test modules/packages have valid Python names.\n"474                "Traceback:\n"475                "{traceback}".format(fspath=self.fspath, traceback=formatted_tb)476            )477        except _pytest.runner.Skipped as e:478            if e.allow_module_level:479                raise480            raise self.CollectError(481                "Using pytest.skip outside of a test is not allowed. "482                "To decorate a test function, use the @pytest.mark.skip "483                "or @pytest.mark.skipif decorators instead, and to skip a "484                "module use `pytestmark = pytest.mark.{skip,skipif}."485            )486        self.config.pluginmanager.consider_module(mod)487        return mod488class Package(Module):489    def __init__(self, fspath, parent=None, config=None, session=None, nodeid=None):490        session = parent.session491        nodes.FSCollector.__init__(492            self, fspath, parent=parent, config=config, session=session, nodeid=nodeid493        )494        self.name = fspath.dirname495        self.trace = session.trace496        self._norecursepatterns = session._norecursepatterns497        self.fspath = fspath498    def setup(self):499        # not using fixtures to call setup_module here because autouse fixtures500        # from packages are not called automatically (#4085)501        setup_module = _get_non_fixture_func(self.obj, "setUpModule")502        if setup_module is None:503            setup_module = _get_non_fixture_func(self.obj, "setup_module")504        if setup_module is not None:505            _call_with_optional_argument(setup_module, self.obj)506        teardown_module = _get_non_fixture_func(self.obj, "tearDownModule")507        if teardown_module is None:508            teardown_module = _get_non_fixture_func(self.obj, "teardown_module")509        if teardown_module is not None:510            func = partial(_call_with_optional_argument, teardown_module, self.obj)511            self.addfinalizer(func)512    def _recurse(self, dirpath):513        if dirpath.basename == "__pycache__":514            return False515        ihook = self.gethookproxy(dirpath.dirpath())516        if ihook.pytest_ignore_collect(path=dirpath, config=self.config):517            return518        for pat in self._norecursepatterns:519            if dirpath.check(fnmatch=pat):520                return False521        ihook = self.gethookproxy(dirpath)522        ihook.pytest_collect_directory(path=dirpath, parent=self)523        return True524    def gethookproxy(self, fspath):525        # check if we have the common case of running526        # hooks with all conftest.py filesall conftest.py527        pm = self.config.pluginmanager528        my_conftestmodules = pm._getconftestmodules(fspath)529        remove_mods = pm._conftest_plugins.difference(my_conftestmodules)530        if remove_mods:531            # one or more conftests are not in use at this fspath532            proxy = FSHookProxy(fspath, pm, remove_mods)533        else:534            # all plugis are active for this fspath535            proxy = self.config.hook536        return proxy537    def _collectfile(self, path, handle_dupes=True):538        assert path.isfile(), "%r is not a file (isdir=%r, exists=%r, islink=%r)" % (539            path,540            path.isdir(),541            path.exists(),542            path.islink(),543        )544        ihook = self.gethookproxy(path)545        if not self.isinitpath(path):546            if ihook.pytest_ignore_collect(path=path, config=self.config):547                return ()548        if handle_dupes:549            keepduplicates = self.config.getoption("keepduplicates")550            if not keepduplicates:551                duplicate_paths = self.config.pluginmanager._duplicatepaths552                if path in duplicate_paths:553                    return ()554                else:555                    duplicate_paths.add(path)556        if self.fspath == path:  # __init__.py557            return [self]558        return ihook.pytest_collect_file(path=path, parent=self)559    def isinitpath(self, path):560        return path in self.session._initialpaths561    def collect(self):562        this_path = self.fspath.dirpath()563        init_module = this_path.join("__init__.py")564        if init_module.check(file=1) and path_matches_patterns(565            init_module, self.config.getini("python_files")566        ):567            yield Module(init_module, self)568        pkg_prefixes = set()569        for path in this_path.visit(rec=self._recurse, bf=True, sort=True):570            # We will visit our own __init__.py file, in which case we skip it.571            is_file = path.isfile()572            if is_file:573                if path.basename == "__init__.py" and path.dirpath() == this_path:574                    continue575            parts_ = parts(path.strpath)576            if any(577                pkg_prefix in parts_ and pkg_prefix.join("__init__.py") != path578                for pkg_prefix in pkg_prefixes...config.py
Source:config.py  
...157        # - Find all recursive link modifiers in paths under link_item and adjust their link_mode.158        if op_type.is_recursive():159            # Break up paths by simple operations:160            link_paths = link_item.glob("**/*")161            link_paths = filter(lambda p: not path_matches_patterns(p, link_config.ignore), link_paths)162            seen_prefixes: Set[str] = set()163            for link_path in link_paths:164                op_type_switch, src_path, dst_path = _determine_operation(165                    link_config, link_item.parent, link_path,166                )167                if str(src_path) in seen_prefixes:168                    continue169                if src_path.is_dir() and op_type == op_type_switch:170                    continue171                seen_prefixes.add(str(src_path))172                topic_ops.append(LogicalSyncPlan(173                    type=str(op_type_switch),174                    src_path=src_path,175                    dst_path=dst_path,...replace-header.py
Source:replace-header.py  
...102        emit_notice(new_file, template, notice_lines)103        new_file.writelines(contents[line_number:])104        new_file.close()105        os.replace(new_filename, filename)106def path_matches_patterns(path, patterns):107    for pattern in patterns:108        if path.match(pattern):109            return True110    return False111def process_files(templates, files, notice_lines, args):112    for f in files:113        path = Path(f)114        if args.exclude is None or not path_matches_patterns(path, args.exclude):115            if path.is_dir():116                process_files(templates, path.iterdir(), notice_lines, args)117            elif args.include is None or path_matches_patterns(path, args.include):118                process_file(templates, f, notice, args.replace, args.copyright_regex)119parser = argparse.ArgumentParser()120parser.add_argument('files', help='Files (or directories) to replace', nargs='*')121parser.add_argument('--notice', help='File containing copyright notice', type=argparse.FileType('r'))122parser.add_argument('--copyright-regex', help='Regular expression matching a copyright line',123                    default=DEFAULT_COPYRIGHT_REGEX)124parser.add_argument('--include', action='append', metavar='PATTERN', help='Include matching files (if not excluded)')125parser.add_argument('--exclude', action='append', metavar='PATTERN', help='Exclude matching files (even if included)')126parser.add_argument('--replace', action='store_true', help='Replace any existing copyright notice')127parser.add_argument('--dump', action='store_true', help='Dump the templates database')128templates = read_templates()129args = parser.parse_args()130if args.dump:131    dump_templates(templates, sys.stdout)...utils.py
Source:utils.py  
...16def coalesce(*args: T) -> T:17    for arg in args:18        if arg is not None:19            return arg20def path_matches_patterns(path: PosixPath, patterns: Iterable[str]) -> bool:21    for ignore_pattern in patterns:22        if path.match(ignore_pattern):23            return True...Looking for an in-depth tutorial around pytest? LambdaTest covers the detailed pytest tutorial that has everything related to the pytest, from setting up the pytest framework to automation testing. Delve deeper into pytest testing by exploring advanced use cases like parallel testing, pytest fixtures, parameterization, executing multiple test cases from a single file, and more.
Skim our below pytest tutorial playlist to get started with automation testing using the pytest framework.
https://www.youtube.com/playlist?list=PLZMWkkQEwOPlcGgDmHl8KkXKeLF83XlrP
Get 100 minutes of automation test minutes FREE!!
