party_foul 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6dc6bbbeb96e2c2c6baf986e969a9384f259fe18
4
- data.tar.gz: d259b9b9e1edbf4a5eb28896deaada03115daa3c
3
+ metadata.gz: 04841443e30d275130c1d6751de062e44feea034
4
+ data.tar.gz: d3e1222567bfd402d0d337c37dbbfdab1a2833bc
5
5
  SHA512:
6
- metadata.gz: c5b2827f54170040d1b6c92391dae766fa9c437246ccf736c73bbddec8e8941ecb711a5dd09854ad4a29fc96e7a56763de04525ec5567cc1802aac242ec45659
7
- data.tar.gz: de714911bc267cb9e5977c35307b23c46881125969bd236dcecd6919cfbd3bc5e205ec61ebaf13574c8f83586007fdd35fd531764ec31df803c8cab2d8f03adf
6
+ metadata.gz: 153edf86b0234e3039b971d4a820456857a3c0e90960e69027094326de56a5e0521b59c715682c9da5d761fbd67121bd818e07ae6bc17c5944af1103f0b65c6e
7
+ data.tar.gz: bf1114177b74cafc812da05af5c8ee87fc458dcf381c0a8012cd0a75501979cb38f5bb63230f78fd94eb4c80c043ed5921dfef9aebbb32fa4f7f97ba894f93ec
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/dockyard/party_foul.png?branch=master)](http://travis-ci.org/dockyard/party_foul)
4
4
  [![Dependency Status](https://gemnasium.com/dockyard/party_foul.png?travis)](https://gemnasium.com/dockyard/party_foul)
5
- [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/dockyard/party_foul)
5
+ [![Code Climate](https://codeclimate.com/github/dockyard/party_foul.png)](https://codeclimate.com/github/dockyard/party_foul)
6
6
 
7
7
  Rails exceptions automatically opened as issues on GitHub
8
8
 
@@ -81,7 +81,7 @@ PartyFoul.configure do |config|
81
81
 
82
82
  # The API endpoint for GitHub. Unless you are hosting a private
83
83
  # instance of Enterprise GitHub you do not need to include this
84
- config.endpoint = 'https://api.github.com'
84
+ config.api_endpoint = 'https://api.github.com'
85
85
 
86
86
  # The Web URL for GitHub. Unless you are hosting a private
87
87
  # instance of Enterprise GitHub you do not need to include this
@@ -198,9 +198,9 @@ The code that you want to handle should be wrapped like so:
198
198
  ```ruby
199
199
  begin
200
200
  ... # some code that might raise an error
201
- rescue => e
202
- PartyFoul::RacklessExceptionHandler.handle(e, {class: class_name, method: method_name, params: message)
203
- raise e
201
+ rescue => error
202
+ PartyFoul::RacklessExceptionHandler.handle(error, {class: class_name, method: method_name, params: message)
203
+ raise error
204
204
  end
205
205
  ```
206
206
 
@@ -215,9 +215,9 @@ module PartyFoul
215
215
  def call(worker, msg, queue)
216
216
  begin
217
217
  yield
218
- rescue => ex
219
- PartyFoul::RacklessExceptionHandler.handle(ex, {class: worker.class.name, method: queue, params: msg})
220
- raise
218
+ rescue => error
219
+ PartyFoul::RacklessExceptionHandler.handle(error, {class: worker.class.name, method: queue, params: msg})
220
+ raise error
221
221
  end
222
222
  end
223
223
  end
@@ -6,18 +6,18 @@ module PartyFoul
6
6
  source_root File.expand_path('../templates', __FILE__)
7
7
 
8
8
  def create_initializer_file
9
- login = ask 'GitHub login:'
10
- password = ask 'GitHub password:'
11
- @owner = ask_with_default "\nRepository owner:", login
12
- @repo = ask 'Repository name:'
13
- @endpoint = ask_with_default 'Api Endpoint:', 'https://api.github.com'
14
- @web_url = ask_with_default 'Web URL:', 'https://github.com'
9
+ login = ask 'GitHub login:'
10
+ password = ask 'GitHub password:'
11
+ @owner = ask_with_default "\nRepository owner:", login
12
+ @repo = ask 'Repository name:'
13
+ @api_endpoint = ask_with_default 'Api Endpoint:', 'https://api.github.com'
14
+ @web_url = ask_with_default 'Web URL:', 'https://github.com'
15
15
 
16
16
  begin
17
- github = Github.new :login => login, :password => password, :endpoint => @endpoint
18
- @oauth_token = github.oauth.create(scopes: ['repo'], note: "PartyFoul #{@owner}/#{@repo}", note_url: "#{@web_url}/#{@owner}/#{@repo}").token
17
+ octokit = Octokit.new :login => login, :password => password, :api_endpoint => @api_endpoint
18
+ @oauth_token = octokit.create_authorization(scopes: ['repo'], note: "PartyFoul #{@owner}/#{@repo}", note_url: "#{@web_url}/#{@owner}/#{@repo}").token
19
19
  template 'party_foul.rb', 'config/initializers/party_foul.rb'
20
- rescue Github::Error::Unauthorized
20
+ rescue Octokit::Unauthorized
21
21
  say 'There was an error retrieving your GitHub OAuth token'
22
22
  end
23
23
  end
@@ -6,9 +6,9 @@ PartyFoul.configure do |config|
6
6
  # The OAuth token for the account that is opening the issues on GitHub
7
7
  config.oauth_token = '<%= @oauth_token %>'
8
8
 
9
- # The API endpoint for GitHub. Unless you are hosting a private
9
+ # The API api_endpoint for GitHub. Unless you are hosting a private
10
10
  # instance of Enterprise GitHub you do not need to include this
11
- config.endpoint = '<%= @endpoint %>'
11
+ config.api_endpoint = '<%= @api_endpoint %>'
12
12
 
13
13
  # The Web URL for GitHub. Unless you are hosting a private
14
14
  # instance of Enterprise GitHub you do not need to include this
@@ -1,12 +1,8 @@
1
- require 'github_api'
1
+ require 'octokit'
2
2
 
3
3
  module PartyFoul
4
4
  class << self
5
- attr_accessor :github, :oauth_token, :endpoint, :owner, :repo, :blacklisted_exceptions, :processor, :web_url, :branch, :whitelisted_rack_variables, :additional_labels, :comment_limit
6
- end
7
-
8
- def self.whitelisted_rack_variables
9
- @whitelisted_rack_variables ||= %w{GATEWAY_INTERFACE PATH_INFO REMOTE_ADDR REMOTE_HOST REQUEST_METHOD REQUEST_URI SERVER_NAME SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE HTTP_HOST HTTP_CONNECTION HTTP_CACHE_CONTROL HTTP_ACCEPT HTTP_USER_AGENT HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE HTTP_ACCEPT_CHARSET rack.version rack.input rack.errors rack.multithread rack.multiprocess rack.run_once rack.url_scheme HTTP_VERSION REQUEST_PATH ORIGINAL_FULLPATH action_dispatch.routes action_dispatch.parameter_filter action_dispatch.secret_token action_dispatch.show_exceptions action_dispatch.show_detailed_exceptions action_dispatch.logger action_dispatch.backtrace_cleaner action_dispatch.request_id action_dispatch.remote_ip rack.session rack.session.options rack.request.cookie_hash rack.request.cookie_string action_dispatch.cookies action_dispatch.request.unsigned_session_cookie action_dispatch.request.path_parameters action_controller.instance action_dispatch.request.request_parameters rack.request.query_string rack.request.query_hash action_dispatch.request.query_parameters action_dispatch.request.parameters action_dispatch.request.formats}
5
+ attr_accessor :github, :oauth_token, :api_endpoint, :owner, :repo, :blacklisted_exceptions, :processor, :web_url, :branch, :whitelisted_rack_variables, :additional_labels, :comment_limit
10
6
  end
11
7
 
12
8
  # The git branch that is used for linking in the stack trace
@@ -28,8 +24,8 @@ module PartyFoul
28
24
  # users
29
25
  #
30
26
  # @return [String] Defaults to 'https://api.github.com' if not set
31
- def self.endpoint
32
- @endpoint ||= 'https://api.github.com'
27
+ def self.api_endpoint
28
+ @api_endpoint ||= 'https://api.github.com'
33
29
  end
34
30
 
35
31
  # The processor to be used when handling the exception. Defaults to a
@@ -55,12 +51,20 @@ module PartyFoul
55
51
  @blacklisted_exceptions || []
56
52
  end
57
53
 
58
- # The url of the repository. Built using the {.web_url}, {.owner}, and {.repo}
54
+ # The GitHub path to the repo
55
+ # Built using {.owner} and {.repo}
56
+ #
57
+ # @return [String]
58
+ def self.repo_path
59
+ "#{owner}/#{repo}"
60
+ end
61
+
62
+ # The url of the repository. Built using the {.web_url} and {.repo_path}
59
63
  # values
60
64
  #
61
65
  # @return [String]
62
66
  def self.repo_url
63
- "#{web_url}/#{owner}/#{repo}"
67
+ "#{web_url}/#{repo_path}"
64
68
  end
65
69
 
66
70
  # The configure block for PartyFoul. Use to initialize settings
@@ -76,7 +80,7 @@ module PartyFoul
76
80
  # @param [Block]
77
81
  def self.configure(&block)
78
82
  yield self
79
- self.github ||= Github.new oauth_token: oauth_token, endpoint: endpoint
83
+ self.github ||= Octokit.new oauth_token: oauth_token, api_endpoint: api_endpoint
80
84
  end
81
85
  end
82
86
 
@@ -36,8 +36,8 @@ class PartyFoul::ExceptionHandler
36
36
 
37
37
  # Hits the GitHub API to find the matching issue using the fingerprint.
38
38
  def find_issue
39
- unless issue = PartyFoul.github.search.issues(owner: PartyFoul.owner, repo: PartyFoul.repo, state: 'open', keyword: fingerprint).issues.first
40
- issue = PartyFoul.github.search.issues(owner: PartyFoul.owner, repo: PartyFoul.repo, state: 'closed', keyword: fingerprint).issues.first
39
+ unless issue = PartyFoul.github.search_issues(PartyFoul.repo_path, fingerprint, 'open').first
40
+ issue = PartyFoul.github.search_issues(PartyFoul.repo_path, fingerprint, 'closed').first
41
41
  end
42
42
 
43
43
  issue
@@ -45,9 +45,9 @@ class PartyFoul::ExceptionHandler
45
45
 
46
46
  # Will create a new issue and a comment with the proper details. All issues are labeled as 'bug'.
47
47
  def create_issue
48
- self.sha = PartyFoul.github.git_data.references.get(PartyFoul.owner, PartyFoul.repo, "heads/#{PartyFoul.branch}").object.sha
49
- issue = PartyFoul.github.issues.create(PartyFoul.owner, PartyFoul.repo, title: rendered_issue.title, body: rendered_issue.body, labels: ['bug'] + rendered_issue.labels)
50
- PartyFoul.github.issues.comments.create(PartyFoul.owner, PartyFoul.repo, issue['number'], body: rendered_issue.comment)
48
+ self.sha = PartyFoul.github.references(PartyFoul.repo_path, "heads/#{PartyFoul.branch}").object.sha
49
+ issue = PartyFoul.github.create_issue(PartyFoul.repo_path, rendered_issue.title, rendered_issue.body, labels: ['bug'] + rendered_issue.labels)
50
+ PartyFoul.github.add_comment(PartyFoul.repo_path, issue['number'], rendered_issue.comment)
51
51
  end
52
52
 
53
53
  # Updates the given issue. If the issue is labeled as 'wontfix' nothing is done. If the issue is closed the issue is reopened and labeled as 'regression'.
@@ -55,16 +55,18 @@ class PartyFoul::ExceptionHandler
55
55
  # @param [Hashie::Mash]
56
56
  def update_issue(issue)
57
57
  unless issue.key?('labels') && issue['labels'].include?('wontfix')
58
- params = {body: rendered_issue.update_body(issue['body']), state: 'open'}
58
+ body = rendered_issue.update_body(issue['body'])
59
+ params = {state: 'open'}
59
60
 
60
61
  if issue['state'] == 'closed'
61
62
  params[:labels] = (['bug', 'regression'] + issue['labels']).uniq
62
63
  end
63
64
 
64
- self.sha = PartyFoul.github.git_data.references.get(PartyFoul.owner, PartyFoul.repo, "heads/#{PartyFoul.branch}").object.sha
65
- PartyFoul.github.issues.edit(PartyFoul.owner, PartyFoul.repo, issue['number'], params)
65
+ self.sha = PartyFoul.github.references(PartyFoul.repo_path, "heads/#{PartyFoul.branch}").object.sha
66
+ PartyFoul.github.update_issue(PartyFoul.repo_path, issue['number'], issue.title, body, params)
67
+
66
68
  unless comment_limit_met?(issue['body'])
67
- PartyFoul.github.issues.comments.create(PartyFoul.owner, PartyFoul.repo, issue['number'], body: rendered_issue.comment)
69
+ PartyFoul.github.add_comment(PartyFoul.repo_path, issue['number'], rendered_issue.comment)
68
70
  end
69
71
  end
70
72
  end
@@ -72,7 +74,7 @@ class PartyFoul::ExceptionHandler
72
74
  private
73
75
 
74
76
  def self.clean_env(env)
75
- env.select { |key, value| PartyFoul.whitelisted_rack_variables.include?(key) }
77
+ env.select { |key, value| Marshal.dump(value) rescue false }
76
78
  end
77
79
 
78
80
  def fingerprint
@@ -53,10 +53,10 @@ BODY
53
53
  # @return [String]
54
54
  def stack_trace
55
55
  exception.backtrace.map do |line|
56
- if matches = extract_file_name_and_line_number(line)
57
- "<a href='#{PartyFoul.repo_url}/blob/#{sha}/#{matches[2]}#L#{matches[3]}'>#{line}</a>"
56
+ if (matches = extract_file_name_and_line_number(line))
57
+ "<a href='#{PartyFoul.repo_url}/blob/#{sha}/#{matches[2]}#L#{matches[3]}'>#{format_line(line)}</a>"
58
58
  else
59
- line
59
+ format_line(line)
60
60
  end
61
61
  end.join("\n")
62
62
  end
@@ -107,7 +107,6 @@ BODY
107
107
  { 'Occurred At' => occurred_at }
108
108
  end
109
109
 
110
-
111
110
  # Builds an HTML table from hash
112
111
  #
113
112
  # @return [String]
@@ -149,6 +148,10 @@ BODY
149
148
  Dir.pwd
150
149
  end
151
150
 
151
+ def bundle_root
152
+ Bundler.bundle_path.to_s if defined?(Bundler)
153
+ end
154
+
152
155
  def extract_file_name_and_line_number(backtrace_line)
153
156
  backtrace_line.match(/#{app_root}\/((.+?):(\d+))/)
154
157
  end
@@ -156,4 +159,13 @@ BODY
156
159
  def raw_title
157
160
  raise NotImplementedError
158
161
  end
162
+
163
+ def format_line(line)
164
+ if bundle_root
165
+ line.sub(app_root, '[app]...').sub(bundle_root, '[bundle]...')
166
+ else
167
+ line.sub(app_root, '[app]...')
168
+ end
169
+ end
170
+
159
171
  end
@@ -12,13 +12,13 @@ class PartyFoul::IssueRenderers::Rails < PartyFoul::IssueRenderers::Rack
12
12
  # @return [Hash]
13
13
  def session
14
14
  parameter_filter = ActionDispatch::Http::ParameterFilter.new(env['action_dispatch.parameter_filter'])
15
- parameter_filter.filter(env['rack.session'])
15
+ parameter_filter.filter(env['rack.session'] || { } )
16
16
  end
17
17
 
18
18
  private
19
19
 
20
20
  def app_root
21
- Rails.root
21
+ Rails.root.to_s
22
22
  end
23
23
 
24
24
  def raw_title
@@ -5,7 +5,7 @@ class PartyFoul::RacklessExceptionHandler < PartyFoul::ExceptionHandler
5
5
  #
6
6
  # @param [Exception, Hash]
7
7
  def self.handle(exception, env)
8
- self.new(exception, env).run
8
+ self.new(exception, clean_env(env)).run
9
9
  end
10
10
 
11
11
  # Uses the Rackless IssueRenderer for a rackless environment
@@ -1,3 +1,3 @@
1
1
  module PartyFoul
2
- VERSION = '1.2.2'
2
+ VERSION = '1.3.0'
3
3
  end
@@ -8,17 +8,14 @@ class PartyFoul::GeneratorTest < Rails::Generators::TestCase
8
8
  test 'it copies the initializer' do
9
9
  owner = 'test_owner'
10
10
  repo = 'test_repo'
11
- oauth = mock('Oauth')
12
- oauth.stubs(:create)
13
- oauth.expects(:create).with(scopes: ['repo'], note: 'PartyFoul test_owner/test_repo', note_url: 'http://example.com/test_owner/test_repo').returns(Hashie::Mash.new(token: 'test_token'))
14
- github = mock('Github')
15
- github.stubs(:oauth).returns(oauth)
16
- Github.stubs(:new).with(:login => 'test_login', :password => 'test_password', :endpoint => 'http://api.example.com').returns(github)
11
+ octokit = mock('Octokit')
12
+ octokit.expects(:create_authorization).with(scopes: ['repo'], note: 'PartyFoul test_owner/test_repo', note_url: 'http://example.com/test_owner/test_repo').returns(Hashie::Mash.new(token: 'test_token'))
13
+ Octokit.stubs(:new).with(:login => 'test_login', :password => 'test_password', :api_endpoint => 'http://api.example.com').returns(octokit)
17
14
  $stdin.stubs(:gets).returns('test_login').then.returns('test_password').then.returns(owner).then.returns(repo).then.returns('http://api.example.com').then.returns('http://example.com').then.returns('')
18
15
  run_generator
19
16
 
20
17
  assert_file 'config/initializers/party_foul.rb' do |initializer|
21
- assert_match(/config\.endpoint\s+=\s'http:\/\/api\.example\.com'/, initializer)
18
+ assert_match(/config\.api_endpoint\s+=\s'http:\/\/api\.example\.com'/, initializer)
22
19
  assert_match(/config\.web_url\s+=\s'http:\/\/example\.com'/, initializer)
23
20
  assert_match(/config\.owner\s+=\s'test_owner'/, initializer)
24
21
  assert_match(/config\.repo\s+=\s'test_repo'/, initializer)
@@ -11,7 +11,7 @@ describe 'Party Foul Confg' do
11
11
  config.blacklisted_exceptions = ['StandardError']
12
12
  config.oauth_token = 'test_token'
13
13
  config.web_url = 'http://example.com'
14
- config.endpoint = 'http://api.example.com'
14
+ config.api_endpoint = 'http://api.example.com'
15
15
  config.owner = 'test_owner'
16
16
  config.repo = 'test_repo'
17
17
  config.branch = 'master'
@@ -19,11 +19,12 @@ describe 'Party Foul Confg' do
19
19
  end
20
20
 
21
21
  PartyFoul.blacklisted_exceptions.must_equal ['StandardError']
22
- PartyFoul.github.must_be_instance_of Github::Client
22
+ PartyFoul.github.must_be_instance_of Octokit::Client
23
23
  PartyFoul.github.oauth_token.must_equal 'test_token'
24
- PartyFoul.github.endpoint.must_equal 'http://api.example.com'
24
+ PartyFoul.github.api_endpoint.must_equal 'http://api.example.com'
25
25
  PartyFoul.owner.must_equal 'test_owner'
26
26
  PartyFoul.repo.must_equal 'test_repo'
27
+ PartyFoul.repo_path.must_equal 'test_owner/test_repo'
27
28
  PartyFoul.repo_url.must_equal 'http://example.com/test_owner/test_repo'
28
29
  PartyFoul.branch.must_equal 'master'
29
30
  PartyFoul.comment_limit.must_equal 10
@@ -9,13 +9,6 @@ describe 'Party Foul Exception Handler' do
9
9
  end
10
10
 
11
11
  PartyFoul.stubs(:branch).returns('deploy')
12
- PartyFoul.github.stubs(:issues).returns(mock('Issues'))
13
- PartyFoul.github.stubs(:search).returns(mock('Search'))
14
- PartyFoul.github.git_data.references.stubs(:get)
15
- PartyFoul.github.issues.stubs(:create)
16
- PartyFoul.github.issues.stubs(:edit)
17
- PartyFoul.github.issues.stubs(:comments).returns(mock('Comments'))
18
- PartyFoul.github.issues.comments.stubs(:create)
19
12
  PartyFoul::IssueRenderers::Rails.any_instance.stubs(:title).returns('Test Title')
20
13
  PartyFoul::IssueRenderers::Rails.any_instance.stubs(:fingerprint).returns('test_fingerprint')
21
14
  end
@@ -24,11 +17,11 @@ describe 'Party Foul Exception Handler' do
24
17
  it 'will open a new error on GitHub' do
25
18
  PartyFoul::IssueRenderers::Rails.any_instance.stubs(:body).returns('Test Body')
26
19
  PartyFoul::IssueRenderers::Rails.any_instance.stubs(:comment).returns('Test Comment')
27
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'open').returns(Hashie::Mash.new(issues: []))
28
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'closed').returns(Hashie::Mash.new(issues: []))
29
- PartyFoul.github.issues.expects(:create).with('test_owner', 'test_repo', title: 'Test Title', body: 'Test Body', :labels => ['bug']).returns(Hashie::Mash.new('number' => 1))
30
- PartyFoul.github.git_data.references.expects(:get).with('test_owner', 'test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
31
- PartyFoul.github.issues.comments.expects(:create).with('test_owner', 'test_repo', 1, body: 'Test Comment')
20
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'open').returns([])
21
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'closed').returns([])
22
+ PartyFoul.github.expects(:create_issue).with('test_owner/test_repo', 'Test Title', 'Test Body', :labels => ['bug']).returns(Hashie::Mash.new('number' => 1))
23
+ PartyFoul.github.expects(:references).with('test_owner/test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
24
+ PartyFoul.github.expects(:add_comment).with('test_owner/test_repo', 1, 'Test Comment')
32
25
  PartyFoul::ExceptionHandler.new(nil, {}).run
33
26
  end
34
27
 
@@ -44,11 +37,11 @@ describe 'Party Foul Exception Handler' do
44
37
  it 'will open a new error on GitHub with the additional labels' do
45
38
  PartyFoul::IssueRenderers::Rails.any_instance.stubs(:body).returns('Test Body')
46
39
  PartyFoul::IssueRenderers::Rails.any_instance.stubs(:comment).returns('Test Comment')
47
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'open').returns(Hashie::Mash.new(issues: []))
48
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'closed').returns(Hashie::Mash.new(issues: []))
49
- PartyFoul.github.issues.expects(:create).with('test_owner', 'test_repo', title: 'Test Title', body: 'Test Body', :labels => ['bug', 'custom', 'label']).returns(Hashie::Mash.new('number' => 1))
50
- PartyFoul.github.git_data.references.expects(:get).with('test_owner', 'test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
51
- PartyFoul.github.issues.comments.expects(:create).with('test_owner', 'test_repo', 1, body: 'Test Comment')
40
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'open').returns([])
41
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'closed').returns([])
42
+ PartyFoul.github.expects(:create_issue).with('test_owner/test_repo', 'Test Title', 'Test Body', :labels => ['bug', 'custom', 'label']).returns(Hashie::Mash.new('number' => 1))
43
+ PartyFoul.github.expects(:references).with('test_owner/test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
44
+ PartyFoul.github.expects(:add_comment).with('test_owner/test_repo', 1, 'Test Comment')
52
45
  PartyFoul::ExceptionHandler.new(nil, {}).run
53
46
  end
54
47
  end
@@ -66,27 +59,27 @@ describe 'Party Foul Exception Handler' do
66
59
  end
67
60
  PartyFoul::IssueRenderers::Rails.any_instance.stubs(:body).returns('Test Body')
68
61
  PartyFoul::IssueRenderers::Rails.any_instance.stubs(:comment).returns('Test Comment')
69
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'open').returns(Hashie::Mash.new(issues: []))
70
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'closed').returns(Hashie::Mash.new(issues: []))
71
- PartyFoul.github.git_data.references.expects(:get).with('test_owner', 'test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
72
- PartyFoul.github.issues.comments.expects(:create).with('test_owner', 'test_repo', 1, body: 'Test Comment')
62
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'open').returns([])
63
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'closed').returns([])
64
+ PartyFoul.github.expects(:references).with('test_owner/test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
65
+ PartyFoul.github.expects(:add_comment).with('test_owner/test_repo', 1, 'Test Comment')
73
66
  end
74
67
  after do
75
68
  clean_up_party
76
69
  end
77
70
 
78
71
  it 'will open a new error on GitHub with the default labels if no additional labels are returned from the proc' do
79
- PartyFoul.github.issues.expects(:create).with('test_owner', 'test_repo', title: 'Test Title', body: 'Test Body', :labels => ['bug']).returns(Hashie::Mash.new('number' => 1))
72
+ PartyFoul.github.expects(:create_issue).with('test_owner/test_repo', 'Test Title', 'Test Body', :labels => ['bug']).returns(Hashie::Mash.new('number' => 1))
80
73
  PartyFoul::ExceptionHandler.new(stub(:message => ''), {}).run
81
74
  end
82
75
 
83
76
  it 'will open a new error on GitHub with the additional labels based on the exception message' do
84
- PartyFoul.github.issues.expects(:create).with('test_owner', 'test_repo', title: 'Test Title', body: 'Test Body', :labels => ['bug', 'database_error']).returns(Hashie::Mash.new('number' => 1))
77
+ PartyFoul.github.expects(:create_issue).with('test_owner/test_repo', 'Test Title', 'Test Body', :labels => ['bug', 'database_error']).returns(Hashie::Mash.new('number' => 1))
85
78
  PartyFoul::ExceptionHandler.new(stub(:message => 'Database'), {}).run
86
79
  end
87
80
 
88
81
  it 'will open a new error on GitHub with the additional labels based on the env' do
89
- PartyFoul.github.issues.expects(:create).with('test_owner', 'test_repo', title: 'Test Title', body: 'Test Body', :labels => ['bug', 'beta']).returns(Hashie::Mash.new('number' => 1))
82
+ PartyFoul.github.expects(:create_issue).with('test_owner/test_repo', 'Test Title', 'Test Body', :labels => ['bug', 'beta']).returns(Hashie::Mash.new('number' => 1))
90
83
  PartyFoul::ExceptionHandler.new(stub(:message => ''), {:http_host => 'beta.example.com'}).run
91
84
  end
92
85
  end
@@ -100,13 +93,13 @@ describe 'Party Foul Exception Handler' do
100
93
 
101
94
  context 'and open' do
102
95
  before do
103
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'open').returns(Hashie::Mash.new(issues: [{title: 'Test Title', body: 'Test Body', state: 'open', number: 1}]))
104
- PartyFoul.github.issues.expects(:edit).with('test_owner', 'test_repo', 1, body: 'New Body', state: 'open')
105
- PartyFoul.github.issues.comments.expects(:create).with('test_owner', 'test_repo', 1, body: 'Test Comment')
106
- PartyFoul.github.git_data.references.expects(:get).with('test_owner', 'test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
96
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'open').returns([Hashie::Mash.new(title: 'Test Title', body: 'Test Body', state: 'open', number: 1)])
97
+ PartyFoul.github.expects(:update_issue).with('test_owner/test_repo', 1, 'Test Title', 'New Body', state: 'open')
98
+ PartyFoul.github.expects(:references).with('test_owner/test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
107
99
  end
108
100
 
109
101
  it 'will update the issue' do
102
+ PartyFoul.github.expects(:add_comment).with('test_owner/test_repo', 1, 'Test Comment')
110
103
  PartyFoul::ExceptionHandler.new(nil, {}).run
111
104
  end
112
105
 
@@ -115,19 +108,18 @@ describe 'Party Foul Exception Handler' do
115
108
  config.comment_limit = 10
116
109
  end
117
110
  PartyFoul::ExceptionHandler.any_instance.expects(:occurrence_count).returns(10)
118
- PartyFoul.github.issues.comments.unstub(:create) # Necessary for the `never` expectation to work.
119
- PartyFoul.github.issues.comments.expects(:create).never
111
+ PartyFoul.github.expects(:add_comment).never
120
112
  PartyFoul::ExceptionHandler.new(nil, {}).run
121
113
  end
122
114
  end
123
115
 
124
116
  context 'and closed' do
125
117
  it 'will update the count on the body and re-open the issue' do
126
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'open').returns(Hashie::Mash.new(issues: []))
127
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'closed').returns(Hashie::Mash.new(issues: [{title: 'Test Title', body: 'Test Body', state: 'closed', number: 1, labels: ['staging']}]))
128
- PartyFoul.github.issues.expects(:edit).with('test_owner', 'test_repo', 1, body: 'New Body', state: 'open', labels: ['bug', 'regression', 'staging'])
129
- PartyFoul.github.issues.comments.expects(:create).with('test_owner', 'test_repo', 1, body: 'Test Comment')
130
- PartyFoul.github.git_data.references.expects(:get).with('test_owner', 'test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
118
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'open').returns([])
119
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'closed').returns([Hashie::Mash.new(title: 'Test Title', body: 'Test Body', state: 'closed', number: 1, labels: ['staging'])])
120
+ PartyFoul.github.expects(:update_issue).with('test_owner/test_repo', 1, 'Test Title', 'New Body', state: 'open', labels: ['bug', 'regression', 'staging'])
121
+ PartyFoul.github.expects(:add_comment).with('test_owner/test_repo', 1, 'Test Comment')
122
+ PartyFoul.github.expects(:references).with('test_owner/test_repo', 'heads/deploy').returns(Hashie::Mash.new(object: Hashie::Mash.new(sha: 'abcdefg1234567890')))
131
123
  PartyFoul::ExceptionHandler.new(nil, {}).run
132
124
  end
133
125
  end
@@ -136,12 +128,12 @@ describe 'Party Foul Exception Handler' do
136
128
  context 'when issue is marked as "wontfix"' do
137
129
  it 'does nothing' do
138
130
  PartyFoul::IssueRenderers::Rails.any_instance.stubs(:body).returns('Test Body')
139
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'open').returns(Hashie::Mash.new(issues: []))
140
- PartyFoul.github.search.stubs(:issues).with(owner: 'test_owner', repo: 'test_repo', keyword: 'test_fingerprint', state: 'closed').returns(Hashie::Mash.new(issues: [{title: 'Test Title', body: 'Test Body', state: 'closed', number: 1, 'labels' => ['wontfix']}]))
141
- PartyFoul.github.issues.expects(:create).never
142
- PartyFoul.github.issues.expects(:edit).never
143
- PartyFoul.github.issues.comments.expects(:create).never
144
- PartyFoul.github.git_data.references.expects(:get).never
131
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'open').returns([])
132
+ PartyFoul.github.expects(:search_issues).with('test_owner/test_repo', 'test_fingerprint', 'closed').returns([Hashie::Mash.new(title: 'Test Title', body: 'Test Body', state: 'closed', number: 1, labels: ['wontfix'])])
133
+ PartyFoul.github.expects(:create_issue).never
134
+ PartyFoul.github.expects(:update_issue).never
135
+ PartyFoul.github.expects(:add_comment).never
136
+ PartyFoul.github.expects(:references).never
145
137
  PartyFoul::ExceptionHandler.new(nil, {}).run
146
138
  end
147
139
  end
@@ -112,4 +112,33 @@ Fingerprint: `abcdefg1234567890`
112
112
  rendered_issue.title.must_equal 'Error for #<ClassName:0xXXXXXX>'
113
113
  end
114
114
  end
115
+
116
+ describe '#stack_trace' do
117
+ it 'returns the stack trace' do
118
+ exception = mock do
119
+ stubs backtrace: ['/path/to/gems/gem-name/lib/some/file.rb:123 in `method`']
120
+ end
121
+ rendered_issue = PartyFoul::IssueRenderers::Base.new(exception, nil)
122
+ rendered_issue.stack_trace.must_equal exception.backtrace.first
123
+ end
124
+
125
+ it 'formats the stack trace with shortened bundle paths' do
126
+ exception = mock do
127
+ stubs backtrace: ["#{Bundler.bundle_path}/some_gem/lib/some/file.rb:123 in `method`"]
128
+ end
129
+ rendered_issue = PartyFoul::IssueRenderers::Base.new(exception, nil)
130
+ rendered_issue.stack_trace.must_equal '[bundle].../some_gem/lib/some/file.rb:123 in `method`'
131
+ end
132
+
133
+ it 'formats the stack trace with link to shortened application path' do
134
+ exception = mock do
135
+ stubs backtrace: ['/path/to/app/lib/some/file.rb:123 in `method`']
136
+ end
137
+ rendered_issue = PartyFoul::IssueRenderers::Base.new(exception, nil)
138
+ rendered_issue.stubs app_root: '/path/to/app'
139
+ rendered_issue.stack_trace.must_match "<a href='https://github.com/"
140
+ rendered_issue.stack_trace.must_match ">[app].../lib/some/file.rb:123 in `method`</a>"
141
+ end
142
+ end
143
+
115
144
  end
@@ -13,14 +13,27 @@ describe 'Rails Issue Renderer' do
13
13
  end
14
14
 
15
15
  describe '#session' do
16
+ let(:params) { {'action_dispatch.parameter_filter' => ['password'], 'rack.session' => { 'status' => 'ok', 'password' => 'test' }, 'QUERY_STRING' => { 'status' => 'fail' } } }
17
+
16
18
  before do
17
- @rendered_issue = PartyFoul::IssueRenderers::Rails.new(nil, {'action_dispatch.parameter_filter' => ['password'], 'rack.session' => { 'status' => 'ok', 'password' => 'test' }, 'QUERY_STRING' => { 'status' => 'fail' } })
19
+ @rendered_issue = PartyFoul::IssueRenderers::Rails.new(nil, params)
18
20
  end
19
21
 
20
22
  it 'returns ok' do
21
23
  @rendered_issue.session['status'].must_equal 'ok'
22
24
  @rendered_issue.session['password'].must_equal '[FILTERED]'
23
25
  end
26
+
27
+ context "without session" do
28
+
29
+ let(:params) { {'action_dispatch.parameter_filter' => ['password'], 'QUERY_STRING' => { 'status' => 'fail' } } }
30
+
31
+ it 'returns empty hash' do
32
+ @rendered_issue.session.must_be_empty
33
+ end
34
+ end
35
+
36
+
24
37
  end
25
38
 
26
39
  describe '#raw_title' do
@@ -6,12 +6,13 @@ else
6
6
  require 'minitest/autorun'
7
7
  end
8
8
  begin
9
- require 'debugger'
9
+ require 'byebug'
10
10
  rescue LoadError
11
11
  end
12
12
  require 'rack/test'
13
13
  require 'mocha/setup'
14
14
  require 'party_foul'
15
+ require 'hashie/mash'
15
16
 
16
17
  class MiniTest::Spec
17
18
  class << self
@@ -24,7 +25,7 @@ module MiniTest::Expectations
24
25
  end
25
26
 
26
27
  def clean_up_party
27
- %w{github oauth_token endpoint owner repo blacklisted_exceptions processor web_url branch additional_labels comment_limit}.each do |attr|
28
+ %w{github oauth_token api_endpoint owner repo blacklisted_exceptions processor web_url branch additional_labels comment_limit}.each do |attr|
28
29
  PartyFoul.send("#{attr}=", nil)
29
30
  end
30
31
  end
@@ -6,9 +6,9 @@ PartyFoul.configure do |config|
6
6
  # The OAuth token for the account that is opening the issues on GitHub
7
7
  config.oauth_token = 'test_token'
8
8
 
9
- # The API endpoint for GitHub. Unless you are hosting a private
9
+ # The API api_endpoint for GitHub. Unless you are hosting a private
10
10
  # instance of Enterprise GitHub you do not need to include this
11
- config.endpoint = 'http://api.example.com'
11
+ config.api_endpoint = 'http://api.example.com'
12
12
 
13
13
  # The Web URL for GitHub. Unless you are hosting a private
14
14
  # instance of Enterprise GitHub you do not need to include this
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: party_foul
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Cardarella
@@ -9,78 +9,78 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-11 00:00:00.000000000 Z
12
+ date: 2013-07-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: github_api
15
+ name: octokit
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - '>='
19
19
  - !ruby/object:Gem::Version
20
- version: '0.9'
20
+ version: '0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - '>='
26
26
  - !ruby/object:Gem::Version
27
- version: '0.9'
27
+ version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: actionpack
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ~>
33
33
  - !ruby/object:Gem::Version
34
- version: 4.0.0.b1
34
+ version: '4.0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ~>
40
40
  - !ruby/object:Gem::Version
41
- version: 4.0.0.b1
41
+ version: '4.0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: activesupport
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - ~>
47
47
  - !ruby/object:Gem::Version
48
- version: 4.0.0.b1
48
+ version: '4.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - ~>
54
54
  - !ruby/object:Gem::Version
55
- version: 4.0.0.b1
55
+ version: '4.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: railties
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - ~>
61
61
  - !ruby/object:Gem::Version
62
- version: 4.0.0.b1
62
+ version: '4.0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: 4.0.0.b1
69
+ version: '4.0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: minitest
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - '>='
74
+ - - ~>
75
75
  - !ruby/object:Gem::Version
76
- version: '0'
76
+ version: '4.7'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '>='
81
+ - - ~>
82
82
  - !ruby/object:Gem::Version
83
- version: '0'
83
+ version: '4.7'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: webmock
86
86
  requirement: !ruby/object:Gem::Requirement
@@ -137,7 +137,7 @@ dependencies:
137
137
  - - '>='
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
- description: Auto-submit Rails exceptions as new isues on GitHub
140
+ description: Auto-submit Rails exceptions as new issues on GitHub
141
141
  email:
142
142
  - bcardarella@gmail.com
143
143
  - rubygems@danmcclain.net
@@ -187,7 +187,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
187
187
  requirements:
188
188
  - - '>='
189
189
  - !ruby/object:Gem::Version
190
- version: '1.9'
190
+ version: 1.9.3
191
191
  required_rubygems_version: !ruby/object:Gem::Requirement
192
192
  requirements:
193
193
  - - '>='
@@ -195,10 +195,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
195
  version: '0'
196
196
  requirements: []
197
197
  rubyforge_project:
198
- rubygems_version: 2.0.0
198
+ rubygems_version: 2.0.3
199
199
  signing_key:
200
200
  specification_version: 4
201
- summary: Auto-submit Rails exceptions as new isues on GitHub
201
+ summary: Auto-submit Rails exceptions as new issues on GitHub
202
202
  test_files:
203
203
  - test/generator_test.rb
204
204
  - test/party_foul/configure_test.rb