1+ import os
12from os .path import normpath
2- from typing import TYPE_CHECKING
3+ from typing import TYPE_CHECKING , List
34
45from cycode .cli .files_collector .walk_ignore import (
56 _collect_top_level_ignore_files ,
67 _get_global_ignore_patterns ,
78 _walk_to_top ,
9+ walk_ignore ,
810)
911
1012if TYPE_CHECKING :
@@ -44,21 +46,38 @@ def test_walk_to_top() -> None:
4446def _create_mocked_file_structure (fs : 'FakeFilesystem' ) -> None :
4547 fs .create_dir ('/home/user/project' )
4648 fs .create_dir ('/home/user/.git' )
49+
50+ fs .create_dir ('/home/user/project/.cycode' )
51+ fs .create_file ('/home/user/project/.cycode/config.yaml' )
52+ fs .create_dir ('/home/user/project/.git' )
53+ fs .create_file ('/home/user/project/.git/HEAD' )
54+
4755 fs .create_file ('/home/user/project/.gitignore' , contents = '*.pyc' )
56+ fs .create_file ('/home/user/project/ignored.pyc' )
57+ fs .create_file ('/home/user/project/presented.txt' )
58+
4859 fs .create_file ('/home/user/project/.cycodeignore' , contents = '*.log' )
49- fs .create_dir ('/home/user/project/subdir' )
50- fs .create_file ('/home/user/project/subdir/.gitignore' , contents = '*.txt' )
60+ fs .create_file ('/home/user/project/ignored2.log' )
61+ fs .create_file ('/home/user/project/ignored2.pyc' )
62+ fs .create_file ('/home/user/project/presented2.txt' )
63+
64+ fs .create_dir ('/home/user/project/subproject' )
65+ fs .create_file ('/home/user/project/subproject/.gitignore' , contents = '*.txt' )
66+ fs .create_file ('/home/user/project/subproject/ignored.txt' )
67+ fs .create_file ('/home/user/project/subproject/ignored.log' )
68+ fs .create_file ('/home/user/project/subproject/ignored.pyc' )
69+ fs .create_file ('/home/user/project/subproject/presented.py' )
5170
5271
5372def test_collect_top_level_ignore_files (fs : 'FakeFilesystem' ) -> None :
5473 _create_mocked_file_structure (fs )
5574
5675 # Test with path inside the project
57- path = normpath ('/home/user/project/subdir ' )
76+ path = normpath ('/home/user/project/subproject ' )
5877 ignore_files = _collect_top_level_ignore_files (path )
5978
6079 assert len (ignore_files ) == 3
61- assert normpath ('/home/user/project/subdir /.gitignore' ) in ignore_files
80+ assert normpath ('/home/user/project/subproject /.gitignore' ) in ignore_files
6281 assert normpath ('/home/user/project/.gitignore' ) in ignore_files
6382 assert normpath ('/home/user/project/.cycodeignore' ) in ignore_files
6483
@@ -85,7 +104,7 @@ def test_collect_top_level_ignore_files(fs: 'FakeFilesystem') -> None:
85104
86105def test_get_global_ignore_patterns (fs : 'FakeFilesystem' ) -> None :
87106 _create_mocked_file_structure (fs )
88- ignore_patterns = _get_global_ignore_patterns ('/home/user/project/subdir ' )
107+ ignore_patterns = _get_global_ignore_patterns ('/home/user/project/subproject ' )
89108
90109 assert len (ignore_patterns ) == 5
91110 # default global:
@@ -95,3 +114,51 @@ def test_get_global_ignore_patterns(fs: 'FakeFilesystem') -> None:
95114 assert '*.txt' in ignore_patterns
96115 assert '*.pyc' in ignore_patterns
97116 assert '*.log' in ignore_patterns
117+
118+
119+ def _collect_walk_ignore_files (path : str ) -> List [str ]:
120+ files = []
121+ for root , _ , filenames in walk_ignore (path ):
122+ for filename in filenames :
123+ files .append (os .path .join (root , filename ))
124+
125+ return files
126+
127+
128+ def test_walk_ignore (fs : 'FakeFilesystem' ) -> None :
129+ _create_mocked_file_structure (fs )
130+
131+ path = normpath ('/home/user/project' )
132+ result = _collect_walk_ignore_files (path )
133+
134+ assert len (result ) == 6
135+ # ignored globally by default:
136+ assert normpath ('/home/user/project/.git/HEAD' ) not in result
137+ assert normpath ('/home/user/project/.cycode/config.yaml' ) not in result
138+ # ignored by .gitignore in project directory:
139+ assert normpath ('/home/user/project/ignored.pyc' ) not in result
140+ assert normpath ('/home/user/project/subproject/ignored.pyc' ) not in result
141+ # ignored by .gitignore in subproject directory:
142+ assert normpath ('/home/user/project/subproject/ignored.txt' ) not in result
143+ # ignored by .cycodeignore in project directory:
144+ assert normpath ('/home/user/project/ignored2.log' ) not in result
145+ assert normpath ('/home/user/project/ignored2.pyc' ) not in result
146+ assert normpath ('/home/user/project/subproject/ignored.log' ) not in result
147+ # presented after both .gitignore and .cycodeignore:
148+ assert normpath ('/home/user/project/.gitignore' ) in result
149+ assert normpath ('/home/user/project/.cycodeignore' ) in result
150+ assert normpath ('/home/user/project/subproject/.gitignore' ) in result
151+ assert normpath ('/home/user/project/presented.txt' ) in result
152+ assert normpath ('/home/user/project/presented2.txt' ) in result
153+ assert normpath ('/home/user/project/subproject/presented.py' ) in result
154+
155+ path = normpath ('/home/user/project/subproject' )
156+ result = _collect_walk_ignore_files (path )
157+
158+ assert len (result ) == 2
159+ # ignored:
160+ assert normpath ('/home/user/project/subproject/ignored.txt' ) not in result
161+ assert normpath ('/home/user/project/subproject/ignored.log' ) not in result
162+ assert normpath ('/home/user/project/subproject/ignored.pyc' ) not in result
163+ # presented:
164+ assert normpath ('/home/user/project/subproject/presented.py' ) in result
0 commit comments