test_bench-telemetry 2.0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|