rreplay 0.1.2 → 0.2.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
2
  SHA256:
3
- metadata.gz: 5fa09716c0210241ba3b0d38a5e8dd75167753ccdb5b4912ad77ec80d78678d1
4
- data.tar.gz: '05909b0693720f9b62c3494e7d1de4ba71e908fea26f6aed85a5a052087ebce0'
3
+ metadata.gz: 14173bb308c83ce39166a267e8f1477616aa6f51b24fc68e2df4e9f9accfa292
4
+ data.tar.gz: d472b8bbe77689121115f7d40758ff2a9c928a22057771f3237a3b181fc396ef
5
5
  SHA512:
6
- metadata.gz: b23043a99ee9f017ceb21ffcd37e9e16269504bdd5ef8e0ac740d0802f5728f19fd124a6d9b1308b336f51c7768fc5ab51578deca922eea770140f2658464f44
7
- data.tar.gz: 43bcd20ae323b1c9f627daf9fca8d0b365712f5b30ca182252f9a221086e25449ecf7a6322ed6e228f79294657fefd8627fa1dd3ee51ab3068134030637bb87e
6
+ metadata.gz: 4ac669fe52af177b7f7133e9d842315137e361eb5c7875ff673f8e12f83a83b440a5523f61dc82c32e5ddc80ad7427c35511ae9109ce91ba9071bf8a6e5b24a5
7
+ data.tar.gz: e2dcf2b4772208628c4d8b63ffa194b1c93f10424f92bb7c2d3840b13ec0fb646273da8d48f09b486d38c7f3d5d96fd58ecfe58ab8c37aafe99770ab2a1733de
@@ -8,7 +8,15 @@ module Rreplay
8
8
  def out(&block)
9
9
  return unless @debug
10
10
 
11
- @logger.write("#{Time.now.iso8601} - #{block.call}\n")
11
+ msg = block.call.then do |msg|
12
+ case msg
13
+ when Hash
14
+ msg.merge({ time: Time.now.iso8601 }).to_json
15
+ else
16
+ "#{Time.now.iso8601} - #{block.call}"
17
+ end
18
+ end
19
+ @logger.write("#{msg}\n")
12
20
  end
13
21
  end
14
22
  end
@@ -9,47 +9,27 @@ require_relative './format'
9
9
  module Rreplay
10
10
  class ReplayRunner
11
11
  def initialize(endpoint, target, format: :msgpack, debug: false)
12
- @endpoint = endpoint
12
+ @http = Http.new(endpoint)
13
13
  @format = Rreplay::Format.of(format)
14
14
  @target = target
15
15
  @debugger = Debugger.new($stderr, debug)
16
16
  end
17
17
 
18
18
  def run
19
+ output = OutputBuilder.new(style: :json)
20
+
19
21
  file_names.each do |file_name|
20
22
  ::File.open(file_name) do |file|
21
- @debugger.out { "Open file: #{file_name}" }
23
+ @debugger.out { { message: "Open file: #{file_name}" } }
22
24
 
23
25
  file.each_line do |line|
24
26
  next if line.start_with?('#') # LogDevice's header
25
27
  line.chomp!
28
+ record = deserialize(line)
26
29
 
27
- begin
28
- record = @format.deserializer.call(line)
29
- rescue => e
30
- raise "Failed to deserialize. err = #{e.inspect}, line = #{line}", e
31
- end
32
- request = record["request"]
33
- result, response_time = http_call(request)
30
+ result = @http.call(record['request'])
34
31
  @debugger.out {
35
- response_json = {
36
- status: result.code,
37
- headers: record['response']['headers'].reduce({}) do |acc, (key, _)|
38
- acc.merge({key => result[key]})
39
- end,
40
- body: Array(result.body),
41
- }
42
- <<~EOF
43
- #{record['uuid']}:
44
- * request:
45
- #{request}
46
- * response(actual):
47
- #{response_time} sec
48
- #{response_json}
49
- * response(recorded):
50
- #{record['response_time']} sec
51
- #{record['response']}
52
- EOF
32
+ output.call(record, result)
53
33
  }
54
34
  end
55
35
  end
@@ -67,8 +47,83 @@ module Rreplay
67
47
  end
68
48
  end
69
49
 
50
+ def deserialize(line)
51
+ @format.deserializer.call(line)
52
+ rescue => e
53
+ raise "Failed to deserialize. err = #{e.inspect}, line = #{line}", e
54
+ end
55
+
56
+ end
57
+
58
+ private
59
+
60
+ class OutputBuilder
61
+ # @param style [Symbol] :json or :string
62
+ def initialize(style: :json)
63
+ @builder = case style
64
+ when :json
65
+ method(:build_json)
66
+ else
67
+ method(:build_string)
68
+ end
69
+ end
70
+
71
+ # @param record [Hash]
72
+ # @param result [Http::Result]
73
+ def call(record, result)
74
+ response_json = {
75
+ status: result.response.code,
76
+ headers: record['response']['headers'].reduce({}) do |acc, (key, _)|
77
+ acc.merge({key => result.response[key]})
78
+ end,
79
+ body: Array(result.response.body),
80
+ }
81
+
82
+ @builder.call(record, result.response_time, response_json)
83
+ end
84
+
85
+ private
86
+
87
+ def build_json(record, response_time, actual_response)
88
+ {
89
+ uuid: record['uuid'],
90
+ response: {
91
+ actual: {
92
+ response_time: response_time,
93
+ response: actual_response,
94
+ },
95
+ recorded: {
96
+ response_time: record['response_time'],
97
+ record: record['response'],
98
+ }
99
+ }
100
+ }
101
+ end
102
+
103
+ def build_string(record, response_time, actual_response)
104
+
105
+ <<~EOF
106
+ #{record['uuid']}:
107
+ * request:
108
+ #{record['request']}
109
+ * response(actual):
110
+ #{response_time} sec
111
+ #{actual_response}
112
+ * response(recorded):
113
+ #{record['response_time']} sec
114
+ #{record['response']}
115
+ EOF
116
+ end
117
+ end
118
+
119
+ class Http
120
+ Result = Struct.new(:response, :response_time)
70
121
 
71
- def http_call(orig_request)
122
+ def initialize(endpoint)
123
+ @endpoint = endpoint
124
+ end
125
+
126
+ def call(orig_request)
72
127
  uri = URI(::File.join(@endpoint, orig_request['path'], orig_request['query_strings']))
73
128
  body = orig_request['body']
74
129
  headers = orig_request['headers']
@@ -95,13 +150,10 @@ module Rreplay
95
150
 
96
151
  start_time = Time.now
97
152
  response = Net::HTTP.start(uri.hostname, uri.port,
98
- :use_ssl => uri.scheme == 'https') { |http|
153
+ :use_ssl => uri.scheme == 'https') { |http|
99
154
  http.request(request)
100
155
  }
101
- [response, Time.now - start_time]
156
+ Result.new(response, Time.now - start_time)
102
157
  end
103
- end
104
-
105
- private
106
-
158
+ end
107
159
  end
data/rreplay.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "rreplay"
3
- spec.version = "0.1.2"
3
+ spec.version = "0.2.0"
4
4
  spec.authors = ["petitviolet"]
5
5
  spec.email = ["violethero0820@gmail.com"]
6
6
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rreplay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - petitviolet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-30 00:00:00.000000000 Z
11
+ date: 2019-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack