ntl-error_data 0.1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f6e0eb4aa4452b9708dc4aa0cada2507fe716d98ed510a19ee6b1c9ee697e4d5
4
+ data.tar.gz: 2775f7e875f61d21cb9b9a62ab000c02d3dbfb590785e34586fb33060981403c
5
+ SHA512:
6
+ metadata.gz: 39f0882c396b42783d11e92e563d0d6be17f93ba243eb2728014eb7a8bdccc13e6fb0d3fbd23d46886d5a1e73d03df95aa52b7d5e269fc2e0feedfedca114ed1
7
+ data.tar.gz: 974e4b0fa92eb1191d5ce99a31083f547e9863f93b9dd71870cbbe8e986db25a61ead7835785a5e5bbe416f7515e9644e1f84bc8dda4fbc0727f55feca00060c
@@ -0,0 +1,10 @@
1
+ require 'json'
2
+
3
+ require 'schema'
4
+ require 'casing'
5
+ require 'transform'
6
+
7
+ require 'error_data/error_data/backtrace/frame'
8
+ require 'error_data/error_data/backtrace'
9
+ require 'error_data/error_data'
10
+ require 'error_data/convert'
@@ -0,0 +1,4 @@
1
+ require 'error_data/controls/error'
2
+ require 'error_data/controls/error/backtrace'
3
+ require 'error_data/controls/error/message'
4
+ require 'error_data/controls/error_data'
@@ -0,0 +1,23 @@
1
+ class ErrorData
2
+ module Controls
3
+ module Error
4
+ Example = Class.new(RuntimeError)
5
+
6
+ OtherExample = Class.new(RuntimeError)
7
+
8
+ def self.example
9
+ error = Example.new(message)
10
+ error.set_backtrace(Backtrace.example)
11
+ error
12
+ end
13
+
14
+ def self.class_name
15
+ Example.name
16
+ end
17
+
18
+ def self.message
19
+ Message.example
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,79 @@
1
+ class ErrorData
2
+ module Controls
3
+ module Error
4
+ module Backtrace
5
+ def self.example
6
+ [
7
+ Frames::First.text,
8
+ Frames::Second.text,
9
+ Frames::Third.text
10
+ ]
11
+ end
12
+
13
+ def self.other_example
14
+ [
15
+ Frames::First.text,
16
+ Frames::Third.text,
17
+ Frames::Second.text
18
+ ]
19
+ end
20
+
21
+ module Frames
22
+ module Text
23
+ def text
24
+ "#{filename}:#{line_number}:in `#{method_name}'"
25
+ end
26
+ end
27
+
28
+ module First
29
+ extend Text
30
+
31
+ def self.line_number
32
+ 111
33
+ end
34
+
35
+ def self.filename
36
+ 'some_file.rb'
37
+ end
38
+
39
+ def self.method_name
40
+ 'some_method'
41
+ end
42
+ end
43
+
44
+ module Second
45
+ extend Text
46
+
47
+ def self.line_number
48
+ 11
49
+ end
50
+
51
+ def self.filename
52
+ 'some_other_file.rb'
53
+ end
54
+
55
+ def self.method_name
56
+ 'some_other_method'
57
+ end
58
+ end
59
+
60
+ module Third
61
+ extend Text
62
+
63
+ def self.line_number
64
+ 1
65
+ end
66
+
67
+ def self.filename
68
+ 'yet_another_file.rb'
69
+ end
70
+
71
+ def self.method_name
72
+ 'yet_another_method'
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,15 @@
1
+ class ErrorData
2
+ module Controls
3
+ module Error
4
+ module Message
5
+ def self.example
6
+ 'An example error'
7
+ end
8
+
9
+ def self.other_example
10
+ 'A different error'
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,167 @@
1
+ class ErrorData
2
+ module Controls
3
+ module ErrorData
4
+ def self.example(class_name: nil, message: nil, backtrace: nil)
5
+ class_name ||= self.class_name
6
+ message ||= self.message
7
+ backtrace ||= self.backtrace
8
+
9
+ error_data = ::ErrorData.new
10
+
11
+ error_data.class_name = class_name
12
+ error_data.message = message
13
+
14
+ error_data.backtrace = backtrace
15
+
16
+ error_data
17
+ end
18
+
19
+ def self.class_name
20
+ Controls::Error.class_name
21
+ end
22
+
23
+ def self.message
24
+ Controls::Error.message
25
+ end
26
+
27
+ def self.backtrace
28
+ Backtrace.example
29
+ end
30
+
31
+ module Backtrace
32
+ def self.example
33
+ ::ErrorData::Backtrace.new.tap do |b|
34
+ b << Frames::First.example
35
+ b << Frames::Second.example
36
+ b << Frames::Third.example
37
+ end
38
+ end
39
+
40
+ def self.other_example
41
+ ::ErrorData::Backtrace.new.tap do |b|
42
+ b << Frames::First.example
43
+ b << Frames::Third.example
44
+ b << Frames::Second.example
45
+ end
46
+ end
47
+
48
+ module Frames
49
+ module First
50
+ def self.example
51
+ ::ErrorData::Backtrace::Frame.new.tap do |f|
52
+ f.line_number = Controls::Error::Backtrace::Frames::First.line_number
53
+ f.filename = Controls::Error::Backtrace::Frames::First.filename
54
+ f.method_name = Controls::Error::Backtrace::Frames::First.method_name
55
+ end
56
+ end
57
+ end
58
+
59
+ module Second
60
+ def self.example
61
+ ::ErrorData::Backtrace::Frame.new.tap do |f|
62
+ f.line_number = Controls::Error::Backtrace::Frames::Second.line_number
63
+ f.filename = Controls::Error::Backtrace::Frames::Second.filename
64
+ f.method_name = Controls::Error::Backtrace::Frames::Second.method_name
65
+ end
66
+ end
67
+ end
68
+
69
+ module Third
70
+ def self.example
71
+ ::ErrorData::Backtrace::Frame.new.tap do |f|
72
+ f.line_number = Controls::Error::Backtrace::Frames::Third.line_number
73
+ f.filename = Controls::Error::Backtrace::Frames::Third.filename
74
+ f.method_name = Controls::Error::Backtrace::Frames::Third.method_name
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ def self.data
82
+ data = {}
83
+
84
+ data[:class_name] = Controls::Error.class_name
85
+ data[:message] = Controls::Error.message
86
+
87
+ backtrace = [
88
+ {
89
+ :line_number => Controls::Error::Backtrace::Frames::First.line_number,
90
+ :filename => Controls::Error::Backtrace::Frames::First.filename,
91
+ :method_name => Controls::Error::Backtrace::Frames::First.method_name
92
+ },
93
+ {
94
+ :line_number => Controls::Error::Backtrace::Frames::Second.line_number,
95
+ :filename => Controls::Error::Backtrace::Frames::Second.filename,
96
+ :method_name => Controls::Error::Backtrace::Frames::Second.method_name
97
+ },
98
+ {
99
+ :line_number => Controls::Error::Backtrace::Frames::Third.line_number,
100
+ :filename => Controls::Error::Backtrace::Frames::Third.filename,
101
+ :method_name => Controls::Error::Backtrace::Frames::Third.method_name
102
+ }
103
+ ]
104
+
105
+ data[:backtrace] = backtrace
106
+
107
+ data
108
+ end
109
+
110
+ module JSON
111
+ def self.text
112
+ ::JSON.generate(data)
113
+ end
114
+
115
+ def self.data
116
+ {
117
+ 'className' => Controls::Error.class_name,
118
+ 'message' => Controls::Error.message,
119
+ 'backtrace' => Backtrace.data
120
+ }
121
+ end
122
+
123
+ module Backtrace
124
+ def self.data
125
+ [
126
+ Frames::First.data,
127
+ Frames::Second.data,
128
+ Frames::Third.data
129
+ ]
130
+ end
131
+
132
+ module Frames
133
+ module First
134
+ def self.data
135
+ {
136
+ 'filename' => Controls::Error::Backtrace::Frames::First.filename,
137
+ 'lineNumber' => Controls::Error::Backtrace::Frames::First.line_number,
138
+ 'methodName' => Controls::Error::Backtrace::Frames::First.method_name
139
+ }
140
+ end
141
+ end
142
+
143
+ module Second
144
+ def self.data
145
+ {
146
+ 'filename' => Controls::Error::Backtrace::Frames::Second.filename,
147
+ 'lineNumber' => Controls::Error::Backtrace::Frames::Second.line_number,
148
+ 'methodName' => Controls::Error::Backtrace::Frames::Second.method_name
149
+ }
150
+ end
151
+ end
152
+
153
+ module Third
154
+ def self.data
155
+ {
156
+ 'filename' => Controls::Error::Backtrace::Frames::Third.filename,
157
+ 'lineNumber' => Controls::Error::Backtrace::Frames::Third.line_number,
158
+ 'methodName' => Controls::Error::Backtrace::Frames::Third.method_name
159
+ }
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,15 @@
1
+ class ErrorData
2
+ module Convert
3
+ module Error
4
+ def self.call(standard_error)
5
+ error_data = ErrorData.build
6
+
7
+ error_data.class_name = standard_error.class.name
8
+ error_data.message = standard_error.message
9
+ error_data.set_backtrace(standard_error.backtrace)
10
+
11
+ error_data
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,67 @@
1
+ class ErrorData
2
+ include Schema::DataStructure
3
+
4
+ attribute :class_name, String
5
+ attribute :message, String
6
+ attribute :backtrace, Backtrace, default: ->{ Backtrace.new }
7
+
8
+ def transform_write(data)
9
+ backtrace = data.delete(:backtrace)
10
+
11
+ backtrace_data = backtrace.to_a
12
+
13
+ data[:backtrace] = backtrace_data
14
+ end
15
+
16
+ def transform_read(data)
17
+ backtrace = data.delete(:backtrace)
18
+
19
+ return if backtrace.nil?
20
+
21
+ backtrace.each do |frame_data|
22
+ frame = Backtrace::Frame.build(frame_data)
23
+
24
+ self.backtrace.add_frame(frame)
25
+ end
26
+ end
27
+
28
+ def set_backtrace(backtrace)
29
+ self.backtrace = Backtrace.parse(backtrace)
30
+ end
31
+
32
+ def correspond?(error)
33
+ error_corresponds =
34
+ class_name == error.class.name &&
35
+ message == error.message
36
+
37
+ backtrace_corresponds = backtrace.text_frames == error.backtrace
38
+
39
+ error_corresponds && backtrace_corresponds
40
+ end
41
+
42
+ module Transform
43
+ def self.json
44
+ JSON
45
+ end
46
+
47
+ def self.raw_data(instance)
48
+ instance.attributes
49
+ end
50
+
51
+ def self.instance(raw_data)
52
+ ErrorData.build(raw_data)
53
+ end
54
+
55
+ module JSON
56
+ def self.read(text)
57
+ formatted_data = ::JSON.parse(text, symbolize_names: true)
58
+ Casing::Underscore.(formatted_data)
59
+ end
60
+
61
+ def self.write(raw_data)
62
+ formatted_data = Casing::Camel.(raw_data)
63
+ ::JSON.generate(formatted_data)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,39 @@
1
+ class ErrorData
2
+ class Backtrace
3
+ include Schema::DataStructure
4
+
5
+ attribute :frames, Array, default: ->{ Array.new }
6
+
7
+ def add_frame(frame)
8
+ frames << frame
9
+ self
10
+ end
11
+ alias :<< :add_frame
12
+
13
+ def each(&blk)
14
+ frames.each &blk
15
+ end
16
+
17
+ def text_frames
18
+ frames.map do |frame|
19
+ frame.to_s
20
+ end
21
+ end
22
+
23
+ def to_a
24
+ frames.map do |frame|
25
+ frame.to_h
26
+ end
27
+ end
28
+
29
+ def self.parse(backtrace)
30
+ instance = new
31
+
32
+ backtrace.each do |frame|
33
+ instance.add_frame(Frame.parse(frame))
34
+ end
35
+
36
+ instance
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,33 @@
1
+ class ErrorData
2
+ class Backtrace
3
+ class Frame
4
+ include Schema::DataStructure
5
+
6
+ attribute :filename, String
7
+ attribute :line_number, Integer
8
+ attribute :method_name, String
9
+
10
+ def to_s
11
+ "#{filename}:#{line_number}:in `#{method_name}'"
12
+ end
13
+
14
+ def correspond?(backtrace_text)
15
+ to_s == backtrace_text
16
+ end
17
+
18
+ def self.parse(frame_text)
19
+ filename, line_number, method_name = frame_text.split(':')
20
+
21
+ line_number = Integer(line_number)
22
+
23
+ method_name.gsub!(/^in `(.*?)'$/, "\\1")
24
+
25
+ build({
26
+ :filename => filename,
27
+ :line_number => line_number,
28
+ :method_name => method_name
29
+ })
30
+ end
31
+ end
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ntl-error_data
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - The Eventide Project
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: evt-schema
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
+ - !ruby/object:Gem::Dependency
28
+ name: evt-casing
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: evt-transform
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: test_bench
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: " "
70
+ email: opensource@eventide-project.org
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/error_data.rb
76
+ - lib/error_data/controls.rb
77
+ - lib/error_data/controls/error.rb
78
+ - lib/error_data/controls/error/backtrace.rb
79
+ - lib/error_data/controls/error/message.rb
80
+ - lib/error_data/controls/error_data.rb
81
+ - lib/error_data/convert.rb
82
+ - lib/error_data/error_data.rb
83
+ - lib/error_data/error_data/backtrace.rb
84
+ - lib/error_data/error_data/backtrace/frame.rb
85
+ homepage: https://github.com/ntl/error-data
86
+ licenses:
87
+ - MIT
88
+ metadata: {}
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '2.4'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubygems_version: 3.1.3
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Representation of an error as a data structure
108
+ test_files: []