solid_errors 0.2.2 → 0.2.3

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
  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