solid_errors 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 760689e543a0af0e87d8998ddcbb6f94611a5b9da8ad2b9d2a7fc11da1ceaa27
4
- data.tar.gz: 83ecabee79fb2ffe3572922e6b97b1a6895b935ec491d0df9d858632cae8d4c2
3
+ metadata.gz: e6489cd6e89af263eefa8d87f35847486c58ee4c8d6cef4302d0cf695a933aba
4
+ data.tar.gz: 28551481557da1e59d45f570122200fcfa2f82fbe928ff99c1e229a5e2093d5d
5
5
  SHA512:
6
- metadata.gz: 40cf2bebf1c854caf6bce78db0b99e03a4a3e05b12fe5ccc254d2cfd0448b924610bee0bc7306237fac7ce09d48c93423ed5299cf82481d96e2fa145648d5965
7
- data.tar.gz: b87fc4639cd99f4e326dd8bbc37c8c5d613209b83c5286f25bdd8f1f30d07d13e5ba6b4ad6e1419e4f57074124ef0feba78a5583622114bd01b9a0aef2069b3b
6
+ metadata.gz: 7da8e7d68a5cd3c700e19e683a3a7e4f344b0cc14b6c0c8674559bd68a97d05d322fb01aed8c9850eb572c4ad69841831618fcd430a52b4647a333a8a3a9cb50
7
+ data.tar.gz: 47edd2b37637a5fd5ca15766586f13534b8dea866079e709dc77fd35731f85639b86fe2d3c4369318ec8b592d0d66d5bf6aa25d979dba889e0169ef2fe123002
@@ -0,0 +1,91 @@
1
+ module SolidErrors
2
+ # adapted from: https://github.com/honeybadger-io/honeybadger-ruby/blob/master/lib/honeybadger/util/sanitizer.rb
3
+ class Sanitizer
4
+ BASIC_OBJECT = '#<BasicObject>'.freeze
5
+ DEPTH = '[DEPTH]'.freeze
6
+ RAISED = '[RAISED]'.freeze
7
+ RECURSION = '[RECURSION]'.freeze
8
+ TRUNCATED = '[TRUNCATED]'.freeze
9
+ MAX_STRING_SIZE = 65536
10
+
11
+ def self.sanitize(data)
12
+ @sanitizer ||= new
13
+ @sanitizer.sanitize(data)
14
+ end
15
+
16
+ def initialize(max_depth: 20)
17
+ @max_depth = max_depth
18
+ end
19
+
20
+ def sanitize(data, depth = 0, stack = nil)
21
+ return BASIC_OBJECT if basic_object?(data)
22
+
23
+ if recursive?(data)
24
+ return RECURSION if stack && stack.include?(data.object_id)
25
+
26
+ stack = stack ? stack.dup : Set.new
27
+ stack << data.object_id
28
+ end
29
+
30
+ case data
31
+ when Hash
32
+ return DEPTH if depth >= max_depth
33
+
34
+ new_hash = {}
35
+ data.each do |key, value|
36
+ key = key.kind_of?(Symbol) ? key : sanitize(key, depth+1, stack)
37
+ value = sanitize(value, depth+1, stack)
38
+ new_hash[key] = value
39
+ end
40
+ new_hash
41
+ when Array, Set
42
+ return DEPTH if depth >= max_depth
43
+
44
+ data.to_a.map do |value|
45
+ sanitize(value, depth+1, stack)
46
+ end
47
+ when Numeric, TrueClass, FalseClass, NilClass
48
+ data
49
+ when String
50
+ sanitize_string(data)
51
+ else # all other objects
52
+ klass = data.class
53
+
54
+ begin
55
+ data = String(data)
56
+ rescue
57
+ return RAISED
58
+ end
59
+
60
+ return "#<#{klass.name}>" if inspected?(data)
61
+
62
+ sanitize_string(data)
63
+ end
64
+ end
65
+
66
+ private
67
+ attr_reader :max_depth
68
+
69
+ def basic_object?(object)
70
+ object.respond_to?(:to_s)
71
+ false
72
+ rescue
73
+ # BasicObject doesn't respond to `#respond_to?`.
74
+ true
75
+ end
76
+
77
+ def recursive?(data)
78
+ data.is_a?(Hash) || data.is_a?(Array) || data.is_a?(Set)
79
+ end
80
+
81
+ def sanitize_string(string)
82
+ string.gsub!(/#<(.*?):0x.*?>/, '#<\1>') # remove object_id
83
+ return string unless string.respond_to?(:size) && string.size > MAX_STRING_SIZE
84
+ string[0...MAX_STRING_SIZE] + TRUNCATED
85
+ end
86
+
87
+ def inspected?(string)
88
+ String(string) =~ /#<.*>/
89
+ end
90
+ end
91
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidErrors
4
- VERSION = "0.2.2"
4
+ VERSION = "0.2.3"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solid_errors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Margheim
@@ -52,6 +52,7 @@ files:
52
52
  - lib/solid_errors/backtrace.rb
53
53
  - lib/solid_errors/backtrace_line.rb
54
54
  - lib/solid_errors/engine.rb
55
+ - lib/solid_errors/sanitizer.rb
55
56
  - lib/solid_errors/subscriber.rb
56
57
  - lib/solid_errors/version.rb
57
58
  homepage: https://github.com/fractaledmind/solid_errors