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