test_bench-telemetry 2.0.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.
- checksums.yaml +7 -0
- data/lib/test_bench/telemetry/controls/capture_sink/path.rb +30 -0
- data/lib/test_bench/telemetry/controls/capture_sink/record.rb +21 -0
- data/lib/test_bench/telemetry/controls/comment.rb +19 -0
- data/lib/test_bench/telemetry/controls/detail_level.rb +15 -0
- data/lib/test_bench/telemetry/controls/error.rb +36 -0
- data/lib/test_bench/telemetry/controls/event.rb +77 -0
- data/lib/test_bench/telemetry/controls/events/asserted.rb +32 -0
- data/lib/test_bench/telemetry/controls/events/commented.rb +26 -0
- data/lib/test_bench/telemetry/controls/events/context_entered.rb +31 -0
- data/lib/test_bench/telemetry/controls/events/context_exited.rb +34 -0
- data/lib/test_bench/telemetry/controls/events/context_skipped.rb +31 -0
- data/lib/test_bench/telemetry/controls/events/detail_decreased.rb +23 -0
- data/lib/test_bench/telemetry/controls/events/detail_increased.rb +23 -0
- data/lib/test_bench/telemetry/controls/events/error_raised.rb +26 -0
- data/lib/test_bench/telemetry/controls/events/file_entered.rb +29 -0
- data/lib/test_bench/telemetry/controls/events/file_exited.rb +32 -0
- data/lib/test_bench/telemetry/controls/events/fixture_finished.rb +29 -0
- data/lib/test_bench/telemetry/controls/events/fixture_started.rb +26 -0
- data/lib/test_bench/telemetry/controls/events/run_aborted.rb +29 -0
- data/lib/test_bench/telemetry/controls/events/run_finished.rb +32 -0
- data/lib/test_bench/telemetry/controls/events/run_started.rb +29 -0
- data/lib/test_bench/telemetry/controls/events/test_finished.rb +34 -0
- data/lib/test_bench/telemetry/controls/events/test_skipped.rb +31 -0
- data/lib/test_bench/telemetry/controls/events/test_started.rb +31 -0
- data/lib/test_bench/telemetry/controls/events.rb +27 -0
- data/lib/test_bench/telemetry/controls/fixture_name.rb +19 -0
- data/lib/test_bench/telemetry/controls/handler.rb +76 -0
- data/lib/test_bench/telemetry/controls/line_number.rb +10 -0
- data/lib/test_bench/telemetry/controls/path.rb +87 -0
- data/lib/test_bench/telemetry/controls/random.rb +7 -0
- data/lib/test_bench/telemetry/controls/result.rb +12 -0
- data/lib/test_bench/telemetry/controls/sink.rb +11 -0
- data/lib/test_bench/telemetry/controls/time.rb +76 -0
- data/lib/test_bench/telemetry/controls/title.rb +43 -0
- data/lib/test_bench/telemetry/controls.rb +40 -0
- data/lib/test_bench/telemetry/event/events.rb +35 -0
- data/lib/test_bench/telemetry/event/serialization.rb +143 -0
- data/lib/test_bench/telemetry/event/type.rb +27 -0
- data/lib/test_bench/telemetry/event.rb +41 -0
- data/lib/test_bench/telemetry/sink/capture/path.rb +69 -0
- data/lib/test_bench/telemetry/sink/capture/record/generate.rb +49 -0
- data/lib/test_bench/telemetry/sink/capture/record.rb +73 -0
- data/lib/test_bench/telemetry/sink/capture.rb +55 -0
- data/lib/test_bench/telemetry/sink/file.rb +31 -0
- data/lib/test_bench/telemetry/sink/handler.rb +90 -0
- data/lib/test_bench/telemetry/substitute.rb +65 -0
- data/lib/test_bench/telemetry/telemetry.rb +68 -0
- data/lib/test_bench/telemetry.rb +19 -0
- metadata +118 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module Events
|
5
|
+
module TestFinished
|
6
|
+
def self.example(result: nil, title: nil, time: nil)
|
7
|
+
result ||= self.result
|
8
|
+
time ||= self.time
|
9
|
+
|
10
|
+
if title == :none
|
11
|
+
title = nil
|
12
|
+
else
|
13
|
+
title ||= self.title
|
14
|
+
end
|
15
|
+
|
16
|
+
TestBench::Telemetry::Event::TestFinished.new(result, title, time)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.random
|
20
|
+
result = Result.random
|
21
|
+
title = Title::Test.random
|
22
|
+
time = Time.random
|
23
|
+
|
24
|
+
example(result:, title:, time:)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.result = Result.example
|
28
|
+
def self.title = Title::Test.example
|
29
|
+
def self.time = Time.example
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module Events
|
5
|
+
module TestSkipped
|
6
|
+
def self.example(title: nil, time: nil)
|
7
|
+
time ||= self.time
|
8
|
+
|
9
|
+
if title == :none
|
10
|
+
title = nil
|
11
|
+
else
|
12
|
+
title ||= self.title
|
13
|
+
end
|
14
|
+
|
15
|
+
TestBench::Telemetry::Event::TestSkipped.new(title, time)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.random
|
19
|
+
title = Title::Test.random
|
20
|
+
time = Time.random
|
21
|
+
|
22
|
+
example(title:, time:)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.title = Title::Test.example
|
26
|
+
def self.time = Time.example
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module Events
|
5
|
+
module TestStarted
|
6
|
+
def self.example(title: nil, time: nil)
|
7
|
+
time ||= self.time
|
8
|
+
|
9
|
+
if title == :none
|
10
|
+
title = nil
|
11
|
+
else
|
12
|
+
title ||= self.title
|
13
|
+
end
|
14
|
+
|
15
|
+
TestBench::Telemetry::Event::TestStarted.new(title, time)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.random
|
19
|
+
title = Title::Test.random
|
20
|
+
time = Time.random
|
21
|
+
|
22
|
+
example(title:, time:)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.title = Title::Test.example
|
26
|
+
def self.time = Time.example
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module Events
|
5
|
+
def self.each_example(random: nil, &block)
|
6
|
+
examples(random:).each(&block)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.examples(random: nil)
|
10
|
+
random ||= false
|
11
|
+
|
12
|
+
if random
|
13
|
+
method_name = :random
|
14
|
+
else
|
15
|
+
method_name = :example
|
16
|
+
end
|
17
|
+
|
18
|
+
controls = TestBench::Telemetry::Event.each_event_type.map do |event_type|
|
19
|
+
const_get(event_type)
|
20
|
+
end
|
21
|
+
|
22
|
+
controls.map(&method_name)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module FixtureName
|
5
|
+
def self.example(suffix=nil)
|
6
|
+
suffix = "_#{suffix}" if not suffix.nil?
|
7
|
+
|
8
|
+
"SomeProject::Fixtures::SomeFixture#{suffix}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.random
|
12
|
+
suffix = example(Random.string)
|
13
|
+
|
14
|
+
example(suffix)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module Handler
|
5
|
+
def self.example(&block)
|
6
|
+
if block.nil?
|
7
|
+
cls = Example
|
8
|
+
else
|
9
|
+
cls = example_class(&block)
|
10
|
+
end
|
11
|
+
|
12
|
+
cls.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.example_class(&block)
|
16
|
+
Class.new do
|
17
|
+
include TestBench::Telemetry::Sink::Handler
|
18
|
+
|
19
|
+
if not block.nil?
|
20
|
+
class_exec(&block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module Event
|
26
|
+
def self.example(data=nil)
|
27
|
+
data ||= self.data
|
28
|
+
|
29
|
+
Controls::Event.example(data)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.data = 'some-data'
|
33
|
+
|
34
|
+
def self.other_example
|
35
|
+
Controls::Event::OtherExample.new
|
36
|
+
end
|
37
|
+
|
38
|
+
Example = Controls::Event::Example
|
39
|
+
OtherExample = Controls::Event::OtherExample
|
40
|
+
end
|
41
|
+
|
42
|
+
module Method
|
43
|
+
def self.example(event_type=nil)
|
44
|
+
event_type ||= Event::Example.event_type
|
45
|
+
|
46
|
+
event_type_method_cased = TestBench::Telemetry::Event::Type.method_cased(event_type)
|
47
|
+
|
48
|
+
:"handle_#{event_type_method_cased}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.other_example
|
52
|
+
event_type = Event::OtherExample.event_type
|
53
|
+
|
54
|
+
example(event_type)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Example = example_class do
|
59
|
+
attr_accessor :data
|
60
|
+
|
61
|
+
handle Event::Example do |data|
|
62
|
+
self.data = data
|
63
|
+
end
|
64
|
+
|
65
|
+
def handled?(data=nil)
|
66
|
+
if data.nil?
|
67
|
+
!self.data.nil?
|
68
|
+
else
|
69
|
+
data == self.data
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module Path
|
5
|
+
def self.example(suffix=nil)
|
6
|
+
suffix = "_#{suffix}" if not suffix.nil?
|
7
|
+
|
8
|
+
"path/to/some_file#{suffix}.rb"
|
9
|
+
end
|
10
|
+
|
11
|
+
module Random
|
12
|
+
def random = example(Controls::Random.string)
|
13
|
+
end
|
14
|
+
extend Random
|
15
|
+
|
16
|
+
module Temporary
|
17
|
+
def self.example(suffix=nil, basename: nil, extension: nil)
|
18
|
+
basename ||= self.basename
|
19
|
+
extension ||= self.extension
|
20
|
+
|
21
|
+
suffix = "-#{suffix}" if not suffix.nil?
|
22
|
+
|
23
|
+
filename = "#{basename}#{suffix}#{extension}"
|
24
|
+
|
25
|
+
File.join('tmp', filename)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.random(basename: nil, extension: nil)
|
29
|
+
suffix = Controls::Random.string
|
30
|
+
|
31
|
+
example(suffix, basename:, extension:)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.basename
|
35
|
+
'some-file'
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.extension
|
39
|
+
'.some-ext'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
module Absolute
|
44
|
+
extend Random
|
45
|
+
|
46
|
+
def self.example(suffix=nil)
|
47
|
+
path = Path.example(suffix)
|
48
|
+
|
49
|
+
File.join('/', path)
|
50
|
+
end
|
51
|
+
|
52
|
+
module Local
|
53
|
+
extend Random
|
54
|
+
|
55
|
+
def self.example(suffix=nil)
|
56
|
+
path = Path.example(suffix)
|
57
|
+
|
58
|
+
File.join(current_dir, path)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.current_dir
|
62
|
+
File.join('/home', 'some-user', 'some-working-dir')
|
63
|
+
end
|
64
|
+
|
65
|
+
module Gem
|
66
|
+
extend Random
|
67
|
+
|
68
|
+
def self.example(path=nil)
|
69
|
+
path ||= Path.example
|
70
|
+
|
71
|
+
path = File.join(gems_path, path)
|
72
|
+
|
73
|
+
Local.example(path)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.gems_path
|
77
|
+
ruby_version = RbConfig::CONFIG['ruby_version']
|
78
|
+
|
79
|
+
"gems/ruby/#{ruby_version}/gems"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module Time
|
5
|
+
def self.example(offset_milliseconds: nil, offset_nanoseconds: nil)
|
6
|
+
if offset_nanoseconds.nil?
|
7
|
+
offset_milliseconds ||= 0
|
8
|
+
offset_nanoseconds = offset_milliseconds * 1_000_000
|
9
|
+
end
|
10
|
+
|
11
|
+
nanoseconds = 111_111_111
|
12
|
+
remaining_offset, additional_nanoseconds = offset_nanoseconds.divmod(1_000_000_000 - nanoseconds)
|
13
|
+
nanoseconds += additional_nanoseconds
|
14
|
+
microseconds = Rational(nanoseconds, 1_000)
|
15
|
+
|
16
|
+
if remaining_offset.zero?
|
17
|
+
seconds = 11
|
18
|
+
else
|
19
|
+
remaining_offset, seconds = remaining_offset.divmod(60)
|
20
|
+
end
|
21
|
+
|
22
|
+
if remaining_offset.zero?
|
23
|
+
minutes = 11
|
24
|
+
else
|
25
|
+
remaining_offset, minutes = remaining_offset.divmod(60)
|
26
|
+
end
|
27
|
+
|
28
|
+
if remaining_offset.zero?
|
29
|
+
hours = 11
|
30
|
+
else
|
31
|
+
remaining_offset, hours = remaining_offset.divmod(24)
|
32
|
+
end
|
33
|
+
|
34
|
+
if remaining_offset.zero?
|
35
|
+
day = 1
|
36
|
+
else
|
37
|
+
remaining_offset, day = remaining_offset.divmod(28)
|
38
|
+
day += 1
|
39
|
+
end
|
40
|
+
|
41
|
+
if remaining_offset.zero?
|
42
|
+
month = 1
|
43
|
+
else
|
44
|
+
remaining_offset, month = remaining_offset.divmod(12)
|
45
|
+
month += 1
|
46
|
+
end
|
47
|
+
|
48
|
+
year = 2000
|
49
|
+
if not remaining_offset.zero?
|
50
|
+
year += remaining_offset
|
51
|
+
end
|
52
|
+
|
53
|
+
::Time.utc(year, month, day, hours, minutes, seconds, microseconds)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.random
|
57
|
+
example(offset_nanoseconds: Random.integer)
|
58
|
+
end
|
59
|
+
|
60
|
+
module ISO8601
|
61
|
+
def self.example(time=nil, **arguments)
|
62
|
+
time ||= Time.example(**arguments)
|
63
|
+
|
64
|
+
time.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.random(...)
|
68
|
+
time = Time.random
|
69
|
+
|
70
|
+
example(time)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module Title
|
5
|
+
def self.example(suffix=nil, text: nil)
|
6
|
+
suffix = " #{suffix}" if not suffix.nil?
|
7
|
+
text ||= self.text
|
8
|
+
|
9
|
+
"#{text}#{suffix}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.text = "Some Title"
|
13
|
+
|
14
|
+
module Random
|
15
|
+
def random = example(Controls::Random.string)
|
16
|
+
end
|
17
|
+
extend Random
|
18
|
+
|
19
|
+
module Test
|
20
|
+
extend Random
|
21
|
+
|
22
|
+
def self.example(suffix=nil)
|
23
|
+
Title.example(suffix, text: example_text)
|
24
|
+
end
|
25
|
+
def self.example_text = "Some test"
|
26
|
+
|
27
|
+
def self.other_example = "Some other test"
|
28
|
+
end
|
29
|
+
|
30
|
+
module Context
|
31
|
+
extend Random
|
32
|
+
|
33
|
+
def self.example(suffix=nil)
|
34
|
+
Title.example(suffix, text: example_text)
|
35
|
+
end
|
36
|
+
def self.example_text = "Some Context"
|
37
|
+
|
38
|
+
def self.other_example = "Some Other Context"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_bench/telemetry/controls/random'
|
2
|
+
require 'test_bench/telemetry/controls/time'
|
3
|
+
|
4
|
+
require 'test_bench/telemetry/controls/comment'
|
5
|
+
require 'test_bench/telemetry/controls/line_number'
|
6
|
+
require 'test_bench/telemetry/controls/path'
|
7
|
+
require 'test_bench/telemetry/controls/error'
|
8
|
+
require 'test_bench/telemetry/controls/result'
|
9
|
+
require 'test_bench/telemetry/controls/title'
|
10
|
+
require 'test_bench/telemetry/controls/fixture_name'
|
11
|
+
require 'test_bench/telemetry/controls/detail_level'
|
12
|
+
|
13
|
+
require 'test_bench/telemetry/controls/event'
|
14
|
+
|
15
|
+
require 'test_bench/telemetry/controls/events'
|
16
|
+
require 'test_bench/telemetry/controls/events/asserted'
|
17
|
+
require 'test_bench/telemetry/controls/events/error_raised'
|
18
|
+
require 'test_bench/telemetry/controls/events/test_started'
|
19
|
+
require 'test_bench/telemetry/controls/events/test_finished'
|
20
|
+
require 'test_bench/telemetry/controls/events/test_skipped'
|
21
|
+
require 'test_bench/telemetry/controls/events/context_entered'
|
22
|
+
require 'test_bench/telemetry/controls/events/context_exited'
|
23
|
+
require 'test_bench/telemetry/controls/events/context_skipped'
|
24
|
+
require 'test_bench/telemetry/controls/events/commented'
|
25
|
+
require 'test_bench/telemetry/controls/events/detail_increased'
|
26
|
+
require 'test_bench/telemetry/controls/events/detail_decreased'
|
27
|
+
require 'test_bench/telemetry/controls/events/run_started'
|
28
|
+
require 'test_bench/telemetry/controls/events/run_finished'
|
29
|
+
require 'test_bench/telemetry/controls/events/run_aborted'
|
30
|
+
require 'test_bench/telemetry/controls/events/file_entered'
|
31
|
+
require 'test_bench/telemetry/controls/events/file_exited'
|
32
|
+
require 'test_bench/telemetry/controls/events/fixture_started'
|
33
|
+
require 'test_bench/telemetry/controls/events/fixture_finished'
|
34
|
+
|
35
|
+
require 'test_bench/telemetry/controls/handler'
|
36
|
+
|
37
|
+
require 'test_bench/telemetry/controls/capture_sink/path'
|
38
|
+
require 'test_bench/telemetry/controls/capture_sink/record'
|
39
|
+
|
40
|
+
require 'test_bench/telemetry/controls/sink'
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Event
|
4
|
+
module Events
|
5
|
+
Asserted = Event.define(:result, :path, :line_number)
|
6
|
+
|
7
|
+
ErrorRaised = Event.define(:error_text)
|
8
|
+
|
9
|
+
TestStarted = Event.define(:title)
|
10
|
+
TestFinished = Event.define(:result, :title)
|
11
|
+
TestSkipped = Event.define(:title)
|
12
|
+
|
13
|
+
ContextEntered = Event.define(:title)
|
14
|
+
ContextExited = Event.define(:result, :title)
|
15
|
+
ContextSkipped = Event.define(:title)
|
16
|
+
|
17
|
+
Commented = Event.define(:comment)
|
18
|
+
|
19
|
+
DetailIncreased = Event.define
|
20
|
+
DetailDecreased = Event.define
|
21
|
+
|
22
|
+
RunStarted = Event.define(:random_seed, :executors)
|
23
|
+
RunFinished = Event.define(:result, :random_seed, :executors)
|
24
|
+
RunAborted = Event.define(:random_seed, :executors)
|
25
|
+
|
26
|
+
FileEntered = Event.define(:path, :executor)
|
27
|
+
FileExited = Event.define(:result, :path, :executor)
|
28
|
+
|
29
|
+
FixtureStarted = Event.define(:name)
|
30
|
+
FixtureFinished = Event.define(:result, :name)
|
31
|
+
end
|
32
|
+
include Events
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Event
|
4
|
+
module Serialization
|
5
|
+
Error = Class.new(RuntimeError)
|
6
|
+
|
7
|
+
def self.dump(event)
|
8
|
+
event_type = event.event_type.to_s
|
9
|
+
|
10
|
+
data = String.new(encoding: 'BINARY')
|
11
|
+
|
12
|
+
data << event_type
|
13
|
+
|
14
|
+
event.values.each do |value|
|
15
|
+
data << "\t"
|
16
|
+
data << dump_value(value)
|
17
|
+
end
|
18
|
+
|
19
|
+
data << "\r\n"
|
20
|
+
data
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.dump_value(value)
|
24
|
+
case value
|
25
|
+
when NilClass
|
26
|
+
''
|
27
|
+
when Time
|
28
|
+
value.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
|
29
|
+
when String
|
30
|
+
value.dump
|
31
|
+
when Integer
|
32
|
+
value.to_s
|
33
|
+
when TrueClass, FalseClass
|
34
|
+
value.to_s
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.load(data, event_namespace)
|
39
|
+
match_data = Pattern.match(data)
|
40
|
+
if match_data.nil?
|
41
|
+
raise Error, "Cannot deserialize #{data.inspect}"
|
42
|
+
end
|
43
|
+
|
44
|
+
event_type = match_data['event_type'].to_sym
|
45
|
+
if not event_namespace.const_defined?(event_type, false)
|
46
|
+
raise Error, "Unknown event type #{event_type.inspect}"
|
47
|
+
end
|
48
|
+
|
49
|
+
values = match_data['values'].split("\t").map do |value_data|
|
50
|
+
load_value(value_data)
|
51
|
+
end
|
52
|
+
|
53
|
+
event_class = event_namespace.const_get(event_type, false)
|
54
|
+
event_class.new(*values)
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.load_value(value_data)
|
58
|
+
match_data = Pattern.match_value(value_data)
|
59
|
+
|
60
|
+
if match_data['nil']
|
61
|
+
nil
|
62
|
+
elsif match_data['time']
|
63
|
+
year = match_data['year'].to_i
|
64
|
+
month = match_data['month'].to_i
|
65
|
+
day = match_data['day'].to_i
|
66
|
+
hour = match_data['hour'].to_i
|
67
|
+
minute = match_data['minute'].to_i
|
68
|
+
second = match_data['second'].to_i
|
69
|
+
|
70
|
+
nanosecond = match_data['nanosecond'].to_i
|
71
|
+
usec = Rational(nanosecond, 1_000)
|
72
|
+
|
73
|
+
Time.utc(year, month, day, hour, minute, second, usec)
|
74
|
+
elsif match_data['string']
|
75
|
+
value_data.undump
|
76
|
+
elsif match_data['integer']
|
77
|
+
Integer(value_data)
|
78
|
+
elsif match_data['true']
|
79
|
+
true
|
80
|
+
elsif match_data['false']
|
81
|
+
false
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
module Pattern
|
86
|
+
def self.match(data)
|
87
|
+
event.match(data)
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.match_value(value_data)
|
91
|
+
pattern = %r{\A#{value}\z}
|
92
|
+
|
93
|
+
pattern.match(value_data)
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.event
|
97
|
+
%r{\A#{event_type}\t#{values}\r\n\z}
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.event_type
|
101
|
+
%r{(?<event_type>[A-Z][[:alpha:]]+)}
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.values
|
105
|
+
%r{(?<values>#{value}(?:\t#{value})*)}
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.value
|
109
|
+
%r{#{self.nil}|#{time}|#{string}|#{integer}|#{boolean}}
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.nil
|
113
|
+
%r{(?<nil>(?=[\n\t])?)}
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.time
|
117
|
+
year = %r{(?<year>[[:digit:]]{4})}
|
118
|
+
month = %r{(?<month>[[:digit:]]{2})}
|
119
|
+
day = %r{(?<day>[[:digit:]]{2})}
|
120
|
+
hour = %r{(?<hour>[[:digit:]]{2})}
|
121
|
+
minute = %r{(?<minute>[[:digit:]]{2})}
|
122
|
+
second = %r{(?<second>[[:digit:]]{2})}
|
123
|
+
nanosecond = %r{(?<nanosecond>[[:digit:]]{9})}
|
124
|
+
|
125
|
+
%r{(?<time>#{year}-#{month}-#{day}T#{hour}:#{minute}:#{second}\.#{nanosecond}Z)}
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.string
|
129
|
+
%r{(?<string>".*")}
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.integer
|
133
|
+
%r{(?<integer>[[:digit:]]+)}
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.boolean
|
137
|
+
%r{(?<true>true)|(?<false>false)}
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|