groonga-query-log 1.3.9 → 1.4.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 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