ntl-error_data 0.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.
@@ -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: []