groonga-query-log 1.3.9 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 747d884c77f1a62e7266740a0a5cfe796dc9afc5
4
- data.tar.gz: 17a9c5e1f2463a1d5b4deee9d187619ceec6f690
2
+ SHA256:
3
+ metadata.gz: 815281fff50a93e07460fc0bb35ea453cfc8b36881f685facf2dc61b6481b564
4
+ data.tar.gz: 6fb79fe569bb61b35dbe7f876348be12c236791cfc53a25118c134f286974ebe
5
5
  SHA512:
6
- metadata.gz: f9ed114c27916395db0d9cf82d02b3c938b7aa338863da6972b156726646ee18cd7cff536c1483ae95af065c697a945d0fb618b2bf34e5c92de15af01e87ced7
7
- data.tar.gz: 5cfe3856cca14f355c1f2d6f19c36b4da3ec61918938e6e3ecdc97ccae8c183726b6ebf30309f8cd6c234f405a910f6c4d1f419caa5a401cf5a233585940fcd7
6
+ metadata.gz: '083d46ede2bcb5ef1902210dcd2b4b67b95ec475704efd4c3c768827772e67fd667e6d8dc53b0d250ed5a5896366af5e7ff9b42d5708f5c3b0c90b6143d3bd6f'
7
+ data.tar.gz: 8d5f90bf96d8815f8c4dccdca755d3e49b13f5586b56e90d5ddd3f4af5561480b3394ed3a62c6c5b2ba5662e88fceab1a5d36c07280307a4e25094cc9fd7c8ae
@@ -1,5 +1,24 @@
1
1
  # News
2
2
 
3
+ ## 1.4.0: 2019-03-13
4
+
5
+ ### Improvements
6
+
7
+ * `groonga-query-log-run-regression-test`:
8
+
9
+ * Added support for rewriting `"column1 @ \"keyword\" && column2 @~ \"^(?!.*keyword1|keyword2|...).+$\""`.
10
+ Specify --rewrite-not-or-regular-expression option to enable it.
11
+
12
+ ### Fixes
13
+
14
+ * `groonga-query-log-check-crash`:
15
+
16
+ * Fixed missing nil check when request path is "/".
17
+
18
+ * `GroongaQueryLog::Statistic`:
19
+
20
+ * Fixed missing nil check in `#to_hash` when request path is "/".
21
+
3
22
  ## 1.3.9: 2018-11-20
4
23
 
5
24
  ### Improvements
@@ -209,7 +209,10 @@ module GroongaQueryLog
209
209
  end
210
210
 
211
211
  def check_query_log_statistic(path, statistic)
212
- case statistic.command.command_name
212
+ command = statistic.command
213
+ return if command.nil?
214
+
215
+ case command.command_name
213
216
  when "load"
214
217
  @flushed = false
215
218
  @unflushed_statistics << statistic
@@ -220,10 +223,10 @@ module GroongaQueryLog
220
223
  @flushed = false
221
224
  @unflushed_statistics << statistic
222
225
  when "io_flush"
223
- check_io_flush(statistic.command)
226
+ check_io_flush(command)
224
227
  when "database_unmap"
225
228
  @unflushed_statistics.reject! do |statistic|
226
- statistic.command.name == "load"
229
+ command.name == "load"
227
230
  end
228
231
  when "table_list", "column_list"
229
232
  # ignore
@@ -28,7 +28,8 @@ require "groonga-query-log/version"
28
28
  module GroongaQueryLog
29
29
  module Command
30
30
  class FormatRegressionTestLogs
31
- def initialize
31
+ def initialize(options={})
32
+ @output = options[:output] || $stdout
32
33
  end
33
34
 
34
35
  def run(command_line)
@@ -68,8 +69,8 @@ module GroongaQueryLog
68
69
 
69
70
  input.each_line do |line|
70
71
  unless line.valid_encoding?
71
- puts("invalid encoding line")
72
- puts("#{path}:#{input.lineno}:#{line}")
72
+ @output.puts("invalid encoding line")
73
+ @output.puts("#{path}:#{input.lineno}:#{line}")
73
74
  next
74
75
  end
75
76
  case line
@@ -97,18 +98,18 @@ module GroongaQueryLog
97
98
  begin
98
99
  JSON.parse(response_old)
99
100
  rescue JSON::ParserError
100
- puts(command)
101
- puts("failed to parse old response: #{$!.message}")
102
- puts(response_old)
101
+ @output.puts(command)
102
+ @output.puts("failed to parse old response: #{$!.message}")
103
+ @output.puts(response_old)
103
104
  valid = false
104
105
  end
105
106
 
106
107
  begin
107
108
  JSON.parse(response_new)
108
109
  rescue JSON::ParserError
109
- puts(command)
110
- puts("failed to parse new response: #{$!.message}")
111
- puts(response_new)
110
+ @output.puts(command)
111
+ @output.puts("failed to parse new response: #{$!.message}")
112
+ @output.puts(response_new)
112
113
  valid = false
113
114
  end
114
115
 
@@ -125,33 +126,39 @@ module GroongaQueryLog
125
126
  PP.pp(JSON.parse(response_new), response_new_file)
126
127
  response_new_file.flush
127
128
  report_command(command)
128
- system("diff",
129
- "--label=old",
130
- "--label=new",
131
- "-u",
132
- response_old_file.path, response_new_file.path)
129
+ Tempfile.open("response-diff") do |response_diff_file|
130
+ system("diff",
131
+ "--label=old",
132
+ "--label=new",
133
+ "-u",
134
+ response_old_file.path,
135
+ response_new_file.path,
136
+ out: response_diff_file)
137
+ response_diff_file.rewind
138
+ @output.puts(response_diff_file.read)
139
+ end
133
140
  end
134
141
  end
135
142
  end
136
143
 
137
144
  def report_error(command, message, backtrace)
138
145
  report_command(command)
139
- puts("Error: #{message}")
140
- puts("Backtrace:")
141
- puts(backtrace)
146
+ @output.puts("Error: #{message}")
147
+ @output.puts("Backtrace:")
148
+ @output.puts(backtrace)
142
149
  end
143
150
 
144
151
  def report_command(command)
145
- puts("Command:")
146
- puts(command)
152
+ @output.puts("Command:")
153
+ @output.puts(command)
147
154
  parsed_command = Groonga::Command::Parser.parse(command)
148
- puts("Name: #{parsed_command.name}")
149
- puts("Arguments:")
155
+ @output.puts("Name: #{parsed_command.name}")
156
+ @output.puts("Arguments:")
150
157
  sorted_arguments = parsed_command.arguments.sort_by do |key, value|
151
158
  key
152
159
  end
153
160
  sorted_arguments.each do |key, value|
154
- puts(" #{key}: #{value}")
161
+ @output.puts(" #{key}: #{value}")
155
162
  end
156
163
  end
157
164
  end
@@ -50,6 +50,7 @@ module GroongaQueryLog
50
50
  @vector_accessors = []
51
51
  @rewrite_nullable_reference_number = false
52
52
  @nullable_reference_number_accessors = []
53
+ @rewrite_not_or_regular_expression = false
53
54
 
54
55
  @care_order = true
55
56
  @ignored_drilldown_keys = []
@@ -187,6 +188,14 @@ module GroongaQueryLog
187
188
  "specifying this option multiple times") do |accessor|
188
189
  @nullable_reference_number_accessors << accessor
189
190
  end
191
+ parser.on("--[no-]rewrite-not-or-regular-expression",
192
+ "Rewrite 'column1 @ \"keyword1\" && column2 @~ " +
193
+ "\"^(?!.*keyword2|keyword3|...).+$\"' " +
194
+ "with 'column1 @ \"keyword1\" &! column2 @ \"keyword2\" " +
195
+ "&! column2 @ \"keyword3\" &! ...'",
196
+ "(#{@rewrite_not_or_regular_expression})") do |boolean|
197
+ @rewrite_not_or_regular_expression = boolean
198
+ end
190
199
 
191
200
  parser.separator("")
192
201
  parser.separator("Comparisons:")
@@ -252,6 +261,8 @@ module GroongaQueryLog
252
261
  @rewrite_nullable_reference_number,
253
262
  :nullable_reference_number_accessors =>
254
263
  @nullable_reference_number_accessors,
264
+ :rewrite_not_or_regular_expression =>
265
+ @rewrite_not_or_regular_expression,
255
266
  :target_command_names => @target_command_names,
256
267
  :read_timeout => @read_timeout,
257
268
  }
@@ -547,6 +558,9 @@ module GroongaQueryLog
547
558
  command_line << "--nullable-reference-number-accessor"
548
559
  command_line << accessor
549
560
  end
561
+ if @options[:rewrite_not_or_regular_expression]
562
+ command_line << "--rewrite-not-or-regular-expression"
563
+ end
550
564
  if @options[:target_command_names]
551
565
  command_line << "--target-command-names"
552
566
  command_line << @options[:target_command_names].join(",")
@@ -230,6 +230,15 @@ module GroongaQueryLog
230
230
  @options.rewrite_nullable_reference_number = boolean
231
231
  end
232
232
 
233
+ parser.on("--[no-]rewrite-not-or-regular-expression",
234
+ "Rewrite 'column1 @ \"keyword1\" && column2 @~ " +
235
+ "\"^(?!.*keyword2|keyword3|...).+$\"' " +
236
+ "with 'column1 @ \"keyword1\" &! column2 @ \"keyword2\" " +
237
+ "&! column2 @ \"keyword3\" &! ...'",
238
+ "(#{@options.rewrite_not_or_regular_expression?})") do |boolean|
239
+ @options.rewrite_not_or_regular_expression = boolean
240
+ end
241
+
233
242
  parser.on("--nullable-reference-number-accessor=ACCESSOR",
234
243
  "Mark ACCESSOR as rewrite nullable reference number targets",
235
244
  "You can specify multiple accessors by",
@@ -35,6 +35,9 @@ module GroongaQueryLog
35
35
  if @options[:rewrite_nullable_reference_number]
36
36
  rewritten = rewrite_nullable_reference_number(rewritten)
37
37
  end
38
+ if @options[:rewrite_not_or_regular_expression]
39
+ rewritten = rewrite_not_or_regular_expression(rewritten)
40
+ end
38
41
  rewritten
39
42
  end
40
43
 
@@ -77,5 +80,25 @@ module GroongaQueryLog
77
80
  end
78
81
  end
79
82
  end
83
+
84
+ def rewrite_not_or_regular_expression(filter)
85
+ filter.gsub(/&& *(?<target_column>[a-zA-Z0-9_.]+) *@~ *"(?<pattern>.*?)"/) do |matched|
86
+ target_column = $LAST_MATCH_INFO[:target_column]
87
+ pattern = $LAST_MATCH_INFO[:pattern]
88
+
89
+ case pattern
90
+ when /\A(?<header>(?:\^|\\A)\(\?\!\.\*)
91
+ (?<body>.+)
92
+ (?<footer>\)\.[+*](?:\$|\\z))\z/x
93
+ body = $LAST_MATCH_INFO[:body]
94
+ conditions = body.split("|").collect do |word|
95
+ "&! #{target_column} @ \"#{word.strip}\""
96
+ end
97
+ conditions.join(" ")
98
+ else
99
+ matched
100
+ end
101
+ end
102
+ end
80
103
  end
81
104
  end
@@ -240,6 +240,7 @@ module GroongaQueryLog
240
240
  attr_accessor :vector_accessors
241
241
  attr_writer :rewrite_nullable_reference_number
242
242
  attr_accessor :nullable_reference_number_accessors
243
+ attr_writer :rewrite_not_or_regular_expression
243
244
  def initialize
244
245
  @groonga1 = GroongaOptions.new
245
246
  @groonga2 = GroongaOptions.new
@@ -268,6 +269,7 @@ module GroongaQueryLog
268
269
  @vector_accessors = []
269
270
  @rewrite_nullable_reference_number = false
270
271
  @nullable_reference_number_accessors = []
272
+ @rewrite_not_or_regular_expression = false
271
273
  end
272
274
 
273
275
  def request_queue_size
@@ -298,6 +300,10 @@ module GroongaQueryLog
298
300
  @rewrite_nullable_reference_number
299
301
  end
300
302
 
303
+ def rewrite_not_or_regular_expression?
304
+ @rewrite_not_or_regular_expression
305
+ end
306
+
301
307
  def target_command_name?(name)
302
308
  return false if name.nil?
303
309
 
@@ -326,7 +332,8 @@ module GroongaQueryLog
326
332
  def need_filter_rewrite?
327
333
  rewrite_vector_equal? or
328
334
  rewrite_vector_not_equal_empty_string? or
329
- rewrite_nullable_reference_number?
335
+ rewrite_nullable_reference_number? or
336
+ rewrite_not_or_regular_expression
330
337
  end
331
338
 
332
339
  def to_filter_rewriter_options
@@ -339,6 +346,8 @@ module GroongaQueryLog
339
346
  rewrite_nullable_reference_number?,
340
347
  :nullable_reference_number_accessors =>
341
348
  nullable_reference_number_accessors,
349
+ :rewrite_not_or_regular_expression =>
350
+ rewrite_not_or_regular_expression?,
342
351
  }
343
352
  end
344
353
  end
@@ -121,14 +121,17 @@ module GroongaQueryLog
121
121
  "return_code" => return_code,
122
122
  "slow" => slow?,
123
123
  }
124
- arguments = command.arguments.collect do |key, value|
125
- {"key" => key, "value" => value}
124
+ if command
125
+ data["command"] = {
126
+ "raw" => raw_command,
127
+ "name" => command.name,
128
+ "parameters" => command_arguments,
129
+ }
130
+ else
131
+ data["command"] = {
132
+ "raw" => raw_command
133
+ }
126
134
  end
127
- data["command"] = {
128
- "raw" => raw_command,
129
- "name" => command.name,
130
- "parameters" => arguments,
131
- }
132
135
  operations = []
133
136
  each_operation do |operation|
134
137
  operation_data = {}
@@ -192,5 +195,11 @@ module GroongaQueryLog
192
195
  def slow_operation?(elapsed)
193
196
  elapsed >= @slow_operation_threshold
194
197
  end
198
+
199
+ def command_arguments
200
+ command.arguments.collect do |key, value|
201
+ {"key" => key, "value" => value}
202
+ end
203
+ end
195
204
  end
196
205
  end
@@ -15,5 +15,5 @@
15
15
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
  module GroongaQueryLog
18
- VERSION = "1.3.9"
18
+ VERSION = "1.4.0"
19
19
  end
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  # Copyright (C) 2014-2018 Kouhei Sutou <kou@clear-code.com>
2
3
  #
3
4
  # This library is free software; you can redistribute it and/or
@@ -29,13 +30,13 @@ class FormatRegressionTestLogsCommandTest < Test::Unit::TestCase
29
30
  success = false
30
31
  begin
31
32
  $stdout.reopen(output)
32
- succees = @command.run(command_line)
33
+ success = @command.run(command_line)
33
34
  ensure
34
35
  $stdout.reopen(stdout)
35
36
  end
36
37
  output.close
37
38
  output.open
38
- [succees, output.read]
39
+ [success, output.read]
39
40
  end
40
41
 
41
42
  def fixture_path(*components)
@@ -59,10 +60,10 @@ Arguments:
59
60
  +++ new
60
61
  @@ -1,4 +1,4 @@
61
62
  [[[2],
62
- [[\"_id\", \"UInt32\"], [\"message\", \"Text\"]],
63
- [1, \"log message1\"],
64
- - [2, \"log message2\"]]]
65
- + [3, \"log message3\"]]]
63
+ [["_id", "UInt32"], ["message", "Text"]],
64
+ [1, "log message1"],
65
+ - [2, "log message2"]]]
66
+ + [3, "log message3"]]]
66
67
  OUTPUT
67
68
  assert_equal([true, output],
68
69
  run_command([fixture_path("command-format.log")]))
@@ -81,10 +82,10 @@ Arguments:
81
82
  +++ new
82
83
  @@ -1,4 +1,4 @@
83
84
  [[[2],
84
- [[\"_id\", \"UInt32\"], [\"message\", \"Text\"]],
85
- [1, \"log message1: 焼肉\"],
86
- - [2, \"log message2: 焼肉\"]]]
87
- + [3, \"log message3: 焼肉\"]]]
85
+ [["_id", "UInt32"], ["message", "Text"]],
86
+ [1, "log message1: 焼肉"],
87
+ - [2, "log message2: 焼肉"]]]
88
+ + [3, "log message3: 焼肉"]]]
88
89
  OUTPUT
89
90
  assert_equal([true, output],
90
91
  run_command([fixture_path("url-format.log")]))
@@ -108,4 +109,32 @@ Backtrace:
108
109
  assert_equal([true, output],
109
110
  run_command([fixture_path("error.log")]))
110
111
  end
112
+
113
+ sub_test_case(".new") do
114
+ def setup
115
+ end
116
+
117
+ def test_output
118
+ output = StringIO.new
119
+ options = {:output => output}
120
+ command = GroongaQueryLog::Command::FormatRegressionTestLogs.new(options)
121
+ command.run([fixture_path("command-format.log")])
122
+ expected = <<-OUTPUT
123
+ Command:
124
+ select Logs
125
+ Name: select
126
+ Arguments:
127
+ table: Logs
128
+ --- old
129
+ +++ new
130
+ @@ -1,4 +1,4 @@
131
+ [[[2],
132
+ [["_id", "UInt32"], ["message", "Text"]],
133
+ [1, "log message1"],
134
+ - [2, "log message2"]]]
135
+ + [3, "log message3"]]]
136
+ OUTPUT
137
+ assert_equal(expected, output.string)
138
+ end
139
+ end
111
140
  end
@@ -110,4 +110,31 @@ class FilterRewriterTest < Test::Unit::TestCase
110
110
  ["ref_column.number"]))
111
111
  end
112
112
  end
113
+
114
+ class RegularExpressionTest < self
115
+ def rewrite(filter, enabled = true)
116
+ super(filter,
117
+ :rewrite_not_or_regular_expression => enabled)
118
+ end
119
+
120
+ def test_rewrite_one
121
+ assert_equal("column1 @ \"value1\" &! column2 @ \"value2\"",
122
+ rewrite("column1 @ \"value1\" && column2 @~ \"^(?!.*value2).+$\""))
123
+ end
124
+
125
+ def test_reference
126
+ assert_equal("column1 @ \"value1\" &! reference.column2 @ \"value2\"",
127
+ rewrite("column1 @ \"value1\" && reference.column2 @~ \"^(?!.*value2).+$\""))
128
+ end
129
+
130
+ def test_under_score
131
+ assert_equal("column1 @ \"value1\" &! column_2 @ \"value_2\"",
132
+ rewrite("column1 @ \"value1\" && column_2 @~ \"^(?!.*value_2).+$\""))
133
+ end
134
+
135
+ def test_rewrite_multiple
136
+ assert_equal("column1 @ \"value1\" &! column2 @ \"value2\" &! column2 @ \"value3\" &! column2 @ \"value4\"",
137
+ rewrite("column1 @ \"value1\" && column2 @~ \"^(?!.*value2 | value3 | value4).+$\""))
138
+ end
139
+ end
113
140
  end
@@ -43,6 +43,17 @@ class ParserTest < Test::Unit::TestCase
43
43
  assert_equal([nil], statistics.collect(&:command))
44
44
  end
45
45
 
46
+ def test_no_command_to_hash
47
+ statistics = parse(<<-LOG)
48
+ 2012-12-13 11:15:20.628105|0x7fff148c8a50|>/
49
+ 2012-12-13 11:15:21.645119|0x7fff148c8a50|<000000017041150 rc=0
50
+ LOG
51
+ expected = {
52
+ "raw" => "/"
53
+ }
54
+ assert_equal(expected, statistics[0].to_hash["command"])
55
+ end
56
+
46
57
  private
47
58
  def parse(log)
48
59
  statistics = []
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groonga-query-log
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.9
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouhei Sutou
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-20 00:00:00.000000000 Z
11
+ date: 2019-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: groonga-command-parser
@@ -154,17 +154,17 @@ description: ''
154
154
  email:
155
155
  - kou@clear-code.com
156
156
  executables:
157
- - groonga-query-log-extract
157
+ - groonga-query-log-format-regression-test-logs
158
158
  - groonga-query-log-run-regression-test
159
- - groonga-query-log-analyze-load
160
159
  - groonga-query-log-check-crash
161
- - groonga-query-log-analyze
162
- - groonga-query-log-verify-server
160
+ - groonga-query-log-replay
163
161
  - groonga-query-log-check-command-version-compatibility
164
- - groonga-query-log-detect-memory-leak
165
- - groonga-query-log-format-regression-test-logs
162
+ - groonga-query-log-verify-server
166
163
  - groonga-query-log-show-running-queries
167
- - groonga-query-log-replay
164
+ - groonga-query-log-analyze
165
+ - groonga-query-log-extract
166
+ - groonga-query-log-detect-memory-leak
167
+ - groonga-query-log-analyze-load
168
168
  extensions: []
169
169
  extra_rdoc_files: []
170
170
  files:
@@ -280,8 +280,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
280
280
  - !ruby/object:Gem::Version
281
281
  version: '0'
282
282
  requirements: []
283
- rubyforge_project:
284
- rubygems_version: 2.5.2.1
283
+ rubygems_version: 3.0.2
285
284
  signing_key:
286
285
  specification_version: 4
287
286
  summary: Groonga-query-log is a collection of library and tools to process [Groonga](http://groonga.org/)'s
@@ -289,35 +288,35 @@ summary: Groonga-query-log is a collection of library and tools to process [Groo
289
288
  as a library. You can analyze your Groonga's queries and test with your Groonga's
290
289
  query log by using groonga-query-log as a tool.
291
290
  test_files:
292
- - test/test-response-comparer.rb
293
- - test/run-test.rb
294
- - test/test-replayer.rb
295
- - test/test-parser.rb
296
- - test/helper.rb
297
- - test/fixtures/query.log
298
- - test/fixtures/n_entries.expected
299
- - test/fixtures/other-query.log
300
- - test/fixtures/no-report-summary.expected
291
+ - test/fixtures/reporter/console.expected
292
+ - test/fixtures/reporter/html.expected
301
293
  - test/fixtures/reporter/json-stream.expected
302
294
  - test/fixtures/reporter/json.expected
303
- - test/fixtures/reporter/html.expected
304
- - test/fixtures/reporter/console.expected
305
- - test/fixtures/regression-test-logs/command-format.log
306
- - test/fixtures/regression-test-logs/url-format.log
307
- - test/fixtures/regression-test-logs/error.log
308
- - test/fixtures/target-commands.expected
309
- - test/fixtures/multi.expected
310
- - test/fixtures/run-regression-test/query-logs/query.log
311
- - test/fixtures/run-regression-test/schema/schema.grn
312
- - test/fixtures/run-regression-test/indexes/indexes.grn
313
- - test/fixtures/run-regression-test/data/data.grn
314
- - test/fixtures/order/-elapsed.expected
315
295
  - test/fixtures/order/start-time.expected
316
296
  - test/fixtures/order/-start-time.expected
297
+ - test/fixtures/order/-elapsed.expected
317
298
  - test/fixtures/order/elapsed.expected
299
+ - test/fixtures/no-report-summary.expected
300
+ - test/fixtures/target-commands.expected
301
+ - test/fixtures/run-regression-test/data/data.grn
302
+ - test/fixtures/run-regression-test/query-logs/query.log
303
+ - test/fixtures/run-regression-test/indexes/indexes.grn
304
+ - test/fixtures/run-regression-test/schema/schema.grn
305
+ - test/fixtures/other-query.log
306
+ - test/fixtures/query.log
318
307
  - test/fixtures/target-tables.expected
319
- - test/test-filter-rewriter.rb
308
+ - test/fixtures/n_entries.expected
309
+ - test/fixtures/multi.expected
310
+ - test/fixtures/regression-test-logs/command-format.log
311
+ - test/fixtures/regression-test-logs/url-format.log
312
+ - test/fixtures/regression-test-logs/error.log
320
313
  - test/command/test-format-regression-test-logs.rb
321
- - test/command/test-extract.rb
322
314
  - test/command/test-analyzer.rb
315
+ - test/command/test-extract.rb
316
+ - test/test-response-comparer.rb
317
+ - test/test-replayer.rb
323
318
  - test/test-incompatibility-detector.rb
319
+ - test/test-filter-rewriter.rb
320
+ - test/test-parser.rb
321
+ - test/helper.rb
322
+ - test/run-test.rb