party_foul 0.2.0 → 0.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.
data/README.md CHANGED
@@ -69,6 +69,9 @@ PartyFoul.configure do |config|
69
69
  # The constants here *must* be represented as strings
70
70
  config.ignored_exceptions = ['ActiveRecord::RecordNotFound', 'ActionController::RoutingError']
71
71
 
72
+ # The names of the HTTP headers to not report
73
+ config.filtered_http_headers = ['Cookie']
74
+
72
75
  # The OAuth token for the account that will be opening the issues on Github
73
76
  config.oauth_token = 'abcdefgh1234567890'
74
77
 
@@ -7,22 +7,15 @@ module PartyFoul
7
7
  source_root File.expand_path('../templates', __FILE__)
8
8
 
9
9
  def create_initializer_file
10
- username = ask 'Github username:'
11
- password = STDIN.noecho do
12
- ask 'Github password:'
13
- end
14
-
15
- say ''
16
-
17
- @owner = ask_with_default 'Repository owner:', username
10
+ login = ask 'Github login:'
11
+ password = STDIN.noecho { ask 'Github password:' }
12
+ @owner = ask_with_default "\nRepository owner:", login
18
13
  @repo = ask 'Repository name:'
19
14
  @endpoint = ask_with_default 'Endpoint:', 'https://api.github.com'
20
15
 
21
- github = Github.new :login => username, :password => password, :endpoint => @endpoint
22
-
23
16
  begin
24
- github.oauth.create 'scopes' => ['repo']
25
- @oauth_token = github.oauth_token
17
+ github = Github.new :login => login, :password => password, :endpoint => @endpoint
18
+ @oauth_token = github.oauth.create('scopes' => ['repo']).token
26
19
  template 'party_foul.rb', 'config/initializers/party_foul.rb'
27
20
  rescue Github::Error::Unauthorized
28
21
  say 'There was an error retrieving your Github OAuth token'
@@ -1,18 +1,21 @@
1
1
  PartyFoul.configure do |config|
2
2
  # the collection of exceptions to be ignored by PartyFoul
3
3
  # The constants here *must* be represented as strings
4
- config.ignored_exceptions = ['ActiveRecord::RecordNotFound', 'ActionController::RoutingError']
4
+ config.ignored_exceptions = ['ActiveRecord::RecordNotFound', 'ActionController::RoutingError']
5
+
6
+ # The names of the HTTP headers to not report
7
+ config.filtered_http_headers = ['Cookie']
5
8
 
6
9
  # The OAuth token for the account that will be opening the issues on Github
7
- config.oauth_token = '<%= @oauth_token %>'
10
+ config.oauth_token = '<%= @oauth_token %>'
8
11
 
9
12
  # The API endpoint for Github. Unless you are hosting a private
10
13
  # instance of Enterprise Github you do not need to include this
11
- config.endpoint = '<%= @endpoint %>'
14
+ config.endpoint = '<%= @endpoint %>'
12
15
 
13
16
  # The organization or user that owns the target repository
14
- config.owner = '<%= @owner %>'
17
+ config.owner = '<%= @owner %>'
15
18
 
16
19
  # The repository for this application
17
- config.repo = '<%= @repo %>'
20
+ config.repo = '<%= @repo %>'
18
21
  end
@@ -2,7 +2,7 @@ require 'github_api'
2
2
 
3
3
  module PartyFoul
4
4
  class << self
5
- attr_accessor :github, :oauth_token, :endpoint, :owner, :repo, :ignored_exceptions, :adapter, :issue_template, :comment_template
5
+ attr_accessor :github, :oauth_token, :endpoint, :owner, :repo, :ignored_exceptions, :adapter, :issue_template, :comment_template, :filtered_http_headers
6
6
  end
7
7
 
8
8
  def self.issue_template
@@ -27,6 +27,7 @@ Fingerprint: `:fingerprint`
27
27
  <tr><th>Occurred at</th><td>:occurred_at</td></tr>
28
28
  <tr><th>Params</th><td>:params</td></tr>
29
29
  <tr><th>IP Address</th><td>:ip_address</td></tr>
30
+ <tr><th>Session</th><td>:session</td></tr>
30
31
  <tr><th>HTTP Headers</th><td>:http_headers</td></tr>
31
32
  </table>
32
33
  TEMPLATE
@@ -94,10 +94,19 @@ class PartyFoul::ExceptionHandler
94
94
 
95
95
  def compile_template(template)
96
96
  template.gsub(/:\w+/) do |method|
97
- self.send(method.split(':').last)
97
+ value = self.send(method.split(':').last)
98
+ if value.kind_of?(Hash)
99
+ hash_as_table(value)
100
+ else
101
+ value
102
+ end
98
103
  end
99
104
  end
100
105
 
106
+ def hash_as_table(value)
107
+ "<table>#{value.map {|key, value| "<tr><th>#{key}</th><td>#{value}</td></tr>"}.join}</table>"
108
+ end
109
+
101
110
  def occurred_at
102
111
  Time.now.strftime('%B %d, %Y %H:%M:%S %z')
103
112
  end
@@ -106,8 +115,15 @@ class PartyFoul::ExceptionHandler
106
115
  env['REMOTE_ADDR']
107
116
  end
108
117
 
118
+ def session
119
+ env['rack.session']
120
+ end
121
+
109
122
  def http_headers
110
- "<table>#{env.keys.select { |k| k =~ /^HTTP_/ }.sort.map { |k| "<tr><th>#{k.split('HTTP_').last.split('_').map(&:capitalize).join(' ')}</th><td>#{env[k]}</td></tr>" }.join }</table>"
123
+ env.keys.select { |key| key =~ /^HTTP_(\w+)/ && !(PartyFoul.filtered_http_headers || []).include?($1.split('_').map(&:capitalize).join('-')) }.sort.inject({}) do |hash, key|
124
+ hash[key.split('HTTP_').last.split('_').map(&:capitalize).join('-')] = env[key]
125
+ hash
126
+ end
111
127
  end
112
128
 
113
129
  private
@@ -1,3 +1,3 @@
1
1
  module PartyFoul
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -8,10 +8,9 @@ class PartyFoul::GeneratorTest < Rails::Generators::TestCase
8
8
  test 'it copies the initializer' do
9
9
  oauth = mock('Oauth')
10
10
  oauth.stubs(:create)
11
- oauth.expects(:create).with('scopes' => ['repo'])
11
+ oauth.expects(:create).with('scopes' => ['repo']).returns(Hashie::Mash.new(token: 'test_token'))
12
12
  github = mock('Github')
13
13
  github.stubs(:oauth).returns(oauth)
14
- github.stubs(:oauth_token).returns('test_token')
15
14
  Github.stubs(:new).with(:login => 'test_login', :password => 'test_password', :endpoint => 'test_endpoint').returns(github)
16
15
  $stdin.stubs(:gets).returns('test_login').then.returns('test_password').then.returns('').then.returns('test_repo').then.returns("test_endpoint").then.returns('')
17
16
  run_generator
@@ -4,7 +4,11 @@ require 'action_dispatch/http/parameter_filter'
4
4
 
5
5
  describe 'Party Foul Exception Handler' do
6
6
  before do
7
- Time.stubs(:now).returns(Time.at(0))
7
+ Time.stubs(:now).returns(Time.new(1970, 1, 1, 0, 0, 0, '-05:00'))
8
+ end
9
+
10
+ after do
11
+ clean_up_party
8
12
  end
9
13
 
10
14
  describe '#body' do
@@ -21,7 +25,7 @@ describe 'Party Foul Exception Handler' do
21
25
  <table>
22
26
  <tr><th>Exception</th><td>Test Exception</td></tr>
23
27
  <tr><th>Count</th><td>1</td></tr>
24
- <tr><th>Last Occurance</th><td>December 31, 1969 19:00:00 -0500</td></tr>
28
+ <tr><th>Last Occurance</th><td>January 01, 1970 00:00:00 -0500</td></tr>
25
29
  </table>
26
30
 
27
31
  ## Stack Trace
@@ -60,7 +64,7 @@ Fingerprint: `abcdefg1234567890`
60
64
  <table>
61
65
  <tr><th>Exception</th><td>Test Exception</td></tr>
62
66
  <tr><th>Count</th><td>1</td></tr>
63
- <tr><th>Last Occurance</th><td>December 31, 1969 19:00:00 -0500</td></tr>
67
+ <tr><th>Last Occurance</th><td>January 01, 1970 00:00:00 -0500</td></tr>
64
68
  </table>
65
69
 
66
70
  ## Stack Trace
@@ -102,7 +106,8 @@ Fingerprint: `abcdefg1234567890`
102
106
  'HTTP_USER_AGENT' => 'test_user_agent',
103
107
  'REMOTE_ADDR' => '127.0.0.1',
104
108
  'HTTP_HOST' => 'localhost:3000',
105
- 'QUERY_STRING' => { :controller => 'landing', :action => 'index' }
109
+ 'QUERY_STRING' => { :controller => 'landing', :action => 'index' },
110
+ 'rack.session' => { :id => 1 }
106
111
  }
107
112
  @handler = PartyFoul::ExceptionHandler.new(nil, env)
108
113
  end
@@ -110,10 +115,11 @@ Fingerprint: `abcdefg1234567890`
110
115
  it 'renders a new comment' do
111
116
  expected_comment = <<-COMMENT
112
117
  <table>
113
- <tr><th>Occurred at</th><td>December 31, 1969 19:00:00 -0500</td></tr>
114
- <tr><th>Params</th><td>{:controller=>"landing", :action=>"index"}</td></tr>
118
+ <tr><th>Occurred at</th><td>January 01, 1970 00:00:00 -0500</td></tr>
119
+ <tr><th>Params</th><td><table><tr><th>controller</th><td>landing</td></tr><tr><th>action</th><td>index</td></tr></table></td></tr>
115
120
  <tr><th>IP Address</th><td>127.0.0.1</td></tr>
116
- <tr><th>HTTP Headers</th><td><table><tr><th>Host</th><td>localhost:3000</td></tr><tr><th>User Agent</th><td>test_user_agent</td></tr></table></td></tr>
121
+ <tr><th>Session</th><td><table><tr><th>id</th><td>1</td></tr></table></td></tr>
122
+ <tr><th>HTTP Headers</th><td><table><tr><th>Host</th><td>localhost:3000</td></tr><tr><th>User-Agent</th><td>test_user_agent</td></tr></table></td></tr>
117
123
  </table>
118
124
  COMMENT
119
125
 
@@ -130,4 +136,26 @@ COMMENT
130
136
  @handler.compile_template(template).must_equal '<span>123</span><div>abc</div>'
131
137
  end
132
138
  end
139
+
140
+ describe '#http_headers' do
141
+ before do
142
+ PartyFoul.filtered_http_headers = ['Cookie']
143
+ env = {
144
+ 'HTTP_USER_AGENT' => 'test_user_agent',
145
+ 'HTTP_COOKIE' => 'test_cookie',
146
+ }
147
+ @handler = PartyFoul::ExceptionHandler.new(nil, env)
148
+ end
149
+
150
+ it 'ignored Cookie' do
151
+ @handler.http_headers.must_equal('User-Agent' => 'test_user_agent')
152
+ end
153
+ end
154
+
155
+ describe '#hash_as_table' do
156
+ it 'renders as an HTML table' do
157
+ expected = '<table><tr><th>Value 1</th><td>A</td></tr><tr><th>Value B</th><td>2</td></tr></table>'
158
+ PartyFoul::ExceptionHandler.new(nil, nil).hash_as_table('Value 1' => 'A', 'Value B' => 2).must_equal expected
159
+ end
160
+ end
133
161
  end
@@ -21,7 +21,7 @@ module MiniTest::Expectations
21
21
  end
22
22
 
23
23
  def clean_up_party
24
- %w{github oauth_token endpoint owner repo ignored_exceptions}.each do |attr|
24
+ %w{github oauth_token endpoint owner repo ignored_exceptions adapter issue_template comment_template filtered_http_headers}.each do |attr|
25
25
  PartyFoul.send("#{attr}=", nil)
26
26
  end
27
27
  end
@@ -1,18 +1,21 @@
1
1
  PartyFoul.configure do |config|
2
2
  # the collection of exceptions to be ignored by PartyFoul
3
3
  # The constants here *must* be represented as strings
4
- config.ignored_exceptions = ['ActiveRecord::RecordNotFound', 'ActionController::RoutingError']
4
+ config.ignored_exceptions = ['ActiveRecord::RecordNotFound', 'ActionController::RoutingError']
5
+
6
+ # The names of the HTTP headers to not report
7
+ config.filtered_http_headers = ['Cookie']
5
8
 
6
9
  # The OAuth token for the account that will be opening the issues on Github
7
- config.oauth_token = 'test_token'
10
+ config.oauth_token = 'test_token'
8
11
 
9
12
  # The API endpoint for Github. Unless you are hosting a private
10
13
  # instance of Enterprise Github you do not need to include this
11
- config.endpoint = 'test_endpoint'
14
+ config.endpoint = 'test_endpoint'
12
15
 
13
16
  # The organization or user that owns the target repository
14
- config.owner = 'test_login'
17
+ config.owner = 'test_login'
15
18
 
16
19
  # The repository for this application
17
- config.repo = 'test_repo'
20
+ config.repo = 'test_repo'
18
21
  end
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: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -193,7 +193,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
193
193
  version: '0'
194
194
  segments:
195
195
  - 0
196
- hash: -1173897567857159302
196
+ hash: 3070115477891214928
197
197
  required_rubygems_version: !ruby/object:Gem::Requirement
198
198
  none: false
199
199
  requirements:
@@ -202,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
202
  version: '0'
203
203
  segments:
204
204
  - 0
205
- hash: -1173897567857159302
205
+ hash: 3070115477891214928
206
206
  requirements: []
207
207
  rubyforge_project:
208
208
  rubygems_version: 1.8.23