fanforce-internal-errors 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Y2RiMjkxY2U1NjZlMTk2NGM5OTFiZGViMWEyMjA1YzYxZGMzZjZmMQ==
5
+ data.tar.gz: !binary |-
6
+ MzRmMmMzNDdmOGRhNjYwNmQzZDA1ZjAzMDZhMDIxOTBiYThmZGE4Mg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NjA0NjY3OWE4ZTIyMGFkMGZhZWI3YjZiYTZiODE0NzNiZjkwYzU0ODQ0ZmM3
10
+ MzJiNzAzMTQ3MWFiYmI2ZjBkMjRkNTI1ZTcyM2JjOThhNjJhZWFmMmRiY2Ji
11
+ YjlmNzc2YmY0MTU3MTg1NzVkZmNkNzRjMDM2ODhmNmE2NjMzNTA=
12
+ data.tar.gz: !binary |-
13
+ YzgyMTExNzM2MzNjM2QwMjZmZDNmNjMwNWVjMWUzYjhkMWQxZmQ2NTI5MDhh
14
+ YjZmZmQzZGUyY2I4MTA1Zjk1YWI0MDJlNThhYzIyNzYwZjhkNjMyY2RmNWRm
15
+ YmEzMzkxYzY5ZTM2MTUyYTRhMzY5M2Q5YzQwZmNkM2Y3N2I5MzA=
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
19
+ .DS_Store
20
+ .idea/
21
+ .idea/*
22
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ fanforce-internal-errors
2
+ ==
3
+
4
+ Internal errors library used by the Fanforce codebase.
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'fileutils'
4
+ include FileUtils
5
+
6
+ # Default Rake task is compile
7
+ #task :default => :compile
8
+
9
+ ########################################################################
10
+
11
+ Rake::TestTask.new do |t|
12
+ t.libs.push "lib"
13
+ t.libs.push "test"
14
+ t.pattern = 'test/**/*_test.rb'
15
+ t.verbose = false
16
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fanforce/errors/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'fanforce-internal-errors'
8
+ gem.version = Fanforce::Errors::VERSION
9
+ gem.date = '2012-10-19'
10
+ gem.summary = %q{Internal errors library used by the Fanforce codebase.}
11
+ gem.authors = ['Caleb Clark']
12
+ gem.email = ['cclark@fanforce.com']
13
+ gem.homepage = 'http://github.com/mlabs/fanforce-internal-errors'
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
+ gem.require_paths = ['lib']
18
+
19
+ gem.add_runtime_dependency 'fanforce-internal-utils'
20
+ end
@@ -0,0 +1,155 @@
1
+ class Fanforce::Error < StandardError
2
+ require 'fanforce/utils'
3
+ include Fanforce::Utils
4
+
5
+ attr_reader :public_errors, :env
6
+
7
+ def for(*args)
8
+ self.new(*args)
9
+ end
10
+
11
+ def initialize(*errors)
12
+ if errors[0].is_a?(String) and errors[1].is_a?(Hash) and is_blank?(errors[1][:message])
13
+ tmp = errors.shift() and errors[0][:message] = tmp
14
+ end
15
+ @public_errors = format_errors(errors)
16
+ @env = Fanforce.env
17
+ super(default_message.to_s)
18
+ end
19
+
20
+ def format_errors(raw_errors)
21
+ raw_errors.is_a?(Array) ? raw_errors.inject([]) {|errors, e| errors << format_error(e) } : [format_error(raw_errors)]
22
+ end
23
+
24
+ def format_error(raw_error)
25
+ return {message: is_blank?(raw_error) ? default_message : raw_error.to_s} if !raw_error.is_a?(Hash)
26
+ raw_error = symbolize_keys(raw_error)
27
+ error = { message: is_blank?(raw_error[:message]) ? default_message : raw_error[:message].to_s }
28
+ error[:resource] = raw_error[:resource].to_s if is_present?(raw_error[:resource])
29
+ error[:code] = (is_blank?(raw_error[:code]) or !valid_error_codes.include? raw_error[:code].to_sym) ? default_error_code : raw_error[:code].to_s
30
+ error[:field] = raw_error[:field].to_s if is_present?(raw_error[:field])
31
+ error[:fields] = raw_error[:fields].map {|f| f.to_s } if is_present?(raw_error[:fields])
32
+ error
33
+ end
34
+
35
+ def curl_command
36
+ return nil if is_blank?(@env[:request_method]) or is_blank?(@env[:request_url])
37
+ Fanforce::Utils.curl_command(@env[:request_method], @env[:request_url], @env[:request_params])
38
+ end
39
+
40
+ def code; 500 end
41
+ def default_message; end
42
+ def valid_error_codes; [] end
43
+ def default_error_code; end
44
+
45
+ end
46
+
47
+ class Fanforce::Error::CorruptRequest < Fanforce::Error # Request is missing something or invalid
48
+ def code; 400 end
49
+ def default_message; 'Corrupt Request' end
50
+ def valid_error_codes; [:blank_field, :missing_field, :invalid_association, :invalid_field] end
51
+ def default_error_code; :unknown end
52
+ end
53
+
54
+ class Fanforce::Error::Unauthorized < Fanforce::Error # Could not successfully authenticate
55
+ def code; 401 end
56
+ def default_message; 'Unauthorized Request' end
57
+ def valid_error_codes; [:unauthorized, :unknown_login] end
58
+ def default_error_code; :unauthorized end
59
+ end
60
+
61
+ class Fanforce::Error::Forbidden < Fanforce::Error # Current API key does not allow access
62
+ def code; 403 end
63
+ def default_message; 'API Key Forbids Access' end
64
+ def valid_error_codes; [:weak_api_key] end
65
+ def default_error_code; :weak_api_key end
66
+ end
67
+
68
+ class Fanforce::Error::NotFound < Fanforce::Error # Method or record could not be found
69
+ def code; 404 end
70
+ def default_message; 'Not Found' end
71
+ def valid_error_codes; [:record_not_found, :method_not_found] end
72
+ def default_error_code; :unknown end
73
+ end
74
+
75
+ class Fanforce::Error::RequestFailed < Fanforce::Error # Request has correct fields but failed for another reason
76
+ def code; 422 end
77
+ def default_message; 'Request Failed' end
78
+ def valid_error_codes; [:invalid_data, :record_already_exists, :maxed_capacity] end
79
+ def default_error_code; :unknown end
80
+ end
81
+
82
+ class Fanforce::Error::InternalError < Fanforce::Error
83
+ def code; 500 end
84
+ def default_message; 'Request Failed for Internal Reason' end
85
+ def valid_error_codes; [:internal_error, :invalid_fanforce_auth, :user_tampering, :third_party_error] end
86
+ def default_error_code; :unknown end
87
+ end
88
+
89
+ class Fanforce::Error::WebhookFailed < Fanforce::Error # Parameters were valid but request failed for another reason
90
+ attr_reader :request_url, :request_params, :response_code, :response_body, :request_curl_command
91
+ def code; 500 end
92
+ def default_message; 'Webhook Failed' end
93
+ def valid_error_codes; [:third_party_error] end
94
+ def default_error_code; :unknown end
95
+
96
+ def initialize(hash)
97
+ @request_url = hash[:request_url]
98
+ @request_params = hash[:request_params]
99
+ @response_code = hash[:response_code]
100
+ @response_body = hash[:response_body]
101
+ @request_curl_command = "curl -X POST -d \"#{@request_params.to_param}\" #{@request_url}"
102
+ super("Callback returned an HTTP response code of #{@response_code} when only 200 and 201 are allowed.")
103
+ end
104
+ end
105
+
106
+ class Fanforce::Error::AddonFailed < Fanforce::Error # A 3rd-party addon crapped out
107
+ attr_reader :plugin_dev_error
108
+ def default_message; 'Third-Party Plugin Error' end
109
+ def valid_error_codes; [:third_party_error] end
110
+ def default_error_code; :third_party_error end
111
+
112
+ def initialize(plugin_type, plugin_id, e, msg, &block)
113
+ plugin_dev_error = {}
114
+ plugin_dev_error[:problem] = msg
115
+ if e.is_a?(Fanforce::Errors::WebhookFailed)
116
+ plugin_dev_error[:request_url] = e.request_url
117
+ plugin_dev_error[:request_params] = e.request_params
118
+ plugin_dev_error[:response_code] = e.response_code
119
+ plugin_dev_error[:response_body] = e.response_body.to_s
120
+ plugin_dev_error[:curl_command] = "curl -X POST -d \"#{e.request_params.to_param}\" #{e.request_url}"
121
+ end
122
+ @plugin_dev_errors = e.respond_to?(:plugin_dev_errors) ? e.plugin_dev_errors : []
123
+ @plugin_dev_errors << plugin_dev_error
124
+
125
+ self.class.handler_blocks.each {|block| block.call(plugin_type, plugin_id, plugin_dev_error, e.backtrace) }
126
+ super(msg)
127
+ end
128
+
129
+ def self.handler(&block)
130
+ handler_blocks << block
131
+ end
132
+
133
+ def self.handler_blocks
134
+ @handler_blocks ||= []
135
+ end
136
+ end
137
+
138
+ module Fanforce::Errors
139
+ CorruptRequest = Fanforce::Error::CorruptRequest
140
+ Unauthorized = Fanforce::Error::Unauthorized
141
+ Forbidden = Fanforce::Error::Forbidden
142
+ NotFound = Fanforce::Error::NotFound
143
+ RequestFailed = Fanforce::Error::RequestFailed
144
+ InternalError = Fanforce::Error::InternalError
145
+ WebhookFailed = Fanforce::Error::WebhookFailed
146
+ AddonFailed = Fanforce::Error::AddonFailed
147
+
148
+ def self.format_admin_details(e, errors=[], additional_options={})
149
+ admin_details = {error_class: e.class.name, public_response: errors}
150
+ admin_details[:curl_command] = e.curl_command if e.respond_to?(:curl_command)
151
+ admin_details[:raw_message] = e.message
152
+ admin_details.merge(additional_options)
153
+ end
154
+
155
+ end
@@ -0,0 +1,5 @@
1
+ class Fanforce
2
+ module Errors
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Fanforce;
2
+ require_relative 'errors/version'
3
+ require_relative 'errors/errors'
4
+ end
5
+
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fanforce-internal-errors
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Caleb Clark
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2012-10-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fanforce-internal-utils
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description:
28
+ email:
29
+ - cclark@fanforce.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - .gitignore
35
+ - Gemfile
36
+ - README.md
37
+ - Rakefile
38
+ - fanforce-internal-errors.gemspec
39
+ - lib/fanforce/errors.rb
40
+ - lib/fanforce/errors/errors.rb
41
+ - lib/fanforce/errors/version.rb
42
+ homepage: http://github.com/mlabs/fanforce-internal-errors
43
+ licenses: []
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.0.3
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Internal errors library used by the Fanforce codebase.
65
+ test_files: []