Skip to content

Commit e0f5312

Browse files
Merge pull request #1913 from presidentbeef/lazy_file_lists
Use lazy file lists in AppTree
2 parents 6d0eedf + 9925d15 commit e0f5312

File tree

4 files changed

+35
-17
lines changed

4 files changed

+35
-17
lines changed

lib/brakeman/app_tree.rb

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,17 @@ def gemspec
145145
end
146146
end
147147

148+
149+
# Call this to be able to marshall the AppTree
150+
def marshallable
151+
@initializer_paths = @initializer_paths.to_a
152+
@controller_paths = @controller_paths.to_a
153+
@template_paths = @template_paths.to_a
154+
@lib_files = @file_paths.to_a
155+
156+
self
157+
end
158+
148159
private
149160

150161
def find_helper_paths
@@ -160,7 +171,7 @@ def find_additional_lib_paths
160171
end
161172

162173
def find_paths(directory, extensions = ".rb")
163-
select_files(glob_files(directory, "*", extensions).sort)
174+
select_files(glob_files(directory, "*", extensions))
164175
end
165176

166177
def glob_files(directory, name, extensions = ".rb")
@@ -179,10 +190,10 @@ def glob_files(directory, name, extensions = ".rb")
179190
end
180191

181192
files = patterns.flat_map { |pattern| Dir.glob(pattern) }
182-
files.uniq
193+
files.uniq.lazy
183194
else
184195
pattern = "#{root_search_pattern}#{directory}/**/#{name}#{extensions}"
185-
Dir.glob(pattern)
196+
Dir.glob(pattern).lazy
186197
end
187198
end
188199

@@ -191,7 +202,8 @@ def select_files(paths)
191202
paths = reject_skipped_files(paths)
192203
paths = convert_to_file_paths(paths)
193204
paths = reject_global_excludes(paths)
194-
reject_directories(paths)
205+
paths = reject_directories(paths)
206+
paths
195207
end
196208

197209
def reject_directories(paths)

lib/brakeman/tracker.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,4 +441,10 @@ def reset_initializer path
441441

442442
@call_index.remove_indexes_by_file path
443443
end
444+
445+
# Call this to be able to marshal the Tracker
446+
def marshallable
447+
@app_tree.marshallable
448+
self
449+
end
444450
end

test/test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def before_rescan_of changed, app = "rails3.2", options = {}
186186
yield dir if block_given?
187187

188188
# Not really sure why we do this..?
189-
t = Marshal.load(Marshal.dump(@original))
189+
t = Marshal.load(Marshal.dump(@original.marshallable))
190190

191191
@rescanner = Brakeman::Rescanner.new(t.options, t.processor, changed)
192192
@rescan = @rescanner.recheck

test/tests/app_tree.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,77 +51,77 @@ def temp_dir_relative_symlink_and_file_from_path(relative_path)
5151
def test_directory_absolute_symlink_support
5252
temp_dir_absolute_symlink_and_file_from_path("test.rb") do |dir, file|
5353
at = Brakeman::AppTree.new(dir, follow_symlinks: true)
54-
assert_equal [file], at.ruby_file_paths.collect(&:absolute)
54+
assert_equal [file], at.ruby_file_paths.collect(&:absolute).to_a
5555
end
5656
end
5757

5858
def test_directory_relative_symlink_support
5959
temp_dir_relative_symlink_and_file_from_path("test.rb") do |dir, file|
6060
at = Brakeman::AppTree.new(dir, follow_symlinks: true)
61-
assert_equal [file], at.ruby_file_paths.collect(&:absolute)
61+
assert_equal [file], at.ruby_file_paths.collect(&:absolute).to_a
6262
end
6363
end
6464

6565
def test_directory_relative_disabled_symlink_support
6666
temp_dir_relative_symlink_and_file_from_path("test.rb") do |dir, file|
6767
at = Brakeman::AppTree.new(dir, follow_symlinks: false)
68-
assert_empty at.ruby_file_paths.collect(&:absolute)
68+
assert_empty at.ruby_file_paths.collect(&:absolute).to_a
6969
end
7070
end
7171

7272
def test_ruby_file_paths
7373
temp_dir_and_file_from_path("test.rb") do |dir, file|
7474
at = Brakeman::AppTree.new(dir)
75-
assert_equal [file], at.ruby_file_paths.collect(&:absolute)
75+
assert_equal [file], at.ruby_file_paths.collect(&:absolute).to_a
7676
end
7777
end
7878

7979
def test_ruby_file_paths_skip_vendor_false
8080
temp_dir_and_file_from_path("vendor/test.rb") do |dir, file|
8181
at = Brakeman::AppTree.new(dir, :skip_vendor => false)
82-
assert_equal [file], at.ruby_file_paths.collect(&:absolute)
82+
assert_equal [file], at.ruby_file_paths.collect(&:absolute).to_a
8383
end
8484
end
8585

8686
def test_ruby_file_paths_skip_vendor_true
8787
temp_dir_and_file_from_path("vendor/test.rb") do |dir, file|
8888
at = Brakeman::AppTree.new(dir, :skip_vendor => true)
89-
assert_equal [], at.ruby_file_paths.collect(&:absolute)
89+
assert_equal [], at.ruby_file_paths.collect(&:absolute).to_a
9090
end
9191
end
9292

9393
def test_ruby_file_paths_skip_vendor_true_add_libs_path
9494
temp_dir_and_file_from_path("vendor/bundle/gems/gem123/lib/test.rb") do |dir, file|
9595
at = Brakeman::AppTree.new(dir, :skip_vendor => true, :additional_libs_path => ["vendor/bundle/gems/gem123/lib"])
96-
assert_equal [file], at.ruby_file_paths.collect(&:absolute)
96+
assert_equal [file], at.ruby_file_paths.collect(&:absolute).to_a
9797
end
9898
end
9999

100100
def test_ruby_file_paths_skip_vendor_true_add_engine_path
101101
temp_dir_and_file_from_path("vendor/bundle/gems/gem123/test.rb") do |dir, file|
102102
at = Brakeman::AppTree.new(dir, :skip_vendor => true, :engine_paths => ["vendor/bundle/gems"])
103-
assert_equal [file], at.ruby_file_paths.collect(&:absolute)
103+
assert_equal [file], at.ruby_file_paths.collect(&:absolute).to_a
104104
end
105105
end
106106

107107
def test_ruby_file_paths_skip_vendor_true_tests_in_engine_path_still_excluded
108108
temp_dir_and_file_from_path("vendor/bundle/gems/gem123/test/test.rb") do |dir, file|
109109
at = Brakeman::AppTree.new(dir, :skip_vendor => true, :engine_paths => ["vendor/bundler/gems"])
110-
assert_equal [], at.ruby_file_paths.collect(&:absolute)
110+
assert_equal [], at.ruby_file_paths.collect(&:absolute).to_a
111111
end
112112
end
113113

114114
def test_ruby_file_paths_add_engine_path
115115
temp_dir_and_file_from_path("lib/gems/gem123/test.rb") do |dir, file|
116116
at = Brakeman::AppTree.new(dir, :engine_paths => ["lib/gems"])
117-
assert_equal [file], at.ruby_file_paths.collect(&:absolute)
117+
assert_equal [file], at.ruby_file_paths.collect(&:absolute).to_a
118118
end
119119
end
120120

121121
def test_ruby_file_paths_add_libs_path
122122
temp_dir_and_file_from_path("gem123/lib/test.rb") do |dir, file|
123123
at = Brakeman::AppTree.new(dir, :additional_libs_path => ["gems/gem123/lib"])
124-
assert_equal [file], at.ruby_file_paths.collect(&:absolute)
124+
assert_equal [file], at.ruby_file_paths.collect(&:absolute).to_a
125125
end
126126
end
127127

@@ -130,7 +130,7 @@ def test_ruby_file_paths_directory_with_rb_extension
130130
FileUtils.mkdir_p(File.join(dir, "test.rb"))
131131

132132
at = Brakeman::AppTree.new(dir)
133-
assert_equal [], at.ruby_file_paths.collect(&:absolute)
133+
assert_equal [], at.ruby_file_paths.collect(&:absolute).to_a
134134
end
135135
end
136136
end

0 commit comments

Comments
 (0)