Commit 9e861299b99bc00e63ee0719790d6946f8e896d5

Authored by Stephen Crosby
2 parents d1683958 9f9132ff
Exists in master and in 1 other branch production

Merge pull request #998 from rud/chore/fix-more-style

Rubocop: whittling down the TODO list
Showing 72 changed files with 476 additions and 531 deletions   Show diff stats
.rubocop.yml
... ... @@ -23,6 +23,9 @@ Style/IndentationConsistency:
23 23 # modifiers.
24 24 EnforcedStyle: rails
25 25  
  26 +Style/GuardClause:
  27 + MinBodyLength: 4
  28 +
26 29 Style/AccessModifierIndentation:
27 30 EnforcedStyle: outdent
28 31  
... ... @@ -33,6 +36,9 @@ Style/DotPosition:
33 36 # Support code copy/paste into console
34 37 EnforcedStyle: trailing
35 38  
  39 +Style/MultilineOperationIndentation:
  40 + EnforcedStyle: indented
  41 +
36 42 Style/IndentHash:
37 43 EnforcedStyle: consistent
38 44  
... ... @@ -46,3 +52,7 @@ Style/SpaceAroundOperators:
46 52 - '=>'
47 53 - '||='
48 54 - 'then'
  55 +
  56 +Style/FileName:
  57 + Exclude:
  58 + - 'config/initializers/cve-*.rb'
... ...
.rubocop_todo.yml
... ... @@ -41,24 +41,6 @@ Rails/Output:
41 41 - 'app/interactors/problem_recacher.rb'
42 42 - 'db/seeds.rb'
43 43  
44   -# Offense count: 12
45   -# Configuration parameters: Include.
46   -Rails/Validation:
47   - Exclude:
48   - - 'app/models/app.rb'
49   - - 'app/models/comment.rb'
50   - - 'app/models/deploy.rb'
51   - - 'app/models/err.rb'
52   - - 'app/models/notice.rb'
53   - - 'app/models/problem.rb'
54   - - 'app/models/user.rb'
55   -
56   -# Offense count: 105
57   -# Cop supports --auto-correct.
58   -# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods.
59   -Style/BlockDelimiters:
60   - Enabled: false
61   -
62 44 # Offense count: 15
63 45 # Configuration parameters: EnforcedStyle, SupportedStyles.
64 46 Style/ClassAndModuleChildren:
... ... @@ -93,94 +75,6 @@ Style/EachWithObject:
93 75 - 'app/models/notice_fingerprinter.rb'
94 76 - 'lib/recurse.rb'
95 77  
96   -# Offense count: 2
97   -# Configuration parameters: Exclude.
98   -Style/FileName:
99   - Exclude:
100   - - 'config/initializers/cve-2013-0156.rb'
101   - - 'script/rspec-queue-mongoid.rb'
102   -
103   -# Offense count: 4
104   -# Cop supports --auto-correct.
105   -# Configuration parameters: EnforcedStyle, SupportedStyles.
106   -Style/FirstParameterIndentation:
107   - Exclude:
108   - - 'app/models/issue_tracker.rb'
109   - - 'spec/decorators/backtrace_decorator_spec.rb'
110   - - 'spec/decorators/issue_tracker_type_decorator_spec.rb'
111   -
112   -# Offense count: 8
113   -# Configuration parameters: EnforcedStyle, SupportedStyles.
114   -Style/FormatString:
115   - Exclude:
116   - - 'app/decorators/backtrace_line_decorator.rb'
117   - - 'app/helpers/problems_helper.rb'
118   - - 'spec/views/apps/edit.html.haml_spec.rb'
119   - - 'spec/views/problems/show.html.haml_spec.rb'
120   - - 'spec/views/users/show.html.haml_spec.rb'
121   -
122   -# Offense count: 27
123   -# Configuration parameters: MinBodyLength.
124   -Style/GuardClause:
125   - Enabled: false
126   -
127   -# Offense count: 6
128   -# Cop supports --auto-correct.
129   -# Configuration parameters: MaxLineLength.
130   -Style/IfUnlessModifier:
131   - Exclude:
132   - - 'app/controllers/api/v1/stats_controller.rb'
133   - - 'app/controllers/application_controller.rb'
134   - - 'app/controllers/problems_controller.rb'
135   - - 'app/models/notice.rb'
136   - - 'app/models/user.rb'
137   -
138   -# Offense count: 17
139   -# Cop supports --auto-correct.
140   -Style/LeadingCommentSpace:
141   - Exclude:
142   - - 'app/models/notification_services/gtalk_service.rb'
143   - - 'spec/controllers/api/v1/notices_controller_spec.rb'
144   - - 'spec/controllers/api/v1/problems_controller_spec.rb'
145   - - 'spec/models/fabricators_spec.rb'
146   - - 'spec/models/notification_service/campfire_service_spec.rb'
147   - - 'spec/models/notification_service/gtalk_service_spec.rb'
148   - - 'spec/models/notification_service/hoiio_service_spec.rb'
149   - - 'spec/models/notification_service/pushover_service_spec.rb'
150   -
151   -# Offense count: 10
152   -# Cop supports --auto-correct.
153   -# Configuration parameters: EnforcedStyle, SupportedStyles.
154   -Style/MultilineOperationIndentation:
155   - Enabled: false
156   -
157   -# Offense count: 5
158   -# Cop supports --auto-correct.
159   -# Configuration parameters: PreferredDelimiters.
160   -Style/PercentLiteralDelimiters:
161   - Exclude:
162   - - 'app/controllers/api/v1/notices_controller.rb'
163   - - 'app/controllers/api/v1/problems_controller.rb'
164   - - 'app/controllers/problems_searcher.rb'
165   - - 'spec/models/notice_spec.rb'
166   -
167   -# Offense count: 1
168   -# Configuration parameters: Methods.
169   -Style/SingleLineBlockParams:
170   - Exclude:
171   - - 'lib/hoptoad/v2.rb'
172   -
173   -# Offense count: 11
174   -# Cop supports --auto-correct.
175   -Style/SingleSpaceBeforeFirstArg:
176   - Exclude:
177   - - 'app/models/comment.rb'
178   - - 'config/application.rb'
179   - - 'spec/fabricators/app_fabricator.rb'
180   - - 'spec/fabricators/comment_fabricator.rb'
181   - - 'spec/fabricators/notice_fabricator.rb'
182   - - 'spec/fabricators/user_fabricator.rb'
183   -
184 78 # Offense count: 873
185 79 # Cop supports --auto-correct.
186 80 # Configuration parameters: EnforcedStyle, SupportedStyles.
... ...
app/controllers/api/v1/notices_controller.rb
... ... @@ -3,7 +3,7 @@ class Api::V1::NoticesController < ApplicationController
3 3  
4 4 def index
5 5 query = {}
6   - fields = %w{created_at message error_class}
  6 + fields = %w(created_at message error_class)
7 7  
8 8 if params.key?(:start_date) && params.key?(:end_date)
9 9 start_date = Time.zone.parse(params[:start_date]).utc
... ...
app/controllers/api/v1/problems_controller.rb
1 1 class Api::V1::ProblemsController < ApplicationController
2 2 respond_to :json, :xml
3   - FIELDS = %w{_id app_id app_name environment message where first_notice_at last_notice_at resolved resolved_at notices_count}
  3 + FIELDS = %w(_id app_id app_name environment message where first_notice_at last_notice_at resolved resolved_at notices_count)
4 4  
5 5 def show
6 6 result = benchmark("[api/v1/problems_controller/show] query time") do
... ...
app/controllers/api/v1/stats_controller.rb
... ... @@ -25,9 +25,7 @@ class Api::V1::StatsController &lt; ApplicationController
25 25  
26 26 protected def require_api_key_or_authenticate_user!
27 27 if params[:api_key].present?
28   - if (@app = App.where(api_key: params[:api_key]).first)
29   - return true
30   - end
  28 + return true if (@app = App.where(api_key: params[:api_key]).first)
31 29 end
32 30  
33 31 authenticate_user!
... ...
app/controllers/application_controller.rb
... ... @@ -23,10 +23,10 @@ protected
23 23 # Check if the current_user is admin or not and redirect to root url if not
24 24 #
25 25 def require_admin!
26   - unless user_signed_in? && current_user.admin?
27   - flash[:error] = "Sorry, you don't have permission to do that"
28   - redirect_to_root
29   - end
  26 + return if user_signed_in? && current_user.admin?
  27 +
  28 + flash[:error] = "Sorry, you don't have permission to do that"
  29 + redirect_to_root
30 30 end
31 31  
32 32 def redirect_to_root
... ... @@ -41,8 +41,6 @@ protected
41 41 user_token = params[User.token_authentication_key].presence
42 42 user = user_token && User.find_by(authentication_token: user_token)
43 43  
44   - if user
45   - sign_in user, store: false
46   - end
  44 + sign_in user, store: false if user
47 45 end
48 46 end
... ...
app/controllers/apps_controller.rb
... ... @@ -8,9 +8,9 @@ class AppsController &lt; ApplicationController
8 8  
9 9 expose(:app_scope) { App }
10 10  
11   - expose(:apps) {
  11 + expose(:apps) do
12 12 app_scope.all.sort.map { |app| AppDecorator.new(app) }
13   - }
  13 + end
14 14  
15 15 expose(:app, ancestor: :app_scope, attributes: :app_params)
16 16  
... ... @@ -18,11 +18,11 @@ class AppsController &lt; ApplicationController
18 18 AppDecorator.new(app)
19 19 end
20 20  
21   - expose(:all_errs) {
  21 + expose(:all_errs) do
22 22 params[:all_errs].present?
23   - }
  23 + end
24 24  
25   - expose(:problems) {
  25 + expose(:problems) do
26 26 if request.format == :atom
27 27 app.problems.unresolved.ordered
28 28 else
... ... @@ -32,15 +32,15 @@ class AppsController &lt; ApplicationController
32 32 params[:environment]
33 33 ).ordered_by(params_sort, params_order).page(params[:page]).per(current_user.per_page)
34 34 end
35   - }
  35 + end
36 36  
37   - expose(:deploys) {
  37 + expose(:deploys) do
38 38 app.deploys.order_by(:created_at.desc).limit(5)
39   - }
  39 + end
40 40  
41   - expose(:users) {
  41 + expose(:users) do
42 42 User.all.sort_by { |u| u.name.downcase }
43   - }
  43 + end
44 44  
45 45 def index; end
46 46  
... ... @@ -93,13 +93,16 @@ class AppsController &lt; ApplicationController
93 93 protected
94 94  
95 95 def initialize_subclassed_notification_service
  96 + notification_type = params[:app].
  97 + fetch(:notification_service_attributes, {}).
  98 + fetch(:type, nil)
  99 + return if notification_type.blank?
  100 +
96 101 # set the app's notification service
97   - if params[:app][:notification_service_attributes] && (notification_type = params[:app][:notification_service_attributes][:type])
98   - available_notification_classes = [NotificationService] + NotificationService.subclasses
99   - notification_class = available_notification_classes.detect { |c| c.name == notification_type }
100   - if notification_class.present?
101   - app.notification_service = notification_class.new(params[:app][:notification_service_attributes])
102   - end
  102 + available_notification_classes = [NotificationService] + NotificationService.subclasses
  103 + notification_class = available_notification_classes.detect { |c| c.name == notification_type }
  104 + if notification_class.present?
  105 + app.notification_service = notification_class.new(params[:app][:notification_service_attributes])
103 106 end
104 107 end
105 108  
... ... @@ -112,32 +115,38 @@ protected
112 115  
113 116 # email_at_notices is edited as a string, and stored as an array.
114 117 def parse_email_at_notices_or_set_default
115   - if params[:app] && (val = params[:app][:email_at_notices])
116   - # Sanitize negative values, split on comma,
117   - # strip, parse as integer, remove all '0's.
118   - # If empty, set as default and show an error message.
119   - email_at_notices = val.gsub(/-\d+/, "").split(",").map { |v| v.strip.to_i }.reject { |v| v == 0 }
120   - if email_at_notices.any?
121   - params[:app][:email_at_notices] = email_at_notices
122   - else
123   - default_array = params[:app][:email_at_notices] = Errbit::Config.email_at_notices
124   - flash[:error] = "Couldn't parse your notification frequency. Value was reset to default (#{default_array.join(', ')})."
125   - end
  118 + return if params[:app].blank?
  119 +
  120 + val = params[:app][:email_at_notices]
  121 + return if val.blank?
  122 +
  123 + # Sanitize negative values, split on comma,
  124 + # strip, parse as integer, remove all '0's.
  125 + # If empty, set as default and show an error message.
  126 + email_at_notices = val.gsub(/-\d+/, "").split(",").map { |v| v.strip.to_i }.reject { |v| v == 0 }
  127 + if email_at_notices.any?
  128 + params[:app][:email_at_notices] = email_at_notices
  129 + else
  130 + default_array = params[:app][:email_at_notices] = Errbit::Config.email_at_notices
  131 + flash[:error] = "Couldn't parse your notification frequency. Value was reset to default (#{default_array.join(', ')})."
126 132 end
127 133 end
128 134  
129 135 def parse_notice_at_notices_or_set_default
130   - if params[:app][:notification_service_attributes] && (val = params[:app][:notification_service_attributes][:notify_at_notices])
131   - # Sanitize negative values, split on comma,
132   - # strip, parse as integer, remove all '0's.
133   - # If empty, set as default and show an error message.
134   - notify_at_notices = val.gsub(/-\d+/, "").split(",").map { |v| v.strip.to_i }
135   - if notify_at_notices.any?
136   - params[:app][:notification_service_attributes][:notify_at_notices] = notify_at_notices
137   - else
138   - default_array = params[:app][:notification_service_attributes][:notify_at_notices] = Errbit::Config.notify_at_notices
139   - flash[:error] = "Couldn't parse your notification frequency. Value was reset to default (#{default_array.join(', ')})."
140   - end
  136 + return if params[:app][:notification_service_attributes].blank?
  137 +
  138 + val = params[:app][:notification_service_attributes][:notify_at_notices]
  139 + return if val.blank?
  140 +
  141 + # Sanitize negative values, split on comma,
  142 + # strip, parse as integer, remove all '0's.
  143 + # If empty, set as default and show an error message.
  144 + notify_at_notices = val.gsub(/-\d+/, "").split(",").map { |v| v.strip.to_i }
  145 + if notify_at_notices.any?
  146 + params[:app][:notification_service_attributes][:notify_at_notices] = notify_at_notices
  147 + else
  148 + default_array = params[:app][:notification_service_attributes][:notify_at_notices] = Errbit::Config.notify_at_notices
  149 + flash[:error] = "Couldn't parse your notification frequency. Value was reset to default (#{default_array.join(', ')})."
141 150 end
142 151 end
143 152  
... ...
app/controllers/deploys_controller.rb
... ... @@ -19,15 +19,15 @@ class DeploysController &lt; ApplicationController
19 19 private
20 20  
21 21 def default_deploy
22   - if params[:deploy]
23   - {
24   - username: params[:deploy][:local_username],
25   - environment: params[:deploy][:rails_env],
26   - repository: params[:deploy][:scm_repository],
27   - revision: params[:deploy][:scm_revision],
28   - message: params[:deploy][:message]
29   - }
30   - end
  22 + return if params[:deploy].blank?
  23 +
  24 + {
  25 + username: params[:deploy][:local_username],
  26 + environment: params[:deploy][:rails_env],
  27 + repository: params[:deploy][:scm_repository],
  28 + revision: params[:deploy][:scm_revision],
  29 + message: params[:deploy][:message]
  30 + }
31 31 end
32 32  
33 33 # handle Heroku's HTTP post deployhook format
... ...
app/controllers/problems_controller.rb
... ... @@ -11,27 +11,27 @@ class ProblemsController &lt; ApplicationController
11 11 :resolve_several, :unresolve_several, :unmerge_several
12 12 ]
13 13  
14   - expose(:app_scope) {
  14 + expose(:app_scope) do
15 15 params[:app_id] ? App.where(_id: params[:app_id]) : App.all
16   - }
  16 + end
17 17  
18   - expose(:app) {
  18 + expose(:app) do
19 19 AppDecorator.new app_scope.find(params[:app_id])
20   - }
  20 + end
21 21  
22   - expose(:problem) {
  22 + expose(:problem) do
23 23 ProblemDecorator.new app.problems.find(params[:id])
24   - }
  24 + end
25 25  
26   - expose(:all_errs) {
  26 + expose(:all_errs) do
27 27 params[:all_errs]
28   - }
  28 + end
29 29  
30   - expose(:params_environement) {
  30 + expose(:params_environement) do
31 31 params[:environment]
32   - }
  32 + end
33 33  
34   - expose(:problems) {
  34 + expose(:problems) do
35 35 pro = Problem.
36 36 for_apps(app_scope).
37 37 in_env(params_environement).
... ... @@ -43,7 +43,7 @@ class ProblemsController &lt; ApplicationController
43 43 else
44 44 pro
45 45 end
46   - }
  46 + end
47 47  
48 48 def index; end
49 49  
... ... @@ -58,9 +58,7 @@ class ProblemsController &lt; ApplicationController
58 58 issue = Issue.new(problem: problem, user: current_user)
59 59 issue.body = render_to_string(*issue.render_body_args)
60 60  
61   - unless issue.save
62   - flash[:error] = issue.errors.full_messages.join(', ')
63   - end
  61 + flash[:error] = issue.errors.full_messages.join(', ') unless issue.save
64 62  
65 63 redirect_to app_problem_path(app, problem)
66 64 end
... ... @@ -138,9 +136,9 @@ class ProblemsController &lt; ApplicationController
138 136 # Redirect :back if no errors selected
139 137 #
140 138 protected def need_selected_problem
141   - if err_ids.empty?
142   - flash[:notice] = I18n.t('controllers.problems.flash.no_select_problem')
143   - redirect_to :back
144   - end
  139 + return if err_ids.any?
  140 +
  141 + flash[:notice] = I18n.t('controllers.problems.flash.no_select_problem')
  142 + redirect_to :back
145 143 end
146 144 end
... ...
app/controllers/problems_searcher.rb
... ... @@ -5,28 +5,28 @@ module ProblemsSearcher
5 5 extend ActiveSupport::Concern
6 6  
7 7 included do
8   - expose(:params_sort) {
9   - if %w{app message last_notice_at last_deploy_at count}.member?(params[:sort])
  8 + expose(:params_sort) do
  9 + if %w(app message last_notice_at last_deploy_at count).member?(params[:sort])
10 10 params[:sort]
11 11 else
12 12 "last_notice_at"
13 13 end
14   - }
  14 + end
15 15  
16   - expose(:params_order) {
17   - if %w{asc desc}.member?(params[:order])
  16 + expose(:params_order) do
  17 + if %w(asc desc).member?(params[:order])
18 18 params[:order]
19 19 else
20 20 'desc'
21 21 end
22   - }
  22 + end
23 23  
24   - expose(:selected_problems) {
  24 + expose(:selected_problems) do
25 25 Array(Problem.find(err_ids))
26   - }
  26 + end
27 27  
28   - expose(:err_ids) {
  28 + expose(:err_ids) do
29 29 (params[:problems] || []).compact
30   - }
  30 + end
31 31 end
32 32 end
... ...
app/controllers/users_controller.rb
... ... @@ -5,9 +5,9 @@ class UsersController &lt; ApplicationController
5 5 before_action :require_user_edit_priviledges, only: [:edit, :update]
6 6  
7 7 expose(:user, attributes: :user_params)
8   - expose(:users) {
  8 + expose(:users) do
9 9 User.all.page(params[:page]).per(current_user.per_page)
10   - }
  10 + end
11 11  
12 12 def index; end
13 13 def new; end
... ...
app/decorators/backtrace_line_decorator.rb
... ... @@ -57,7 +57,7 @@ private
57 57 link_to_hosted_javascript(app, text)
58 58 else
59 59 link_to_repo_source_file(app, text) ||
60   - link_to_issue_tracker_file(app, text)
  60 + link_to_issue_tracker_file(app, text)
61 61 end
62 62 end
63 63  
... ... @@ -66,20 +66,19 @@ private
66 66 end
67 67  
68 68 def link_to_hosted_javascript(app, text)
69   - if app.asset_host?
70   - h.link_to(text, "#{app.asset_host}/#{file_relative}", target: '_blank')
71   - end
  69 + return unless app.asset_host?
  70 + h.link_to(text, "#{app.asset_host}/#{file_relative}", target: '_blank')
72 71 end
73 72  
74 73 def link_to_github(app, text = nil)
75 74 return unless app.github_repo?
76   - href = "%s#L%s" % [app.github_url_to_file(decorated_path + file_name), number]
  75 + href = format("%s#L%s", app.github_url_to_file(decorated_path + file_name), number)
77 76 h.link_to(text || file_name, href, target: '_blank')
78 77 end
79 78  
80 79 def link_to_bitbucket(app, text = nil)
81 80 return unless app.bitbucket_repo?
82   - href = "%s#%s-%s" % [app.bitbucket_url_to_file(decorated_path + file_name), file_name, number]
  81 + href = format("%s#%s-%s", app.bitbucket_url_to_file(decorated_path + file_name), file_name, number)
83 82 h.link_to(text || file_name, href, target: '_blank')
84 83 end
85 84  
... ...
app/helpers/application_helper.rb
... ... @@ -20,7 +20,7 @@ module ApplicationHelper
20 20 end
21 21  
22 22 def generate_ical(deploys)
23   - RiCal.Calendar { |cal|
  23 + RiCal.Calendar do |cal|
24 24 deploys.each_with_index do |deploy, idx|
25 25 cal.event do |event|
26 26 event.summary = "#{idx + 1} #{deploy.repository}"
... ... @@ -31,7 +31,7 @@ module ApplicationHelper
31 31 event.organizer = deploy.username.to_s
32 32 end
33 33 end
34   - }.to_s
  34 + end.to_s
35 35 end
36 36  
37 37 def user_agent_graph(problem)
... ... @@ -57,7 +57,7 @@ module ApplicationHelper
57 57 total = (options[:total] || total_from_tallies(tallies))
58 58 percent = 100.0 / total.to_f
59 59 rows = tallies.map { |value, count| [(count.to_f * percent), value] }. \
60   - sort { |a, b| b[0] <=> a[0] }
  60 + sort { |a, b| b[0] <=> a[0] }
61 61 render "problems/tally_table", rows: rows
62 62 end
63 63  
... ...
app/helpers/apps_helper.rb
1 1 module AppsHelper
2 2 def link_to_copy_attributes_from_other_app
3   - if App.count > 1
4   - html = link_to('copy settings from another app', '#',
5   - class: 'button copy_config')
6   - html << select("duplicate", "app",
7   - App.all.asc(:name).reject { |a| a == @app }.
8   - collect { |p| [p.name, p.id] }, { include_blank: "[choose app]" },
9   - class: "choose_other_app", style: "display: none;")
10   - return html
11   - end
  3 + return if App.count <= 1
  4 +
  5 + html = link_to('copy settings from another app', '#',
  6 + class: 'button copy_config')
  7 + html << select("duplicate", "app",
  8 + App.all.asc(:name).reject { |a| a == @app }.
  9 + collect { |p| [p.name, p.id] }, { include_blank: "[choose app]" },
  10 + class: "choose_other_app", style: "display: none;")
  11 + html
12 12 end
13 13  
14 14 def any_github_repos?
... ...
app/helpers/problems_helper.rb
1 1 module ProblemsHelper
2 2 def problem_confirm(action)
3   - t('problems.confirm.%s' % action) unless Errbit::Config.confirm_err_actions.eql? false
  3 + t(format('problems.confirm.%s', action)) unless Errbit::Config.confirm_err_actions.eql? false
4 4 end
5 5  
6 6 def truncated_problem_message(problem)
7   - unless (msg = problem.message).blank?
8   - # Truncate & insert invisible chars so that firefox can emulate 'word-wrap: break-word' CSS rule
9   - truncate(msg, length: 300, escape: false).scan(/.{1,5}/).map { |s| h(s) }.join("&#8203;").html_safe
10   - end
  7 + msg = problem.message
  8 + return if msg.blank?
  9 +
  10 + # Truncate & insert invisible chars so that firefox can emulate
  11 + # 'word-wrap: break-word' CSS rule
  12 + truncate(msg, length: 300, escape: false).
  13 + scan(/.{1,5}/).map { |s| h(s) }.
  14 + join("&#8203;").html_safe
11 15 end
12 16  
13 17 def gravatar_tag(email, options = {})
... ...
app/interactors/problem_destroy.rb
... ... @@ -20,9 +20,9 @@ class ProblemDestroy
20 20 # the number of problem destroy
21 21 #
22 22 def self.execute(problems)
23   - Array(problems).each { |problem|
  23 + Array(problems).each do |problem|
24 24 ProblemDestroy.new(problem).execute
25   - }.count
  25 + end.count
26 26 end
27 27  
28 28 private
... ...
app/interactors/resolved_problem_clearer.rb
... ... @@ -5,14 +5,14 @@ class ResolvedProblemClearer
5 5 # Clear all problem already resolved
6 6 #
7 7 def execute
8   - nb_problem_resolved.tap { |nb|
  8 + nb_problem_resolved.tap do |nb|
9 9 if nb > 0
10 10 criteria.each do |problem|
11 11 ProblemDestroy.new(problem).execute
12 12 end
13 13 repair_database
14 14 end
15   - }
  15 + end
16 16 end
17 17  
18 18 private
... ...
app/models/app.rb
... ... @@ -35,9 +35,7 @@ class App
35 35 before_save :normalize_github_repo
36 36 after_update :store_cached_attributes_on_problems
37 37  
38   - validates_presence_of :name, :api_key
39   - validates_uniqueness_of :name, allow_blank: true
40   - validates_uniqueness_of :api_key, allow_blank: true
  38 + validates :name, :api_key, presence: true, uniqueness: { allow_blank: true }
41 39 validates_associated :watchers
42 40 validates_associated :notice_fingerprinter
43 41 validate :check_issue_tracker
... ... @@ -154,16 +152,17 @@ class App
154 152  
155 153 # Copy app attributes from another app.
156 154 def copy_attributes_from(app_id)
157   - if (copy_app = App.where(_id: app_id).first)
158   - # Copy fields
159   - (copy_app.fields.keys - %w(_id name created_at updated_at)).each do |k|
160   - send("#{k}=", copy_app.send(k))
161   - end
162   - # Clone the embedded objects that can be changed via apps/edit (ignore errs & deploys, etc.)
163   - %w(watchers issue_tracker notification_service).each do |relation|
164   - if (obj = copy_app.send(relation))
165   - send("#{relation}=", obj.is_a?(Array) ? obj.map(&:clone) : obj.clone)
166   - end
  155 + copy_app = App.where(_id: app_id).first
  156 + return if copy_app.blank?
  157 +
  158 + # Copy fields
  159 + (copy_app.fields.keys - %w(_id name created_at updated_at)).each do |k|
  160 + send("#{k}=", copy_app.send(k))
  161 + end
  162 + # Clone the embedded objects that can be changed via apps/edit (ignore errs & deploys, etc.)
  163 + %w(watchers issue_tracker notification_service).each do |relation|
  164 + if (obj = copy_app.send(relation))
  165 + send("#{relation}=", obj.is_a?(Array) ? obj.map(&:clone) : obj.clone)
167 166 end
168 167 end
169 168 end
... ... @@ -179,8 +178,8 @@ class App
179 178 # Compare by number of unresolved errs, then problem counts.
180 179 def <=>(other)
181 180 (other.unresolved_count <=> unresolved_count).nonzero? ||
182   - (other.problem_count <=> problem_count).nonzero? ||
183   - name <=> other.name
  181 + (other.problem_count <=> problem_count).nonzero? ||
  182 + name <=> other.name
184 183 end
185 184  
186 185 def email_at_notices
... ... @@ -204,12 +203,12 @@ protected
204 203 end
205 204  
206 205 def check_issue_tracker
207   - if issue_tracker.present?
208   - issue_tracker.valid?
209   - issue_tracker.errors.full_messages.each do |error|
210   - errors[:base] << error
211   - end if issue_tracker.errors
212   - end
  206 + return if issue_tracker.blank?
  207 +
  208 + issue_tracker.valid?
  209 + issue_tracker.errors.full_messages.each do |error|
  210 + errors[:base] << error
  211 + end if issue_tracker.errors
213 212 end
214 213  
215 214 def normalize_github_repo
... ...
app/models/comment.rb
... ... @@ -12,9 +12,10 @@ class Comment
12 12  
13 13 belongs_to :err, class_name: "Problem"
14 14 belongs_to :user
15   - delegate :app, to: :err
16 15  
17   - validates_presence_of :body
  16 + delegate :app, to: :err
  17 +
  18 + validates :body, presence: true
18 19  
19 20 def deliver_email
20 21 Mailer.comment_notification(self).deliver_now
... ...
app/models/deploy.rb
... ... @@ -16,7 +16,7 @@ class Deploy
16 16 after_create :store_cached_attributes_on_problems
17 17 after_create :deliver_email
18 18  
19   - validates_presence_of :username, :environment
  19 + validates :username, :environment, presence: true
20 20  
21 21 def resolve_app_errs
22 22 app.problems.unresolved.in_env(environment).each(&:resolve!)
... ...
app/models/err.rb
... ... @@ -14,7 +14,7 @@ class Err
14 14 belongs_to :problem
15 15 has_many :notices, inverse_of: :err, dependent: :destroy
16 16  
17   - validates_presence_of :problem_id, :fingerprint
  17 + validates :problem_id, :fingerprint, presence: true
18 18  
19 19 delegate :app, :resolved?, to: :problem
20 20 end
... ...
app/models/issue_tracker.rb
... ... @@ -14,10 +14,12 @@ class IssueTracker
14 14 begin
15 15 klass = ErrbitPlugin::Registry.issue_trackers[type_tracker] || ErrbitPlugin::NoneIssueTracker
16 16 # TODO: we need to find out a better way to pass those config to the issue tracker
17   - klass.new(options.merge(
18   - github_repo: app.try(:github_repo),
19   - bitbucket_repo: app.try(:bitbucket_repo)
20   - ))
  17 + klass.new(
  18 + options.merge(
  19 + github_repo: app.try(:github_repo),
  20 + bitbucket_repo: app.try(:bitbucket_repo)
  21 + )
  22 + )
21 23 end
22 24 end
23 25  
... ...
app/models/notice.rb
... ... @@ -24,7 +24,7 @@ class Notice
24 24 before_save :sanitize
25 25 before_destroy :problem_recache
26 26  
27   - validates_presence_of :backtrace_id, :server_environment, :notifier
  27 + validates :backtrace_id, :server_environment, :notifier, presence: true
28 28  
29 29 scope :ordered, -> { order_by(:created_at.asc) }
30 30 scope :reverse_ordered, -> { order_by(:created_at.desc) }
... ... @@ -107,15 +107,11 @@ class Notice
107 107 # TODO: Move on decorator maybe
108 108 #
109 109 def project_root
110   - if server_environment
111   - server_environment['project-root'] || ''
112   - end
  110 + server_environment['project-root'] || '' if server_environment
113 111 end
114 112  
115 113 def app_version
116   - if server_environment
117   - server_environment['app-version'] || ''
118   - end
  114 + server_environment['app-version'] || '' if server_environment
119 115 end
120 116  
121 117 # filter memory addresses out of object strings
... ...
app/models/notification_services/gtalk_service.rb
... ... @@ -45,10 +45,10 @@ class NotificationServices::GtalkService &lt; NotificationService
45 45 client.connect(service)
46 46 client.auth(api_token)
47 47  
48   - #has to look like this to be formatted properly in the client
49   - message = """#{problem.app.name}
50   -#{Errbit::Config.protocol}://#{Errbit::Config.host}/apps/#{problem.app.id}
51   -#{notification_description problem}"""
  48 + # has to look like this to be formatted properly in the client
  49 + message = """#{problem.app.name}\n" \
  50 + "#{Errbit::Config.protocol}://#{Errbit::Config.host}/apps/#{problem.app.id}\n" \
  51 + "#{notification_description problem}"""
52 52  
53 53 # post the issue to the xmpp room(s)
54 54 send_to_users(client, message) unless user_id.blank?
... ... @@ -66,7 +66,7 @@ private
66 66 end
67 67  
68 68 def send_to_muc(client, message)
69   - #TODO: set this so that it can send to multiple rooms like users, nb multiple room joins in one send fail randomly so leave as one room for the moment
  69 + # TODO: set this so that it can send to multiple rooms like users, nb multiple room joins in one send fail randomly so leave as one room for the moment
70 70 muc = Jabber::MUC::SimpleMUCClient.new(client)
71 71 muc.join(room_id + "/errbit")
72 72 muc.send(Jabber::Message.new(room_id, message))
... ...
app/models/problem.rb
... ... @@ -53,7 +53,8 @@ class Problem
53 53 has_many :errs, inverse_of: :problem, dependent: :destroy
54 54 has_many :comments, inverse_of: :err, dependent: :destroy
55 55  
56   - validates_presence_of :environment
  56 + validates :environment, presence: true
  57 + validates :last_notice_at, :first_notice_at, presence: true
57 58  
58 59 before_create :cache_app_attributes
59 60 before_save :truncate_message
... ... @@ -63,8 +64,6 @@ class Problem
63 64 scope :ordered, -> { order_by(:last_notice_at.desc) }
64 65 scope :for_apps, ->(apps) { where(:app_id.in => apps.all.map(&:id)) }
65 66  
66   - validates_presence_of :last_notice_at, :first_notice_at
67   -
68 67 def self.all_else_unresolved(fetch_all)
69 68 if fetch_all
70 69 all
... ...
app/models/user.rb
... ... @@ -38,12 +38,12 @@ class User
38 38  
39 39 before_save :ensure_authentication_token
40 40  
41   - validates_presence_of :name
42   - validates_uniqueness_of :github_login, allow_nil: true
  41 + validates :name, presence: true
  42 + validates :github_login, uniqueness: { allow_nil: true }
43 43  
44 44 if Errbit::Config.user_has_username
45 45 field :username
46   - validates_presence_of :username
  46 + validates :username, presence: true
47 47 end
48 48  
49 49 def per_page
... ... @@ -67,9 +67,7 @@ class User
67 67 end
68 68  
69 69 def github_login=(login)
70   - if login.is_a?(String) && login.strip.empty?
71   - login = nil
72   - end
  70 + login = nil if login.is_a?(String) && login.strip.empty?
73 71 self[:github_login] = login
74 72 end
75 73  
... ...
config/application.rb
... ... @@ -37,9 +37,9 @@ module Errbit
37 37  
38 38 # > rails generate - config
39 39 config.generators do |g|
40   - g.orm :mongoid
  40 + g.orm :mongoid
41 41 g.template_engine :haml
42   - g.test_framework :rspec, fixture: false
  42 + g.test_framework :rspec, fixture: false
43 43 g.fixture_replacement :fabrication
44 44 end
45 45  
... ...
config/load.rb
... ... @@ -29,9 +29,9 @@ Errbit::Config = Configurator.run(
29 29 mongo_url: %w(MONGOLAB_URI MONGOHQ_URL MONGODB_URL MONGO_URL),
30 30  
31 31 # github
32   - github_url: ['GITHUB_URL', lambda { |values|
  32 + github_url: ['GITHUB_URL', lambda do |values|
33 33 values[:github_url].gsub(%r{/*\z}, '')
34   - }],
  34 + end],
35 35 github_authentication: ['GITHUB_AUTHENTICATION'],
36 36 github_client_id: ['GITHUB_CLIENT_ID'],
37 37 github_secret: ['GITHUB_SECRET'],
... ... @@ -40,9 +40,9 @@ Errbit::Config = Configurator.run(
40 40 github_api_url: ['GITHUB_API_URL'],
41 41 github_site_title: ['GITHUB_SITE_TITLE'],
42 42  
43   - email_delivery_method: ['EMAIL_DELIVERY_METHOD', lambda { |values|
  43 + email_delivery_method: ['EMAIL_DELIVERY_METHOD', lambda do |values|
44 44 values[:email_delivery_method] && values[:email_delivery_method].to_sym
45   - }],
  45 + end],
46 46  
47 47 # smtp settings
48 48 smtp_address: ['SMTP_SERVER'],
... ... @@ -50,10 +50,10 @@ Errbit::Config = Configurator.run(
50 50 smtp_authentication: ['SMTP_AUTHENTICATION'],
51 51 smtp_user_name: %w(SMTP_USERNAME SENDGRID_USERNAME),
52 52 smtp_password: %w(SMTP_PASSWORD SENDGRID_PASSWORD),
53   - smtp_domain: ['SMTP_DOMAIN', 'SENDGRID_DOMAIN', lambda { |values|
  53 + smtp_domain: ['SMTP_DOMAIN', 'SENDGRID_DOMAIN', lambda do |values|
54 54 values[:smtp_domain] ||
55 55 (values[:email_from] && values[:email_from].split('@').last) || nil
56   - }],
  56 + end],
57 57  
58 58 # sendmail settings
59 59 sendmail_location: ['SENDMAIL_LOCATION'],
... ...
docs/DEVELOPER-ADVANCED.md
... ... @@ -15,7 +15,7 @@ gem install test-queue
15 15 After you just need launch the script with adapting runner of mongoid.
16 16  
17 17 ```
18   -./script/rspec-queue-mongoid.rb spec
  18 +./script/rspec_queue_mongoid.rb spec
19 19 ```
20 20  
21 21 In my case, the complete test suite down to 2min after a 16min long
... ...
lib/hoptoad/v2.rb
... ... @@ -22,11 +22,15 @@ module Hoptoad
22 22 elsif node.key?('key')
23 23 { normalize_key(node['key']) => nil }
24 24 else
25   - node.inject({}) { |rekeyed, (key, val)| rekeyed.merge(normalize_key(key) => rekey(val)) }
  25 + node.inject({}) do |rekeyed, (key, val)|
  26 + rekeyed.merge(normalize_key(key) => rekey(val))
  27 + end
26 28 end
27 29 when Array
28 30 if node.first.key?('key')
29   - node.inject({}) { |rekeyed, keypair| rekeyed.merge(rekey(keypair)) }
  31 + node.inject({}) do |rekeyed, keypair|
  32 + rekeyed.merge(rekey(keypair))
  33 + end
30 34 else
31 35 node.map { |n| rekey(n) }
32 36 end
... ...
lib/overrides/hoptoad_notifier/hoptoad_notifier.rb
... ... @@ -6,18 +6,18 @@ HoptoadNotifier.module_eval do
6 6 class << self
7 7 private def send_notice(notice)
8 8 # Log the error internally if we are not in a development environment.
9   - if configuration.public?
10   - app = App.find_or_initialize_by(name: "Self.Errbit")
11   - app.github_repo = "errbit/errbit"
12   - app.save!
13   - notice.send("api_key=", app.api_key)
  9 + return unless configuration.public?
14 10  
15   - # Create notice internally.
16   - report = ErrorReport.new(notice.to_xml)
17   - report.generate_notice!
  11 + app = App.find_or_initialize_by(name: "Self.Errbit")
  12 + app.github_repo = "errbit/errbit"
  13 + app.save!
  14 + notice.send("api_key=", app.api_key)
18 15  
19   - logger.info "Internal error was logged to 'Self.Errbit' app."
20   - end
  16 + # Create notice internally.
  17 + report = ErrorReport.new(notice.to_xml)
  18 + report.generate_notice!
  19 +
  20 + logger.info "Internal error was logged to 'Self.Errbit' app."
21 21 end
22 22 end
23 23 end
... ...
lib/tasks/errbit/demo.rake
... ... @@ -32,12 +32,13 @@ namespace :errbit do
32 32  
33 33 def random_backtrace
34 34 backtrace = []
35   - 99.times {|t|
  35 + 99.times do |t|
36 36 backtrace << {
37 37 'number' => t.hash % 1000,
38 38 'file' => "/path/to/file.rb",
39 39 'method' => RANDOM_METHODS.sample.to_s
40   - }}
  40 + }
  41 + end
41 42 backtrace
42 43 end
43 44  
... ...
script/rspec-queue-mongoid.rb
... ... @@ -1,17 +0,0 @@
1   -#!/usr/bin/env ruby
2   -require 'rubygems'
3   -require 'test_queue'
4   -require 'bundler'
5   -Bundler.setup(:default, :development, :test)
6   -require 'test_queue/runner/rspec'
7   -
8   -class MongoidRspecRunner < TestQueue::Runner::RSpec
9   - def after_fork(num)
10   - super
11   - Mongoid.override_database(
12   - "#{Mongoid.session(:default).options[:database]}_#{num}"
13   - )
14   - end
15   -end
16   -
17   -MongoidRspecRunner.new.execute
script/rspec_queue_mongoid.rb 0 → 100755
... ... @@ -0,0 +1,18 @@
  1 +#!/usr/bin/env ruby
  2 +require 'rubygems'
  3 +require 'test_queue'
  4 +require 'test_queue/runner/rspec'
  5 +
  6 +require 'bundler'
  7 +Bundler.setup(:default, :development, :test)
  8 +
  9 +class MongoidRspecRunner < TestQueue::Runner::RSpec
  10 + def after_fork(num)
  11 + super
  12 + Mongoid.override_database(
  13 + "#{Mongoid.client(:default).options[:database]}_#{num}"
  14 + )
  15 + end
  16 +end
  17 +
  18 +MongoidRspecRunner.new.execute
... ...
spec/acceptance/app_regenerate_api_key_spec.rb
... ... @@ -3,9 +3,9 @@ require &#39;acceptance/acceptance_helper&#39;
3 3 feature "Regeneration api_Key" do
4 4 let(:app) { Fabricate(:app) }
5 5 let(:admin) { Fabricate(:admin) }
6   - let(:user) {
  6 + let(:user) do
7 7 Fabricate(:user_watcher, app: app).user
8   - }
  8 + end
9 9  
10 10 before do
11 11 app && admin
... ... @@ -16,9 +16,9 @@ feature &quot;Regeneration api_Key&quot; do
16 16 log_in admin
17 17 click_link app.name
18 18 click_link I18n.t('apps.show.edit')
19   - expect {
  19 + expect do
20 20 click_link I18n.t('apps.fields.regenerate_api_key')
21   - }.to change {
  21 + end.to change {
22 22 app.reload.api_key
23 23 }
24 24 click_link I18n.t('shared.navigation.apps')
... ... @@ -36,9 +36,9 @@ end
36 36  
37 37 feature "Create an application" do
38 38 let(:admin) { Fabricate(:admin) }
39   - let(:user) {
  39 + let(:user) do
40 40 Fabricate(:user_watcher, app: app).user
41   - }
  41 + end
42 42  
43 43 before do
44 44 admin
... ...
spec/controllers/api/v1/notices_controller_spec.rb
... ... @@ -14,7 +14,7 @@ describe Api::V1::NoticesController, type: &#39;controller&#39; do
14 14  
15 15 it "should return JSON if JSON is requested" do
16 16 get :index, auth_token: @user.authentication_token, format: "json"
17   - expect { JSON.load(response.body) }.not_to raise_error #JSON::ParserError)
  17 + expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError)
18 18 end
19 19  
20 20 it "should return XML if XML is requested" do
... ... @@ -24,7 +24,7 @@ describe Api::V1::NoticesController, type: &#39;controller&#39; do
24 24  
25 25 it "should return JSON by default" do
26 26 get :index, auth_token: @user.authentication_token
27   - expect { JSON.load(response.body) }.not_to raise_error #JSON::ParserError)
  27 + expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError)
28 28 end
29 29  
30 30 describe "given a date range" do
... ...
spec/controllers/api/v1/problems_controller_spec.rb
... ... @@ -13,7 +13,7 @@ describe Api::V1::ProblemsController, type: &#39;controller&#39; do
13 13  
14 14 it "should return JSON if JSON is requested" do
15 15 get :show, auth_token: @user.authentication_token, format: "json", id: Problem.first.id
16   - expect { JSON.load(response.body) }.not_to raise_error #JSON::ParserError
  16 + expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError
17 17 end
18 18  
19 19 it "should return XML if XML is requested" do
... ... @@ -23,7 +23,7 @@ describe Api::V1::ProblemsController, type: &#39;controller&#39; do
23 23  
24 24 it "should return JSON by default" do
25 25 get :show, auth_token: @user.authentication_token, id: @problem.id
26   - expect { JSON.load(response.body) }.not_to raise_error #JSON::ParserError)
  26 + expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError)
27 27 end
28 28  
29 29 it "should return the correct problem" do
... ... @@ -67,7 +67,7 @@ describe Api::V1::ProblemsController, type: &#39;controller&#39; do
67 67  
68 68 it "should return JSON if JSON is requested" do
69 69 get :index, auth_token: @user.authentication_token, format: "json"
70   - expect { JSON.load(response.body) }.not_to raise_error #JSON::ParserError)
  70 + expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError)
71 71 end
72 72  
73 73 it "should return XML if XML is requested" do
... ... @@ -77,7 +77,7 @@ describe Api::V1::ProblemsController, type: &#39;controller&#39; do
77 77  
78 78 it "should return JSON by default" do
79 79 get :index, auth_token: @user.authentication_token
80   - expect { JSON.load(response.body) }.not_to raise_error #JSON::ParserError)
  80 + expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError)
81 81 end
82 82  
83 83 describe "given a date range" do
... ...
spec/controllers/apps_controller_spec.rb
... ... @@ -312,9 +312,9 @@ describe AppsController, type: &#39;controller&#39; do
312 312  
313 313 it "should destroy the app" do
314 314 delete :destroy, id: @app.id
315   - expect {
  315 + expect do
316 316 @app.reload
317   - }.to raise_error(Mongoid::Errors::DocumentNotFound)
  317 + end.to raise_error(Mongoid::Errors::DocumentNotFound)
318 318 end
319 319  
320 320 it "should display a message" do
... ...
spec/controllers/problems_controller_spec.rb
... ... @@ -326,10 +326,10 @@ describe ProblemsController, type: &#39;controller&#39; do
326 326 it "should unmerge a merged problem" do
327 327 merged_problem = Problem.merge!(@problem1, @problem2)
328 328 expect(merged_problem.errs.length).to eq 2
329   - expect {
  329 + expect do
330 330 post :unmerge_several, problems: [merged_problem.id.to_s]
331 331 expect(merged_problem.reload.errs.length).to eq 1
332   - }.to change(Problem, :count).by(1)
  332 + end.to change(Problem, :count).by(1)
333 333 end
334 334 end
335 335  
... ... @@ -370,9 +370,9 @@ describe ProblemsController, type: &#39;controller&#39; do
370 370  
371 371 context "POST /problems/destroy_several" do
372 372 it "should delete the problems" do
373   - expect {
  373 + expect do
374 374 post :destroy_several, problems: [@problem1.id.to_s]
375   - }.to change(Problem, :count).by(-1)
  375 + end.to change(Problem, :count).by(-1)
376 376 end
377 377 end
378 378  
... ... @@ -385,9 +385,9 @@ describe ProblemsController, type: &#39;controller&#39; do
385 385 end
386 386  
387 387 it "destroys all problems" do
388   - expect {
  388 + expect do
389 389 post :destroy_all, app_id: @app.id
390   - }.to change(Problem, :count).by(-2)
  390 + end.to change(Problem, :count).by(-2)
391 391 expect(controller.app).to eq @app
392 392 end
393 393  
... ...
spec/controllers/users_controller_spec.rb
... ... @@ -56,9 +56,9 @@ describe UsersController, type: &#39;controller&#39; do
56 56 end
57 57  
58 58 it "should not be able to become an admin" do
59   - expect {
  59 + expect do
60 60 put :update, id: user.to_param, user: { admin: true }
61   - }.to_not change {
  61 + end.to_not change {
62 62 user.reload.admin
63 63 }.from(false)
64 64 end
... ... @@ -157,9 +157,9 @@ describe UsersController, type: &#39;controller&#39; do
157 157 end
158 158  
159 159 context "when the create is unsuccessful" do
160   - let(:user) {
  160 + let(:user) do
161 161 Struct.new(:admin, :attributes).new(true, {})
162   - }
  162 + end
163 163 before do
164 164 expect(User).to receive(:new).and_return(user)
165 165 expect(user).to receive(:save).and_return(false)
... ... @@ -174,9 +174,9 @@ describe UsersController, type: &#39;controller&#39; do
174 174  
175 175 context "PUT /users/:id" do
176 176 context "when the update is successful" do
177   - before {
  177 + before do
178 178 put :update, id: user.to_param, user: user_params
179   - }
  179 + end
180 180  
181 181 context "with normal params" do
182 182 let(:user_params) { { name: 'Kermit' } }
... ... @@ -198,10 +198,10 @@ describe UsersController, type: &#39;controller&#39; do
198 198 context "with a destroy success" do
199 199 let(:user_destroy) { double(destroy: true) }
200 200  
201   - before {
  201 + before do
202 202 expect(UserDestroy).to receive(:new).with(user).and_return(user_destroy)
203 203 delete :destroy, id: user.id
204   - }
  204 + end
205 205  
206 206 it 'should destroy user' do
207 207 expect(request.flash[:success]).to eq I18n.t('controllers.users.flash.destroy.success', name: user.name)
... ... @@ -210,10 +210,10 @@ describe UsersController, type: &#39;controller&#39; do
210 210 end
211 211  
212 212 context "with trying destroy himself" do
213   - before {
  213 + before do
214 214 expect(UserDestroy).to_not receive(:new)
215 215 delete :destroy, id: admin.id
216   - }
  216 + end
217 217  
218 218 it 'should not destroy user' do
219 219 expect(response).to redirect_to(users_path)
... ... @@ -224,12 +224,12 @@ describe UsersController, type: &#39;controller&#39; do
224 224  
225 225 describe "#user_params" do
226 226 context "with current user not admin" do
227   - before {
  227 + before do
228 228 allow(controller).to receive(:current_user).and_return(user)
229 229 allow(controller).to receive(:params).and_return(
230 230 ActionController::Parameters.new(user_param)
231 231 )
232   - }
  232 + end
233 233 let(:user_param) { { 'user' => { name: 'foo', admin: true } } }
234 234 it 'not have admin field' do
235 235 expect(controller.send(:user_params)).to eq('name' => 'foo')
... ...
spec/decorators/backtrace_decorator_spec.rb
1 1 describe BacktraceDecorator, type: :decorator do
2 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   - ))
  3 + described_class.new(
  4 + Backtrace.new(
  5 + lines: [
  6 + { number: 131,
  7 + file: '[PROJECT_ROOT]app/controllers/accounts_controller.rb',
  8 + method: :update_preferences },
  9 + { number: 61,
  10 + file: '[PROJECT_ROOT]app/controllers/application_controller.rb',
  11 + method: :call },
  12 + { number: 182,
  13 + file: '[GEM_ROOT]activesupport-2.3.18/lib/active_support/callbacks.rb',
  14 + method: :call },
  15 + { number: 384,
  16 + file: '[PROJECT_ROOT]app/models/account.rb',
  17 + method: :update_server_tag_scope },
  18 + { number: 182,
  19 + file: '[GEM_ROOT]activesupport-2.3.18/lib/active_support/callbacks.rb',
  20 + method: :evaluate_method },
  21 + { number: 23,
  22 + file: '/home/rails/library/current/vendor/bundle/ruby/2.1.0/bin/rainbows',
  23 + method: '<main>' }
  24 + ]
  25 + )
  26 + )
25 27 end
26 28  
27 29 describe '#grouped_lines' do
... ...
spec/decorators/issue_tracker_decorator_spec.rb
1 1 describe IssueTrackerDecorator do
2 2 let(:fake_tracker) do
3   - klass = Class.new(ErrbitPlugin::IssueTracker) {
  3 + klass = Class.new(ErrbitPlugin::IssueTracker) do
4 4 def self.label
5 5 'fake'
6 6 end
... ... @@ -19,7 +19,7 @@ describe IssueTrackerDecorator do
19 19 def configured?
20 20 true
21 21 end
22   - }
  22 + end
23 23 klass.new 'nothing special'
24 24 end
25 25  
... ...
spec/decorators/issue_tracker_type_decorator_spec.rb
... ... @@ -50,15 +50,21 @@ describe IssueTrackerDecorator do
50 50  
51 51 describe "#params_class" do
52 52 it 'adds the label in class' do
53   - tracker = IssueTrackerDecorator.new(IssueTracker.new(
54   - type_tracker: 'none'))
  53 + tracker = IssueTrackerDecorator.new(
  54 + IssueTracker.new(type_tracker: 'none')
  55 + )
55 56 expect(decorator.params_class(tracker)).to eql 'fake'
56 57 end
57 58  
58 59 it 'adds chosen class if type is same' do
59   - expect(decorator.params_class(
60   - IssueTracker.new(type_tracker: 'fake').decorate
61   - )).to eql 'chosen fake'
  60 + expect(
  61 + decorator.
  62 + params_class(
  63 + IssueTracker.new(
  64 + type_tracker: 'fake'
  65 + ).decorate
  66 + )
  67 + ).to eql 'chosen fake'
62 68 end
63 69 end
64 70 end
... ...
spec/fabricators/app_fabricator.rb
... ... @@ -4,9 +4,9 @@ Fabricator(:app) do
4 4 end
5 5  
6 6 Fabricator(:app_with_watcher, from: :app) do
7   - watchers(count: 1) { |parent, _i|
  7 + watchers(count: 1) do |parent, _i|
8 8 Fabricate.build(:watcher, app: parent)
9   - }
  9 + end
10 10 end
11 11  
12 12 Fabricator(:watcher) do
... ... @@ -22,8 +22,8 @@ end
22 22  
23 23 Fabricator(:deploy) do
24 24 app
25   - username 'clyde.frog'
26   - repository 'git@github.com/errbit/errbit.git'
27   - environment 'production'
28   - revision { SecureRandom.hex(10) }
  25 + username 'clyde.frog'
  26 + repository 'git@github.com/errbit/errbit.git'
  27 + environment 'production'
  28 + revision { SecureRandom.hex(10) }
29 29 end
... ...
spec/fabricators/issue_tracker_fabricator.rb
1 1 Fabricator :issue_tracker do
2 2 type_tracker 'mock'
3   - options {
  3 + options do
4 4 {
5 5 foo: 'one',
6 6 bar: 'two'
7   - }}
  7 + }
  8 + end
8 9 app
9 10 end
... ...
spec/fabricators/notice_fabricator.rb
1 1 Fabricator :notice do
2 2 app
3 3 err
4   - error_class 'FooError'
5   - message 'Too Much Bar'
  4 + error_class 'FooError'
  5 + message 'Too Much Bar'
6 6 backtrace
7 7 server_environment { { 'environment-name' => 'production' } }
8 8 request { { 'component' => 'foo', 'action' => 'bar' } }
... ...
spec/fabricators/problem_fabricator.rb
... ... @@ -6,19 +6,19 @@ Fabricator(:problem) do
6 6 end
7 7  
8 8 Fabricator(:problem_with_comments, from: :problem) do
9   - after_create { |parent|
  9 + after_create do |parent|
10 10 3.times do
11 11 Fabricate(:comment, err: parent)
12 12 end
13   - }
  13 + end
14 14 end
15 15  
16 16 Fabricator(:problem_with_errs, from: :problem) do
17   - after_create { |parent|
  17 + after_create do |parent|
18 18 3.times do
19 19 Fabricate(:err, problem: parent)
20 20 end
21   - }
  21 + end
22 22 end
23 23  
24 24 Fabricator(:problem_resolved, from: :problem) do
... ...
spec/fabricators/user_fabricator.rb
1 1 Fabricator :user do
2   - name 'Clyde Frog'
3   - email { sequence(:user_email) { |n| "user.#{n}@example.com" } }
4   - password 'password'
  2 + name 'Clyde Frog'
  3 + email { sequence(:user_email) { |n| "user.#{n}@example.com" } }
  4 + password 'password'
5 5 password_confirmation 'password'
6 6 end
7 7  
... ...
spec/interactors/problem_destroy_spec.rb
1 1 describe ProblemDestroy do
2   - let(:problem_destroy) {
  2 + let(:problem_destroy) do
3 3 ProblemDestroy.new(problem)
4   - }
  4 + end
5 5  
6 6 context "in unit way" do
7   - let(:problem) {
  7 + let(:problem) do
8 8 problem = Problem.new
9 9 allow(problem).to receive(:errs).and_return(double(:criteria, only: [err_1, err_2]))
10 10 allow(problem).to receive(:comments).and_return(double(:criteria, only: [comment_1, comment_2]))
11 11 allow(problem).to receive(:delete)
12 12 problem
13   - }
  13 + end
14 14 let(:err_1) { Err.new }
15 15 let(:err_2) { Err.new }
16 16  
... ...
spec/interactors/problem_merge_spec.rb
... ... @@ -4,9 +4,9 @@ describe ProblemMerge do
4 4  
5 5 describe "#initialize" do
6 6 it 'failed if less than 2 uniq problem pass in args' do
7   - expect {
  7 + expect do
8 8 ProblemMerge.new(problem)
9   - }.to raise_error(ArgumentError)
  9 + end.to raise_error(ArgumentError)
10 10 end
11 11  
12 12 it 'extract first problem like merged_problem' do
... ... @@ -20,18 +20,18 @@ describe ProblemMerge do
20 20 end
21 21  
22 22 describe "#merge" do
23   - let!(:problem_merge) {
  23 + let!(:problem_merge) do
24 24 ProblemMerge.new(problem, problem_1)
25   - }
  25 + end
26 26 let(:first_errs) { problem.errs }
27 27 let(:merged_errs) { problem_1.errs }
28 28 let!(:notice) { Fabricate(:notice, err: first_errs.first) }
29 29 let!(:notice_1) { Fabricate(:notice, err: merged_errs.first) }
30 30  
31 31 it 'delete one of problem' do
32   - expect {
  32 + expect do
33 33 problem_merge.merge
34   - }.to change(Problem, :count).by(-1)
  34 + end.to change(Problem, :count).by(-1)
35 35 end
36 36  
37 37 it 'move all err in one problem' do
... ... @@ -55,9 +55,9 @@ describe ProblemMerge do
55 55 let!(:comment) { Fabricate(:comment, err: problem) }
56 56 let!(:comment_2) { Fabricate(:comment, err: problem_1, user: comment.user) }
57 57 it 'merge comment' do
58   - expect {
  58 + expect do
59 59 problem_merge.merge
60   - }.to change {
  60 + end.to change {
61 61 problem.comments.size
62 62 }.from(1).to(2)
63 63 expect(comment_2.reload.err).to eq problem
... ...
spec/interactors/resolved_problem_clearer_spec.rb
1 1 describe ResolvedProblemClearer do
2   - let(:resolved_problem_clearer) {
  2 + let(:resolved_problem_clearer) do
3 3 ResolvedProblemClearer.new
4   - }
  4 + end
5 5 describe "#execute" do
6   - let!(:problems) {
  6 + let!(:problems) do
7 7 [
8 8 Fabricate(:problem),
9 9 Fabricate(:problem),
10 10 Fabricate(:problem)
11 11 ]
12   - }
  12 + end
13 13 context 'without problem resolved' do
14 14 it 'do nothing' do
15   - expect {
  15 + expect do
16 16 expect(resolved_problem_clearer.execute).to eq 0
17   - }.to_not change {
  17 + end.to_not change {
18 18 Problem.count
19 19 }
20 20 end
... ... @@ -34,9 +34,9 @@ describe ResolvedProblemClearer do
34 34 end
35 35  
36 36 it 'delete problem resolve' do
37   - expect {
  37 + expect do
38 38 expect(resolved_problem_clearer.execute).to eq 2
39   - }.to change {
  39 + end.to change {
40 40 Problem.count
41 41 }.by(-2)
42 42 expect(Problem.where(_id: problems.first.id).first).to be_nil
... ...
spec/interactors/user_destroy_spec.rb
1 1 describe UserDestroy do
2   - let(:app) {
  2 + let(:app) do
3 3 Fabricate(
4 4 :app,
5 5 watchers: [
6 6 Fabricate.build(:user_watcher, user: user)
7 7 ])
8   - }
  8 + end
9 9  
10 10 describe "#destroy" do
11 11 let!(:user) { Fabricate(:user) }
12 12 it 'should delete user' do
13   - expect {
  13 + expect do
14 14 UserDestroy.new(user).destroy
15   - }.to change(User, :count)
  15 + end.to change(User, :count)
16 16 end
17 17  
18 18 it 'should delete watcher' do
19   - expect {
  19 + expect do
20 20 UserDestroy.new(user).destroy
21   - }.to change {
  21 + end.to change {
22 22 app.reload.watchers.where(user_id: user.id).count
23 23 }.from(1).to(0)
24 24 end
... ...
spec/lib/airbrake_api/v3/notice_parser_spec.rb
... ... @@ -2,13 +2,13 @@ describe AirbrakeApi::V3::NoticeParser do
2 2 let(:app) { Fabricate(:app) }
3 3  
4 4 it 'raises error when errors attribute is missing' do
5   - expect {
  5 + expect do
6 6 AirbrakeApi::V3::NoticeParser.new({}).report
7   - }.to raise_error(AirbrakeApi::ParamsError)
  7 + end.to raise_error(AirbrakeApi::ParamsError)
8 8  
9   - expect {
  9 + expect do
10 10 AirbrakeApi::V3::NoticeParser.new('errors' => []).report
11   - }.to raise_error(AirbrakeApi::ParamsError)
  11 + end.to raise_error(AirbrakeApi::ParamsError)
12 12 end
13 13  
14 14 it 'parses JSON payload and returns ErrorReport' do
... ...
spec/models/app_spec.rb
... ... @@ -164,13 +164,13 @@ describe App, type: &#39;model&#39; do
164 164  
165 165 context '#find_or_create_err!' do
166 166 let(:app) { Fabricate(:app) }
167   - let(:conditions) {
  167 + let(:conditions) do
168 168 {
169 169 error_class: 'Whoops',
170 170 environment: 'production',
171 171 fingerprint: 'some-finger-print'
172 172 }
173   - }
  173 + end
174 174  
175 175 it 'returns the correct err if one already exists' do
176 176 existing = Fabricate(
... ... @@ -188,23 +188,23 @@ describe App, type: &#39;model&#39; do
188 188  
189 189 it 'creates a new problem if a matching one does not already exist' do
190 190 expect(Err.where(conditions).first).to be_nil
191   - expect {
  191 + expect do
192 192 app.find_or_create_err!(conditions)
193   - }.to change(Problem, :count).by(1)
  193 + end.to change(Problem, :count).by(1)
194 194 end
195 195  
196 196 context "without error_class" do
197   - let(:conditions) {
  197 + let(:conditions) do
198 198 {
199 199 environment: 'production',
200 200 fingerprint: 'some-finger-print'
201 201 }
202   - }
  202 + end
203 203 it 'save the err' do
204 204 expect(Err.where(conditions).first).to be_nil
205   - expect {
  205 + expect do
206 206 app.find_or_create_err!(conditions)
207   - }.to change(Problem, :count).by(1)
  207 + end.to change(Problem, :count).by(1)
208 208 end
209 209 end
210 210 end
... ... @@ -215,9 +215,9 @@ describe App, type: &#39;model&#39; do
215 215 expect(App.find_by_api_key!(app.api_key)).to eq app
216 216 end
217 217 it 'raise Mongoid::Errors::DocumentNotFound if not found' do
218   - expect {
  218 + expect do
219 219 App.find_by_api_key!('foo')
220   - }.to raise_error(Mongoid::Errors::DocumentNotFound)
  220 + end.to raise_error(Mongoid::Errors::DocumentNotFound)
221 221 end
222 222 end
223 223 end
... ...
spec/models/error_report_spec.rb
... ... @@ -17,18 +17,18 @@ module Airbrake
17 17 end
18 18  
19 19 describe ErrorReport do
20   - let(:xml) {
  20 + let(:xml) do
21 21 Rails.root.join('spec', 'fixtures', 'hoptoad_test_notice.xml').read
22   - }
  22 + end
23 23  
24 24 let(:error_report) { ErrorReport.new(xml) }
25 25  
26   - let!(:app) {
  26 + let!(:app) do
27 27 Fabricate(
28 28 :app,
29 29 api_key: 'APIKEY'
30 30 )
31   - }
  31 + end
32 32  
33 33 describe "#app" do
34 34 it 'find the good app' do
... ... @@ -44,39 +44,39 @@ describe ErrorReport do
44 44  
45 45 describe "#generate_notice!" do
46 46 it "save a notice" do
47   - expect {
  47 + expect do
48 48 error_report.generate_notice!
49   - }.to change {
  49 + end.to change {
50 50 app.reload.problems.count
51 51 }.by(1)
52 52 end
53 53  
54 54 context "with a minimal notice" do
55   - let(:xml) {
  55 + let(:xml) do
56 56 Rails.root.join('spec', 'fixtures', 'minimal_test_notice.xml').read
57   - }
  57 + end
58 58  
59 59 it 'save a notice' do
60   - expect {
  60 + expect do
61 61 error_report.generate_notice!
62   - }.to change {
  62 + end.to change {
63 63 app.reload.problems.count
64 64 }.by(1)
65 65 end
66 66 end
67 67  
68 68 context "with notice generate by Airbrake gem" do
69   - let(:xml) {
  69 + let(:xml) do
70 70 Airbrake::Notice.new(
71 71 exception: Exception.new,
72 72 api_key: 'APIKEY',
73 73 project_root: Rails.root
74 74 ).to_xml
75   - }
  75 + end
76 76 it 'save a notice' do
77   - expect {
  77 + expect do
78 78 error_report.generate_notice!
79   - }.to change {
  79 + end.to change {
80 80 app.reload.problems.count
81 81 }.by(1)
82 82 end
... ... @@ -201,10 +201,10 @@ describe ErrorReport do
201 201 end
202 202  
203 203 it 'memoize the notice' do
204   - expect {
  204 + expect do
205 205 error_report.generate_notice!
206 206 error_report.generate_notice!
207   - }.to change {
  207 + end.to change {
208 208 Notice.count
209 209 }.by(1)
210 210 end
... ... @@ -213,9 +213,9 @@ describe ErrorReport do
213 213 error_report.generate_notice!
214 214 error_report.problem.resolve!
215 215  
216   - expect {
  216 + expect do
217 217 ErrorReport.new(xml).generate_notice!
218   - }.to change {
  218 + end.to change {
219 219 error_report.problem.reload.resolved?
220 220 }.from(true).to(false)
221 221 end
... ... @@ -237,26 +237,26 @@ describe ErrorReport do
237 237 end
238 238  
239 239 context "with xml without request section" do
240   - let(:xml) {
  240 + let(:xml) do
241 241 Rails.root.join('spec', 'fixtures', 'hoptoad_test_notice_without_request_section.xml').read
242   - }
  242 + end
243 243 it "save a notice" do
244   - expect {
  244 + expect do
245 245 error_report.generate_notice!
246   - }.to change {
  246 + end.to change {
247 247 app.reload.problems.count
248 248 }.by(1)
249 249 end
250 250 end
251 251  
252 252 context "with xml with only a single line of backtrace" do
253   - let(:xml) {
  253 + let(:xml) do
254 254 Rails.root.join('spec', 'fixtures', 'hoptoad_test_notice_with_one_line_of_backtrace.xml').read
255   - }
  255 + end
256 256 it "save a notice" do
257   - expect {
  257 + expect do
258 258 error_report.generate_notice!
259   - }.to change {
  259 + end.to change {
260 260 app.reload.problems.count
261 261 }.by(1)
262 262 end
... ...
spec/models/fabricators_spec.rb
... ... @@ -5,7 +5,7 @@ Fabrication::Config.fabricator_path.each do |folder|
5 5 end
6 6  
7 7 describe "Fabrication" do
8   - #TODO : when 1.8.7 drop support se directly Symbol#sort
  8 + # TODO : when 1.8.7 drop support se directly Symbol#sort
9 9 Fabrication.manager.schematics.keys.sort.each do |fabricator_name|
10 10 context "Fabricate(:#{fabricator_name})" do
11 11 subject { Fabricate.build(fabricator_name) }
... ...
spec/models/notification_service/campfire_service_spec.rb
... ... @@ -5,12 +5,12 @@ describe NotificationServices::CampfireService, type: &#39;model&#39; do
5 5 notification_service = Fabricate :campfire_notification_service, app: notice.app
6 6 problem = notice.problem
7 7  
8   - #campy stubbing
  8 + # campy stubbing
9 9 campy = double('CampfireService')
10 10 allow(Campy::Room).to receive(:new).and_return(campy)
11 11 allow(campy).to receive(:speak).and_return(true)
12 12  
13   - #assert
  13 + # assert
14 14 expect(campy).to receive(:speak)
15 15  
16 16 notification_service.create_notification(problem)
... ...
spec/models/notification_service/gtalk_service_spec.rb
... ... @@ -6,7 +6,7 @@ describe NotificationServices::GtalkService, type: &#39;model&#39; do
6 6 notification_service = Fabricate :gtalk_notification_service, app: notice.app
7 7 problem = notice.problem
8 8  
9   - #gtalk stubbing
  9 + # gtalk stubbing
10 10 gtalk = double('GtalkService')
11 11 jid = double("jid")
12 12 message = double("message")
... ... @@ -24,7 +24,7 @@ describe NotificationServices::GtalkService, type: &#39;model&#39; do
24 24 expect(Jabber::MUC::SimpleMUCClient).to receive(:new).and_return(gtalk)
25 25 expect(gtalk).to receive(:join).with(notification_service.room_id + "/errbit")
26 26  
27   - #assert
  27 + # assert
28 28 expect(gtalk).to receive(:send).exactly(2).times.with(message)
29 29 expect(gtalk).to receive(:close)
30 30  
... ... @@ -97,7 +97,7 @@ describe NotificationServices::GtalkService, type: &#39;model&#39; do
97 97 notification_service = Fabricate :gtalk_notification_service, app: notice.app
98 98 problem = notice.problem
99 99  
100   - #gtalk stubbing
  100 + # gtalk stubbing
101 101 gtalk = double('GtalkService')
102 102 jid = double("jid")
103 103 message = double("message")
... ... @@ -116,7 +116,7 @@ describe NotificationServices::GtalkService, type: &#39;model&#39; do
116 116  
117 117 notification_service.user_id = ""
118 118  
119   - #assert
  119 + # assert
120 120 expect(gtalk).to receive(:send).with(message)
121 121 expect(gtalk).to receive(:close)
122 122  
... ...
spec/models/notification_service/hoiio_service_spec.rb
... ... @@ -10,7 +10,7 @@ describe NotificationServices::HoiioService, type: &#39;model&#39; do
10 10 allow(Hoi::SMS).to receive(:new).and_return(sms)
11 11 allow(sms).to receive(:send).and_return(true)
12 12  
13   - #assert
  13 + # assert
14 14 expect(sms).to receive(:send)
15 15  
16 16 notification_service.create_notification(problem)
... ...
spec/models/notification_service/pushover_service_spec.rb
... ... @@ -10,7 +10,7 @@ describe NotificationServices::PushoverService, type: &#39;model&#39; do
10 10 allow(Rushover::Client).to receive(:new).and_return(notification)
11 11 allow(notification).to receive(:notify).and_return(true)
12 12  
13   - #assert
  13 + # assert
14 14 expect(notification).to receive(:notify)
15 15  
16 16 notification_service.create_notification(problem)
... ...
spec/models/problem_spec.rb
... ... @@ -10,25 +10,25 @@ describe Problem, type: &#39;model&#39; do
10 10 describe "Fabrication" do
11 11 context "Fabricate(:problem)" do
12 12 it 'should have no comment' do
13   - expect {
  13 + expect do
14 14 Fabricate(:problem)
15   - }.to_not change(Comment, :count)
  15 + end.to_not change(Comment, :count)
16 16 end
17 17 end
18 18  
19 19 context "Fabricate(:problem_with_comments)" do
20 20 it 'should have 3 comments' do
21   - expect {
  21 + expect do
22 22 Fabricate(:problem_with_comments)
23   - }.to change(Comment, :count).by(3)
  23 + end.to change(Comment, :count).by(3)
24 24 end
25 25 end
26 26  
27 27 context "Fabricate(:problem_with_errs)" do
28 28 it 'should have 3 errs' do
29   - expect {
  29 + expect do
30 30 Fabricate(:problem_with_errs)
31   - }.to change(Err, :count).by(3)
  31 + end.to change(Err, :count).by(3)
32 32 end
33 33 end
34 34 end
... ... @@ -65,9 +65,9 @@ describe Problem, type: &#39;model&#39; do
65 65 it "adding a notice caches its message" do
66 66 err = Fabricate(:err)
67 67 problem = err.problem
68   - expect {
  68 + expect do
69 69 Fabricate(:notice, err: err, message: 'ERR 1')
70   - }.to change(problem, :message).from(nil).to('ERR 1')
  70 + end.to change(problem, :message).from(nil).to('ERR 1')
71 71 end
72 72 end
73 73  
... ... @@ -132,9 +132,9 @@ describe Problem, type: &#39;model&#39; do
132 132 er.add_on_blank(:resolved)
133 133 allow(problem).to receive(:errors).and_return(er)
134 134 expect(problem).to_not be_valid
135   - expect {
  135 + expect do
136 136 problem.resolve!
137   - }.to raise_error(Mongoid::Errors::Validations)
  137 + end.to raise_error(Mongoid::Errors::Validations)
138 138 end
139 139 end
140 140  
... ... @@ -201,17 +201,17 @@ describe Problem, type: &#39;model&#39; do
201 201 end
202 202  
203 203 it "adding a notice increases #notices_count by 1" do
204   - expect {
  204 + expect do
205 205 Fabricate(:notice, err: @err, message: 'ERR 1')
206   - }.to change(@problem.reload, :notices_count).from(0).to(1)
  206 + end.to change(@problem.reload, :notices_count).from(0).to(1)
207 207 end
208 208  
209 209 it "removing a notice decreases #notices_count by 1" do
210 210 Fabricate(:notice, err: @err, message: 'ERR 1')
211   - expect {
  211 + expect do
212 212 @err.notices.first.destroy
213 213 @problem.reload
214   - }.to change(@problem, :notices_count).from(1).to(0)
  214 + end.to change(@problem, :notices_count).from(1).to(0)
215 215 end
216 216 end
217 217  
... ... @@ -226,10 +226,10 @@ describe Problem, type: &#39;model&#39; do
226 226 end
227 227  
228 228 it "is updated when an app is updated" do
229   - expect {
  229 + expect do
230 230 app.update_attributes!(name: "Bar App")
231 231 problem.reload
232   - }.to change(problem, :app_name).to("Bar App")
  232 + end.to change(problem, :app_name).to("Bar App")
233 233 end
234 234 end
235 235  
... ... @@ -248,10 +248,10 @@ describe Problem, type: &#39;model&#39; do
248 248 it "is updated when a deploy is created" do
249 249 problem = Fabricate(:problem, app: @app, environment: "production")
250 250 next_deploy = 5.minutes.ago
251   - expect {
  251 + expect do
252 252 @deploy = Fabricate(:deploy, app: @app, created_at: next_deploy)
253 253 problem.reload
254   - }.to change { problem.last_deploy_at.iso8601 }.
  254 + end.to change { problem.last_deploy_at.iso8601 }.
255 255 from(@last_deploy.iso8601).
256 256 to(next_deploy.iso8601)
257 257 end
... ... @@ -270,10 +270,10 @@ describe Problem, type: &#39;model&#39; do
270 270  
271 271 it "removing a notice removes string from #messages" do
272 272 Fabricate(:notice, err: @err, message: 'ERR 1')
273   - expect {
  273 + expect do
274 274 @err.notices.first.destroy
275 275 @problem.reload
276   - }.to change(@problem, :messages).from(Digest::MD5.hexdigest('ERR 1') => { 'value' => 'ERR 1', 'count' => 1 }).to({})
  276 + end.to change(@problem, :messages).from(Digest::MD5.hexdigest('ERR 1') => { 'value' => 'ERR 1', 'count' => 1 }).to({})
277 277 end
278 278  
279 279 it "removing a notice from the problem with broken counter should not raise an error" do
... ... @@ -297,10 +297,10 @@ describe Problem, type: &#39;model&#39; do
297 297  
298 298 it "removing a notice removes string from #hosts" do
299 299 Fabricate(:notice, err: @err, request: { 'url' => "http://example.com/resource/12" })
300   - expect {
  300 + expect do
301 301 @err.notices.first.destroy
302 302 @problem.reload
303   - }.to change(@problem, :hosts).from(Digest::MD5.hexdigest('example.com') => { 'value' => 'example.com', 'count' => 1 }).to({})
  303 + end.to change(@problem, :hosts).from(Digest::MD5.hexdigest('example.com') => { 'value' => 'example.com', 'count' => 1 }).to({})
304 304 end
305 305 end
306 306  
... ... @@ -325,10 +325,10 @@ describe Problem, type: &#39;model&#39; do
325 325 }
326 326 }
327 327 )
328   - expect {
  328 + expect do
329 329 @err.notices.first.destroy
330 330 @problem.reload
331   - }.to change(@problem, :user_agents).
  331 + end.to change(@problem, :user_agents).
332 332 from(
333 333 Digest::MD5.hexdigest('Chrome 10.0.648.204 (OS X 10.6.7)') => {
334 334 'value' => 'Chrome 10.0.648.204 (OS X 10.6.7)', 'count' => 1 }
... ... @@ -347,17 +347,17 @@ describe Problem, type: &#39;model&#39; do
347 347 end
348 348  
349 349 it "adding a comment increases #comments_count by 1" do
350   - expect {
  350 + expect do
351 351 Fabricate(:comment, err: @problem)
352   - }.to change(@problem, :comments_count).from(0).to(1)
  352 + end.to change(@problem, :comments_count).from(0).to(1)
353 353 end
354 354  
355 355 it "removing a comment decreases #comments_count by 1" do
356 356 Fabricate(:comment, err: @problem)
357   - expect {
  357 + expect do
358 358 @problem.reload.comments.first.destroy
359 359 @problem.reload
360   - }.to change(@problem, :comments_count).from(1).to(0)
  360 + end.to change(@problem, :comments_count).from(1).to(0)
361 361 end
362 362 end
363 363  
... ... @@ -420,9 +420,9 @@ describe Problem, type: &#39;model&#39; do
420 420 end
421 421  
422 422 it 'update the notice_count' do
423   - expect {
  423 + expect do
424 424 problem.recache
425   - }.to change {
  425 + end.to change {
426 426 problem.notices_count
427 427 }.from(0).to(1)
428 428 end
... ...
spec/models/user_spec.rb
... ... @@ -39,10 +39,10 @@ describe User do
39 39  
40 40 context "First user" do
41 41 it "should be created this admin access via db:seed" do
42   - expect {
  42 + expect do
43 43 allow($stdout).to receive(:puts).and_return(true)
44 44 require Rails.root.join('db/seeds.rb')
45   - }.to change {
  45 + end.to change {
46 46 User.where(admin: true).count
47 47 }.from(0).to(1)
48 48 end
... ...
spec/requests/notices_controller_spec.rb
... ... @@ -5,10 +5,10 @@ describe &quot;Notices management&quot;, type: &#39;request&#39; do
5 5 context "with valide notice" do
6 6 let(:xml) { Rails.root.join('spec', 'fixtures', 'hoptoad_test_notice.xml').read }
7 7 it 'save a new notice' do
8   - expect {
  8 + expect do
9 9 post '/notifier_api/v2/notices', data: xml
10 10 expect(response).to be_success
11   - }.to change {
  11 + end.to change {
12 12 errbit_app.problems.count
13 13 }.by(1)
14 14 end
... ... @@ -17,10 +17,10 @@ describe &quot;Notices management&quot;, type: &#39;request&#39; do
17 17 context "with notice with empty backtrace" do
18 18 let(:xml) { Rails.root.join('spec', 'fixtures', 'hoptoad_test_notice_without_line_of_backtrace.xml').read }
19 19 it 'save a new notice' do
20   - expect {
  20 + expect do
21 21 post '/notifier_api/v2/notices', data: xml
22 22 expect(response).to be_success
23   - }.to change {
  23 + end.to change {
24 24 errbit_app.problems.count
25 25 }.by(1)
26 26 end
... ... @@ -30,21 +30,21 @@ describe &quot;Notices management&quot;, type: &#39;request&#39; do
30 30 let(:errbit_app) { Fabricate(:app) }
31 31 let(:xml) { Rails.root.join('spec', 'fixtures', 'hoptoad_test_notice.xml').read }
32 32 it 'not save a new notice and return 422' do
33   - expect {
  33 + expect do
34 34 post '/notifier_api/v2/notices', data: xml
35 35 expect(response.status).to eq 422
36 36 expect(response.body).to eq "Your API key is unknown"
37   - }.to_not change(errbit_app.problems, :count)
  37 + end.to_not change(errbit_app.problems, :count)
38 38 end
39 39 end
40 40  
41 41 context "with GET request" do
42 42 let(:xml) { Rails.root.join('spec', 'fixtures', 'hoptoad_test_notice.xml').read }
43 43 it 'save a new notice' do
44   - expect {
  44 + expect do
45 45 get '/notifier_api/v2/notices', data: xml
46 46 expect(response).to be_success
47   - }.to change {
  47 + end.to change {
48 48 errbit_app.problems.count
49 49 }.by(1)
50 50 end
... ...
spec/views/apps/edit.html.haml_spec.rb
... ... @@ -15,21 +15,31 @@ describe &quot;apps/edit.html.haml&quot;, type: &#39;view&#39; do
15 15  
16 16 it "should confirm the 'reset' link" do
17 17 render
18   - expect(action_bar).to have_selector('a.button[data-confirm="%s"]' % I18n.t('apps.confirm_destroy_all_problems'))
  18 + expect(action_bar).to have_selector(
  19 + format(
  20 + 'a.button[data-confirm="%s"]',
  21 + I18n.t('apps.confirm_destroy_all_problems')
  22 + )
  23 + )
19 24 end
20 25  
21 26 it "should confirm the 'destroy' link" do
22 27 render
23   - expect(action_bar).to have_selector('a.button[data-confirm="%s"]' % I18n.t('apps.confirm_delete'))
  28 + expect(action_bar).to have_selector(
  29 + format(
  30 + 'a.button[data-confirm="%s"]',
  31 + I18n.t('apps.confirm_delete')
  32 + )
  33 + )
24 34 end
25 35 end
26 36  
27 37 context "with unvalid app" do
28   - let(:app) {
  38 + let(:app) do
29 39 app = stub_model(App)
30 40 app.errors.add(:base, 'You must specify your')
31 41 app
32   - }
  42 + end
33 43  
34 44 it 'see the error' do
35 45 render
... ...
spec/views/apps/new.html.haml_spec.rb
... ... @@ -21,11 +21,11 @@ describe &quot;apps/new.html.haml&quot;, type: &#39;view&#39; do
21 21 end
22 22  
23 23 context "with unvalid app" do
24   - let(:app) {
  24 + let(:app) do
25 25 app = stub_model(App)
26 26 app.errors.add(:base, 'You must specify your')
27 27 app
28   - }
  28 + end
29 29  
30 30 it 'see the error' do
31 31 render
... ...
spec/views/issue_trackers/issue.md.erb_spec.rb
1 1 describe "issue_trackers/issue.md.erb", type: 'view' do
2   - let(:problem) {
  2 + let(:problem) do
3 3 problem = Fabricate(:problem)
4 4 Fabricate(:notice, err: Fabricate(:err, problem: problem))
5 5 problem
6   - }
  6 + end
7 7  
8 8 before do
9 9 allow(view).to receive(:problem).and_return(ProblemDecorator.new(problem))
... ...
spec/views/issue_trackers/issue.txt.erb_spec.rb
1 1 describe "issue_trackers/issue.txt.erb", type: 'view' do
2   - let(:problem) {
  2 + let(:problem) do
3 3 problem = Fabricate(:problem)
4 4 Fabricate(:notice, err: Fabricate(:err, problem: problem))
5 5 problem
6   - }
  6 + end
7 7  
8 8 before do
9 9 allow(view).to receive(:problem).and_return(
... ...
spec/views/problems/show.html.haml_spec.rb
1 1 describe "problems/show.html.haml", type: 'view' do
2 2 let(:problem) { Fabricate(:problem) }
3 3 let(:comment) { Fabricate(:comment) }
4   - let(:pivotal_tracker) {
  4 + let(:pivotal_tracker) do
5 5 Class.new(ErrbitPlugin::MockIssueTracker) do
6 6 def self.label
7 7 'pivotal'
... ... @@ -15,8 +15,8 @@ describe &quot;problems/show.html.haml&quot;, type: &#39;view&#39; do
15 15 true
16 16 end
17 17 end
18   - }
19   - let(:github_tracker) {
  18 + end
  19 + let(:github_tracker) do
20 20 Class.new(ErrbitPlugin::MockIssueTracker) do
21 21 def self.label
22 22 'github'
... ... @@ -30,13 +30,13 @@ describe &quot;problems/show.html.haml&quot;, type: &#39;view&#39; do
30 30 true
31 31 end
32 32 end
33   - }
34   - let(:trackers) {
  33 + end
  34 + let(:trackers) do
35 35 {
36 36 'github' => github_tracker,
37 37 'pivotal' => pivotal_tracker
38 38 }
39   - }
  39 + end
40 40 let(:app) { AppDecorator.new(problem.app) }
41 41  
42 42 before do
... ... @@ -66,13 +66,23 @@ describe &quot;problems/show.html.haml&quot;, type: &#39;view&#39; do
66 66  
67 67 it "should confirm the 'resolve' link by default" do
68 68 render
69   - expect(action_bar).to have_selector('a.resolve[data-confirm="%s"]' % I18n.t('problems.confirm.resolve_one'))
  69 + expect(action_bar).to have_selector(
  70 + format(
  71 + 'a.resolve[data-confirm="%s"]',
  72 + I18n.t('problems.confirm.resolve_one')
  73 + )
  74 + )
70 75 end
71 76  
72 77 it "should confirm the 'resolve' link if configuration is unset" do
73 78 allow(Errbit::Config).to receive(:confirm_err_actions).and_return(nil)
74 79 render
75   - expect(action_bar).to have_selector('a.resolve[data-confirm="%s"]' % I18n.t('problems.confirm.resolve_one'))
  80 + expect(action_bar).to have_selector(
  81 + format(
  82 + 'a.resolve[data-confirm="%s"]',
  83 + I18n.t('problems.confirm.resolve_one')
  84 + )
  85 + )
76 86 end
77 87  
78 88 it "should not confirm the 'resolve' link if configured not to" do
... ...
spec/views/users/edit.html.haml_spec.rb
1 1 describe 'users/edit.html.haml', type: 'view' do
2 2 let(:user) { stub_model(User, name: 'shingara') }
3   - before {
  3 + before do
4 4 allow(view).to receive(:current_user).and_return(user)
5 5 allow(view).to receive(:user).and_return(user)
6   - }
  6 + end
7 7 it 'should have per_page option' do
8 8 render
9 9 expect(rendered).to match(/id="user_per_page"/)
... ...
spec/views/users/index.html.haml_spec.rb
1 1 describe 'users/index.html.haml', type: 'view' do
2 2 let(:user) { stub_model(User) }
3   - before {
  3 + before do
4 4 allow(view).to receive(:current_user).and_return(user)
5 5 allow(view).to receive(:users).and_return(
6 6 Kaminari.paginate_array([user], total_count: 1).page(1)
7 7 )
8   - }
  8 + end
9 9 it 'should see users option' do
10 10 render
11 11 expect(rendered).to match(/class='user_list'/)
... ...
spec/views/users/new.html.haml_spec.rb
1 1 describe 'users/new.html.haml', type: 'view' do
2 2 let(:user) { stub_model(User) }
3   - before {
  3 + before do
4 4 allow(view).to receive(:current_user).and_return(user)
5 5 allow(view).to receive(:user).and_return(user)
6   - }
  6 + end
7 7 it 'should have per_page option' do
8 8 render
9 9 expect(rendered).to match(/id="user_per_page"/)
... ...
spec/views/users/show.html.haml_spec.rb
... ... @@ -53,7 +53,12 @@ describe &#39;users/show.html.haml&#39;, type: &#39;view&#39; do
53 53  
54 54 it "should confirm the 'resolve' link by default" do
55 55 render
56   - expect(view.content_for(:action_bar)).to have_selector('a.delete[data-confirm="%s"]' % I18n.t('.users.confirm_delete'))
  56 + expect(view.content_for(:action_bar)).to have_selector(
  57 + format(
  58 + 'a.delete[data-confirm="%s"]',
  59 + I18n.t('.users.confirm_delete')
  60 + )
  61 + )
57 62 end
58 63 end
59 64 end
... ...