Fix determining rootdir from common_ancestor
This commit is contained in:
		
							parent
							
								
									ffb583ae91
								
							
						
					
					
						commit
						a2891420de
					
				| 
						 | 
					@ -1095,6 +1095,8 @@ def get_common_ancestor(args):
 | 
				
			||||||
        if str(arg)[0] == "-":
 | 
					        if str(arg)[0] == "-":
 | 
				
			||||||
            continue
 | 
					            continue
 | 
				
			||||||
        p = py.path.local(arg)
 | 
					        p = py.path.local(arg)
 | 
				
			||||||
 | 
					        if not p.exists():
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
        if common_ancestor is None:
 | 
					        if common_ancestor is None:
 | 
				
			||||||
            common_ancestor = p
 | 
					            common_ancestor = p
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
| 
						 | 
					@ -1108,21 +1110,28 @@ def get_common_ancestor(args):
 | 
				
			||||||
                    common_ancestor = shared
 | 
					                    common_ancestor = shared
 | 
				
			||||||
    if common_ancestor is None:
 | 
					    if common_ancestor is None:
 | 
				
			||||||
        common_ancestor = py.path.local()
 | 
					        common_ancestor = py.path.local()
 | 
				
			||||||
    elif not common_ancestor.isdir():
 | 
					    elif common_ancestor.isfile():
 | 
				
			||||||
        common_ancestor = common_ancestor.dirpath()
 | 
					        common_ancestor = common_ancestor.dirpath()
 | 
				
			||||||
    return common_ancestor
 | 
					    return common_ancestor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_dirs_from_args(args):
 | 
				
			||||||
 | 
					    return [d for d in (py.path.local(x) for x in args
 | 
				
			||||||
 | 
					                        if not str(x).startswith("-"))
 | 
				
			||||||
 | 
					            if d.exists()]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def determine_setup(inifile, args):
 | 
					def determine_setup(inifile, args):
 | 
				
			||||||
 | 
					    dirs = get_dirs_from_args(args)
 | 
				
			||||||
    if inifile:
 | 
					    if inifile:
 | 
				
			||||||
        iniconfig = py.iniconfig.IniConfig(inifile)
 | 
					        iniconfig = py.iniconfig.IniConfig(inifile)
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            inicfg = iniconfig["pytest"]
 | 
					            inicfg = iniconfig["pytest"]
 | 
				
			||||||
        except KeyError:
 | 
					        except KeyError:
 | 
				
			||||||
            inicfg = None
 | 
					            inicfg = None
 | 
				
			||||||
        rootdir = get_common_ancestor(args)
 | 
					        rootdir = get_common_ancestor(dirs)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        ancestor = get_common_ancestor(args)
 | 
					        ancestor = get_common_ancestor(dirs)
 | 
				
			||||||
        rootdir, inifile, inicfg = getcfg(
 | 
					        rootdir, inifile, inicfg = getcfg(
 | 
				
			||||||
            [ancestor], ["pytest.ini", "tox.ini", "setup.cfg"])
 | 
					            [ancestor], ["pytest.ini", "tox.ini", "setup.cfg"])
 | 
				
			||||||
        if rootdir is None:
 | 
					        if rootdir is None:
 | 
				
			||||||
| 
						 | 
					@ -1130,6 +1139,12 @@ def determine_setup(inifile, args):
 | 
				
			||||||
                if rootdir.join("setup.py").exists():
 | 
					                if rootdir.join("setup.py").exists():
 | 
				
			||||||
                    break
 | 
					                    break
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
 | 
					                rootdir, inifile, inicfg = getcfg(
 | 
				
			||||||
 | 
					                    dirs, ["pytest.ini", "tox.ini", "setup.cfg"])
 | 
				
			||||||
 | 
					                if rootdir is None:
 | 
				
			||||||
 | 
					                    rootdir = get_common_ancestor([py.path.local(), ancestor])
 | 
				
			||||||
 | 
					                    is_fs_root = os.path.splitdrive(str(rootdir))[1] == os.sep
 | 
				
			||||||
 | 
					                    if is_fs_root:
 | 
				
			||||||
                        rootdir = ancestor
 | 
					                        rootdir = ancestor
 | 
				
			||||||
    return rootdir, inifile, inicfg or {}
 | 
					    return rootdir, inifile, inicfg or {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -490,6 +490,7 @@ class TestSession:
 | 
				
			||||||
class Test_getinitialnodes:
 | 
					class Test_getinitialnodes:
 | 
				
			||||||
    def test_global_file(self, testdir, tmpdir):
 | 
					    def test_global_file(self, testdir, tmpdir):
 | 
				
			||||||
        x = tmpdir.ensure("x.py")
 | 
					        x = tmpdir.ensure("x.py")
 | 
				
			||||||
 | 
					        with tmpdir.as_cwd():
 | 
				
			||||||
            config = testdir.parseconfigure(x)
 | 
					            config = testdir.parseconfigure(x)
 | 
				
			||||||
        col = testdir.getnode(config, x)
 | 
					        col = testdir.getnode(config, x)
 | 
				
			||||||
        assert isinstance(col, pytest.Module)
 | 
					        assert isinstance(col, pytest.Module)
 | 
				
			||||||
| 
						 | 
					@ -504,6 +505,7 @@ class Test_getinitialnodes:
 | 
				
			||||||
        subdir = tmpdir.join("subdir")
 | 
					        subdir = tmpdir.join("subdir")
 | 
				
			||||||
        x = subdir.ensure("x.py")
 | 
					        x = subdir.ensure("x.py")
 | 
				
			||||||
        subdir.ensure("__init__.py")
 | 
					        subdir.ensure("__init__.py")
 | 
				
			||||||
 | 
					        with subdir.as_cwd():
 | 
				
			||||||
            config = testdir.parseconfigure(x)
 | 
					            config = testdir.parseconfigure(x)
 | 
				
			||||||
        col = testdir.getnode(config, x)
 | 
					        col = testdir.getnode(config, x)
 | 
				
			||||||
        assert isinstance(col, pytest.Module)
 | 
					        assert isinstance(col, pytest.Module)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -468,6 +468,7 @@ def test_consider_args_after_options_for_rootdir_and_inifile(testdir, args):
 | 
				
			||||||
            args[i] = d1
 | 
					            args[i] = d1
 | 
				
			||||||
        elif arg == 'dir2':
 | 
					        elif arg == 'dir2':
 | 
				
			||||||
            args[i] = d2
 | 
					            args[i] = d2
 | 
				
			||||||
 | 
					    with root.as_cwd():
 | 
				
			||||||
        result = testdir.runpytest(*args)
 | 
					        result = testdir.runpytest(*args)
 | 
				
			||||||
    result.stdout.fnmatch_lines(['*rootdir: *myroot, inifile: '])
 | 
					    result.stdout.fnmatch_lines(['*rootdir: *myroot, inifile: '])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -547,10 +548,14 @@ class TestWarning:
 | 
				
			||||||
class TestRootdir:
 | 
					class TestRootdir:
 | 
				
			||||||
    def test_simple_noini(self, tmpdir):
 | 
					    def test_simple_noini(self, tmpdir):
 | 
				
			||||||
        assert get_common_ancestor([tmpdir]) == tmpdir
 | 
					        assert get_common_ancestor([tmpdir]) == tmpdir
 | 
				
			||||||
        assert get_common_ancestor([tmpdir.mkdir("a"), tmpdir]) == tmpdir
 | 
					        a = tmpdir.mkdir("a")
 | 
				
			||||||
        assert get_common_ancestor([tmpdir, tmpdir.join("a")]) == tmpdir
 | 
					        assert get_common_ancestor([a, tmpdir]) == tmpdir
 | 
				
			||||||
 | 
					        assert get_common_ancestor([tmpdir, a]) == tmpdir
 | 
				
			||||||
        with tmpdir.as_cwd():
 | 
					        with tmpdir.as_cwd():
 | 
				
			||||||
            assert get_common_ancestor([]) == tmpdir
 | 
					            assert get_common_ancestor([]) == tmpdir
 | 
				
			||||||
 | 
					            no_path = tmpdir.join('does-not-exist')
 | 
				
			||||||
 | 
					            assert get_common_ancestor([no_path]) == tmpdir
 | 
				
			||||||
 | 
					            assert get_common_ancestor([no_path.join('a')]) == tmpdir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @pytest.mark.parametrize("name", "setup.cfg tox.ini pytest.ini".split())
 | 
					    @pytest.mark.parametrize("name", "setup.cfg tox.ini pytest.ini".split())
 | 
				
			||||||
    def test_with_ini(self, tmpdir, name):
 | 
					    def test_with_ini(self, tmpdir, name):
 | 
				
			||||||
| 
						 | 
					@ -595,3 +600,34 @@ class TestRootdir:
 | 
				
			||||||
        inifile = tmpdir.ensure("pytest.ini")
 | 
					        inifile = tmpdir.ensure("pytest.ini")
 | 
				
			||||||
        rootdir, inifile, inicfg = determine_setup(inifile, [tmpdir])
 | 
					        rootdir, inifile, inicfg = determine_setup(inifile, [tmpdir])
 | 
				
			||||||
        assert rootdir == tmpdir
 | 
					        assert rootdir == tmpdir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_with_arg_outside_cwd_without_inifile(self, tmpdir):
 | 
				
			||||||
 | 
					        a = tmpdir.mkdir("a")
 | 
				
			||||||
 | 
					        b = tmpdir.mkdir("b")
 | 
				
			||||||
 | 
					        rootdir, inifile, inicfg = determine_setup(None, [a, b])
 | 
				
			||||||
 | 
					        assert rootdir == tmpdir
 | 
				
			||||||
 | 
					        assert inifile is None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_with_arg_outside_cwd_with_inifile(self, tmpdir):
 | 
				
			||||||
 | 
					        a = tmpdir.mkdir("a")
 | 
				
			||||||
 | 
					        b = tmpdir.mkdir("b")
 | 
				
			||||||
 | 
					        inifile = a.ensure("pytest.ini")
 | 
				
			||||||
 | 
					        rootdir, parsed_inifile, inicfg = determine_setup(None, [a, b])
 | 
				
			||||||
 | 
					        assert rootdir == a
 | 
				
			||||||
 | 
					        assert inifile == parsed_inifile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @pytest.mark.parametrize('dirs', ([], ['does-not-exist'],
 | 
				
			||||||
 | 
					                                      ['a/does-not-exist']))
 | 
				
			||||||
 | 
					    def test_with_non_dir_arg(self, dirs, tmpdir):
 | 
				
			||||||
 | 
					        with tmpdir.ensure(dir=True).as_cwd():
 | 
				
			||||||
 | 
					            rootdir, inifile, inicfg = determine_setup(None, dirs)
 | 
				
			||||||
 | 
					            assert rootdir == tmpdir
 | 
				
			||||||
 | 
					            assert inifile is None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_with_existing_file_in_subdir(self, tmpdir):
 | 
				
			||||||
 | 
					        a = tmpdir.mkdir("a")
 | 
				
			||||||
 | 
					        a.ensure("exist")
 | 
				
			||||||
 | 
					        with tmpdir.as_cwd():
 | 
				
			||||||
 | 
					            rootdir, inifile, inicfg = determine_setup(None, ['a/exist'])
 | 
				
			||||||
 | 
					            assert rootdir == tmpdir
 | 
				
			||||||
 | 
					            assert inifile is None
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue