Commit b177f0e5ae4b3e65171b6ff54c3f1b65df0ceb10
1 parent
d3b6d050
Exists in
master
and in
1 other branch
simplify line grouper and add coverage
Showing
5 changed files
with
56 additions
and
18 deletions
Show diff stats
app/decorators/backtrace_decorator.rb
@@ -2,4 +2,11 @@ class BacktraceDecorator < Draper::Decorator | @@ -2,4 +2,11 @@ class BacktraceDecorator < Draper::Decorator | ||
2 | def lines | 2 | def lines |
3 | @lines ||= object.lines.map { |line| BacktraceLineDecorator.new line } | 3 | @lines ||= object.lines.map { |line| BacktraceLineDecorator.new line } |
4 | end | 4 | end |
5 | + | ||
6 | + # Group lines into sections of in-app files and external files | ||
7 | + def grouped_lines | ||
8 | + lines.chunk do |line| | ||
9 | + line.in_app? || false | ||
10 | + end | ||
11 | + end | ||
5 | end | 12 | end |
app/helpers/backtrace_helper.rb
@@ -1,16 +0,0 @@ | @@ -1,16 +0,0 @@ | ||
1 | -module BacktraceHelper | ||
2 | - # Group lines into sections of in-app files and external files | ||
3 | - # (An implementation of Enumerable#chunk so we don't break 1.8.7 support.) | ||
4 | - def grouped_lines(lines) | ||
5 | - line_groups = [] | ||
6 | - lines.each do |line| | ||
7 | - in_app = line.in_app? | ||
8 | - if line_groups.last && line_groups.last[0] == in_app | ||
9 | - line_groups.last[1] << line | ||
10 | - else | ||
11 | - line_groups << [in_app, [line]] | ||
12 | - end | ||
13 | - end | ||
14 | - line_groups | ||
15 | - end | ||
16 | -end |
app/views/notices/_backtrace.html.haml
@@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
3 | -# Group lines into internal / external so we can toggle the external backtrace | 3 | -# Group lines into internal / external so we can toggle the external backtrace |
4 | -# Includes a margin of x lines that are not toggled. | 4 | -# Includes a margin of x lines that are not toggled. |
5 | - em = 4 # (external backtrace margin) | 5 | - em = 4 # (external backtrace margin) |
6 | - - grouped_lines(lines).each do |in_app, line_group| | 6 | + - backtrace.grouped_lines.each do |in_app, line_group| |
7 | - if !in_app && line_group.size > (em * 3) | 7 | - if !in_app && line_group.size > (em * 3) |
8 | = render :partial => 'notices/backtrace_line', :collection => line_group[0, em], :as => :line | 8 | = render :partial => 'notices/backtrace_line', :collection => line_group[0, em], :as => :line |
9 | = render :partial => 'notices/backtrace_line', :collection => line_group[em, line_group.size - (em * 2)], :as => :line, :locals => {:row_class => 'toggle_external_backtrace'} | 9 | = render :partial => 'notices/backtrace_line', :collection => line_group[em, line_group.size - (em * 2)], :as => :line, :locals => {:row_class => 'toggle_external_backtrace'} |
app/views/problems/show.html.haml
@@ -68,7 +68,7 @@ | @@ -68,7 +68,7 @@ | ||
68 | 68 | ||
69 | #backtrace | 69 | #backtrace |
70 | %h3 Backtrace | 70 | %h3 Backtrace |
71 | - = render 'notices/backtrace', :lines => @notice.backtrace.lines | 71 | + = render 'notices/backtrace', :backtrace => @notice.backtrace |
72 | 72 | ||
73 | - if @notice.user_attributes.present? | 73 | - if @notice.user_attributes.present? |
74 | #user_attributes | 74 | #user_attributes |
@@ -0,0 +1,47 @@ | @@ -0,0 +1,47 @@ | ||
1 | +describe BacktraceDecorator, type: :decorator do | ||
2 | + let(:backtrace) do | ||
3 | + described_class.new(Backtrace.new( | ||
4 | + lines: [ | ||
5 | + { number: 131, | ||
6 | + file: '[PROJECT_ROOT]app/controllers/accounts_controller.rb', | ||
7 | + method: :update_preferences }, | ||
8 | + { number: 61, | ||
9 | + file: '[PROJECT_ROOT]app/controllers/application_controller.rb', | ||
10 | + method: :call }, | ||
11 | + { number: 182, | ||
12 | + file: '[GEM_ROOT]activesupport-2.3.18/lib/active_support/callbacks.rb', | ||
13 | + method: :call }, | ||
14 | + { number: 384, | ||
15 | + file: '[PROJECT_ROOT]app/models/account.rb', | ||
16 | + method: :update_server_tag_scope }, | ||
17 | + { number: 182, | ||
18 | + file: '[GEM_ROOT]activesupport-2.3.18/lib/active_support/callbacks.rb', | ||
19 | + method: :evaluate_method }, | ||
20 | + { number: 23, | ||
21 | + file: '/home/rails/library/current/vendor/bundle/ruby/2.1.0/bin/rainbows', | ||
22 | + method: '<main>' } | ||
23 | + ] | ||
24 | + )) | ||
25 | + end | ||
26 | + | ||
27 | + describe '#grouped_lines' do | ||
28 | + let(:grouped) { backtrace.grouped_lines.to_a } | ||
29 | + | ||
30 | + it 'puts the first two in-app lines in separate groups' do | ||
31 | + expect(grouped[0][0]).to be_present | ||
32 | + expect(grouped[0][1]).to eq [backtrace.lines[0]] | ||
33 | + expect(grouped[1][0]).to be_present | ||
34 | + expect(grouped[1][1]).to eq [backtrace.lines[1]] | ||
35 | + end | ||
36 | + | ||
37 | + it 'puts the first out-of-app line in its own group' do | ||
38 | + expect(grouped[2][0]).to eq false | ||
39 | + expect(grouped[2][1]).to eq [backtrace.lines[2]] | ||
40 | + end | ||
41 | + | ||
42 | + it 'puts the last two out-of-app lines together in one group' do | ||
43 | + expect(grouped[4][0]).to eq false | ||
44 | + expect(grouped[4][1]).to eq [backtrace.lines[4], backtrace.lines[5]] | ||
45 | + end | ||
46 | + end | ||
47 | +end |