request-log-analyzer 1.13.1 → 1.13.3
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/.gitignore +1 -0
- data/bin/console +17 -0
- data/lib/cli/command_line_arguments.rb +29 -36
- data/lib/cli/database_console.rb +1 -3
- data/lib/cli/database_console_init.rb +11 -11
- data/lib/cli/progressbar.rb +30 -32
- data/lib/cli/tools.rb +20 -23
- data/lib/request_log_analyzer.rb +8 -8
- data/lib/request_log_analyzer/aggregator.rb +4 -7
- data/lib/request_log_analyzer/aggregator/database_inserter.rb +10 -13
- data/lib/request_log_analyzer/aggregator/echo.rb +5 -7
- data/lib/request_log_analyzer/aggregator/summarizer.rb +15 -18
- data/lib/request_log_analyzer/class_level_inheritable_attributes.rb +23 -0
- data/lib/request_log_analyzer/controller.rb +36 -42
- data/lib/request_log_analyzer/database.rb +4 -6
- data/lib/request_log_analyzer/database/base.rb +39 -41
- data/lib/request_log_analyzer/database/connection.rb +8 -10
- data/lib/request_log_analyzer/database/request.rb +1 -3
- data/lib/request_log_analyzer/database/source.rb +0 -2
- data/lib/request_log_analyzer/database/warning.rb +4 -6
- data/lib/request_log_analyzer/file_format.rb +46 -49
- data/lib/request_log_analyzer/file_format/amazon_s3.rb +15 -19
- data/lib/request_log_analyzer/file_format/apache.rb +42 -45
- data/lib/request_log_analyzer/file_format/delayed_job.rb +13 -15
- data/lib/request_log_analyzer/file_format/delayed_job2.rb +9 -11
- data/lib/request_log_analyzer/file_format/delayed_job21.rb +9 -11
- data/lib/request_log_analyzer/file_format/delayed_job3.rb +5 -8
- data/lib/request_log_analyzer/file_format/delayed_job4.rb +5 -8
- data/lib/request_log_analyzer/file_format/haproxy.rb +44 -48
- data/lib/request_log_analyzer/file_format/merb.rb +13 -17
- data/lib/request_log_analyzer/file_format/mysql.rb +21 -25
- data/lib/request_log_analyzer/file_format/nginx.rb +0 -2
- data/lib/request_log_analyzer/file_format/oink.rb +30 -31
- data/lib/request_log_analyzer/file_format/postgresql.rb +11 -15
- data/lib/request_log_analyzer/file_format/rack.rb +0 -2
- data/lib/request_log_analyzer/file_format/rails.rb +100 -104
- data/lib/request_log_analyzer/file_format/rails3.rb +19 -23
- data/lib/request_log_analyzer/file_format/rails_development.rb +0 -1
- data/lib/request_log_analyzer/file_format/w3c.rb +16 -18
- data/lib/request_log_analyzer/filter.rb +0 -2
- data/lib/request_log_analyzer/filter/anonymize.rb +4 -7
- data/lib/request_log_analyzer/filter/field.rb +3 -6
- data/lib/request_log_analyzer/filter/timespan.rb +2 -6
- data/lib/request_log_analyzer/line_definition.rb +16 -19
- data/lib/request_log_analyzer/log_processor.rb +10 -14
- data/lib/request_log_analyzer/mailer.rb +9 -12
- data/lib/request_log_analyzer/output.rb +12 -14
- data/lib/request_log_analyzer/output/fixed_width.rb +21 -28
- data/lib/request_log_analyzer/output/html.rb +11 -14
- data/lib/request_log_analyzer/request.rb +53 -33
- data/lib/request_log_analyzer/source.rb +2 -5
- data/lib/request_log_analyzer/source/log_parser.rb +9 -16
- data/lib/request_log_analyzer/tracker.rb +10 -12
- data/lib/request_log_analyzer/tracker/duration.rb +4 -6
- data/lib/request_log_analyzer/tracker/frequency.rb +9 -11
- data/lib/request_log_analyzer/tracker/hourly_spread.rb +8 -11
- data/lib/request_log_analyzer/tracker/numeric_value.rb +40 -44
- data/lib/request_log_analyzer/tracker/timespan.rb +5 -8
- data/lib/request_log_analyzer/tracker/traffic.rb +8 -10
- data/lib/request_log_analyzer/version.rb +1 -1
- data/request-log-analyzer.gemspec +6 -6
- data/spec/integration/command_line_usage_spec.rb +33 -33
- data/spec/integration/mailer_spec.rb +181 -185
- data/spec/integration/munin_plugins_rails_spec.rb +20 -20
- data/spec/integration/scout_spec.rb +40 -41
- data/spec/lib/helpers.rb +8 -9
- data/spec/lib/macros.rb +2 -4
- data/spec/lib/matchers.rb +20 -25
- data/spec/lib/mocks.rb +10 -11
- data/spec/lib/testing_format.rb +8 -10
- data/spec/spec_helper.rb +5 -1
- data/spec/unit/aggregator/database_inserter_spec.rb +23 -23
- data/spec/unit/aggregator/summarizer_spec.rb +7 -7
- data/spec/unit/controller/controller_spec.rb +14 -14
- data/spec/unit/controller/log_processor_spec.rb +3 -3
- data/spec/unit/database/base_class_spec.rb +36 -37
- data/spec/unit/database/connection_spec.rb +10 -10
- data/spec/unit/database/database_spec.rb +11 -11
- data/spec/unit/file_format/amazon_s3_format_spec.rb +66 -62
- data/spec/unit/file_format/apache_format_spec.rb +57 -52
- data/spec/unit/file_format/common_regular_expressions_spec.rb +18 -21
- data/spec/unit/file_format/delayed_job21_format_spec.rb +22 -16
- data/spec/unit/file_format/delayed_job2_format_spec.rb +22 -16
- data/spec/unit/file_format/delayed_job3_format_spec.rb +14 -10
- data/spec/unit/file_format/delayed_job4_format_spec.rb +14 -10
- data/spec/unit/file_format/delayed_job_format_spec.rb +12 -12
- data/spec/unit/file_format/file_format_api_spec.rb +19 -19
- data/spec/unit/file_format/format_autodetection_spec.rb +7 -7
- data/spec/unit/file_format/haproxy_format_spec.rb +53 -49
- data/spec/unit/file_format/inheritance_spec.rb +13 -0
- data/spec/unit/file_format/line_definition_spec.rb +35 -33
- data/spec/unit/file_format/merb_format_spec.rb +13 -11
- data/spec/unit/file_format/mysql_format_spec.rb +24 -24
- data/spec/unit/file_format/oink_format_spec.rb +29 -29
- data/spec/unit/file_format/postgresql_format_spec.rb +9 -9
- data/spec/unit/file_format/rack_format_spec.rb +36 -31
- data/spec/unit/file_format/rails3_format_spec.rb +46 -46
- data/spec/unit/file_format/rails_format_spec.rb +52 -53
- data/spec/unit/file_format/w3c_format_spec.rb +27 -24
- data/spec/unit/filter/anonymize_filter_spec.rb +7 -7
- data/spec/unit/filter/field_filter_spec.rb +26 -26
- data/spec/unit/filter/filter_spec.rb +4 -4
- data/spec/unit/filter/timespan_filter_spec.rb +22 -22
- data/spec/unit/mailer_spec.rb +21 -21
- data/spec/unit/request_spec.rb +29 -29
- data/spec/unit/source/log_parser_spec.rb +5 -5
- data/spec/unit/tracker/duration_tracker_spec.rb +23 -23
- data/spec/unit/tracker/frequency_tracker_spec.rb +29 -30
- data/spec/unit/tracker/hourly_spread_spec.rb +35 -35
- data/spec/unit/tracker/numeric_value_tracker_spec.rb +71 -72
- data/spec/unit/tracker/timespan_tracker_spec.rb +31 -31
- data/spec/unit/tracker/tracker_api_spec.rb +43 -44
- data/spec/unit/tracker/traffic_tracker_spec.rb +7 -7
- metadata +38 -35
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 91a5bda268facff9ef6d7ddb5ae9d4eec33a8d5c
|
|
4
|
+
data.tar.gz: f3683a5a70afba9f695016d304f91dfa7372b150
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e582a48f76e38c28312077176975f7f83369b49152edbd741db1abc0636d518c520bd6471efe30e6a8a8313c3f7ab6b54cf9fadd240101345644bca804fba089
|
|
7
|
+
data.tar.gz: 3a9fb94f97e219dd3346d30d3da6361c329b5d4310f8e68eb8982d47a73093a9d729ed5b298fa00767b67aea38e4f65922f4a374f137b00e98717f67c3ee1b1f
|
data/.gitignore
CHANGED
data/bin/console
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# -*- encoding : utf-8 -*-
|
|
3
|
+
$LOAD_PATH.unshift(File.expand_path('./../lib', File.dirname(__FILE__)))
|
|
4
|
+
#noinspection RubyResolve
|
|
5
|
+
require 'request_log_analyzer'
|
|
6
|
+
require 'irb'
|
|
7
|
+
require 'pp'
|
|
8
|
+
|
|
9
|
+
if __FILE__ == $0
|
|
10
|
+
IRB.start(__FILE__)
|
|
11
|
+
else # check -e option
|
|
12
|
+
if /\A-e\z/ =~ $0
|
|
13
|
+
IRB.start(__FILE__)
|
|
14
|
+
else
|
|
15
|
+
IRB.setup(__FILE__)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
module CommandLine
|
|
2
|
-
|
|
3
2
|
class Option
|
|
4
|
-
|
|
5
3
|
attr_reader :name, :alias
|
|
6
4
|
attr_reader :parameter_count
|
|
7
5
|
attr_reader :default_value
|
|
@@ -18,7 +16,7 @@ module CommandLine
|
|
|
18
16
|
def initialize(name, definition = {})
|
|
19
17
|
@name = CommandLine::Option.rewrite(name)
|
|
20
18
|
@alias = definition[:alias] ? definition[:alias].to_sym : nil
|
|
21
|
-
@required = definition.
|
|
19
|
+
@required = definition.key?(:required) && definition[:required] == true
|
|
22
20
|
@parameter_count = definition[:parameters] || 1
|
|
23
21
|
@multiple = definition[:multiple] || false
|
|
24
22
|
@default_value = definition[:default] || false
|
|
@@ -29,7 +27,7 @@ module CommandLine
|
|
|
29
27
|
return true
|
|
30
28
|
elsif @parameter_count == 1
|
|
31
29
|
parameter = arguments_parser.next_parameter
|
|
32
|
-
|
|
30
|
+
fail CommandLine::ParameterExpected, self if parameter.nil?
|
|
33
31
|
return parameter
|
|
34
32
|
elsif @parameter_count == :any
|
|
35
33
|
parameters = []
|
|
@@ -39,9 +37,9 @@ module CommandLine
|
|
|
39
37
|
return parameters
|
|
40
38
|
else
|
|
41
39
|
parameters = []
|
|
42
|
-
@parameter_count.times do |
|
|
40
|
+
@parameter_count.times do |_n|
|
|
43
41
|
parameter = arguments_parser.next_parameter
|
|
44
|
-
|
|
42
|
+
fail CommandLine::ParameterExpected, self if parameter.nil?
|
|
45
43
|
parameters << parameter
|
|
46
44
|
end
|
|
47
45
|
return parameters
|
|
@@ -87,10 +85,8 @@ module CommandLine
|
|
|
87
85
|
end
|
|
88
86
|
|
|
89
87
|
class Arguments
|
|
90
|
-
|
|
91
88
|
class Definition
|
|
92
|
-
|
|
93
|
-
ENDLESS_PARAMETERS = 99999
|
|
89
|
+
ENDLESS_PARAMETERS = 99_999
|
|
94
90
|
|
|
95
91
|
attr_reader :commands, :options, :parameters
|
|
96
92
|
|
|
@@ -103,10 +99,10 @@ module CommandLine
|
|
|
103
99
|
|
|
104
100
|
def [](option_name)
|
|
105
101
|
option_symbol = CommandLine::Option.rewrite(option_name)
|
|
106
|
-
if the_option = @options.
|
|
102
|
+
if the_option = @options.find { |(_, odef)| odef =~ option_symbol }
|
|
107
103
|
the_option[1]
|
|
108
104
|
else
|
|
109
|
-
|
|
105
|
+
fail CommandLine::UnknownOption, option_name
|
|
110
106
|
end
|
|
111
107
|
end
|
|
112
108
|
|
|
@@ -114,11 +110,9 @@ module CommandLine
|
|
|
114
110
|
@parameters = count_specifier..ENDLESS_PARAMETERS
|
|
115
111
|
end
|
|
116
112
|
|
|
117
|
-
|
|
118
|
-
@parameters = count_specifier
|
|
119
|
-
end
|
|
113
|
+
attr_writer :parameters
|
|
120
114
|
|
|
121
|
-
|
|
115
|
+
alias_method :files=, :parameters=
|
|
122
116
|
|
|
123
117
|
def option(name, options = {})
|
|
124
118
|
clo = CommandLine::Option.new(name, options)
|
|
@@ -126,10 +120,10 @@ module CommandLine
|
|
|
126
120
|
end
|
|
127
121
|
|
|
128
122
|
def switch(name, switch_alias = nil)
|
|
129
|
-
option(name, :
|
|
123
|
+
option(name, alias: switch_alias, parameters: 0)
|
|
130
124
|
end
|
|
131
125
|
|
|
132
|
-
def command(name, &
|
|
126
|
+
def command(name, &_block)
|
|
133
127
|
command_definition = Definition.new(self)
|
|
134
128
|
yield(command_definition) if block_given?
|
|
135
129
|
@commands[CommandLine::Option.rewrite(name)] = command_definition
|
|
@@ -140,7 +134,7 @@ module CommandLine
|
|
|
140
134
|
end
|
|
141
135
|
end
|
|
142
136
|
|
|
143
|
-
OPTION_REGEXP = /^\-\-([A-Za-z0-9-]+)
|
|
137
|
+
OPTION_REGEXP = /^\-\-([A-Za-z0-9-]+)$/
|
|
144
138
|
ALIASES_REGEXP = /^\-([A-Aa-z0-9]+)$/
|
|
145
139
|
|
|
146
140
|
attr_reader :definition
|
|
@@ -150,7 +144,7 @@ module CommandLine
|
|
|
150
144
|
def self.parse(tokens = $*, &block)
|
|
151
145
|
cla = Arguments.new
|
|
152
146
|
cla.define(&block)
|
|
153
|
-
|
|
147
|
+
cla.parse!(tokens)
|
|
154
148
|
end
|
|
155
149
|
|
|
156
150
|
def initialize
|
|
@@ -159,12 +153,12 @@ module CommandLine
|
|
|
159
153
|
@current_definition = @definition
|
|
160
154
|
end
|
|
161
155
|
|
|
162
|
-
def define(&
|
|
156
|
+
def define(&_block)
|
|
163
157
|
yield(@definition)
|
|
164
158
|
end
|
|
165
159
|
|
|
166
160
|
def [](option)
|
|
167
|
-
if the_option = @options.
|
|
161
|
+
if the_option = @options.find { |(key, _)| key =~ option }
|
|
168
162
|
the_option[1]
|
|
169
163
|
else
|
|
170
164
|
@current_definition[option].default_value
|
|
@@ -173,13 +167,13 @@ module CommandLine
|
|
|
173
167
|
|
|
174
168
|
def next_token
|
|
175
169
|
@current_token = @tokens.shift
|
|
176
|
-
|
|
170
|
+
@current_token
|
|
177
171
|
end
|
|
178
172
|
|
|
179
173
|
def next_parameter
|
|
180
174
|
parameter_candidate = @tokens.first
|
|
181
175
|
parameter = (parameter_candidate.nil? || OPTION_REGEXP =~ parameter_candidate || ALIASES_REGEXP =~ parameter_candidate) ? nil : @tokens.shift
|
|
182
|
-
|
|
176
|
+
parameter
|
|
183
177
|
end
|
|
184
178
|
|
|
185
179
|
def parse!(tokens)
|
|
@@ -200,8 +194,8 @@ module CommandLine
|
|
|
200
194
|
@command = CommandLine::Option.rewrite(@current_token)
|
|
201
195
|
else
|
|
202
196
|
case @current_token
|
|
203
|
-
when ALIASES_REGEXP
|
|
204
|
-
when OPTION_REGEXP
|
|
197
|
+
when ALIASES_REGEXP then handle_alias_expansion(Regexp.last_match[1])
|
|
198
|
+
when OPTION_REGEXP then handle_option(Regexp.last_match[1])
|
|
205
199
|
else; handle_other_parameter(@current_token)
|
|
206
200
|
end
|
|
207
201
|
@first_token = false
|
|
@@ -211,24 +205,24 @@ module CommandLine
|
|
|
211
205
|
|
|
212
206
|
validate_arguments!
|
|
213
207
|
|
|
214
|
-
|
|
208
|
+
self
|
|
215
209
|
end
|
|
216
210
|
|
|
217
211
|
protected
|
|
218
212
|
|
|
219
213
|
def prepare_result!
|
|
220
|
-
multiple_options = Hash[*@current_definition.options.select { |
|
|
221
|
-
multiple_options.each { |
|
|
214
|
+
multiple_options = Hash[*@current_definition.options.select { |_name, o| o.multiple? }.flatten]
|
|
215
|
+
multiple_options.each { |_name, definition| @options[definition] = [] }
|
|
222
216
|
end
|
|
223
217
|
|
|
224
218
|
def validate_arguments!
|
|
225
219
|
if @current_definition.parameters && !(@current_definition.parameters === @parameters.length)
|
|
226
|
-
|
|
220
|
+
fail CommandLine::ParametersOutOfRange.new(@current_definition.parameters, @parameters.length)
|
|
227
221
|
end
|
|
228
222
|
|
|
229
|
-
required_options = Hash[*@current_definition.options.select { |
|
|
223
|
+
required_options = Hash[*@current_definition.options.select { |_name, o| o.required? }.flatten]
|
|
230
224
|
required_options.each do |name, definition|
|
|
231
|
-
|
|
225
|
+
fail CommandLine::RequiredOptionMissing, definition unless self[name]
|
|
232
226
|
end
|
|
233
227
|
end
|
|
234
228
|
|
|
@@ -237,7 +231,7 @@ module CommandLine
|
|
|
237
231
|
if option_definition = @current_definition[alias_char]
|
|
238
232
|
@tokens.unshift(option_definition.to_option)
|
|
239
233
|
else
|
|
240
|
-
|
|
234
|
+
fail CommandLine::UnknownOption, alias_char
|
|
241
235
|
end
|
|
242
236
|
end
|
|
243
237
|
end
|
|
@@ -248,7 +242,7 @@ module CommandLine
|
|
|
248
242
|
|
|
249
243
|
def handle_option(option_name)
|
|
250
244
|
option_definition = @current_definition[option_name]
|
|
251
|
-
|
|
245
|
+
fail CommandLine::UnknownOption, option_name if option_definition.nil?
|
|
252
246
|
|
|
253
247
|
if option_definition.multiple?
|
|
254
248
|
@options[option_definition] << option_definition.parse(self)
|
|
@@ -256,7 +250,6 @@ module CommandLine
|
|
|
256
250
|
@options[option_definition] = option_definition.parse(self)
|
|
257
251
|
end
|
|
258
252
|
end
|
|
259
|
-
|
|
260
253
|
end
|
|
261
254
|
|
|
262
255
|
# Commandline parsing errors and exceptions
|
|
@@ -273,7 +266,7 @@ module CommandLine
|
|
|
273
266
|
# Missing a required file
|
|
274
267
|
class ParametersOutOfRange < CommandLine::Error
|
|
275
268
|
def initialize(expected, actual)
|
|
276
|
-
if expected.
|
|
269
|
+
if expected.is_a?(Range)
|
|
277
270
|
if expected.end == CommandLine::Arguments::Definition::ENDLESS_PARAMETERS
|
|
278
271
|
super("The command expected at least #{expected.begin} parameters, but found #{actual}!")
|
|
279
272
|
else
|
|
@@ -298,4 +291,4 @@ module CommandLine
|
|
|
298
291
|
super("#{option_identifier.inspect} not recognized as a valid option!")
|
|
299
292
|
end
|
|
300
293
|
end
|
|
301
|
-
end
|
|
294
|
+
end
|
data/lib/cli/database_console.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
class DatabaseConsole
|
|
2
|
-
|
|
3
2
|
IRB = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
|
4
3
|
|
|
5
4
|
def initialize(arguments)
|
|
@@ -7,7 +6,7 @@ class DatabaseConsole
|
|
|
7
6
|
end
|
|
8
7
|
|
|
9
8
|
def run!
|
|
10
|
-
libraries = ['irb/completion', 'rubygems','cli/database_console_init']
|
|
9
|
+
libraries = ['irb/completion', 'rubygems', 'cli/database_console_init']
|
|
11
10
|
libaries_string = libraries.map { |l| "-r #{l}" }.join(' ')
|
|
12
11
|
|
|
13
12
|
ENV['RLA_DBCONSOLE_DATABASE'] = @arguments[:database]
|
|
@@ -22,4 +21,3 @@ class DatabaseConsole
|
|
|
22
21
|
exec("#{IRB} #{libaries_string} --simple-prompt")
|
|
23
22
|
end
|
|
24
23
|
end
|
|
25
|
-
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Setup the include path
|
|
2
|
-
|
|
2
|
+
$LOAD_PATH.unshift(File.expand_path('..', File.dirname(__FILE__)))
|
|
3
3
|
require 'request_log_analyzer'
|
|
4
4
|
require 'request_log_analyzer/database'
|
|
5
5
|
|
|
@@ -9,9 +9,9 @@ $database.register_default_orm_classes!
|
|
|
9
9
|
|
|
10
10
|
require 'cli/tools'
|
|
11
11
|
|
|
12
|
-
def wordwrap(string, max = 80, indent =
|
|
13
|
-
strings = [
|
|
14
|
-
string.split(
|
|
12
|
+
def wordwrap(string, max = 80, indent = '')
|
|
13
|
+
strings = ['']
|
|
14
|
+
string.split(', ').each do |item|
|
|
15
15
|
if strings.last.length == 0 || strings.last.length + item.length <= max
|
|
16
16
|
strings.last << item << ', '
|
|
17
17
|
else
|
|
@@ -28,9 +28,9 @@ class Request
|
|
|
28
28
|
|
|
29
29
|
inspected_lines = lines.map do |line|
|
|
30
30
|
inspect_line = " - #{line.line_type} (line #{line.lineno})"
|
|
31
|
-
if (inspect_attributes = line.attributes.reject { |(k,
|
|
32
|
-
inspect_attributes = inspect_attributes.map { |(k,v)| "#{k} = #{v.inspect}" }.join(', ')
|
|
33
|
-
inspect_line << "\n " + wordwrap(inspect_attributes, CommandLine::Tools.terminal_width - 6,
|
|
31
|
+
if (inspect_attributes = line.attributes.reject { |(k, _v)| [:id, :source_id, :request_id, :lineno].include?(k.to_sym) }).any?
|
|
32
|
+
inspect_attributes = inspect_attributes.map { |(k, v)| "#{k} = #{v.inspect}" }.join(', ')
|
|
33
|
+
inspect_line << "\n " + wordwrap(inspect_attributes, CommandLine::Tools.terminal_width - 6, ' ')
|
|
34
34
|
end
|
|
35
35
|
inspect_line
|
|
36
36
|
end
|
|
@@ -39,7 +39,7 @@ class Request
|
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
puts
|
|
43
|
-
puts
|
|
44
|
-
puts
|
|
45
|
-
puts $database.orm_classes.map { |k| k.name.split('::').last }.join(
|
|
42
|
+
puts 'request-log-analyzer database console'
|
|
43
|
+
puts '-------------------------------------'
|
|
44
|
+
puts 'The following ActiveRecord classes are available:'
|
|
45
|
+
puts $database.orm_classes.map { |k| k.name.split('::').last }.join(', ')
|
data/lib/cli/progressbar.rb
CHANGED
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
|
|
11
11
|
module CommandLine
|
|
12
12
|
class ProgressBar
|
|
13
|
-
VERSION =
|
|
13
|
+
VERSION = '0.9'
|
|
14
14
|
|
|
15
|
-
def initialize
|
|
15
|
+
def initialize(title, total, out = STDERR)
|
|
16
16
|
@title = title
|
|
17
17
|
@total = total
|
|
18
18
|
@out = out
|
|
@@ -30,17 +30,18 @@ module CommandLine
|
|
|
30
30
|
show
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
attr_reader
|
|
34
|
-
attr_reader
|
|
35
|
-
attr_reader
|
|
33
|
+
attr_reader :title
|
|
34
|
+
attr_reader :current
|
|
35
|
+
attr_reader :total
|
|
36
36
|
attr_accessor :start_time
|
|
37
37
|
|
|
38
38
|
private
|
|
39
|
+
|
|
39
40
|
def fmt_bar
|
|
40
41
|
bar_width = do_percentage * @terminal_width / 100
|
|
41
|
-
sprintf(
|
|
42
|
+
sprintf('[%s%s]',
|
|
42
43
|
@bar_mark * bar_width,
|
|
43
|
-
|
|
44
|
+
' ' * (@terminal_width - bar_width))
|
|
44
45
|
end
|
|
45
46
|
|
|
46
47
|
def fmt_percentage
|
|
@@ -53,59 +54,59 @@ module CommandLine
|
|
|
53
54
|
|
|
54
55
|
def fmt_stat_for_file_transfer
|
|
55
56
|
if @finished_p then
|
|
56
|
-
sprintf(
|
|
57
|
+
sprintf('%s %s %s', bytes, transfer_rate, elapsed)
|
|
57
58
|
else
|
|
58
|
-
sprintf(
|
|
59
|
+
sprintf('%s %s %s', bytes, transfer_rate, eta)
|
|
59
60
|
end
|
|
60
61
|
end
|
|
61
62
|
|
|
62
63
|
def fmt_title
|
|
63
|
-
@title[0,(@title_width - 1)] +
|
|
64
|
+
@title[0, (@title_width - 1)] + ':'
|
|
64
65
|
end
|
|
65
66
|
|
|
66
|
-
def convert_bytes
|
|
67
|
+
def convert_bytes(bytes)
|
|
67
68
|
if bytes < 1024
|
|
68
|
-
sprintf(
|
|
69
|
+
sprintf('%6dB', bytes)
|
|
69
70
|
elsif bytes < 1024 * 1000 # 1000kb
|
|
70
|
-
sprintf(
|
|
71
|
+
sprintf('%5.1fKB', bytes.to_f / 1024)
|
|
71
72
|
elsif bytes < 1024 * 1024 * 1000 # 1000mb
|
|
72
|
-
sprintf(
|
|
73
|
+
sprintf('%5.1fMB', bytes.to_f / 1024 / 1024)
|
|
73
74
|
else
|
|
74
|
-
sprintf(
|
|
75
|
+
sprintf('%5.1fGB', bytes.to_f / 1024 / 1024 / 1024)
|
|
75
76
|
end
|
|
76
77
|
end
|
|
77
78
|
|
|
78
79
|
def transfer_rate
|
|
79
80
|
bytes_per_second = @current.to_f / (Time.now - @start_time)
|
|
80
|
-
sprintf(
|
|
81
|
+
sprintf('%s/s', convert_bytes(bytes_per_second))
|
|
81
82
|
end
|
|
82
83
|
|
|
83
84
|
def bytes
|
|
84
85
|
convert_bytes(@current)
|
|
85
86
|
end
|
|
86
87
|
|
|
87
|
-
def format_time
|
|
88
|
+
def format_time(t)
|
|
88
89
|
t = t.to_i
|
|
89
90
|
sec = t % 60
|
|
90
91
|
min = (t / 60) % 60
|
|
91
92
|
hour = t / 3600
|
|
92
|
-
sprintf(
|
|
93
|
+
sprintf('%02d:%02d:%02d', hour, min, sec)
|
|
93
94
|
end
|
|
94
95
|
|
|
95
96
|
# ETA stands for Estimated Time of Arrival.
|
|
96
97
|
def eta
|
|
97
98
|
if @current == 0
|
|
98
|
-
|
|
99
|
+
'ETA: --:--:--'
|
|
99
100
|
else
|
|
100
101
|
elapsed = Time.now - @start_time
|
|
101
|
-
eta = elapsed * @total / @current - elapsed
|
|
102
|
-
sprintf(
|
|
102
|
+
eta = elapsed * @total / @current - elapsed
|
|
103
|
+
sprintf('ETA: %s', format_time(eta))
|
|
103
104
|
end
|
|
104
105
|
end
|
|
105
106
|
|
|
106
107
|
def elapsed
|
|
107
108
|
elapsed = Time.now - @start_time
|
|
108
|
-
sprintf(
|
|
109
|
+
sprintf('Time: %s', format_time(elapsed))
|
|
109
110
|
end
|
|
110
111
|
|
|
111
112
|
def eol
|
|
@@ -122,7 +123,7 @@ module CommandLine
|
|
|
122
123
|
|
|
123
124
|
def show
|
|
124
125
|
arguments = @format_arguments.map do |method|
|
|
125
|
-
method = sprintf(
|
|
126
|
+
method = sprintf('fmt_%s', method)
|
|
126
127
|
send(method)
|
|
127
128
|
end
|
|
128
129
|
line = sprintf(@format, *arguments)
|
|
@@ -158,9 +159,10 @@ module CommandLine
|
|
|
158
159
|
end
|
|
159
160
|
|
|
160
161
|
public
|
|
162
|
+
|
|
161
163
|
def clear
|
|
162
164
|
@out.print "\r"
|
|
163
|
-
@out.print(
|
|
165
|
+
@out.print(' ' * (CommandLine::Tools.terminal_width(80) - 1))
|
|
164
166
|
@out.print "\r"
|
|
165
167
|
end
|
|
166
168
|
|
|
@@ -178,27 +180,23 @@ module CommandLine
|
|
|
178
180
|
@format_arguments = [:title, :percentage, :bar, :stat_for_file_transfer]
|
|
179
181
|
end
|
|
180
182
|
|
|
181
|
-
|
|
182
|
-
@format = format
|
|
183
|
-
end
|
|
183
|
+
attr_writer :format
|
|
184
184
|
|
|
185
|
-
|
|
186
|
-
@format_arguments = arguments
|
|
187
|
-
end
|
|
185
|
+
attr_writer :format_arguments
|
|
188
186
|
|
|
189
187
|
def halt
|
|
190
188
|
@finished_p = true
|
|
191
189
|
show
|
|
192
190
|
end
|
|
193
191
|
|
|
194
|
-
def inc
|
|
192
|
+
def inc(step = 1)
|
|
195
193
|
@current += step
|
|
196
194
|
@current = @total if @current > @total
|
|
197
195
|
show_if_needed
|
|
198
196
|
@previous = @current
|
|
199
197
|
end
|
|
200
198
|
|
|
201
|
-
def set
|
|
199
|
+
def set(count)
|
|
202
200
|
count = 0 if count < 0
|
|
203
201
|
count = @total if count > @total
|
|
204
202
|
|