project_106 1.0.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/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +37 -0
- data/Rakefile +1 -0
- data/app/controllers/project106/error_controller.rb +7 -0
- data/bin/project_106 +4 -0
- data/config/routes.rb +3 -0
- data/lib/generators/project106/install_generator.rb +46 -0
- data/lib/generators/project106/templates/initializer.rb +3 -0
- data/lib/node_handler.js +54 -0
- data/lib/project_106.rb +112 -0
- data/lib/project_106/configuration.rb +13 -0
- data/lib/project_106/engine.rb +3 -0
- data/lib/project_106/exception_reporter.rb +14 -0
- data/lib/project_106/log_reporter.rb +13 -0
- data/lib/project_106/middleware/rails/show_exceptions.rb +37 -0
- data/lib/project_106/railtie.rb +35 -0
- data/lib/project_106/request_data_extractor.rb +134 -0
- data/lib/project_106/version.rb +3 -0
- metadata +144 -0
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 WeboniseLab
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Project106
|
2
|
+
|
3
|
+
Project 106 is a errors and exception tracking system
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'project_106'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
Go to Terminal and Run
|
18
|
+
|
19
|
+
project_106
|
20
|
+
|
21
|
+
This will install node_js in your system
|
22
|
+
Skip this if you have node js already install.
|
23
|
+
|
24
|
+
|
25
|
+
Then run
|
26
|
+
|
27
|
+
rails generate project106:install yourapikey
|
28
|
+
|
29
|
+
This will add issential files to your rails app.
|
30
|
+
|
31
|
+
## Contributing
|
32
|
+
|
33
|
+
1. Fork it
|
34
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
35
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
36
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
37
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/project_106
ADDED
data/config/routes.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/named_base'
|
3
|
+
|
4
|
+
module Project106
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
argument :access_token, :type => :string, :banner => 'access_token', :default => :use_env_sentinel
|
7
|
+
|
8
|
+
source_root File.expand_path("../templates", __FILE__)
|
9
|
+
|
10
|
+
def create_initializer
|
11
|
+
say "creating initializer..."
|
12
|
+
if access_token_configured?
|
13
|
+
say "It looks like you've already configured Project106."
|
14
|
+
say "To re-create the config file, remove it first: config/initializers/project_106.rb"
|
15
|
+
exit
|
16
|
+
end
|
17
|
+
|
18
|
+
if access_token === :use_env_sentinel
|
19
|
+
say "Generator run without an access token; assuming you want to configure using an environment variable."
|
20
|
+
say "You'll need to add an environment variable PROJECT106_ACCESS_TOKEN with your access token:"
|
21
|
+
say "\n$ export PROJECT106_ACCESS_TOKEN=yourtokenhere"
|
22
|
+
say "\nIf that's not what you wanted to do:"
|
23
|
+
say "\n$ rm config/initializers/project_106.rb"
|
24
|
+
say "$ rails generate project106:install yourtokenhere"
|
25
|
+
say "\n"
|
26
|
+
else
|
27
|
+
say "access token: " << access_token
|
28
|
+
end
|
29
|
+
|
30
|
+
template 'initializer.rb', 'config/initializers/project_106.rb',
|
31
|
+
:assigns => { :access_token => access_token_expr }
|
32
|
+
end
|
33
|
+
|
34
|
+
def access_token_expr
|
35
|
+
if access_token === :use_env_sentinel
|
36
|
+
"ENV['PROJECT106_ACCESS_TOKEN']"
|
37
|
+
else
|
38
|
+
"'#{access_token}'"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def access_token_configured?
|
43
|
+
File.exists?('config/initializers/project_106.rb')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/node_handler.js
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
var http = require('http');
|
2
|
+
|
3
|
+
// catch the data from command line argument
|
4
|
+
var data = process.argv[2]
|
5
|
+
|
6
|
+
// parsing data
|
7
|
+
jdata = JSON.parse(data);
|
8
|
+
|
9
|
+
// create the JSON object
|
10
|
+
jsonObject = JSON.stringify(jdata);
|
11
|
+
|
12
|
+
// prepare the header
|
13
|
+
var postheaders = {
|
14
|
+
'Content-Type' : 'application/json',
|
15
|
+
'Content-Length' : Buffer.byteLength(jsonObject, 'utf8')
|
16
|
+
};
|
17
|
+
|
18
|
+
// the post options
|
19
|
+
var optionspost = {
|
20
|
+
host : 'beta.erreport.io',
|
21
|
+
path : '/api/v1/error_reports',
|
22
|
+
method : 'POST',
|
23
|
+
headers : postheaders
|
24
|
+
};
|
25
|
+
|
26
|
+
console.info('Options prepared:');
|
27
|
+
console.info(optionspost);
|
28
|
+
console.info('Do the POST call');
|
29
|
+
|
30
|
+
// do the POST call
|
31
|
+
var reqPost = http.request(optionspost, function(res) {
|
32
|
+
console.log("statusCode: ", res.statusCode);
|
33
|
+
console.log("headers: ", res.headers);
|
34
|
+
|
35
|
+
res.on('data', function(d) {
|
36
|
+
console.info('POST result:\n');
|
37
|
+
data = JSON.parse(d)
|
38
|
+
console.error('\n[Project-106] Response status');
|
39
|
+
console.error(data['status']);
|
40
|
+
console.error('\n[Project-106] Response Message');
|
41
|
+
console.error(data['message']);
|
42
|
+
console.info('\n\nPOST completed');
|
43
|
+
console.error("\n\n[Project-106] Exception Reporting Finished to Project-106 server using node js");
|
44
|
+
});
|
45
|
+
});
|
46
|
+
|
47
|
+
// write the json data
|
48
|
+
reqPost.write(jsonObject);
|
49
|
+
reqPost.end();
|
50
|
+
// handle error
|
51
|
+
reqPost.on('error', function(e) {
|
52
|
+
console.error("[Project-106] Error while reporting exception to project-106 in node support");
|
53
|
+
console.error(e);
|
54
|
+
});
|
data/lib/project_106.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require "json"
|
3
|
+
require "shellwords"
|
4
|
+
require "fileutils"
|
5
|
+
require 'benchmark'
|
6
|
+
require "project_106/version"
|
7
|
+
require "project_106/configuration"
|
8
|
+
require 'project_106/exception_reporter'
|
9
|
+
require 'project_106/log_reporter'
|
10
|
+
require 'rails'
|
11
|
+
require "project_106/railtie" if defined? Rails
|
12
|
+
require "active_support/dependencies"
|
13
|
+
|
14
|
+
module Project106
|
15
|
+
include LogReporter
|
16
|
+
|
17
|
+
# install nodeJS on client machine
|
18
|
+
def self.install_nodejs
|
19
|
+
puts "Installing nodejs dependencies\n"
|
20
|
+
`sudo apt-get install python-software-properties python g++ make`
|
21
|
+
puts "Adding nodejs ppa\n"
|
22
|
+
`sudo add-apt-repository ppa:chris-lea/node.js`
|
23
|
+
puts "Updating system\n"
|
24
|
+
`sudo apt-get update`
|
25
|
+
puts "Installing nodeJS\n"
|
26
|
+
`sudo apt-get install nodejs`
|
27
|
+
puts "NodeJS Installed ...\n"
|
28
|
+
end
|
29
|
+
|
30
|
+
class << self
|
31
|
+
attr_writer :configuration
|
32
|
+
include LogReporter
|
33
|
+
|
34
|
+
def configure
|
35
|
+
yield(configuration)
|
36
|
+
end
|
37
|
+
|
38
|
+
def configuration
|
39
|
+
@configuration ||= Configuration.new
|
40
|
+
end
|
41
|
+
|
42
|
+
# give memory usage of process using unix shell command
|
43
|
+
# def get_memory_usage
|
44
|
+
# `ps -o rss= -p #{Process.pid}`.to_i
|
45
|
+
# end
|
46
|
+
|
47
|
+
def append_access_token_to_data(data)
|
48
|
+
data[:api_key] = configuration.access_token
|
49
|
+
data
|
50
|
+
end
|
51
|
+
|
52
|
+
# Making api call to send error report to project-106 server
|
53
|
+
def report_exception_to_project_106_server(data)
|
54
|
+
|
55
|
+
# Append api_key to data
|
56
|
+
data = append_access_token_to_data(data)
|
57
|
+
|
58
|
+
# If handler == node then request data will be pass to nodejs to make api call
|
59
|
+
# If handler == ruby then request data will be directly pass through ruby api call
|
60
|
+
handler = "node"
|
61
|
+
begin
|
62
|
+
# benchmarking code
|
63
|
+
# Benchmark.bm do |bm|
|
64
|
+
|
65
|
+
if handler == "node"
|
66
|
+
# bm.report("Node") do
|
67
|
+
|
68
|
+
# before = get_memory_usage
|
69
|
+
# report_log "BEFORE: " + before.to_s
|
70
|
+
|
71
|
+
|
72
|
+
# Pass request data to node_handler.js which will make api call to project-106-server
|
73
|
+
# Stringifing data
|
74
|
+
jdata = data.to_json
|
75
|
+
# Get node_handler path
|
76
|
+
node_handler = File.join(File.dirname(__FILE__), "node_handler.js")
|
77
|
+
report_log "[Project-106] Calling NODE script to send data to project-106 server"
|
78
|
+
`node #{node_handler} #{Shellwords.escape(jdata)}`
|
79
|
+
|
80
|
+
# after = get_memory_usage
|
81
|
+
# report_log "AFTER: " + (after).to_s
|
82
|
+
# report_log "Node Memory Usage: " + (after-before).to_s
|
83
|
+
|
84
|
+
# end
|
85
|
+
else
|
86
|
+
# bm.report("Ruby") do
|
87
|
+
|
88
|
+
# before = get_memory_usage
|
89
|
+
# report_log "BEFORE: " + before.to_s
|
90
|
+
|
91
|
+
# Ruby api call to pass request data to project-106-server
|
92
|
+
report_log "[Project-106] Calling RUBY script to send data to project-106 server"
|
93
|
+
url = URI.parse('http://localhost:3000/api/v1/error_reports')
|
94
|
+
resp = Net::HTTP.post_form(url, data)
|
95
|
+
report_log "[Project-106] Exception Reported to Project-106 server"
|
96
|
+
# after = get_memory_usage
|
97
|
+
# report_log "AFTER: " + (after).to_s
|
98
|
+
# report_log "Ruby Memory Usage: " + (after-before).to_s
|
99
|
+
|
100
|
+
# end
|
101
|
+
end
|
102
|
+
|
103
|
+
# end
|
104
|
+
rescue => e
|
105
|
+
report_log "[Project-106] Error reporting exception to Project-106: #{e}"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Require engine
|
112
|
+
require "project_106/engine"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'project_106/log_reporter'
|
2
|
+
require 'project_106/request_data_extractor'
|
3
|
+
|
4
|
+
module Project106
|
5
|
+
module ExceptionReporter
|
6
|
+
include LogReporter
|
7
|
+
include RequestDataExtractor
|
8
|
+
def report_exception_to_project_106(env, exception)
|
9
|
+
report_log "[Project106] Reporting Exception: #{exception}", :error
|
10
|
+
req_data = extract_request_data_from_rack(env, exception)
|
11
|
+
Project106.report_exception_to_project_106_server(req_data)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Project106
|
2
|
+
module LogReporter
|
3
|
+
# Call to the rails default logger method with message and level
|
4
|
+
# level can be error, debug, info, etc
|
5
|
+
def report_log(message, level = :debug)
|
6
|
+
if defined?(Rails)
|
7
|
+
::Rails.logger.send(level, message)
|
8
|
+
else
|
9
|
+
puts message
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Project106
|
2
|
+
module Middleware
|
3
|
+
module Rails
|
4
|
+
module ShowExceptions
|
5
|
+
include ExceptionReporter
|
6
|
+
|
7
|
+
# catching rails middleware render_exception method call and
|
8
|
+
# doing project-106 error catching task and
|
9
|
+
# again continue with rails render_exception method
|
10
|
+
def render_exception_with_project_106(env, exception)
|
11
|
+
key = 'action_dispatch.show_detailed_exceptions'
|
12
|
+
|
13
|
+
# don't report production exceptions here as it is done below
|
14
|
+
# in call_with_project_106() when show_detailed_exception is false
|
15
|
+
if not env.has_key?(key) or env[key]
|
16
|
+
# sending exception to project-106 to collect exception data
|
17
|
+
report_exception_to_project_106(env, exception)
|
18
|
+
end
|
19
|
+
render_exception_without_project_106(env, exception)
|
20
|
+
end
|
21
|
+
|
22
|
+
def call_with_project_106(env)
|
23
|
+
call_without_project_106(env)
|
24
|
+
rescue => exception
|
25
|
+
# won't reach here if show_detailed_exceptions is true
|
26
|
+
report_exception_to_project_106(env, exception)
|
27
|
+
raise exception
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.included(base)
|
31
|
+
base.send(:alias_method_chain, :call, :project_106)
|
32
|
+
base.send(:alias_method_chain, :render_exception, :project_106)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'active_support/all'
|
2
|
+
require 'rails'
|
3
|
+
require 'project_106/log_reporter'
|
4
|
+
require 'project_106/request_data_extractor'
|
5
|
+
|
6
|
+
module Project106
|
7
|
+
class Railtie < Rails::Railtie
|
8
|
+
include RequestDataExtractor
|
9
|
+
include LogReporter
|
10
|
+
|
11
|
+
config.after_initialize do
|
12
|
+
# Catch uninitialized typed errors in ErrorController#routing
|
13
|
+
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, start, finish, id, payload|
|
14
|
+
if payload[:exception].present?
|
15
|
+
elsif payload[:controller] == "Project106::ErrorController"
|
16
|
+
req_data = extract_request_data_from_payload(payload)
|
17
|
+
Project106.report_exception_to_project_106_server(req_data)
|
18
|
+
report_log "[Project-106] Uninitialized Routing Error"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Catch all other rails error except routing error in the same way as rails did
|
23
|
+
if defined?(ActionDispatch::DebugExceptions)
|
24
|
+
# Rails 3.2.x
|
25
|
+
require 'project_106/middleware/rails/show_exceptions'
|
26
|
+
ActionDispatch::DebugExceptions.send(:include, Project106::Middleware::Rails::ShowExceptions)
|
27
|
+
elsif defined?(ActionDispatch::ShowExceptions)
|
28
|
+
# Rails 3.0.x and 3.1.x
|
29
|
+
require 'project_106/middleware/rails/show_exceptions'
|
30
|
+
ActionDispatch::ShowExceptions.send(:include, Project106::Middleware::Rails::ShowExceptions)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
module Project106
|
2
|
+
module RequestDataExtractor
|
3
|
+
# Collecting data from rack to be send to project-106 server
|
4
|
+
def extract_request_data_from_rack(env, exception)
|
5
|
+
rack_req = Rack::Request.new(env)
|
6
|
+
request_params = project_106_request_params(env)
|
7
|
+
|
8
|
+
get_params = project_106_get_params(rack_req)
|
9
|
+
post_params = project_106_post_params(rack_req)
|
10
|
+
cookies = project_106_request_cookies(rack_req)
|
11
|
+
session = env['rack.session.options']
|
12
|
+
|
13
|
+
params = request_params.merge(get_params).merge(post_params)
|
14
|
+
|
15
|
+
# Collect data from rails env.
|
16
|
+
request_data = {
|
17
|
+
:params => params,
|
18
|
+
:url => project_106_url(env),
|
19
|
+
:user_ip => project_106_user_ip(env),
|
20
|
+
:headers => project_106_headers(env),
|
21
|
+
:method => project_106_request_method(env),
|
22
|
+
:error => {
|
23
|
+
:message => exception.message,
|
24
|
+
:backtrace => exception.backtrace,
|
25
|
+
:error_controller => params[:controller],
|
26
|
+
:error_action => params[:action]
|
27
|
+
}
|
28
|
+
}
|
29
|
+
# Excluding session and cookies from request data
|
30
|
+
# :cookies => cookies,
|
31
|
+
# :session => session,
|
32
|
+
|
33
|
+
# Data to be sent to project-106 server through api call in case of rails error except routing
|
34
|
+
# sorting out data from request_data which might have extra data.
|
35
|
+
# note : remove this once finalize data to be send to project-106 server
|
36
|
+
# req_data = {
|
37
|
+
# "error_controller" => request_data[:params][:controller],
|
38
|
+
# "error_action" => request_data[:params][:action],
|
39
|
+
# "error_format" => "Not Assigned",
|
40
|
+
# "method" => request_data[:method],
|
41
|
+
# "path" => request_data[:url],
|
42
|
+
# "error" => "Not Assigned",
|
43
|
+
# "error_info" => exception.inspect
|
44
|
+
# }
|
45
|
+
end
|
46
|
+
|
47
|
+
# Data to be sent to project-106 server through api call in case of routing error
|
48
|
+
def extract_request_data_from_payload(payload)
|
49
|
+
|
50
|
+
# Note : remove this once finalize data to be send to project-106 server
|
51
|
+
|
52
|
+
# {
|
53
|
+
# "error_controller" => payload[:controller],
|
54
|
+
# "error_action" => payload[:action],
|
55
|
+
# "error_format" => payload[:format],
|
56
|
+
# "method" => payload[:method],
|
57
|
+
# "path" => payload[:path],
|
58
|
+
# "error" => "routing error",
|
59
|
+
# "error_info" => "It may be that the user have misspelled or devs have forgot to ensure the path"
|
60
|
+
# }
|
61
|
+
|
62
|
+
request_data = {
|
63
|
+
:params => "",
|
64
|
+
:url => payload[:path],
|
65
|
+
:user_ip => "",
|
66
|
+
:headers => "",
|
67
|
+
:method => payload[:method],
|
68
|
+
:error => {
|
69
|
+
:message => "routing error",
|
70
|
+
:backtrace => "",
|
71
|
+
:error_controller => payload[:controller],
|
72
|
+
:error_action => payload[:action],
|
73
|
+
}
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
# Methods for collecting data required in method "extract_request_data_from_rack"
|
80
|
+
# from rack
|
81
|
+
def project_106_request_params(env)
|
82
|
+
route = ::Rails.application.routes.recognize_path(env['PATH_INFO']) rescue {}
|
83
|
+
{
|
84
|
+
:controller => route[:controller],
|
85
|
+
:action => route[:action],
|
86
|
+
:format => route[:format],
|
87
|
+
}.merge(env['action_dispatch.request.parameters'] || {})
|
88
|
+
end
|
89
|
+
|
90
|
+
def project_106_get_params(rack_req)
|
91
|
+
rack_req.GET
|
92
|
+
rescue
|
93
|
+
{}
|
94
|
+
end
|
95
|
+
|
96
|
+
def project_106_post_params(rack_req)
|
97
|
+
rack_req.POST
|
98
|
+
rescue
|
99
|
+
{}
|
100
|
+
end
|
101
|
+
|
102
|
+
def project_106_request_cookies(rack_req)
|
103
|
+
rack_req.cookies
|
104
|
+
rescue
|
105
|
+
{}
|
106
|
+
end
|
107
|
+
|
108
|
+
def project_106_url(env)
|
109
|
+
scheme = env['rack.url_scheme']
|
110
|
+
host = env['HTTP_HOST'] || env['SERVER_NAME']
|
111
|
+
path = env['ORIGINAL_FULLPATH'] || env['REQUEST_URI']
|
112
|
+
unless path.nil? || path.empty?
|
113
|
+
path = '/' + path.to_s if path.to_s.slice(0, 1) != '/'
|
114
|
+
end
|
115
|
+
|
116
|
+
[scheme, '://', host, path].join
|
117
|
+
end
|
118
|
+
|
119
|
+
def project_106_user_ip(env)
|
120
|
+
(env['action_dispatch.remote_ip'] || env['HTTP_X_REAL_IP'] || env['HTTP_X_FORWARDED_FOR'] || env['REMOTE_ADDR']).to_s
|
121
|
+
end
|
122
|
+
|
123
|
+
def project_106_headers(env)
|
124
|
+
env.keys.grep(/^HTTP_/).map do |header|
|
125
|
+
name = header.gsub(/^HTTP_/, '').split('_').map(&:capitalize).join('-')
|
126
|
+
{ name => env[header] }
|
127
|
+
end.inject(:merge)
|
128
|
+
end
|
129
|
+
|
130
|
+
def project_106_request_method(env)
|
131
|
+
env['REQUEST_METHOD'] || env[:method]
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
metadata
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: project_106
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Webonise Lab
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-04-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.3'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: activesupport
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 3.0.0
|
54
|
+
- - <
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '4.0'
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 3.0.0
|
65
|
+
- - <
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '4.0'
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: rails
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.0.0
|
76
|
+
- - <
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '4.0'
|
79
|
+
type: :runtime
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 3.0.0
|
87
|
+
- - <
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '4.0'
|
90
|
+
description: Error and Exception Tracking.
|
91
|
+
email:
|
92
|
+
- apurva@weboniselab.com
|
93
|
+
- ketan@weboniselab.com
|
94
|
+
executables:
|
95
|
+
- project_106
|
96
|
+
extensions: []
|
97
|
+
extra_rdoc_files: []
|
98
|
+
files:
|
99
|
+
- app/controllers/project106/error_controller.rb
|
100
|
+
- lib/node_handler.js
|
101
|
+
- lib/project_106/version.rb
|
102
|
+
- lib/project_106/configuration.rb
|
103
|
+
- lib/project_106/exception_reporter.rb
|
104
|
+
- lib/project_106/request_data_extractor.rb
|
105
|
+
- lib/project_106/railtie.rb
|
106
|
+
- lib/project_106/middleware/rails/show_exceptions.rb
|
107
|
+
- lib/project_106/log_reporter.rb
|
108
|
+
- lib/project_106/engine.rb
|
109
|
+
- lib/project_106.rb
|
110
|
+
- lib/generators/project106/templates/initializer.rb
|
111
|
+
- lib/generators/project106/install_generator.rb
|
112
|
+
- config/routes.rb
|
113
|
+
- LICENSE.txt
|
114
|
+
- Rakefile
|
115
|
+
- Gemfile
|
116
|
+
- README.md
|
117
|
+
- bin/project_106
|
118
|
+
homepage: http://git.weboniselab.com/webonise-lab/project-106
|
119
|
+
licenses:
|
120
|
+
- MIT
|
121
|
+
post_install_message:
|
122
|
+
rdoc_options: []
|
123
|
+
require_paths:
|
124
|
+
- lib
|
125
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
126
|
+
none: false
|
127
|
+
requirements:
|
128
|
+
- - ! '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
+
none: false
|
133
|
+
requirements:
|
134
|
+
- - ! '>='
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
requirements: []
|
138
|
+
rubyforge_project:
|
139
|
+
rubygems_version: 1.8.24
|
140
|
+
signing_key:
|
141
|
+
specification_version: 3
|
142
|
+
summary: Project 106 is a errors and exception tracking system
|
143
|
+
test_files: []
|
144
|
+
has_rdoc:
|