Commit 337eca2db8111af3c6fcfaf775c8c396d7db9e16
1 parent
26c5f32b
Exists in
master
and in
1 other branch
BacktraceLineHelper refactoring
Showing
5 changed files
with
50 additions
and
42 deletions
Show diff stats
app/helpers/backtrace_line_helper.rb
| 1 | 1 | module BacktraceLineHelper |
| 2 | - def link_to_source_file(app, line, &block) | |
| 2 | + def link_to_source_file(line, &block) | |
| 3 | 3 | text = capture_haml(&block) |
| 4 | - if line.in_app? | |
| 5 | - return link_to_github(app, line, text) if app.github_repo? | |
| 6 | - return link_to_bitbucket(app, line, text) if app.bitbucket_repo? | |
| 7 | - if app.issue_tracker && app.issue_tracker.respond_to?(:url_to_file) | |
| 8 | - # Return link to file on tracker if issue tracker supports this | |
| 9 | - return link_to_issue_tracker_file(app, line, text) | |
| 10 | - end | |
| 11 | - end | |
| 12 | - text | |
| 4 | + line.in_app? ? link_to_in_app_source_file(line, text) : link_to_external_source_file(text) | |
| 13 | 5 | end |
| 14 | 6 | |
| 15 | - def filepath_parts(file) | |
| 16 | - [file.split('/').last, file] | |
| 7 | + private | |
| 8 | + def link_to_in_app_source_file(line, text) | |
| 9 | + link_to_repo_source_file(line, text) || link_to_issue_tracker_file(line, text) | |
| 17 | 10 | end |
| 18 | 11 | |
| 19 | - def link_to_github(app, line, text = nil) | |
| 20 | - file_name, file_path = filepath_parts(line.file) | |
| 21 | - href = "%s#L%s" % [app.github_url_to_file(file_path), line.number] | |
| 22 | - link_to(text || file_name, href, :target => '_blank') | |
| 12 | + def link_to_repo_source_file(line, text) | |
| 13 | + link_to_github(line, text) || link_to_bitbucket(line, text) | |
| 23 | 14 | end |
| 24 | 15 | |
| 25 | - def link_to_bitbucket(app, line, text = nil) | |
| 26 | - file_name, file_path = filepath_parts(line.file) | |
| 27 | - href = "%s#cl-%s" % [app.bitbucket_url_to_file(file_path), line.number] | |
| 28 | - link_to(text || file_name, href, :target => '_blank') | |
| 16 | + def link_to_external_source_file(text) | |
| 17 | + text | |
| 29 | 18 | end |
| 30 | 19 | |
| 31 | - def link_to_issue_tracker_file(app, line, text = nil) | |
| 32 | - file_name, file_path = filepath_parts(line.file_relative) | |
| 33 | - href = app.issue_tracker.url_to_file(file_path, line.number) | |
| 34 | - link_to(text || file_name, href, :target => '_blank') | |
| 20 | + def link_to_github(line, text = nil) | |
| 21 | + return unless line.app.github_repo? | |
| 22 | + href = "%s#L%s" % [line.app.github_url_to_file(line.file), line.number] | |
| 23 | + link_to(text || line.file_name, href, :target => '_blank') | |
| 35 | 24 | end |
| 36 | 25 | |
| 37 | - def path_for_backtrace_line(line) | |
| 38 | - path = File.dirname(line.file) | |
| 39 | - return '' if path == '.' | |
| 40 | - # Remove [PROJECT_ROOT] | |
| 41 | - path.gsub!('[PROJECT_ROOT]/', '') | |
| 42 | - # Make gem name bold if starts with [GEM_ROOT]/gems | |
| 43 | - path.gsub!(/\[GEM_ROOT\]\/gems\/([^\/]+)/, "<strong>\\1</strong>") | |
| 44 | - (path << '/').html_safe | |
| 26 | + def link_to_bitbucket(line, text = nil) | |
| 27 | + return unless line.app.bitbucket_repo? | |
| 28 | + href = "%s#cl-%s" % [line.app.bitbucket_url_to_file(line.file), line.number] | |
| 29 | + link_to(text || line.file_name, href, :target => '_blank') | |
| 45 | 30 | end |
| 46 | 31 | |
| 47 | - def file_for_backtrace_line(line) | |
| 48 | - file = File.basename(line.file) | |
| 32 | + def link_to_issue_tracker_file(line, text = nil) | |
| 33 | + return unless line.app.issue_tracker && line.app.issue_tracker.respond_to?(:url_to_file) | |
| 34 | + href = line.app.issue_tracker.url_to_file(line.file, line.number) | |
| 35 | + link_to(text || line.file_name, href, :target => '_blank') | |
| 49 | 36 | end |
| 50 | 37 | |
| 51 | 38 | end | ... | ... |
app/models/backtrace.rb
| ... | ... | @@ -6,10 +6,14 @@ class Backtrace |
| 6 | 6 | index :fingerprint |
| 7 | 7 | |
| 8 | 8 | has_many :notices |
| 9 | + has_one :notice | |
| 10 | + | |
| 9 | 11 | embeds_many :lines, :class_name => "BacktraceLine" |
| 10 | 12 | |
| 11 | 13 | after_initialize :generate_fingerprint |
| 12 | 14 | |
| 15 | + delegate :app, :to => :notice | |
| 16 | + | |
| 13 | 17 | def self.find_or_create(attributes = {}) |
| 14 | 18 | new(attributes).similar || create(attributes) |
| 15 | 19 | end | ... | ... |
app/models/backtrace_line.rb
| 1 | 1 | class BacktraceLine |
| 2 | 2 | include Mongoid::Document |
| 3 | - IN_APP_REGEXP = %r{^\[PROJECT_ROOT\]\/(?!(vendor))} | |
| 3 | + IN_APP_PATH = %r{^\[PROJECT_ROOT\]\/(?!(vendor))} | |
| 4 | + GEMS_PATH = %r{\[GEM_ROOT\]\/gems\/([^\/]+)} | |
| 4 | 5 | |
| 5 | 6 | field :number, :type => Integer |
| 6 | 7 | field :file |
| ... | ... | @@ -8,18 +9,33 @@ class BacktraceLine |
| 8 | 9 | |
| 9 | 10 | embedded_in :backtrace |
| 10 | 11 | |
| 11 | - scope :in_app, where(:file => IN_APP_REGEXP) | |
| 12 | + scope :in_app, where(:file => IN_APP_PATH) | |
| 13 | + | |
| 14 | + delegate :app, :to => :backtrace | |
| 12 | 15 | |
| 13 | 16 | def to_s |
| 14 | 17 | "#{file}:#{number}" |
| 15 | 18 | end |
| 16 | 19 | |
| 17 | 20 | def in_app? |
| 18 | - !!(file =~ IN_APP_REGEXP) | |
| 21 | + !!(file =~ IN_APP_PATH) | |
| 22 | + end | |
| 23 | + | |
| 24 | + def path | |
| 25 | + File.dirname(file).gsub(/^\.$/, '') + "/" | |
| 19 | 26 | end |
| 20 | 27 | |
| 21 | 28 | def file_relative |
| 22 | - file.to_s.sub(/^\[PROJECT_ROOT\]/, '') | |
| 29 | + file.to_s.sub(IN_APP_PATH, '') | |
| 30 | + end | |
| 31 | + | |
| 32 | + def file_name | |
| 33 | + File.basename file | |
| 34 | + end | |
| 35 | + | |
| 36 | + def decorated_path | |
| 37 | + path.sub(BacktraceLine::IN_APP_PATH, ''). | |
| 38 | + sub(BacktraceLine::GEMS_PATH, "<strong>\\1</strong>") | |
| 23 | 39 | end |
| 24 | 40 | |
| 25 | 41 | end | ... | ... |
app/models/notice.rb
app/views/notices/_backtrace_line.html.haml
| 1 | -%tr{:class => defined?(row_class) ? row_class : nil} | |
| 1 | +%tr{:class => defined?(row_class) && row_class} | |
| 2 | 2 | %td.line{:class => line.in_app? && 'in-app' } |
| 3 | - = link_to_source_file(@app, line) do | |
| 4 | - %span.path>= path_for_backtrace_line(line) | |
| 5 | - %span.file>= file_for_backtrace_line(line) | |
| 3 | + = link_to_source_file(line) do | |
| 4 | + %span.path>=raw line.decorated_path | |
| 5 | + %span.file>= line.file_name | |
| 6 | 6 | - if line.number.present? |
| 7 | 7 | %span.number>= ":#{line.number}" |
| 8 | 8 | → | ... | ... |