def test_in_project_roots(tmpdir): from _pydevd_bundle.pydevd_filtering import FilesFiltering files_filtering = FilesFiltering() import os.path import sys assert files_filtering._get_library_roots() == [ os.path.normcase(x) for x in files_filtering._get_default_library_roots() ] site_packages = tmpdir.mkdir('site-packages') project_dir = tmpdir.mkdir('project') project_dir_inside_site_packages = str(site_packages.mkdir('project')) site_packages_inside_project_dir = str(project_dir.mkdir('site-packages')) # Convert from pytest paths to str. site_packages = str(site_packages) project_dir = str(project_dir) tmpdir = str(tmpdir) # Test permutations of project dir inside site packages and vice-versa. files_filtering.set_project_roots( [project_dir, project_dir_inside_site_packages]) files_filtering.set_library_roots( [site_packages, site_packages_inside_project_dir]) check = [ (tmpdir, False), (site_packages, False), (site_packages_inside_project_dir, False), (project_dir, True), (project_dir_inside_site_packages, True), ] for (check_path, find) in check[:]: check.append((os.path.join(check_path, 'a.py'), find)) for check_path, find in check: assert files_filtering.in_project_roots(check_path) == find files_filtering.set_project_roots([]) files_filtering.set_library_roots( [site_packages, site_packages_inside_project_dir]) # If the IDE did not set the project roots, consider anything not in the site # packages as being in a project root (i.e.: we can calculate default values for # site-packages but not for project roots). check = [ (tmpdir, True), (site_packages, False), (site_packages_inside_project_dir, False), (project_dir, True), (project_dir_inside_site_packages, False), (os.path.join(tmpdir, '<foo>'), False), ] for check_path, find in check: assert files_filtering.in_project_roots(check_path) == find sys.path.append(str(site_packages)) try: default_library_roots = files_filtering._get_default_library_roots() assert len(set(default_library_roots)) == len(default_library_roots), \ 'Duplicated library roots found in: %s' % (default_library_roots,) assert str(site_packages) in default_library_roots for path in sys.path: if os.path.exists(path) and path.endswith('site-packages'): assert path in default_library_roots finally: sys.path.remove(str(site_packages))
def test_in_project_roots(tmpdir): from _pydevd_bundle.pydevd_filtering import FilesFiltering files_filtering = FilesFiltering() import os.path import sys assert files_filtering._get_library_roots() == [ os.path.normcase(x) + ('\\' if IS_WINDOWS else '/') for x in files_filtering._get_default_library_roots()] site_packages = tmpdir.mkdir('site-packages') project_dir = tmpdir.mkdir('project') project_dir_inside_site_packages = str(site_packages.mkdir('project')) site_packages_inside_project_dir = str(project_dir.mkdir('site-packages')) # Convert from pytest paths to str. site_packages = str(site_packages) project_dir = str(project_dir) tmpdir = str(tmpdir) # Test permutations of project dir inside site packages and vice-versa. files_filtering.set_project_roots([project_dir, project_dir_inside_site_packages]) files_filtering.set_library_roots([site_packages, site_packages_inside_project_dir]) check = [ (tmpdir, False), (site_packages, False), (site_packages_inside_project_dir, False), (project_dir, True), (project_dir_inside_site_packages, True), ] for (check_path, find) in check[:]: filename_inside = os.path.join(check_path, 'a.py') with open(filename_inside, 'w') as stream: # Note: on Github actions, tmpdir may be something as: # c:\\users\\runner~1\\appdata\\local\\temp\\pytest-of-runneradmin\\pytest-0\\test_in_project_roots0 # internally this may be set as: # c:\\users\\runneradmin\\appdata\\local\\temp\\pytest-of-runneradmin\\pytest-0\\test_in_project_roots0 # So, when getting the absolute path, `runner~1` will be properly expanded to `runneradmin` if the # file exists, but if it doesn't it's not (which may make the test fail), so, make sure # that we actually create the file so that things work as expected. stream.write('...') check.append((filename_inside, find)) for check_path, find in check: if files_filtering.in_project_roots(check_path) != find: if find: msg = 'Expected %s to be in the project roots.\nProject roots: %s\nLibrary roots: %s\n' else: msg = 'Expected %s NOT to be in the project roots.\nProject roots: %s\nLibrary roots: %s\n' raise AssertionError(msg % ( check_path, files_filtering._get_project_roots(), files_filtering._get_library_roots(), ) ) files_filtering.set_project_roots([]) files_filtering.set_library_roots([site_packages, site_packages_inside_project_dir]) # If the IDE did not set the project roots, consider anything not in the site # packages as being in a project root (i.e.: we can calculate default values for # site-packages but not for project roots). check = [ (tmpdir, True), (site_packages, False), (site_packages_inside_project_dir, False), (project_dir, True), (project_dir_inside_site_packages, False), ('<foo>', False), ('<ipython>', True), ('<frozen importlib._bootstrap>', False), ] for check_path, find in check: assert files_filtering.in_project_roots(check_path) == find, \ 'Expected: %s to be a part of the project: %s' % (check_path, find) sys.path.append(str(site_packages)) try: default_library_roots = files_filtering._get_default_library_roots() assert len(set(default_library_roots)) == len(default_library_roots), \ 'Duplicated library roots found in: %s' % (default_library_roots,) assert str(site_packages) in default_library_roots for path in sys.path: if os.path.exists(path) and path.endswith('site-packages'): assert path in default_library_roots finally: sys.path.remove(str(site_packages))
def test_in_project_roots(tmpdir): from _pydevd_bundle.pydevd_filtering import FilesFiltering files_filtering = FilesFiltering() import os.path import sys assert files_filtering._get_library_roots() == [ os.path.normcase(x) for x in files_filtering._get_default_library_roots()] site_packages = tmpdir.mkdir('site-packages') project_dir = tmpdir.mkdir('project') project_dir_inside_site_packages = str(site_packages.mkdir('project')) site_packages_inside_project_dir = str(project_dir.mkdir('site-packages')) # Convert from pytest paths to str. site_packages = str(site_packages) project_dir = str(project_dir) tmpdir = str(tmpdir) # Test permutations of project dir inside site packages and vice-versa. files_filtering.set_project_roots([project_dir, project_dir_inside_site_packages]) files_filtering.set_library_roots([site_packages, site_packages_inside_project_dir]) check = [ (tmpdir, False), (site_packages, False), (site_packages_inside_project_dir, False), (project_dir, True), (project_dir_inside_site_packages, True), ] for (check_path, find) in check[:]: check.append((os.path.join(check_path, 'a.py'), find)) for check_path, find in check: assert files_filtering.in_project_roots(check_path) == find files_filtering.set_project_roots([]) files_filtering.set_library_roots([site_packages, site_packages_inside_project_dir]) # If the IDE did not set the project roots, consider anything not in the site # packages as being in a project root (i.e.: we can calculate default values for # site-packages but not for project roots). check = [ (tmpdir, True), (site_packages, False), (site_packages_inside_project_dir, False), (project_dir, True), (project_dir_inside_site_packages, False), ('<foo>', True), ('<frozen importlib._bootstrap>', False), ] for check_path, find in check: assert files_filtering.in_project_roots(check_path) == find sys.path.append(str(site_packages)) try: default_library_roots = files_filtering._get_default_library_roots() assert len(set(default_library_roots)) == len(default_library_roots), \ 'Duplicated library roots found in: %s' % (default_library_roots,) assert str(site_packages) in default_library_roots for path in sys.path: if os.path.exists(path) and path.endswith('site-packages'): assert path in default_library_roots finally: sys.path.remove(str(site_packages))