trace_visualization 0.0.3 → 0.0.5
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 +4 -4
- data/Gemfile +1 -1
- data/bin/trace_visualization +21 -26
- data/lib/trace_visualization.rb +2 -2
- data/lib/trace_visualization/algorithm.rb +42 -0
- data/lib/trace_visualization/data/irepetition.rb +5 -1
- data/lib/trace_visualization/data/repetition.rb +14 -6
- data/lib/trace_visualization/data/sorted_array.rb +44 -0
- data/lib/trace_visualization/data/{lexeme.rb → token.rb} +7 -8
- data/lib/trace_visualization/lexeme_overlap_filter.rb +18 -18
- data/lib/trace_visualization/mapping.rb +72 -185
- data/lib/trace_visualization/repetitions/concatenation.rb +136 -0
- data/lib/trace_visualization/repetitions/context.rb +70 -0
- data/lib/trace_visualization/repetitions/filter.rb +153 -0
- data/lib/trace_visualization/repetitions/incrementation.rb +89 -0
- data/lib/trace_visualization/repetitions_psy.rb +12 -5
- data/lib/trace_visualization/utils.rb +5 -42
- data/lib/trace_visualization/version.rb +1 -1
- data/lib/trace_visualization/visualization/console_color_print.rb +20 -4
- data/spec/algorithm_spec.rb +69 -0
- data/spec/bwt_spec.rb +2 -5
- data/spec/data/sorted_array_spec.rb +27 -0
- data/spec/lexeme_overlap_filter_spec.rb +22 -22
- data/spec/longest_common_prefix_spec.rb +3 -8
- data/spec/mapping_spec.rb +72 -69
- data/spec/repetitions/concatenation_spec.rb +65 -0
- data/spec/repetitions/filter_spec.rb +180 -0
- data/spec/repetitions/incrementation_spec.rb +29 -0
- data/spec/repetitions_psy_spec.rb +7 -16
- data/spec/suffix_array_spec.rb +11 -31
- data/spec/utils_spec.rb +21 -9
- data/spec/visualization/console_color_print_spec.rb +26 -0
- data/trace_visualization.gemspec +2 -2
- metadata +27 -13
- data/lib/trace_visualization/repetitions_concatenation.rb +0 -134
- data/lib/trace_visualization/repetitions_context.rb +0 -18
- data/spec/repetitions_concatenation_spec.rb +0 -64
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'trace_visualization/repetitions/concatenation'
|
2
|
+
require 'trace_visualization/repetitions/context'
|
3
|
+
require 'trace_visualization/data/repetition'
|
4
|
+
|
5
|
+
include TraceVisualization
|
6
|
+
include TraceVisualization::Data
|
7
|
+
include TraceVisualization::Repetitions
|
8
|
+
|
9
|
+
describe Concatenation do
|
10
|
+
it "process common positions" do
|
11
|
+
str = "aaaxbbbyaaazbbbvaaawbbb"
|
12
|
+
|
13
|
+
mapping = TraceVisualization::Mapping.new
|
14
|
+
mapping.process { from_string(str) }
|
15
|
+
|
16
|
+
context = Context.new(mapping)
|
17
|
+
|
18
|
+
lpos = [0, 8, 16]
|
19
|
+
rpos = [4, 12, 20]
|
20
|
+
ppos = [[0, 4], [8, 12], [16, 20]]
|
21
|
+
|
22
|
+
left = Repetition.new(3, lpos)
|
23
|
+
right = Repetition.new(3, rpos)
|
24
|
+
|
25
|
+
cpl, cpr = Concatenation.process_common_positions(left, right, 1, context)
|
26
|
+
|
27
|
+
left.left_positions.should eq cpl
|
28
|
+
right.left_positions.should eq cpr
|
29
|
+
|
30
|
+
lpos.should eq left.left_positions
|
31
|
+
rpos.should eq right.left_positions
|
32
|
+
end
|
33
|
+
|
34
|
+
it "don't concatenate repetitions through forbidden chars" do
|
35
|
+
str = <<EOF
|
36
|
+
aaa
|
37
|
+
bbb
|
38
|
+
aaa
|
39
|
+
bbb
|
40
|
+
EOF
|
41
|
+
context = Context.new(str)
|
42
|
+
|
43
|
+
lpos, rpos = [0, 8], [4, 12]
|
44
|
+
left = Repetition.new(3, lpos)
|
45
|
+
right = Repetition.new(3, rpos)
|
46
|
+
|
47
|
+
cpl, cpr = Concatenation.process_common_positions(left, right, 1, context)
|
48
|
+
|
49
|
+
cpl.should eq []
|
50
|
+
cpr.should eq []
|
51
|
+
|
52
|
+
#
|
53
|
+
str.gsub!(TraceVisualization::FORBIDDEN_CHARS, "x")
|
54
|
+
context = Context.new(str)
|
55
|
+
|
56
|
+
lpos, rpos = [0, 8], [4, 12]
|
57
|
+
left = Repetition.new(3, lpos)
|
58
|
+
right = Repetition.new(3, rpos)
|
59
|
+
|
60
|
+
cpl, cpr = Concatenation.process_common_positions(left, right, 1, context)
|
61
|
+
|
62
|
+
cpl.should eq [0, 8]
|
63
|
+
cpr.should eq [4, 12]
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require 'trace_visualization'
|
2
|
+
require 'trace_visualization/mapping'
|
3
|
+
require 'trace_visualization/repetitions/filter'
|
4
|
+
require 'trace_visualization/data/repetition'
|
5
|
+
require 'trace_visualization/visualization/console_color_print'
|
6
|
+
|
7
|
+
include TraceVisualization
|
8
|
+
include TraceVisualization::Data
|
9
|
+
include TraceVisualization::Repetitions
|
10
|
+
|
11
|
+
describe Filter do
|
12
|
+
it 'test fix_boundaries' do
|
13
|
+
str = "test\ntest\ntest\n"
|
14
|
+
|
15
|
+
rs = [
|
16
|
+
Repetition.new(5, [0, 5, 10]), # "test\n"
|
17
|
+
Repetition.new(6, [4, 9]), # "\ntest\n"
|
18
|
+
Repetition.new(9, [0, 5]) # "test\ntest"
|
19
|
+
]
|
20
|
+
|
21
|
+
Filter.fix_boundaries(str, rs)
|
22
|
+
|
23
|
+
rs[0].length.should eq 4
|
24
|
+
rs[0].left_positions.should eq [0, 5, 10]
|
25
|
+
|
26
|
+
rs[1].length.should eq 4
|
27
|
+
rs[1].left_positions.should eq [5, 10]
|
28
|
+
|
29
|
+
rs[2].length.should eq 9
|
30
|
+
rs[2].left_positions.should eq [0, 5]
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'test split' do
|
34
|
+
mapping = Mapping.new
|
35
|
+
mapping.process { from_string "test\ntest\ntest\n" }
|
36
|
+
|
37
|
+
repetitions = [
|
38
|
+
Repetition.new(5, [0, 5, 10]), # "test\n"
|
39
|
+
Repetition.new(6, [4, 9]), # "\ntest\n"
|
40
|
+
Repetition.new(9, [0, 5]) # "test\ntest"
|
41
|
+
]
|
42
|
+
|
43
|
+
context = Context.new(mapping)
|
44
|
+
context.repetitions = repetitions
|
45
|
+
|
46
|
+
Filter.split(mapping, context)
|
47
|
+
|
48
|
+
rsplitted_1 = Repetition.new(4, [0, 5])
|
49
|
+
rsplitted_2 = Repetition.new(4, [5, 10])
|
50
|
+
|
51
|
+
repetitions.size.should eq 4
|
52
|
+
|
53
|
+
(
|
54
|
+
(repetitions[2] == rsplitted_1 && repetitions[3] == rsplitted_2) ||
|
55
|
+
(repetitions[3] == rsplitted_1 && repetitions[2] == rsplitted_2)
|
56
|
+
).should be_true
|
57
|
+
|
58
|
+
####
|
59
|
+
|
60
|
+
# Delete subrepetition after split
|
61
|
+
repetitions = [
|
62
|
+
Repetition.new(4, [0, 5, 10]), # "test"
|
63
|
+
Repetition.new(9, [0, 5]) # "test\ntest"
|
64
|
+
]
|
65
|
+
|
66
|
+
context = Context.new(mapping)
|
67
|
+
context.repetitions = repetitions
|
68
|
+
|
69
|
+
Filter.split(mapping, context)
|
70
|
+
|
71
|
+
repetitions.size.should eq 1
|
72
|
+
|
73
|
+
(repetitions[0] == Repetition.new(4, [0, 5, 10])).should be_true
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'test for delete_duplicates' do
|
77
|
+
mapping = Mapping.new
|
78
|
+
mapping.process { from_string "test\ntest\ntest\n" }
|
79
|
+
|
80
|
+
repetitions = [
|
81
|
+
Repetition.new(4, [0, 5, 10]), # "test"
|
82
|
+
Repetition.new(6, [4, 9]), # "\ntest\n"
|
83
|
+
|
84
|
+
Repetition.new(4, [0, 5, 10]), # "test"
|
85
|
+
Repetition.new(6, [4, 9]), # "\ntest\n"
|
86
|
+
|
87
|
+
Repetition.new(4, [0, 5, 10]), # "test"
|
88
|
+
Repetition.new(6, [4, 9]) # "\ntest\n"
|
89
|
+
]
|
90
|
+
|
91
|
+
context = Context.new(mapping)
|
92
|
+
context.repetitions = repetitions
|
93
|
+
|
94
|
+
Filter.delete_duplicates(context)
|
95
|
+
|
96
|
+
repetitions.size.should eq 2
|
97
|
+
(
|
98
|
+
repetitions[0] == Repetition.new(4, [0, 5, 10]) &&
|
99
|
+
repetitions[1] == Repetition.new(6, [4, 9])
|
100
|
+
).should be_true
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'test for repetitions merge' do
|
104
|
+
mapping = Mapping.new
|
105
|
+
mapping.process { from_string "test\ntest\ntest\n" }
|
106
|
+
|
107
|
+
repetitions = [
|
108
|
+
Repetition.new(4, [0, 5, 10]), # "test"
|
109
|
+
Repetition.new(4, [0, 5]), # "test"
|
110
|
+
Repetition.new(4, [5, 10]), # "test"
|
111
|
+
]
|
112
|
+
|
113
|
+
context = Context.new(mapping)
|
114
|
+
context.repetitions = repetitions
|
115
|
+
Filter.merge(context)
|
116
|
+
|
117
|
+
repetitions.size.should eq 1
|
118
|
+
(repetitions[0] == Repetition.new(4, [0, 5, 10])).should be_true
|
119
|
+
repetitions[0].lines.should eq [0, 1, 2]
|
120
|
+
|
121
|
+
# Different order of repetitions and positions
|
122
|
+
repetitions = [
|
123
|
+
Repetition.new(4, [0, 10]), # "test"
|
124
|
+
Repetition.new(4, [0, 5, 10]), # "test"
|
125
|
+
Repetition.new(4, [5, 10]), # "test"
|
126
|
+
]
|
127
|
+
|
128
|
+
context = Context.new(mapping)
|
129
|
+
context.repetitions = repetitions
|
130
|
+
|
131
|
+
Filter.merge(context)
|
132
|
+
|
133
|
+
repetitions.size.should eq 1
|
134
|
+
(repetitions[0] == Repetition.new(4, [0, 5, 10])).should be_true
|
135
|
+
repetitions[0].lines.should eq [0, 1, 2]
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'test set of filters' do
|
139
|
+
mapping = Mapping.new
|
140
|
+
mapping.process { from_string "test1\ntest2\ntest3\ntest4" }
|
141
|
+
|
142
|
+
repetitions = Repetitions.psy1(mapping, 3)
|
143
|
+
|
144
|
+
repetitions.size.should eq 2
|
145
|
+
(
|
146
|
+
(repetitions[0].length == 4 && repetitions[1].length == 5) ||
|
147
|
+
(repetitions[0].length == 5 && repetitions[1].length == 4)
|
148
|
+
).should be_true
|
149
|
+
|
150
|
+
context = Context.new(mapping)
|
151
|
+
context.repetitions = repetitions
|
152
|
+
|
153
|
+
Filter.strict_repetitions_filter(mapping, context, { :positions_min_size => 3 })
|
154
|
+
|
155
|
+
repetitions.size.should eq 1
|
156
|
+
repetitions[0].length.should eq 4
|
157
|
+
repetitions[0].k.should eq 0
|
158
|
+
repetitions[0].left_positions.should eq [0, 6, 12, 18]
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'test split one repetition into two' do
|
163
|
+
str = "testA\ntestB\ntestC\ntestA\ntestB"
|
164
|
+
|
165
|
+
mapping = TraceVisualization::Mapping.new
|
166
|
+
mapping.process { from_string(str) }
|
167
|
+
|
168
|
+
context = Context.new(mapping)
|
169
|
+
|
170
|
+
context.repetitions = TraceVisualization::Repetitions.psy1(mapping, 2)
|
171
|
+
|
172
|
+
context.repetitions.size.should eq 3
|
173
|
+
|
174
|
+
Filter.strict_repetitions_filter(mapping, context, { :positions_min_size => 2 })
|
175
|
+
|
176
|
+
context.repetitions.size.should eq 3
|
177
|
+
|
178
|
+
Visualization::ConsoleColorPrint.hl_stdout(mapping, context.repetitions)
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'trace_visualization/repetitions/incrementation'
|
2
|
+
require 'trace_visualization/repetitions/context'
|
3
|
+
require 'trace_visualization/repetitions/filter'
|
4
|
+
require 'trace_visualization/data/repetition'
|
5
|
+
require 'trace_visualization/visualization/console_color_print'
|
6
|
+
|
7
|
+
include TraceVisualization
|
8
|
+
include TraceVisualization::Data
|
9
|
+
include TraceVisualization::Repetitions
|
10
|
+
include TraceVisualization::Visualization
|
11
|
+
|
12
|
+
describe Incrementation do
|
13
|
+
it 'smoke test' do
|
14
|
+
str = "testA\ntestB\ntestC\ntestA\ntestB"
|
15
|
+
|
16
|
+
mapping = TraceVisualization::Mapping.new
|
17
|
+
mapping.process { from_string(str) }
|
18
|
+
|
19
|
+
context = Context.new(mapping)
|
20
|
+
|
21
|
+
context.repetitions = TraceVisualization::Repetitions.psy1(mapping, 2)
|
22
|
+
|
23
|
+
Filter.strict_repetitions_filter(mapping, context, { :positions_min_size => 2 })
|
24
|
+
|
25
|
+
Incrementation.process(context, { :positions_min_size => 2, :k => 1 })
|
26
|
+
|
27
|
+
ConsoleColorPrint.hl_stdout(mapping, context.repetitions)
|
28
|
+
end
|
29
|
+
end
|
@@ -14,29 +14,20 @@ describe TraceVisualization::Repetitions do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'simple test PSY1 with mapping' do
|
17
|
-
str = 'aaa[123]aaa'
|
17
|
+
str = 'aaa{TOKEN;id;[123];123;1}aaa'
|
18
18
|
|
19
|
-
mapping = TraceVisualization::Mapping.
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
mapping.process do
|
24
|
-
from_string(str)
|
25
|
-
end
|
19
|
+
mapping = TraceVisualization::Mapping.new
|
20
|
+
mapping.process { from_string str }
|
26
21
|
|
27
22
|
TraceVisualization::Repetitions.psy1(mapping, 3, false).should eq [{:lcp=>3, :i=>2, :j=>3}]
|
28
23
|
end
|
29
24
|
|
30
25
|
it 'test decode PSY1' do
|
31
|
-
|
32
|
-
|
33
|
-
mapping = TraceVisualization::Mapping.init do
|
34
|
-
default_tokens
|
35
|
-
end
|
26
|
+
# <---> "aaaXxyzYaaaX"
|
27
|
+
str = "aaa{TOKEN;id;[123];123;1}xyz{TOKEN;id;[654];654;1}aaa{TOKEN;id;[123];123;1}"
|
36
28
|
|
37
|
-
mapping.
|
38
|
-
|
39
|
-
end
|
29
|
+
mapping = TraceVisualization::Mapping.new
|
30
|
+
mapping.process { from_string str }
|
40
31
|
|
41
32
|
rs = TraceVisualization::Repetitions.psy1(mapping, 3)
|
42
33
|
|
data/spec/suffix_array_spec.rb
CHANGED
@@ -10,15 +10,10 @@ describe TraceVisualization::SuffixArray do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should correct process mapped string' do
|
13
|
-
str = 'abc[123]def[456]ghi'
|
13
|
+
str = 'abc{TOKEN;id;[123];123;1}def{TOKEN;id;[456];456;1}ghi'
|
14
14
|
|
15
|
-
mapping = TraceVisualization::Mapping.
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
mapping.process do
|
20
|
-
from_string(str)
|
21
|
-
end
|
15
|
+
mapping = TraceVisualization::Mapping.new
|
16
|
+
mapping.process { from_string(str) }
|
22
17
|
|
23
18
|
TraceVisualization::SuffixArray.naive(mapping).should eq([0, 1, 2, 4, 5, 6, 8, 9, 10, 3, 7])
|
24
19
|
end
|
@@ -57,30 +52,20 @@ describe TraceVisualization::SuffixArray do
|
|
57
52
|
end
|
58
53
|
|
59
54
|
it 'should correct process mapped string' do
|
60
|
-
str = 'abc[123]def[456]ghi'
|
61
|
-
|
62
|
-
mapping = TraceVisualization::Mapping.init do
|
63
|
-
default_tokens
|
64
|
-
end
|
55
|
+
str = 'abc{TOKEN;id;[123];123;1}def{TOKEN;id;[456];456;1}ghi'
|
65
56
|
|
66
|
-
mapping.
|
67
|
-
|
68
|
-
end
|
57
|
+
mapping = TraceVisualization::Mapping.new
|
58
|
+
mapping.process { from_string(str) }
|
69
59
|
|
70
60
|
TraceVisualization::SuffixArray.effective(mapping).should eq([0, 1, 2, 4, 5, 6, 8, 9, 10, 3, 7])
|
71
61
|
end
|
72
62
|
|
73
63
|
it 'another string for mapped processing' do
|
74
|
-
str = "127.0.0.1 a 127.0.0.1 b"
|
64
|
+
str = "{TOKEN;ip;127.0.0.1;1000;1} a {TOKEN;ip;127.0.0.1;1000;1} b"
|
75
65
|
|
76
66
|
# 'X a X b'
|
77
|
-
mapping = TraceVisualization::Mapping.
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
mapping.process do
|
82
|
-
from_string(str)
|
83
|
-
end
|
67
|
+
mapping = TraceVisualization::Mapping.new
|
68
|
+
mapping.process { from_string(str) }
|
84
69
|
|
85
70
|
mapping[0].to_int.should eq 4
|
86
71
|
mapping[1].to_int.should eq 1
|
@@ -102,13 +87,8 @@ describe TraceVisualization::SuffixArray do
|
|
102
87
|
it 'bug with endless loop' do
|
103
88
|
str = "127.0.0.1 user login\r\n127.0.0.1 user logout"
|
104
89
|
|
105
|
-
mapping = TraceVisualization::Mapping.
|
106
|
-
|
107
|
-
end
|
108
|
-
|
109
|
-
mapping.process do
|
110
|
-
from_string(str)
|
111
|
-
end
|
90
|
+
mapping = TraceVisualization::Mapping.new
|
91
|
+
mapping.process { from_string str }
|
112
92
|
|
113
93
|
sa = TraceVisualization::SuffixArray.effective(mapping)
|
114
94
|
end
|
data/spec/utils_spec.rb
CHANGED
@@ -1,22 +1,18 @@
|
|
1
|
+
require 'trace_visualization'
|
1
2
|
require 'trace_visualization/utils'
|
2
3
|
|
3
4
|
require 'tempfile'
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
lines_pos = TraceVisualization::Utils.lines_pos(str)
|
9
|
-
|
10
|
-
lines_pos.should eq [0, 8, 16]
|
11
|
-
end
|
12
|
-
|
6
|
+
include TraceVisualization
|
7
|
+
|
8
|
+
describe Utils do
|
13
9
|
it "read file test" do
|
14
10
|
file = Tempfile.new('trace_visualization_test')
|
15
11
|
begin
|
16
12
|
file.write("first line\r\nsecond line\r\nthird line")
|
17
13
|
file.close
|
18
14
|
|
19
|
-
str =
|
15
|
+
str = Utils.read_file({
|
20
16
|
:file_name => file.path,
|
21
17
|
:n_lines => 2
|
22
18
|
})
|
@@ -27,4 +23,20 @@ describe TraceVisualization::Utils do
|
|
27
23
|
file.unlink
|
28
24
|
end
|
29
25
|
end
|
26
|
+
|
27
|
+
it 'correctly process set_default_options' do
|
28
|
+
default = { :offset => 0, :limit => 100 }
|
29
|
+
|
30
|
+
options = {}
|
31
|
+
Utils.set_default_options(options, default)
|
32
|
+
options.should eq ({ :offset => 0, :limit => 100 })
|
33
|
+
|
34
|
+
options = { :offset => 100 }
|
35
|
+
Utils.set_default_options(options, default)
|
36
|
+
options.should eq ({ :offset => 100, :limit => 100 })
|
37
|
+
|
38
|
+
options = { :limit => 100, :qty => 42 }
|
39
|
+
Utils.set_default_options(options, default)
|
40
|
+
options.should eq ({ :offset => 0, :limit => 100, :qty => 42 })
|
41
|
+
end
|
30
42
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'trace_visualization'
|
2
|
+
|
3
|
+
include TraceVisualization
|
4
|
+
|
5
|
+
describe TraceVisualization::Visualization::ConsoleColorPrint do
|
6
|
+
it 'smoke' do
|
7
|
+
data = <<-LOG
|
8
|
+
sergey-macbook login[4077] <Notice>: USER_PROCESS: 4077 ttys001
|
9
|
+
sergey-macbook loginwindow[4215] <Notice>: USER_PROCESS: 4215 console
|
10
|
+
LOG
|
11
|
+
|
12
|
+
mapping = TraceVisualization::Mapping.new
|
13
|
+
mapping.process { from_string(data) }
|
14
|
+
|
15
|
+
rs = Repetitions.psy1(mapping, 2, true)
|
16
|
+
|
17
|
+
RepetitionsScore.fill_score(rs, :sort => true, :order => 'desc', :version => 'relative')
|
18
|
+
|
19
|
+
Visualization::ConsoleColorPrint.hl(mapping, rs[0]).should eq <<-EOL
|
20
|
+
sergey-macbook login[4077#{Visualization::ConsoleColorPrint::GRN}] <Notice>: USER_PROCESS: 4#{Visualization::ConsoleColorPrint::FINISH}077 ttys001
|
21
|
+
sergey-macbook loginwindow[4215#{Visualization::ConsoleColorPrint::GRN}] <Notice>: USER_PROCESS: 4#{Visualization::ConsoleColorPrint::FINISH}215 console
|
22
|
+
EOL
|
23
|
+
.chomp
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|