Commit 93030e53f8f6b6f0ff0975e75ea84fa75f337591

Authored by Jared Pace
1 parent 4239e83e
Exists in master and in 1 other branch production

Errs#show with backtrace

Gemfile
... ... @@ -5,6 +5,7 @@ gem 'libxml-ruby'
5 5 gem 'bson_ext', :require => nil
6 6 gem 'mongoid', '2.0.0.beta.15'
7 7 gem 'haml'
  8 +gem 'will_paginate'
8 9  
9 10 group :development, :test do
10 11 gem 'rspec-rails', '>= 2.0.0.beta.19'
... ...
Gemfile.lock
... ... @@ -112,3 +112,4 @@ DEPENDENCIES
112 112 rails (= 3.0.0.rc)
113 113 rspec (>= 2.0.0.beta.19)
114 114 rspec-rails (>= 2.0.0.beta.19)
  115 + will_paginate
... ...
app/controllers/errs_controller.rb
... ... @@ -4,4 +4,11 @@ class ErrsController < ApplicationController
4 4 @errs = Err.unresolved.paginate(:page => params[:page])
5 5 end
6 6  
  7 + def show
  8 + @project = Project.find(params[:project_id])
  9 + @err = @project.errs.find(params[:id])
  10 + @notices = @err.notices.paginate(:page => (params[:notice] || @err.notices.count), :per_page => 1)
  11 + @notice = @notices.first
  12 + end
  13 +
7 14 end
... ...
app/views/errs/show.html.haml 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +- content_for :title, @err.message
  2 +- content_for :meta do
  3 + %strong Where:
  4 + = @err.where
  5 + %strong Environment:
  6 + = @err.environment.titleize
  7 + %strong Type:
  8 + = @err.klass
  9 + %strong Last Notice:
  10 + = @err.last_notice_at.to_s(:micro)
  11 +- content_for :action_bar do
  12 + = will_paginate @notices, :param_name => :notice, :page_links => false
  13 + .float-left viewing occurrence #{@notices.current_page} of #{@notices.total_pages}
  14 + = link_to "back to '#{@project.name}'", project_path(@project)
  15 + |
  16 + = link_to 'resolve', '#' if @err.unresolved?
  17 +
  18 +%h3#backtrace Backtrace
  19 += render 'notices/backtrace', :lines => @notice.backtrace
0 20 \ No newline at end of file
... ...
app/views/layouts/application.html.haml
... ... @@ -18,7 +18,7 @@
18 18 #content-title
19 19 %h1= yield :title
20 20 %span.meta= yield :meta
21   - - if action_bar = yield(:action_bar)
  21 + - if (action_bar = yield(:action_bar)).present?
22 22 #action-bar
23 23 = action_bar
24 24 #content
... ...
app/views/notices/_backtrace.html.haml 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +.backtrace
  2 + %table
  3 + %tr
  4 + %th
  5 + %ul.line-numbers
  6 + - lines.each do |line|
  7 + %li= line['number']
  8 + %td
  9 + %ul.lines
  10 + - lines.each do |line|
  11 + %li{:class => (line['file'].gsub!('[PROJECT_ROOT]','') ? 'in-project' : nil)}
  12 + = line['file']
  13 + →
  14 + %strong= line['method']
0 15 \ No newline at end of file
... ...
app/views/shared/_navigation.html.haml
... ... @@ -2,5 +2,5 @@
2 2 %ul
3 3 //%li= link_to 'Dashboard', admin_dashboard_path, :class => active_if_here(:dashboards)
4 4 %li= link_to 'Projects', projects_path, :class => active_if_here(:projects)
5   - %li= link_to 'Errors', errs_path, :class => active_if_here(:errs => :index)
  5 + %li= link_to 'Errors', errs_path, :class => active_if_here(:errs)
6 6 %div.clear
7 7 \ No newline at end of file
... ...
public/stylesheets/application.css
... ... @@ -9,6 +9,8 @@ body {
9 9 }
10 10  
11 11 /* Convenience Classes */
  12 +.float-left { float: left; }
  13 +.float-right { float: right; }
12 14 .clear { clear: both; }
13 15 .clear-left { clear: left; }
14 16 .clear-right { clear: right; }
... ... @@ -171,6 +173,26 @@ pre {
171 173 .html ul li { margin-bottom: 0.5em; list-style: disc; }
172 174 .html ol li { margin-bottom: 0.5em; list-style: decimal; }
173 175  
  176 +/* Pagination */
  177 +.pagination {
  178 + float: left;
  179 + margin-right: 0.8em;
  180 + text-align: left;
  181 + font-size: 0.9em;
  182 +}
  183 +.pagination a, .pagination span {
  184 + display: inline-block;
  185 + padding: 0 0.3em;
  186 + background-color: #666666;
  187 + border: 1px solid #505050;
  188 +}
  189 +.pagination a:hover {
  190 + text-decoration: none !important;
  191 +}
  192 +.pagination span {
  193 + color: #AAA;
  194 +}
  195 +
174 196 /* Projects Table */
175 197 table.projects td.name, table.errs td.message {
176 198 width: 100%;
... ... @@ -189,4 +211,33 @@ table.errs td.message a {
189 211 table.errs td.message em {
190 212 color: #727272;
191 213 font-size: 0.9em;
  214 +}
  215 +
  216 +/* Backtrace */
  217 +.backtrace {
  218 + width: 100%;
  219 + overflow: auto;
  220 +}
  221 +.backtrace table {
  222 + margin: 0;
  223 +}
  224 +.backtrace td {
  225 + width: 100%;
  226 + padding: 0;
  227 + margin: 0;
  228 + color: #A2A2A2;
  229 + background-color: #222 !important;
  230 +}
  231 +.backtrace ul.line-numbers li {
  232 + text-align: right;
  233 +}
  234 +.backtrace ul.lines {
  235 + padding: 10px 8px;
  236 + overflow: auto;
  237 +}
  238 +.backtrace li {
  239 + white-space: nowrap;
  240 +}
  241 +.backtrace li.in-project {
  242 + color: #2adb2e;
192 243 }
193 244 \ No newline at end of file
... ...
spec/controllers/errs_controller_spec.rb
... ... @@ -3,15 +3,40 @@ require 'spec_helper'
3 3 describe ErrsController do
4 4  
5 5 let(:project) { Factory(:project) }
  6 + let(:err) { Factory(:err, :project => project) }
6 7  
7 8 describe "GET /errs" do
8 9 it "gets a paginated list of unresolved errors" do
9 10 errors = WillPaginate::Collection.new(1,30)
10   - 3.times { errors << Factory(:err, :project => project) }
  11 + 3.times { errors << Factory(:err) }
11 12 Err.should_receive(:unresolved).and_return(mock('proxy', :paginate => errors))
12 13 get :index
13 14 assigns(:errs).should == errors
14 15 end
15 16 end
16 17  
  18 + describe "GET /errs/:id" do
  19 + before do
  20 + 3.times { Factory(:notice, :err => err)}
  21 + end
  22 +
  23 + it "finds the project" do
  24 + get :show, :project_id => project.id, :id => err.id
  25 + assigns(:project).should == project
  26 + end
  27 +
  28 + it "finds the err" do
  29 + get :show, :project_id => project.id, :id => err.id
  30 + assigns(:err).should == err
  31 + end
  32 +
  33 + it "paginates the notices, 1 at a time" do
  34 + Project.stub(:find).with(project.id).and_return(project)
  35 + project.errs.stub(:find).with(err.id).and_return(err)
  36 + err.notices.should_receive(:paginate).with(:page => 3, :per_page => 1).
  37 + and_return(WillPaginate::Collection.new(1,1) << err.notices.first)
  38 + get :show, :project_id => project.id, :id => err.id
  39 + end
  40 + end
  41 +
17 42 end
... ...