clarity 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,54 @@
1
+ /* ----------------------------------------------------------------------------
2
+ * Log Search Server CSS
3
+ * by John Tajima
4
+ * ----------------------------------------------------------------------------
5
+ */
6
+
7
+ /* 960 reset */
8
+ html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}:focus{outline:0}ins{text-decoration:none}del{text-decoration:line-through}table{border-collapse:collapse;border-spacing:0}
9
+ /* 960 text */
10
+ body{font:13px/1.5 'Helvetica Neue',Arial,'Liberation Sans',FreeSans,sans-serif}a:focus{outline:1px dotted invert}hr{border:0 #ccc solid;border-top-width:1px;clear:both;height:0}h1{font-size:25px}h2{font-size:23px}h3{font-size:21px}h4{font-size:19px}h5{font-size:17px}h6{font-size:15px}ol{list-style:decimal}ul{list-style:disc}li{margin-left:30px}p,dl,hr,h1,h2,h3,h4,h5,h6,ol,ul,pre,table,address,fieldset{margin-bottom:20px}
11
+
12
+ /*
13
+ * Toolbar Styling
14
+ *
15
+ */
16
+
17
+
18
+ #toolbar { color: #333; font-size: 12px; min-width: 980px; height: 130px;
19
+ padding: 0 10px; background: #f0f0f0; border-bottom: 2px solid #000;
20
+ position:fixed; top: 0; margin: 0 -10px; width: 100%;
21
+ font-family: 'Helvetica Neue',Arial,'Liberation Sans',FreeSans,sans-serif;
22
+ }
23
+ #toolbar a { color: blue; background: none; }
24
+ #toolbar a:hover { background: none; }
25
+
26
+ #toolbar #header { height: 20px; padding: 3px 5px; margin: 0 -10px 10px; overflow:hidden; background: #333; border-bottom: 2px solid #222; color: #eee; }
27
+ #toolbar #header h1 { font-size: 16px; line-height: 20px; }
28
+ #toolbar #header a { text-decoration: none; color: #eee; }
29
+ #toolbar #header a:hover { text-decoration: none; color: #fff;}
30
+ #toolbar .small { font-size: 11px; color: #333; font-weight: bold;}
31
+ #toolbar input.time { width: 20px;}
32
+
33
+ table.actions { width: auto; border-collapse: collapse; }
34
+ table.actions th { font-size: 11px; color: #333; text-align: left; min-width: 100px; padding: 0 5px; }
35
+ table.actions td { padding: 2px 5px; text-align: left; vertical-align: middle;}
36
+ table.actions span.note { font-weight: normal; color: #999; }
37
+ table.actions span.and { font-size: 11px; color: red; font-weight: bold; }
38
+ table.actions span.label { font-weight: bold; cursor:pointer;}
39
+ table.actions input[type=text] { width: 200px; padding: 2px; border: 1px solid #aaa;}
40
+
41
+
42
+ div#option-ctrl { position: fixed; z-index: 100; bottom: 0; right: 0; min-width: 60px; min-height: 20px; height: 20px; padding: 5px; border: 1px solid #ddd; background: #f0f0f0; font-size: 11px; color: #000;
43
+ font-family: 'Helvetica Neue',Arial,'Liberation Sans',FreeSans,sans-serif; }
44
+ div#option-ctrl ul { list-style:none; margin: 0; padding: 0;}
45
+ div#option-ctrl ul li { list-style:none; margin: 0 5px 0 0; float:left; }
46
+
47
+
48
+
49
+ /* output */
50
+ body { margin: 10px; padding-top: 130px; font-family: 'Monaco', 'Deja Vu Sans Mono', 'Inconsolata' ,'Consolas',monospace; background:#111 none repeat scroll 0 0; color:#fff; font-size:10px;}
51
+ a { color: #0f0; }
52
+ a:hover { background-color: #03c; color: white; text-decoration: none; }
53
+
54
+
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/clarity.rb'}"
9
+ puts "Loading clarity gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,100 @@
1
+ require "test/unit"
2
+ require File.dirname(__FILE__) + "/../../lib/commands/command_builder.rb"
3
+
4
+ class CommandBuilderTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @params = {
8
+ "file" => "testfile.log",
9
+ "tool" => "grep",
10
+ "term1" => "foo",
11
+ "term2" => nil,
12
+ "term3" => nil
13
+ }
14
+ @command = CommandBuilder.new(@params)
15
+ end
16
+
17
+ def test_create_new_builder
18
+ assert @command.is_a?(CommandBuilder)
19
+ assert_equal "testfile.log", @command.filename
20
+ assert_equal 1, @command.terms.size
21
+ end
22
+
23
+ def test_raises_error_if_no_file
24
+ assert_raises CommandBuilder::InvalidParameterError do
25
+ command = CommandBuilder.new(@params.merge("file" => nil))
26
+ end
27
+ end
28
+
29
+ def test_exec_functions_for_log
30
+ command = CommandBuilder.new(@params)
31
+ assert_equal 1, command.exec_functions.size
32
+ assert_match /^grep/, command.exec_functions.first
33
+ end
34
+
35
+ def test_exec_functions_with_multiple_terms_for_log
36
+ command = CommandBuilder.new(@params.merge("term2" => "bar", "term3" => "baz"))
37
+ assert_equal 3, command.exec_functions.size
38
+ assert_match /^grep/, command.exec_functions[0]
39
+ assert_match /^grep/, command.exec_functions[1]
40
+ assert_match /^grep/, command.exec_functions[2]
41
+ end
42
+
43
+ def test_exec_function_with_no_terms_for_log
44
+ command = CommandBuilder.new(@params.merge("term1" => nil))
45
+ assert_equal 1, command.exec_functions.size
46
+ assert_match /^cat/, command.exec_functions[0]
47
+ end
48
+
49
+ def test_exec_funcations_for_gzip
50
+ command = CommandBuilder.new(@params.merge("file" => "testfile.gz"))
51
+ assert_equal 1, command.exec_functions.size
52
+ assert_match /^zgrep/, command.exec_functions.first
53
+ end
54
+
55
+ def test_exec_functions_with_multiple_terms_for_gzip
56
+ command = CommandBuilder.new(@params.merge("file" => "testfile.gz", "term2" => "bar", "term3" => "baz"))
57
+ assert_equal 3, command.exec_functions.size
58
+ assert_match /^zgrep/, command.exec_functions[0]
59
+ assert_match /^grep/, command.exec_functions[1]
60
+ assert_match /^grep/, command.exec_functions[2]
61
+ end
62
+
63
+ def test_exec_function_with_no_terms_for_gzip
64
+ command = CommandBuilder.new(@params.merge("file" => "testfile.gz", "term1" => nil))
65
+ assert_equal 1, command.exec_functions.size
66
+ assert_match "gzcat", command.exec_functions[0]
67
+ end
68
+
69
+ def test_command_for_log
70
+ command = CommandBuilder.new(@params)
71
+ assert_equal "sh -c 'grep -e foo testfile.log'", command.command
72
+ end
73
+
74
+ def test_command_with_no_terms_for_log
75
+ command = CommandBuilder.new(@params.merge("term1" => nil))
76
+ assert_equal "sh -c 'cat testfile.log'", command.command
77
+ end
78
+
79
+ def test_command_with_multiple_terms_for_log
80
+ command = CommandBuilder.new(@params.merge("term2" => "bar", "term3" => "baz"))
81
+ assert_equal "sh -c 'grep -e foo testfile.log | grep -e bar | grep -e baz'", command.command
82
+ end
83
+
84
+ def test_command_for_gzip
85
+ command = CommandBuilder.new(@params.merge("file" => "testfile.gz"))
86
+ assert_equal "sh -c 'zgrep -e foo testfile.gz'", command.command
87
+ end
88
+
89
+ def test_command_with_no_terms_for_gzip
90
+ command = CommandBuilder.new(@params.merge("file" => "testfile.gz","term1" => nil))
91
+ assert_equal "sh -c 'gzcat testfile.gz'", command.command
92
+ end
93
+
94
+ def test_command_with_multiple_terms_for_gzip
95
+ command = CommandBuilder.new(@params.merge("file" => "testfile.gz","term2" => "bar", "term3" => "baz"))
96
+ assert_equal "sh -c 'zgrep -e foo testfile.gz | grep -e bar | grep -e baz'", command.command
97
+ end
98
+
99
+
100
+ end
@@ -0,0 +1,43 @@
1
+ require "test/unit"
2
+ require File.dirname(__FILE__) + "/../../lib/commands/tail_command_builder.rb"
3
+
4
+ class TailCommandBuilderTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @params = {
8
+ "file" => "testfile.log",
9
+ "tool" => "tail",
10
+ "term1" => "foo",
11
+ "term2" => nil,
12
+ "term3" => nil
13
+ }
14
+ @command = TailCommandBuilder.new(@params)
15
+ end
16
+
17
+ def test_create_new_builder
18
+ assert @command.is_a?(TailCommandBuilder)
19
+ assert_equal "testfile.log", @command.filename
20
+ assert_equal 1, @command.terms.size
21
+ end
22
+
23
+ def test_raises_error_if_invalid_file
24
+ assert_raises CommandBuilder::InvalidParameterError do
25
+ command = TailCommandBuilder.new(@params.merge("file" => "testfile.gz"))
26
+ end
27
+ end
28
+
29
+ def test_command_for_log
30
+ command = TailCommandBuilder.new(@params)
31
+ assert_equal "sh -c 'tail -n 250 -f testfile.log | grep -e foo'", command.command
32
+ end
33
+
34
+ def test_command_with_no_terms_for_log
35
+ command = TailCommandBuilder.new(@params.merge("term1" => nil))
36
+ assert_equal "sh -c 'tail -n 250 -f testfile.log'", command.command
37
+ end
38
+
39
+ def test_command_with_multiple_terms_for_log
40
+ command = TailCommandBuilder.new(@params.merge("term2" => "bar", "term3" => "baz"))
41
+ assert_equal "sh -c 'tail -n 250 -f testfile.log | grep -e foo | grep -e bar | grep -e baz'", command.command
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ Jul 7 20:12:11 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Processing Admin::ProductsController#index (for 67.70.29.242 at 2009-07-07 20:12:11) [GET]
2
+ Jul 7 20:12:11 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Parameters: {"action"=>"index", "controller"=>"admin/products"}
3
+ Jul 7 20:12:12 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Shop Load (44.5ms) SELECT shops.* FROM shops JOIN domains ON domains.host = 'jessetesting.staging.shopify.com' AND domains.shop_id = shops.id LIMIT 1
4
+ Jul 7 20:12:12 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Subscription Columns (1.4ms) SHOW FIELDS FROM `subscriptions`
5
+ Jul 7 20:12:12 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Subscription Load (11.3ms) SELECT * FROM `subscriptions` WHERE (`subscriptions`.`id` = 500852)
6
+ Jul 7 20:12:13 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Redirected to http://jessetesting.staging.shopify.com/admin/auth/login
7
+ Jul 7 20:12:13 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Filter chain halted as [:ensure_proper_user] rendered_or_redirected.
8
+ Jul 7 20:12:13 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Completed in 118ms (DB: 57) | 302 Found [http://jessetesting.staging.shopify.com/admin/products]
9
+ Jul 7 20:20:00 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Processing Admin::AuthController#login (for 67.70.29.242 at 2009-07-07 20:12:11) [GET]
10
+ Jul 7 20:20:00 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Parameters: {"action"=>"login", "controller"=>"admin/auth"}
11
+ Jul 7 20:30:11 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Shop Load (0.2ms) SELECT shops.* FROM shops JOIN domains ON domains.host = 'jessetesting.staging.shopify.com' AND domains.shop_id = shops.id LIMIT 1
12
+ Jul 7 20:40:11 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Rendering template within layouts/admin/auth
13
+ Jul 7 20:50:11 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Rendering admin/auth/login
14
+ Jul 7 21:00:11 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Completed in 17ms (View: 10, DB: 0) | 200 OK [http://jessetesting.staging.shopify.com/admin/auth/login]
15
+ Jul 7 22:12:11 10.1.1.1 rails.shopify[27975]: [john.staging.shopify.com] Processing Admin::ProductsController#index (for 67.70.29.242 at 2009-07-07 20:12:11) [GET]
16
+ Jul 7 22:12:11 192.168.5.1 rails.shopify[27975]: [john.staging.shopify.com] Processing Admin::ProductsController#index (for 67.70.29.242 at 2009-07-07 20:12:11) [GET]
17
+ Jul 7 22:12:11 192.168.5.1 rails.shopify[27975]: [john.staging.shopify.com] Processing Admin::ProductsController#index (for 67.70.29.242 at 2009-07-07 20:12:11) [GET]
@@ -0,0 +1,40 @@
1
+ require "test/unit"
2
+ require File.dirname(__FILE__) + "/../../lib/parsers/hostname_parser.rb"
3
+
4
+ class HostnameParserTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @params = { "sh" => "12", "sm" => "00", "ss" => "10", "eh" => "12", "em" => "00", "es" => "59" }
8
+ @lines = %|Jul 24 14:58:21 app3 rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
9
+ Jul 24 12:00:21 192.168.5.1 rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
10
+ Jul 24 12:00:31 192.168.5.1 rails.shopify[9855]: [test.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
11
+ Jul 24 12:00:41 192.168.5.1 rails.shopify[9855]: [test2.myshopify.com] Processing some other line of text
12
+ |.split("\n")
13
+ @parser = HostnameParser.new(nil)
14
+ end
15
+
16
+
17
+ def test_parse_strips_out_ip_and_appname
18
+ line = @lines[1][16..-1] # strip out first 16 lines
19
+ out = @parser.parse(line)
20
+
21
+ assert out.has_key?(:line)
22
+ assert_equal "[wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]", out[:line]
23
+ end
24
+
25
+ def test_parse_strips_out_host_and_appname
26
+ line = @lines.first[16..-1] # strip out first 16 lines
27
+ out = @parser.parse(line)
28
+
29
+ assert out.has_key?(:line)
30
+ assert_equal "[wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]", out[:line]
31
+ end
32
+
33
+ def test_parse_returns_line_if_no_match
34
+ line = "in@valid rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]"
35
+ out = @parser.parse(line)
36
+ assert out.has_key?(:line)
37
+ assert_equal line, out[:line]
38
+ end
39
+
40
+ end
@@ -0,0 +1,54 @@
1
+ require "test/unit"
2
+ require File.dirname(__FILE__) + "/../../lib/parsers/shop_parser.rb"
3
+
4
+ class ShopParserTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @parser = ShopParser.new(nil)
8
+ @lines = %|[wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
9
+ [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
10
+ [test.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
11
+ [my-shop.myshopify.com] Processing some other line of text
12
+ Jul 7 20:12:11 staging rails.shopify[27975]: [jessetesting.staging.shopify.com] Processing Admin::ProductsController#index (for 67.70.29.242 at 2009-07-07 20:12:11) [GET]
13
+ |.split("\n")
14
+ end
15
+
16
+ def test_parse_shop_name
17
+ line = @lines.first
18
+ out = @parser.parse(line)
19
+
20
+ assert out.has_key?(:shop)
21
+ assert out.has_key?(:line)
22
+ assert_equal "wadedemt.myshopify.com", out[:shop]
23
+ assert_equal "Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]", out[:line]
24
+ end
25
+
26
+ def test_parse_shop_name_with_extra_space
27
+ line = @lines[1]
28
+ out = @parser.parse(line)
29
+
30
+ assert out.has_key?(:shop)
31
+ assert out.has_key?(:line)
32
+ assert_equal "wadedemt.myshopify.com", out[:shop]
33
+ assert_equal "Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]", out[:line]
34
+ end
35
+
36
+ def test_parse_shop_name_with_dashes
37
+ line = @lines[3]
38
+ out = @parser.parse(line)
39
+
40
+ assert out.has_key?(:shop)
41
+ assert out.has_key?(:line)
42
+ assert_equal "my-shop.myshopify.com", out[:shop]
43
+ assert_equal "Processing some other line of text", out[:line]
44
+ end
45
+
46
+ def test_parse_with_no_shop_returns_line
47
+ line = @lines[4]
48
+ out = @parser.parse(line)
49
+ assert !out.has_key?(:shop)
50
+ assert_equal line, out[:line]
51
+ end
52
+
53
+ end
54
+
@@ -0,0 +1,84 @@
1
+ require "test/unit"
2
+ require File.dirname(__FILE__) + "/../../lib/parsers/time_parser.rb"
3
+
4
+ class TimeParserTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @params = { "sh" => "12", "sm" => "00", "ss" => "10", "eh" => "12", "em" => "00", "es" => "59" }
8
+ @lines = %|Jul 24 14:58:21 app3 rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
9
+ Jul 24 12:00:21 192.168.5.1 rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
10
+ Jul 24 12:00:31 192.168.5.1 rails.shopify[9855]: [test.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
11
+ Jul 24 12:00:41 192.168.5.1 rails.shopify[9855]: [test2.myshopify.com] Processing some other line of text
12
+ |.split("\n")
13
+ end
14
+
15
+ def test_parse_timestamp
16
+ @parser = TimeParser.new(nil, {})
17
+ line = @lines.first
18
+ elements = @parser.parse(line)
19
+
20
+ assert elements.has_key?(:timestamp)
21
+ assert_equal "Jul 24 14:58:21", elements[:timestamp]
22
+ assert_equal "app3 rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]", elements[:line]
23
+ end
24
+
25
+ def test_parse_with_start_time_and_early_timestamp
26
+ @parser = TimeParser.new(nil, {"sh" => "15", "sm" => "00", "ss" => "10"})
27
+ line = @lines.first
28
+ elements = @parser.parse(line)
29
+
30
+ # does not match - reject line all together
31
+ assert elements.empty?
32
+ end
33
+
34
+ def test_parse_with_start_time_and_later_timestamp
35
+ @parser = TimeParser.new(nil, {"sh" => "12", "sm" => "00", "ss" => "10"})
36
+ line = @lines[1]
37
+ elements = @parser.parse(line)
38
+
39
+ assert elements.has_key?(:timestamp)
40
+ assert elements.has_key?(:line)
41
+ end
42
+
43
+ def test_parse_with_end_time_and_early_timestamp
44
+ @parser = TimeParser.new(nil, {"eh" => "12", "em" => "00", "es" => "00"})
45
+ line = @lines.first
46
+ elements = @parser.parse(line)
47
+
48
+ assert elements.empty?
49
+ end
50
+
51
+ def test_parse_with_end_time_and_later_timestamp
52
+ @parser = TimeParser.new(nil, {"eh" => "13", "em" => "00", "es" => "00"})
53
+ line = @lines[1]
54
+ elements = @parser.parse(line)
55
+
56
+ assert elements.has_key?(:timestamp)
57
+ assert elements.has_key?(:line)
58
+ end
59
+
60
+ def test_parse_with_entry_between_start_and_end
61
+ @parser = TimeParser.new(nil, {"sh" => "14", "sm" => "00", "ss" => "00", "eh" => "15", "em" => "00", "es" => "00"})
62
+ line = @lines.first
63
+ elements = @parser.parse(line)
64
+
65
+ assert elements.has_key?(:timestamp)
66
+ assert elements.has_key?(:line)
67
+ end
68
+
69
+ def test_parse_with_entry_outside_start_and_end
70
+ @parser = TimeParser.new(nil, {"sh" => "14", "sm" => "00", "ss" => "00", "eh" => "15", "em" => "00", "es" => "00"})
71
+ line = @lines[1]
72
+ elements = @parser.parse(line)
73
+
74
+ assert elements.empty?
75
+ end
76
+
77
+ def test_parse_returns_entry_if_doesnt_match_parser
78
+ line = "July 24, 1999 12:00:21 192.168.5.1 rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET] "
79
+ @parser = TimeParser.new(nil)
80
+ elements = @parser.parse(line)
81
+ assert_equal line, elements[:line]
82
+ end
83
+
84
+ end
@@ -0,0 +1,3 @@
1
+ require 'stringio'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../lib/clarity'