Merge pull request #4247 from blueyed/lru
_getconftestmodules: use functools.lru_cache
This commit is contained in:
		
						commit
						a192e6b430
					
				| 
						 | 
				
			
			@ -214,7 +214,7 @@ class PytestPluginManager(PluginManager):
 | 
			
		|||
        self._conftest_plugins = set()
 | 
			
		||||
 | 
			
		||||
        # state related to local conftest plugins
 | 
			
		||||
        self._path2confmods = {}
 | 
			
		||||
        self._dirpath2confmods = {}
 | 
			
		||||
        self._conftestpath2mod = {}
 | 
			
		||||
        self._confcutdir = None
 | 
			
		||||
        self._noconftest = False
 | 
			
		||||
| 
						 | 
				
			
			@ -385,31 +385,35 @@ class PytestPluginManager(PluginManager):
 | 
			
		|||
                if x.check(dir=1):
 | 
			
		||||
                    self._getconftestmodules(x)
 | 
			
		||||
 | 
			
		||||
    @lru_cache(maxsize=128)
 | 
			
		||||
    def _getconftestmodules(self, path):
 | 
			
		||||
        if self._noconftest:
 | 
			
		||||
            return []
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            return self._path2confmods[path]
 | 
			
		||||
        except KeyError:
 | 
			
		||||
            if path.isfile():
 | 
			
		||||
                directory = path.dirpath()
 | 
			
		||||
            else:
 | 
			
		||||
                directory = path
 | 
			
		||||
            # XXX these days we may rather want to use config.rootdir
 | 
			
		||||
            # and allow users to opt into looking into the rootdir parent
 | 
			
		||||
            # directories instead of requiring to specify confcutdir
 | 
			
		||||
            clist = []
 | 
			
		||||
            for parent in directory.realpath().parts():
 | 
			
		||||
                if self._confcutdir and self._confcutdir.relto(parent):
 | 
			
		||||
                    continue
 | 
			
		||||
                conftestpath = parent.join("conftest.py")
 | 
			
		||||
                if conftestpath.isfile():
 | 
			
		||||
                    mod = self._importconftest(conftestpath)
 | 
			
		||||
                    clist.append(mod)
 | 
			
		||||
        if path.isfile():
 | 
			
		||||
            directory = path.dirpath()
 | 
			
		||||
        else:
 | 
			
		||||
            directory = path
 | 
			
		||||
 | 
			
		||||
            self._path2confmods[path] = clist
 | 
			
		||||
            return clist
 | 
			
		||||
        if six.PY2:  # py2 is not using lru_cache.
 | 
			
		||||
            try:
 | 
			
		||||
                return self._dirpath2confmods[directory]
 | 
			
		||||
            except KeyError:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
        # XXX these days we may rather want to use config.rootdir
 | 
			
		||||
        # and allow users to opt into looking into the rootdir parent
 | 
			
		||||
        # directories instead of requiring to specify confcutdir
 | 
			
		||||
        clist = []
 | 
			
		||||
        for parent in directory.realpath().parts():
 | 
			
		||||
            if self._confcutdir and self._confcutdir.relto(parent):
 | 
			
		||||
                continue
 | 
			
		||||
            conftestpath = parent.join("conftest.py")
 | 
			
		||||
            if conftestpath.isfile():
 | 
			
		||||
                mod = self._importconftest(conftestpath)
 | 
			
		||||
                clist.append(mod)
 | 
			
		||||
        self._dirpath2confmods[directory] = clist
 | 
			
		||||
        return clist
 | 
			
		||||
 | 
			
		||||
    def _rget_with_confmod(self, name, path):
 | 
			
		||||
        modules = self._getconftestmodules(path)
 | 
			
		||||
| 
						 | 
				
			
			@ -450,8 +454,8 @@ class PytestPluginManager(PluginManager):
 | 
			
		|||
            self._conftest_plugins.add(mod)
 | 
			
		||||
            self._conftestpath2mod[conftestpath] = mod
 | 
			
		||||
            dirpath = conftestpath.dirpath()
 | 
			
		||||
            if dirpath in self._path2confmods:
 | 
			
		||||
                for path, mods in self._path2confmods.items():
 | 
			
		||||
            if dirpath in self._dirpath2confmods:
 | 
			
		||||
                for path, mods in self._dirpath2confmods.items():
 | 
			
		||||
                    if path and path.relto(dirpath) or path == dirpath:
 | 
			
		||||
                        assert mod not in mods
 | 
			
		||||
                        mods.append(mod)
 | 
			
		||||
| 
						 | 
				
			
			@ -902,7 +906,6 @@ class Config(object):
 | 
			
		|||
            assert type is None
 | 
			
		||||
            return value
 | 
			
		||||
 | 
			
		||||
    @lru_cache(maxsize=None)
 | 
			
		||||
    def _getconftest_pathlist(self, name, path):
 | 
			
		||||
        try:
 | 
			
		||||
            mod, relroots = self.pluginmanager._rget_with_confmod(name, path)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,14 +49,14 @@ class TestConftestValueAccessGlobal(object):
 | 
			
		|||
 | 
			
		||||
    def test_immediate_initialiation_and_incremental_are_the_same(self, basedir):
 | 
			
		||||
        conftest = PytestPluginManager()
 | 
			
		||||
        len(conftest._path2confmods)
 | 
			
		||||
        len(conftest._dirpath2confmods)
 | 
			
		||||
        conftest._getconftestmodules(basedir)
 | 
			
		||||
        snap1 = len(conftest._path2confmods)
 | 
			
		||||
        # assert len(conftest._path2confmods) == snap1 + 1
 | 
			
		||||
        snap1 = len(conftest._dirpath2confmods)
 | 
			
		||||
        # assert len(conftest._dirpath2confmods) == snap1 + 1
 | 
			
		||||
        conftest._getconftestmodules(basedir.join("adir"))
 | 
			
		||||
        assert len(conftest._path2confmods) == snap1 + 1
 | 
			
		||||
        assert len(conftest._dirpath2confmods) == snap1 + 1
 | 
			
		||||
        conftest._getconftestmodules(basedir.join("b"))
 | 
			
		||||
        assert len(conftest._path2confmods) == snap1 + 2
 | 
			
		||||
        assert len(conftest._dirpath2confmods) == snap1 + 2
 | 
			
		||||
 | 
			
		||||
    def test_value_access_not_existing(self, basedir):
 | 
			
		||||
        conftest = ConftestWithSetinitial(basedir)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue