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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/bin/trace_visualization +21 -26
  4. data/lib/trace_visualization.rb +2 -2
  5. data/lib/trace_visualization/algorithm.rb +42 -0
  6. data/lib/trace_visualization/data/irepetition.rb +5 -1
  7. data/lib/trace_visualization/data/repetition.rb +14 -6
  8. data/lib/trace_visualization/data/sorted_array.rb +44 -0
  9. data/lib/trace_visualization/data/{lexeme.rb → token.rb} +7 -8
  10. data/lib/trace_visualization/lexeme_overlap_filter.rb +18 -18
  11. data/lib/trace_visualization/mapping.rb +72 -185
  12. data/lib/trace_visualization/repetitions/concatenation.rb +136 -0
  13. data/lib/trace_visualization/repetitions/context.rb +70 -0
  14. data/lib/trace_visualization/repetitions/filter.rb +153 -0
  15. data/lib/trace_visualization/repetitions/incrementation.rb +89 -0
  16. data/lib/trace_visualization/repetitions_psy.rb +12 -5
  17. data/lib/trace_visualization/utils.rb +5 -42
  18. data/lib/trace_visualization/version.rb +1 -1
  19. data/lib/trace_visualization/visualization/console_color_print.rb +20 -4
  20. data/spec/algorithm_spec.rb +69 -0
  21. data/spec/bwt_spec.rb +2 -5
  22. data/spec/data/sorted_array_spec.rb +27 -0
  23. data/spec/lexeme_overlap_filter_spec.rb +22 -22
  24. data/spec/longest_common_prefix_spec.rb +3 -8
  25. data/spec/mapping_spec.rb +72 -69
  26. data/spec/repetitions/concatenation_spec.rb +65 -0
  27. data/spec/repetitions/filter_spec.rb +180 -0
  28. data/spec/repetitions/incrementation_spec.rb +29 -0
  29. data/spec/repetitions_psy_spec.rb +7 -16
  30. data/spec/suffix_array_spec.rb +11 -31
  31. data/spec/utils_spec.rb +21 -9
  32. data/spec/visualization/console_color_print_spec.rb +26 -0
  33. data/trace_visualization.gemspec +2 -2
  34. metadata +27 -13
  35. data/lib/trace_visualization/repetitions_concatenation.rb +0 -134
  36. data/lib/trace_visualization/repetitions_context.rb +0 -18
  37. 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.init do
20
- default_tokens
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
- str = "aaa[123]xyz[654]aaa[123]" # <---> "aaaXxyzYaaaX"
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.process do
38
- from_string(str)
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
 
@@ -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.init do
16
- default_tokens
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.process do
67
- from_string(str)
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.init do
78
- default_tokens
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.init do
106
- default_tokens
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
@@ -1,22 +1,18 @@
1
+ require 'trace_visualization'
1
2
  require 'trace_visualization/utils'
2
3
 
3
4
  require 'tempfile'
4
5
 
5
- describe TraceVisualization::Utils do
6
- it "lines pos" do
7
- str = "qwerty\r\nqwerty\r\nqwerty"
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 = TraceVisualization::Utils.read_file({
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