ntail 0.0.11 → 0.0.12

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.
@@ -6,34 +6,47 @@ require 'rainbow'
6
6
  module NginxTail
7
7
  class LogLine
8
8
 
9
- def self.component_to_module_name(component)
10
- # this mimicks the ActiveSupport::Inflector.camelize() method in Rails...
11
- component.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
12
- end
13
-
14
- def self.component_to_ntail_module(component)
15
- # this mimicks the ActiveSupport::Inflector.constantize() method in Rails...
16
- NginxTail.const_get(self.component_to_module_name(component))
17
- end
18
-
19
9
  attr_reader :raw_line
20
10
  attr_reader :parsable
11
+ attr_reader :filename
12
+ attr_reader :line_number
13
+
14
+ COMPONENTS = [ # formatting token:
15
+
16
+ # NGINX
17
+
18
+ :remote_addr, # %a
19
+ :remote_user, # %u
20
+ :time_local, # %t
21
+ :request, # %r
22
+ :status, # %s
23
+ :body_bytes_sent, # %b
24
+ :http_referer, # %R
25
+ :http_user_agent, # %U
26
+ :proxy_addresses, # %p
27
+
28
+ # APACHE
29
+
30
+ :server_name, # %V
31
+ # :remote_addr, # %h
32
+ :remote_log_name, # %l
33
+ # :remote_user, # %u
34
+ # :time_local, # %t
35
+ # :request, # %r
36
+ # :status, # %s
37
+ # :body_bytes_sent, # %b
38
+ # :http_referer, # %%{Referer}i
39
+ # :http_user_agent, # %%{User-agent}i
40
+ :http_cookie, # %{Cookie}i
41
+ :time_taken, # %D
21
42
 
22
- COMPONENTS = [
23
- :remote_addr,
24
- :remote_user,
25
- :time_local,
26
- :request,
27
- :status,
28
- :body_bytes_sent,
29
- :http_referer,
30
- :http_user_agent,
31
- :proxy_addresses,
32
43
  ]
33
-
44
+
34
45
  COMPONENTS.each do |symbol|
35
46
  attr_reader symbol
36
- include component_to_ntail_module(symbol)
47
+ if (module_for_symbol = Inflections.component_to_ntail_module(symbol))
48
+ include module_for_symbol
49
+ end
37
50
  end
38
51
 
39
52
  include KnownIpAddresses # module to identify known IP addresses
@@ -44,23 +57,47 @@ module NginxTail
44
57
  :uri,
45
58
  :http_version,
46
59
  ]
47
-
60
+
48
61
  SUBCOMPONENTS.each do |symbol|
49
62
  attr_reader symbol
50
- include component_to_ntail_module(symbol)
63
+ include Inflections.component_to_ntail_module(symbol)
51
64
  end
52
65
 
66
+ #
67
+ # http://httpd.apache.org/docs/2.0/mod/mod_log_config.html - we currently only support the following custom log format...
68
+ #
69
+ # "%V %h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{Cookie}i\" %I %O %D %{deflate_ratio}n%%"
70
+ #
71
+
72
+ APACHE_LOG_PATTERN = Regexp.compile(/\A([\S]*) ([\S]+) ([\S]+|-) ([\S]+|-) \[([^\]]+)\] "(.*)" ([\d]+) ([\d]+|-) "(.*?)" "(.*?)" "(.*?)" [\d]+ [\d]+ ([\d]+) .*\Z/)
73
+
53
74
  #
54
75
  # http://wiki.nginx.org/NginxHttpLogModule#log_format - we currently only support the default "combined" log format...
55
76
  #
56
77
 
57
78
  NGINX_LOG_PATTERN = Regexp.compile(/\A(\S+) - (\S+) \[([^\]]+)\] "([^"]+)" (\S+) (\S+) "([^"]*?)" "([^"]*?)"( "([^"]*?)")?\Z/)
79
+
80
+ #
81
+ # the actual pattern used for line matching, either nginx (default) or apache
82
+ #
83
+
84
+ @@log_pattern = NGINX_LOG_PATTERN
85
+
86
+ def self.set_log_pattern(nginx_format)
87
+ @@log_pattern = nginx_format ? NGINX_LOG_PATTERN : APACHE_LOG_PATTERN
88
+ end
89
+
58
90
  NGINX_REQUEST_PATTERN = Regexp.compile(/\A(\S+) (.*?) (\S+)\Z/)
59
91
  NGINX_PROXY_PATTERN = Regexp.compile(/\A "([^"]*)"\Z/)
60
92
 
61
- def initialize(line)
62
- @parsable = if NGINX_LOG_PATTERN.match(@raw_line = line)
63
- @remote_addr, @remote_user, @time_local, @request, @status, @body_bytes_sent, @http_referer, @http_user_agent, @proxy_addresses = $~.captures
93
+ def initialize(line, filename = nil, line_number = nil)
94
+ @filename = filename ; @line_number = line_number
95
+ @parsable = if @@log_pattern.match(@raw_line = line)
96
+ if @@log_pattern == NGINX_LOG_PATTERN
97
+ @remote_addr, @remote_user, @time_local, @request, @status, @body_bytes_sent, @http_referer, @http_user_agent, @proxy_addresses = $~.captures
98
+ elsif @@log_pattern == APACHE_LOG_PATTERN
99
+ @server_name, @remote_addr, @remote_log_name, @remote_user, @time_local, @request, @status, @body_bytes_sent, @http_referer, @http_user_agent, @http_cookie, @time_taken = $~.captures
100
+ end
64
101
  if NGINX_REQUEST_PATTERN.match(@request)
65
102
  # counter example (ie. HTTP request that cannot by parsed)
66
103
  # 91.203.96.51 - - [21/Dec/2010:05:26:53 +0000] "-" 400 0 "-" "-"
@@ -74,35 +111,46 @@ module NginxTail
74
111
  false
75
112
  end
76
113
  end
77
-
114
+
78
115
  alias_method :remote_address, :remote_addr # a non-abbreviated alias, for convenience and readability...
79
-
116
+
80
117
  # for now, until we make it fancier...
81
118
  def method_missing(method, *params)
82
119
  raw_line.send method, *params
83
120
  end
84
-
121
+
85
122
  @@parser = FormattingParser.new
86
-
87
- def to_s()
123
+
124
+ @@result = @@format = nil
125
+
126
+ def self.format= format
127
+ unless @@result = @@parser.parse(@@format = format)
128
+ raise @@parser.terminal_failures.join("\n")
129
+ else
130
+ def @@result.value(log_line, color)
131
+ elements.map { |element| element.value(log_line, color) }.join
132
+ end
133
+ end
134
+ end
135
+
136
+ self.format = "%t - %a - %s - %r - %U - %R"
137
+
138
+ def to_s(options = {})
139
+
88
140
  # simple but boring:
89
141
  # raw_line.to_s
90
- color = if redirect_status?
142
+
143
+ # a bit less boring:
144
+ color = options[:color] && if redirect_status?
91
145
  :yellow
92
146
  elsif !success_status?
93
147
  :red
94
148
  else
95
149
  :default
96
150
  end
97
- unless result = @@parser.parse("%d - %a - %s - %r - %u - %f")
98
- raise @@parser.terminal_failures.join("\n")
99
- else
100
- def result.value(log_line, color)
101
- elements.map { |element| element.value(log_line, color) }.join
102
- end
103
- end
104
- result.value(self, color)
151
+ @@result.value(self, color)
152
+
105
153
  end
106
-
154
+
107
155
  end # class LogLine
108
156
  end # module NginxTail
data/lib/ntail/node.rb CHANGED
@@ -5,5 +5,8 @@ module Formatting
5
5
  def value(log_line, color)
6
6
  raise "SubclassResponsibility" # override in node "subclasses"...
7
7
  end
8
+ def foreground(string, color)
9
+ color ? string.foreground(color) : string
10
+ end
8
11
  end
9
12
  end
@@ -0,0 +1,82 @@
1
+ module NginxTail
2
+ module Options
3
+
4
+ def parse_options(argv, defaults = {})
5
+
6
+ options = OpenStruct.new(defaults)
7
+
8
+ OptionParser.new do |opts|
9
+
10
+ opts.banner = "Usage: ntail {options} {file(s)}"
11
+ opts.separator ""
12
+ opts.separator "Options are ..."
13
+
14
+ opts.on '--verbose', '-v', "Run verbosely (log messages to STDERR)." do |value|
15
+ options.verbose = true
16
+ end
17
+
18
+ opts.on '--filter', '-f CODE', "Ruby code block for filtering (parsed) lines - needs to return true or false." do |value|
19
+ options.filter = value
20
+ end
21
+
22
+ opts.on '--execute', '-e CODE', "Ruby code block for processing each (parsed) line." do |value|
23
+ options.code = value
24
+ end
25
+
26
+ opts.on '--line-number', '-l LINE_NUMBER', "Only process the line with the given line number" do |value|
27
+ options.line_number = value.to_i
28
+ end
29
+
30
+ opts.on '--dry-run', '-n', "Dry-run: process files, but don't actually parse the lines" do |value|
31
+ options.dry_run = true
32
+ end
33
+
34
+ opts.on '--parse-only', '-p', "Parse only: parse all lines, but don't actually process them" do |value|
35
+ options.parse_only = true
36
+ end
37
+
38
+ opts.on '--raw', '-r', "Parse lines, and - for parseable ones - print out the raw input" do |value|
39
+ options.raw = true
40
+ end
41
+
42
+ opts.on '--apache', "Try to match lines using the Apache log format instead of nginx (the default)" do |value|
43
+ options.nginx = false
44
+ end
45
+
46
+ opts.on '--sleep [SECONDS]', '-s', Float, "Sleeps for the given number of seconds before processing the next line (--raw only)" do |value|
47
+ options.sleep = value
48
+ end
49
+
50
+ opts.on '--progress', '-p', String, "In-flight progress animation during parsing" do |value|
51
+ unless $stdout.tty?
52
+ Sickill::Rainbow.enabled = true
53
+ options.progress = true
54
+ end
55
+ end
56
+
57
+ opts.on '--static-repo [REPO]', String, "Add [REPO] to the list of static repos" do |value|
58
+ NginxTail::LogLine.add_static_repo(value)
59
+ end
60
+
61
+ opts.on '--persist', '-P', String, "Persist the parsed lines for future use" do |value|
62
+ options.persist = true
63
+ end
64
+
65
+ opts.on '--version', '-V', "Display the program version." do |value|
66
+ puts "#{NTAIL_NAME}, version #{NTAIL_VERSION}"
67
+ options.running = false
68
+ end
69
+
70
+ opts.on_tail("-h", "--help", "-H", "Display this help message.") do
71
+ puts opts
72
+ options.running = false
73
+ end
74
+
75
+ end.parse!(argv)
76
+
77
+ return options
78
+
79
+ end
80
+
81
+ end # module Options
82
+ end # module NginxTail
@@ -5,10 +5,10 @@ module NginxTail
5
5
  base.class_eval do
6
6
 
7
7
  # this ensures the below module methods actually make sense...
8
- raise "Class #{base.name} should implement instance method 'proxy_addresses'" unless base.instance_methods.include? 'proxy_addresses'
8
+ raise "Class #{base.name} should implement instance method 'proxy_addresses'" unless base.instance_methods.map(&:to_s).include? 'proxy_addresses'
9
9
 
10
10
  end
11
11
  end
12
12
 
13
13
  end
14
- end
14
+ end
@@ -35,7 +35,7 @@ module NginxTail
35
35
  end
36
36
 
37
37
  # this ensures the below module methods actually make sense...
38
- raise "Class #{base.name} should implement instance method 'remote_addr'" unless base.instance_methods.include? 'remote_addr'
38
+ raise "Class #{base.name} should implement instance method 'remote_addr'" unless base.instance_methods.map(&:to_s).include? 'remote_addr'
39
39
 
40
40
  end
41
41
  end
@@ -53,4 +53,4 @@ module NginxTail
53
53
  end
54
54
 
55
55
  end
56
- end
56
+ end
@@ -42,7 +42,7 @@ module NginxTail
42
42
  end
43
43
 
44
44
  # this ensures the below module methods actually make sense...
45
- raise "Class #{base.name} should implement instance method 'remote_user'" unless base.instance_methods.include? 'remote_user'
45
+ raise "Class #{base.name} should implement instance method 'remote_user'" unless base.instance_methods.map(&:to_s).include? 'remote_user'
46
46
 
47
47
  end
48
48
  end
@@ -60,4 +60,4 @@ module NginxTail
60
60
  end
61
61
 
62
62
  end
63
- end
63
+ end
data/lib/ntail/request.rb CHANGED
@@ -11,7 +11,7 @@ module NginxTail
11
11
  end
12
12
 
13
13
  # this ensures the below module methods actually make sense...
14
- raise "Class #{base.name} should implement instance method 'request'" unless base.instance_methods.include? 'request'
14
+ raise "Class #{base.name} should implement instance method 'request'" unless base.instance_methods.map(&:to_s).include? 'request'
15
15
 
16
16
  end
17
17
  end
@@ -30,4 +30,4 @@ module NginxTail
30
30
  end
31
31
 
32
32
  end
33
- end
33
+ end
data/lib/ntail/status.rb CHANGED
@@ -37,7 +37,7 @@ module NginxTail
37
37
  end
38
38
 
39
39
  # this ensures the below module methods actually make sense...
40
- raise "Class #{base.name} should implement instance method 'status'" unless base.instance_methods.include? 'status'
40
+ raise "Class #{base.name} should implement instance method 'status'" unless base.instance_methods.map(&:to_s).include? 'status'
41
41
 
42
42
  end
43
43
  end
@@ -21,7 +21,7 @@ module NginxTail
21
21
  end
22
22
 
23
23
  # this ensures the below module methods actually make sense...
24
- raise "Class #{base.name} should implement instance method 'time_local'" unless base.instance_methods.include? 'time_local'
24
+ raise "Class #{base.name} should implement instance method 'time_local'" unless base.instance_methods.map(&:to_s).include? 'time_local'
25
25
 
26
26
  end
27
27
  end
@@ -35,4 +35,4 @@ module NginxTail
35
35
  end
36
36
 
37
37
  end
38
- end
38
+ end
data/lib/ntail/uri.rb CHANGED
@@ -64,15 +64,22 @@ module NginxTail
64
64
  html
65
65
  images
66
66
  javascripts
67
+ js
67
68
  movies
68
69
  newsletters
69
70
  pictures
70
71
  stylesheets
72
+ css
71
73
  xml
72
74
  }
73
75
 
74
76
  @@static_uris = @@static_repos.map { |repo| Regexp.compile("^\/#{repo}\/") }
75
77
 
78
+ def self.add_static_repo(repo)
79
+ # TODO make this DRY...
80
+ @@static_uris << Regexp.compile("^\/#{repo}\/")
81
+ end
82
+
76
83
  def self.static_uri?(uri)
77
84
  !@@static_uris.detect { |static_uri_regexp| uri.match(static_uri_regexp) }.nil?
78
85
  end
@@ -82,7 +89,7 @@ module NginxTail
82
89
  end
83
90
 
84
91
  # this ensures the below module methods actually make sense...
85
- raise "Class #{base.name} should implement instance method 'uri'" unless base.instance_methods.include? 'uri'
92
+ raise "Class #{base.name} should implement instance method 'uri'" unless base.instance_methods.map(&:to_s).include? 'uri'
86
93
 
87
94
  end
88
95
  end
data/lib/ntail.rb CHANGED
@@ -1,6 +1,20 @@
1
1
  NTAIL_NAME = 'ntail'
2
2
  NTAIL_VERSION = '0.0.1'
3
3
 
4
+ # module methods to be used as functions...
5
+ module NginxTail
6
+ module Inflections
7
+ def self.component_to_module_name(component)
8
+ # this mimicks the ActiveSupport::Inflector.camelize() method in Rails...
9
+ component.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
10
+ end
11
+ def self.component_to_ntail_module(component)
12
+ # this mimicks the ActiveSupport::Inflector.constantize() method in Rails...
13
+ NginxTail.const_get(self.component_to_module_name(component)) rescue nil
14
+ end
15
+ end
16
+ end
17
+
4
18
  # so-called components...
5
19
  require 'ntail/remote_addr'
6
20
  require 'ntail/remote_user'
@@ -26,7 +40,8 @@ require 'ntail/node.rb'
26
40
  require 'ntail/formatting.rb'
27
41
 
28
42
  # the core classes...
29
- require 'ntail/log_line'
30
- require 'ntail/application'
43
+ require 'ntail/log_line.rb'
44
+ require 'ntail/options.rb'
45
+ require 'ntail/application.rb'
31
46
 
32
- # That's all, Folks!
47
+ # That's all, Folks!
data/ntail.gemspec CHANGED
@@ -5,25 +5,25 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ntail}
8
- s.version = "0.0.11"
8
+ s.version = "0.0.12"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Peter Vandenberk"]
12
- s.date = %q{2011-01-19}
12
+ s.date = %q{2011-08-08}
13
13
  s.default_executable = %q{ntail}
14
14
  s.description = %q{A tail(1)-like utility for nginx log files. It supports parsing, filtering and formatting individual log lines.}
15
15
  s.email = %q{pvandenberk@mac.com}
16
16
  s.executables = ["ntail"]
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE.txt",
19
- "README.rdoc"
19
+ "README.md"
20
20
  ]
21
21
  s.files = [
22
22
  ".document",
23
23
  "Gemfile",
24
24
  "Gemfile.lock",
25
25
  "LICENSE.txt",
26
- "README.rdoc",
26
+ "README.md",
27
27
  "Rakefile",
28
28
  "VERSION",
29
29
  "bin/ntail",
@@ -40,6 +40,7 @@ Gem::Specification.new do |s|
40
40
  "lib/ntail/local_ip_addresses.rb",
41
41
  "lib/ntail/log_line.rb",
42
42
  "lib/ntail/node.rb",
43
+ "lib/ntail/options.rb",
43
44
  "lib/ntail/proxy_addresses.rb",
44
45
  "lib/ntail/remote_addr.rb",
45
46
  "lib/ntail/remote_user.rb",
@@ -48,10 +49,14 @@ Gem::Specification.new do |s|
48
49
  "lib/ntail/time_local.rb",
49
50
  "lib/ntail/uri.rb",
50
51
  "ntail.gemspec",
52
+ "spec/application_spec.rb",
53
+ "spec/spec_helper.rb",
51
54
  "test/helper.rb",
55
+ "test/ntail/test_formatting.rb",
52
56
  "test/ntail/test_http_method.rb",
53
57
  "test/ntail/test_http_referer.rb",
54
58
  "test/ntail/test_http_user_agent.rb",
59
+ "test/ntail/test_http_version.rb",
55
60
  "test/ntail/test_known_ip_addresses.rb",
56
61
  "test/ntail/test_local_ip_addresses.rb",
57
62
  "test/ntail/test_log_line.rb",
@@ -66,13 +71,17 @@ Gem::Specification.new do |s|
66
71
  s.homepage = %q{http://github.com/pvdb/ntail}
67
72
  s.licenses = ["MIT"]
68
73
  s.require_paths = ["lib"]
69
- s.rubygems_version = %q{1.3.7}
74
+ s.rubygems_version = %q{1.5.2}
70
75
  s.summary = %q{A tail(1)-like utility for nginx log files}
71
76
  s.test_files = [
77
+ "spec/application_spec.rb",
78
+ "spec/spec_helper.rb",
72
79
  "test/helper.rb",
80
+ "test/ntail/test_formatting.rb",
73
81
  "test/ntail/test_http_method.rb",
74
82
  "test/ntail/test_http_referer.rb",
75
83
  "test/ntail/test_http_user_agent.rb",
84
+ "test/ntail/test_http_version.rb",
76
85
  "test/ntail/test_known_ip_addresses.rb",
77
86
  "test/ntail/test_local_ip_addresses.rb",
78
87
  "test/ntail/test_log_line.rb",
@@ -86,37 +95,51 @@ Gem::Specification.new do |s|
86
95
  ]
87
96
 
88
97
  if s.respond_to? :specification_version then
89
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
90
98
  s.specification_version = 3
91
99
 
92
100
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
93
101
  s.add_runtime_dependency(%q<rainbow>, [">= 0"])
94
102
  s.add_runtime_dependency(%q<user-agent>, [">= 0"])
95
103
  s.add_runtime_dependency(%q<treetop>, ["~> 1.4.9"])
104
+ s.add_runtime_dependency(%q<sequel>, [">= 0"])
105
+ s.add_runtime_dependency(%q<mongoid>, [">= 0"])
106
+ s.add_runtime_dependency(%q<sqlite3-ruby>, [">= 0"])
107
+ s.add_development_dependency(%q<rake>, [">= 0.9.2"])
96
108
  s.add_development_dependency(%q<shoulda>, [">= 0"])
97
109
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
98
110
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
99
111
  s.add_development_dependency(%q<rcov>, [">= 0"])
100
112
  s.add_development_dependency(%q<geoip>, [">= 0"])
113
+ s.add_development_dependency(%q<rspec>, [">= 2.5"])
101
114
  else
102
115
  s.add_dependency(%q<rainbow>, [">= 0"])
103
116
  s.add_dependency(%q<user-agent>, [">= 0"])
104
117
  s.add_dependency(%q<treetop>, ["~> 1.4.9"])
118
+ s.add_dependency(%q<sequel>, [">= 0"])
119
+ s.add_dependency(%q<mongoid>, [">= 0"])
120
+ s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
121
+ s.add_dependency(%q<rake>, [">= 0.9.2"])
105
122
  s.add_dependency(%q<shoulda>, [">= 0"])
106
123
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
107
124
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
108
125
  s.add_dependency(%q<rcov>, [">= 0"])
109
126
  s.add_dependency(%q<geoip>, [">= 0"])
127
+ s.add_dependency(%q<rspec>, [">= 2.5"])
110
128
  end
111
129
  else
112
130
  s.add_dependency(%q<rainbow>, [">= 0"])
113
131
  s.add_dependency(%q<user-agent>, [">= 0"])
114
132
  s.add_dependency(%q<treetop>, ["~> 1.4.9"])
133
+ s.add_dependency(%q<sequel>, [">= 0"])
134
+ s.add_dependency(%q<mongoid>, [">= 0"])
135
+ s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
136
+ s.add_dependency(%q<rake>, [">= 0.9.2"])
115
137
  s.add_dependency(%q<shoulda>, [">= 0"])
116
138
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
117
139
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
118
140
  s.add_dependency(%q<rcov>, [">= 0"])
119
141
  s.add_dependency(%q<geoip>, [">= 0"])
142
+ s.add_dependency(%q<rspec>, [">= 2.5"])
120
143
  end
121
144
  end
122
145
 
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe NginxTail::Application do
4
+
5
+ %w{ exit running interrupted }.each do |option|
6
+ it "should respond to #{option} option method" do
7
+ NginxTail::Application.new.should respond_to(option.to_sym)
8
+ end
9
+ end
10
+
11
+ it "has a default 'exit' value of 0" do
12
+ NginxTail::Application.new.exit.should eq(0)
13
+ end
14
+
15
+ it "has a default 'running' value of true" do
16
+ NginxTail::Application.new.running.should eq(true)
17
+ end
18
+
19
+ it "has a default 'interrupted' value of false" do
20
+ NginxTail::Application.new.interrupted.should eq(false)
21
+ end
22
+
23
+ end
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ require 'rspec'
5
+
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
8
+
9
+ require 'ntail'
data/test/helper.rb CHANGED
@@ -12,6 +12,7 @@ require 'shoulda'
12
12
 
13
13
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
14
  $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+
15
16
  require 'ntail'
16
17
 
17
18
  class Test::Unit::TestCase
@@ -50,7 +51,8 @@ class Test::Unit::TestCase
50
51
  :status => 200,
51
52
  :body_bytes_sent => 6918,
52
53
  :http_referer => 'http://www.google.com/search?q=example',
53
- :http_user_agent => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10'
54
+ :http_user_agent => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10',
55
+ :proxy_addresses => nil
54
56
  }
55
57
 
56
58
  REQUEST_FORMAT = '%s %s %s'
@@ -71,6 +73,7 @@ class Test::Unit::TestCase
71
73
  options[:body_bytes_sent],
72
74
  options[:http_referer],
73
75
  options[:http_user_agent],
76
+ # TODO implement support for :proxy_addresses
74
77
  ]
75
78
  end
76
79