Class: Brakeman::FileParser
- Inherits:
-
Object
- Object
- Brakeman::FileParser
- Defined in:
- lib/brakeman/file_parser.rb
Overview
This class handles reading and parsing files.
Instance Attribute Summary collapse
-
#errors ⇒ Object
readonly
Returns the value of attribute errors.
-
#file_list ⇒ Object
readonly
Returns the value of attribute file_list.
Instance Method Summary collapse
-
#initialize(app_tree, timeout, parallel = true) ⇒ FileParser
constructor
A new instance of FileParser.
- #parse_files(list) ⇒ Object
-
#parse_ruby(input, path) ⇒ Object
path can be a string or a Brakeman::FilePath.
- #read_files(list) ⇒ Object
Constructor Details
#initialize(app_tree, timeout, parallel = true) ⇒ FileParser
Returns a new instance of FileParser.
10 11 12 13 14 15 16 |
# File 'lib/brakeman/file_parser.rb', line 10 def initialize app_tree, timeout, parallel = true @app_tree = app_tree @timeout = timeout @file_list = [] @errors = [] @parallel = parallel end |
Instance Attribute Details
#errors ⇒ Object (readonly)
Returns the value of attribute errors.
8 9 10 |
# File 'lib/brakeman/file_parser.rb', line 8 def errors @errors end |
#file_list ⇒ Object (readonly)
Returns the value of attribute file_list.
8 9 10 |
# File 'lib/brakeman/file_parser.rb', line 8 def file_list @file_list end |
Instance Method Details
#parse_files(list) ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/brakeman/file_parser.rb', line 18 def parse_files list if @parallel = {} else # Disable parallelism = { in_threads: 0 } end # Parse the files in parallel. # By default, the parsing will be in separate processes. # So we map the result to ASTFiles and/or Exceptions # then partition them into ASTFiles and Exceptions # and add the Exceptions to @errors # # Basically just a funky way to deal with two possible # return types that are returned from isolated processes. # # Note this method no longer uses read_files @file_list, new_errors = Parallel.map(list, ) do |file_name| file_path = @app_tree.file_path(file_name) contents = file_path.read begin if ast = parse_ruby(contents, file_path.relative) ASTFile.new(file_name, ast) end rescue Exception => e e end end.compact.partition do |result| result.is_a? ASTFile end errors.concat new_errors end |
#parse_ruby(input, path) ⇒ Object
path can be a string or a Brakeman::FilePath
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/brakeman/file_parser.rb', line 71 def parse_ruby input, path if path.is_a? Brakeman::FilePath path = path.relative end begin Brakeman.debug "Parsing #{path}" RubyParser.new.parse input, path, @timeout rescue Racc::ParseError => e raise e.exception(e. + "\nCould not parse #{path}") rescue Timeout::Error => e raise Exception.new("Parsing #{path} took too long (> #{@timeout} seconds). Try increasing the limit with --parser-timeout") rescue => e raise e.exception(e. + "\nWhile processing #{path}") end end |
#read_files(list) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/brakeman/file_parser.rb', line 54 def read_files list list.each do |path| file = @app_tree.file_path(path) begin result = yield file, file.read if result @file_list << result end rescue Exception => e @errors << e end end end |