indy 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/.autotest +18 -0
  2. data/.gitignore +2 -0
  3. data/.rspec +1 -0
  4. data/History.txt +11 -0
  5. data/README.md +132 -0
  6. data/Rakefile +68 -0
  7. data/autotest/discover.rb +2 -0
  8. data/cucumber.yml +6 -0
  9. data/features/after_time.feature +41 -0
  10. data/features/application.feature +33 -0
  11. data/features/around_time.feature +34 -0
  12. data/features/before_time.feature +34 -0
  13. data/features/custom_pattern.feature +52 -0
  14. data/features/exact_log_level.feature +35 -0
  15. data/features/exact_message.feature +33 -0
  16. data/features/exact_mulitple_fields.feature +38 -0
  17. data/features/exact_time.feature +28 -0
  18. data/features/file.feature +30 -0
  19. data/features/log_levels.feature +40 -0
  20. data/features/message.feature +39 -0
  21. data/features/multiple_fields.feature +38 -0
  22. data/features/step_definitions/find_by.steps.rb +55 -0
  23. data/features/step_definitions/log_file.steps.rb +8 -0
  24. data/features/step_definitions/support/env.rb +1 -0
  25. data/features/step_definitions/support/transforms.rb +28 -0
  26. data/features/step_definitions/test_setup.steps.rb +4 -0
  27. data/features/step_definitions/test_teardown.steps.rb +0 -0
  28. data/features/step_definitions/time.steps.rb +29 -0
  29. data/features/within_time.feature +41 -0
  30. data/indy.gemspec +61 -0
  31. data/lib/indy.rb +5 -0
  32. data/lib/indy/indy.rb +463 -0
  33. data/lib/indy/result_set.rb +8 -0
  34. data/performance/helper.rb +5 -0
  35. data/performance/profile_spec.rb +35 -0
  36. data/spec/data.log +2 -0
  37. data/spec/helper.rb +4 -0
  38. data/spec/indy_spec.rb +212 -0
  39. data/spec/result_set_spec.rb +9 -0
  40. data/spec/search_spec.rb +97 -0
  41. data/spec/time_spec.rb +80 -0
  42. metadata +126 -0
@@ -0,0 +1,35 @@
1
+ @log_level
2
+ Feature: Finding log entries at an exact log level
3
+ As an Indy user I am able to create an instance and find all logs at the various standard log levels.
4
+
5
+ Background:
6
+ Given the following log:
7
+ """
8
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
9
+ 2000-09-07 14:07:42 DEBUG MyApp - Focusing application.
10
+ 2000-09-07 14:07:43 DEBUG MyApp - Blurring application.
11
+ 2000-09-07 14:07:44 WARN MyApp - Low on Memory.
12
+ 2000-09-07 14:07:45 ERROR MyApp - Out of Memory.
13
+ 2000-09-07 14:07:46 INFO MyApp - Exiting application.
14
+ """
15
+
16
+ Scenario: Count of entries at specified log level
17
+ When searching the log for the log severity INFO
18
+ Then I expect to have found 2 log entries
19
+
20
+
21
+ Scenario: Particular entry at the specified log level
22
+ When searching the log for the log severity INFO
23
+ Then I expect the first entry to be:
24
+ """
25
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
26
+ """
27
+ And I expect the last entry to be:
28
+ """
29
+ 2000-09-07 14:07:46 INFO MyApp - Exiting application.
30
+ """
31
+
32
+
33
+ Scenario: No entries at the specified log level
34
+ When searching the log for the log severity SEVERE
35
+ Then I expect to have found no log entries
@@ -0,0 +1,33 @@
1
+ @message
2
+ Feature: Finding log entries exactly matching a message
3
+ As an Indy user I am able to create an instance and find all logs that exactly match a message.
4
+
5
+ Background:
6
+ Given the following log:
7
+ """
8
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
9
+ 2000-09-07 14:07:41 INFO MyApp - Exiting application.
10
+ """
11
+
12
+
13
+ Scenario: Count of entries that exactly match the given message
14
+ When searching the log for the exact match of the message "Entering application."
15
+ Then I expect to have found 1 log entry
16
+
17
+
18
+ Scenario: Particular entry that exactly matches a given message
19
+ When searching the log for the exact match of the message "Entering application."
20
+ Then I expect the first entry to be:
21
+ """
22
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
23
+ """
24
+
25
+
26
+ Scenario: No entries when no messages exactly match
27
+ When searching the log for the exact match of the message "Opening application."
28
+ Then I expect to have found no log entries
29
+
30
+
31
+ Scenario: No entries when even when there is a partial match
32
+ When searching the log for the exact match of the message "application"
33
+ Then I expect to have found no log entries
@@ -0,0 +1,38 @@
1
+ @application @message @log_level @time
2
+ Feature: Finding log entries that exactly match multiple fields
3
+ As an Indy user I am able to create an instance and find all logs related to a particular application.
4
+
5
+ Background:
6
+ Given the following log:
7
+ """
8
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
9
+ 2000-09-07 14:07:42 DEBUG MyApp - Focusing application.
10
+ 2000-09-07 14:07:43 DEBUG MyApp - Blurring application.
11
+ 2000-09-07 14:07:44 WARN MyApp - Low on Memory.
12
+ 2000-09-07 14:07:45 ERROR MyApp - Out of Memory.
13
+ 2000-09-07 14:07:46 INFO MyApp - Exiting application.
14
+ """
15
+
16
+ Scenario: Count of entries that exactly match the application and log level
17
+ When searching the log for:
18
+ | application | severity |
19
+ | MyApp | DEBUG |
20
+ Then I expect to have found 2 log entries
21
+
22
+
23
+ Scenario: Particular entry that exactly match a message and and a log level
24
+ When searching the log for:
25
+ | Message | severity |
26
+ | Out of Memory. | ERROR |
27
+ Then I expect to have found 1 log entry
28
+ And I expect the first entry to be:
29
+ """
30
+ 2000-09-07 14:07:45 ERROR MyApp - Out of Memory.
31
+ """
32
+
33
+
34
+ Scenario: No entries for when looking at a matching time but not exact message
35
+ When searching the log for:
36
+ | time | message |
37
+ | 2000-09-07 14:07:46 | Focusing application. |
38
+ Then I expect to have found no log entries
@@ -0,0 +1,28 @@
1
+ @time
2
+ Feature: Finding log messages at a particular time
3
+ As an Indy user I am able to create an instance and find all logs at an exact time.
4
+
5
+ Background:
6
+ Given the following log:
7
+ """
8
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
9
+ 2000-09-07 14:07:42 INFO MyApp - Exiting application.
10
+ """
11
+
12
+
13
+ Scenario: Count of entries at the specified time
14
+ When searching the log for the time 2000-09-07 14:07:41
15
+ Then I expect to have found 1 log entry
16
+
17
+
18
+ Scenario: Particular entry at the specified time
19
+ When searching the log for the time 2000-09-07 14:07:41
20
+ Then I expect the last entry to be:
21
+ """
22
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
23
+ """
24
+
25
+
26
+ Scenario: No entries at the specified time
27
+ When searching the log for the time 2000-09-07 14:07:40
28
+ Then I expect to have found no log entries
@@ -0,0 +1,30 @@
1
+ @application
2
+ Feature: Finding log entries in a file
3
+
4
+ Background:
5
+ Given the following log:
6
+ """
7
+ spec/data.log
8
+ """
9
+
10
+
11
+ Scenario: Count of entries for a specific application
12
+ When searching the log for the application 'MyApp'
13
+ Then I expect to have found 2 log entries
14
+
15
+
16
+ Scenario: Particular entry for a specific application
17
+ When searching the log for the application 'MyApp'
18
+ Then I expect the first entry to be:
19
+ """
20
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
21
+ """
22
+ Then I expect the last entry to be:
23
+ """
24
+ 2000-09-07 14:07:41 INFO MyApp - Exiting application.
25
+ """
26
+
27
+
28
+ Scenario: No entries for a specific application
29
+ When searching the log for the application 'YourApp'
30
+ Then I expect to have found no log entries
@@ -0,0 +1,40 @@
1
+ @log_level
2
+ Feature: Finding log entries at various log levels
3
+ As an Indy user I am able to create an instance and find all logs at or above the log level.
4
+
5
+ Background:
6
+ Given the following log:
7
+ """
8
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
9
+ 2000-09-07 14:07:42 DEBUG MyApp - Focusing application.
10
+ 2000-09-07 14:07:43 DEBUG MyApp - Blurring application.
11
+ 2000-09-07 14:07:44 WARN MyApp - Low on Memory.
12
+ 2000-09-07 14:07:45 ERROR MyApp - Out of Memory.
13
+ 2000-09-07 14:07:46 INFO MyApp - Exiting application.
14
+ """
15
+
16
+ Scenario: Count of messages at a specified log level or higher
17
+ When searching the log for the log severity INFO and higher
18
+ Then I expect to have found 4 log entries
19
+
20
+
21
+ Scenario: Count of messages at a specified log level or higher
22
+ When searching the log for the log severity DEBUG and higher
23
+ Then I expect to have found 6 log entries
24
+
25
+
26
+ Scenario: Count of messages at a specified log level or lower
27
+ When searching the log for the log severity INFO and lower
28
+ Then I expect to have found 4 log entries
29
+
30
+
31
+ Scenario: Particular message at a specified log level or higher
32
+ When searching the log for the log severity INFO and higher
33
+ Then I expect the first entry to be:
34
+ """
35
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
36
+ """
37
+ And I expect the last entry to be:
38
+ """
39
+ 2000-09-07 14:07:46 INFO MyApp - Exiting application.
40
+ """
@@ -0,0 +1,39 @@
1
+ @message
2
+ Feature: Finding log messages by message
3
+ As an Indy user I am able to create an instance and find all logs related to a particular message or portion of a message.
4
+
5
+ Background:
6
+ Given the following log:
7
+ """
8
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
9
+ 2000-09-07 14:07:41 INFO MyApp - Exiting application.
10
+ """
11
+
12
+
13
+ Scenario: Count of entries that partially match a given message
14
+ When searching the log for matches of the message "Entering"
15
+ Then I expect to have found 1 log entry
16
+
17
+
18
+ Scenario: Particular entry that partially match a given message
19
+ When searching the log for matches of the message "Entering"
20
+ Then I expect the first entry to be:
21
+ """
22
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
23
+ """
24
+
25
+ Scenario: Two entries that partially match a given message
26
+ When searching the log for matches of the message "application"
27
+ Then I expect the first entry to be:
28
+ """
29
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
30
+ """
31
+ Then I expect the last entry to be:
32
+ """
33
+ 2000-09-07 14:07:41 INFO MyApp - Exiting application.
34
+ """
35
+
36
+
37
+ Scenario: No entries when no entries partially match the message
38
+ When searching the log for matches of the message "Opening"
39
+ Then I expect to have found no log entries
@@ -0,0 +1,38 @@
1
+ @application @message @log_level @time
2
+ Feature: Finding log entries that match multiple fields
3
+ As an Indy user I am able to create an instance and find all logs related to a particular application.
4
+
5
+ Background:
6
+ Given the following log:
7
+ """
8
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
9
+ 2000-09-07 14:07:42 DEBUG MyApp - Focusing application.
10
+ 2000-09-07 14:07:43 DEBUG MyApp - Blurring application.
11
+ 2000-09-07 14:07:44 WARN MyApp - Low on Memory.
12
+ 2000-09-07 14:07:45 ERROR MyApp - Out of Memory.
13
+ 2000-09-07 14:07:46 INFO MyApp - Exiting application.
14
+ """
15
+
16
+ Scenario: Count of entries that partially matches the message and the log level
17
+ When searching the log for entries like:
18
+ | message | severity |
19
+ | application | INFO\|DEBUG |
20
+ Then I expect to have found 4 log entries
21
+
22
+
23
+ Scenario: Particular entry that partially matches two message but only one log level
24
+ When searching the log for entries like:
25
+ | Message | severity |
26
+ | [Mm]emory | ERROR |
27
+ Then I expect to have found 1 log entry
28
+ And I expect the first entry to be:
29
+ """
30
+ 2000-09-07 14:07:45 ERROR MyApp - Out of Memory.
31
+ """
32
+
33
+
34
+ Scenario: No entries for when looking at a matching time but no application
35
+ When searching the log for:
36
+ | time | application |
37
+ | 2000-09-07 14:07:46 | YourApp |
38
+ Then I expect to have found no log entries
@@ -0,0 +1,55 @@
1
+
2
+ When /^searching the log for the application '([^']+)'$/ do |name|
3
+ @results = @indy.for(:application => name)
4
+ end
5
+
6
+ When /^searching the log for the log severity (\w+)$/ do |severity|
7
+ @results = @indy.for(:severity => severity)
8
+ end
9
+
10
+ When /^searching the log for the log severity (\w+) and lower$/ do |severity|
11
+ @results = @indy.severity(severity,:equal_and_below)
12
+ end
13
+
14
+ When /^searching the log for the log severity (\w+) and higher$/ do |severity|
15
+ @results = @indy.severity(severity,:equal_and_above)
16
+ end
17
+
18
+ When /^searching the log for the exact match of the message "([^"]+)"$/ do |message|
19
+ @results = @indy.for(:message => message)
20
+ end
21
+
22
+ When /^searching the log for matches of the message "([^"]+)"$/ do |message|
23
+ @results = @indy.like(:message => message)
24
+ end
25
+
26
+ When /^searching the log for:$/ do |fields|
27
+ fields.map_headers! {|header| header.is_a?(Symbol) ? header : header.downcase.gsub(/\s/,'_').to_sym }
28
+ @results = @indy.search(fields.hashes.first)
29
+ end
30
+
31
+ When /^searching the log for entries like:$/ do |fields|
32
+ fields.map_headers! {|header| header.is_a?(Symbol) ? header : header.downcase.gsub(/\s/,'_').to_sym }
33
+ @results = @indy.matching(fields.hashes.first)
34
+ end
35
+
36
+ When /^searching the log for the exact match of custom field ([^"]+)\s*"([^"]+)"$/ do |field,value|
37
+ @results = @indy.search(field.strip.gsub(/\s/,'_').to_sym => value)
38
+ end
39
+
40
+ When /^searching the log for entries in the (\w+ \w+), by (.+)$/ do |portion, method|
41
+ method = method.intern
42
+ case portion
43
+ when /(second|last) half/
44
+ @results = @indy.last(:half, method)
45
+ when 'first half'
46
+ @results = @indy.first(:half, method)
47
+ else
48
+ pending
49
+ end
50
+ end
51
+
52
+ Then /^I expect the (first|last|\d+(?:st|nd|rd|th)) entry to be:$/ do |position,expected|
53
+ @results[position].line.should == expected
54
+ end
55
+
@@ -0,0 +1,8 @@
1
+
2
+ Given /^the following log:$/ do |string|
3
+ @indy = Indy.search(string)
4
+ end
5
+
6
+ And /^the custom pattern \(([^\)]+)\):$/ do |fields,pattern|
7
+ @indy = @indy.with( [ pattern, fields.split(',').map{|f| f.to_sym} ].flatten)
8
+ end
@@ -0,0 +1 @@
1
+ require "#{File.dirname(__FILE__)}/../../../lib/indy"
@@ -0,0 +1,28 @@
1
+
2
+ Transform /^no$/ do |no|
3
+ 0
4
+ end
5
+
6
+ Transform /^(\d+)$/ do |number|
7
+ number.to_i
8
+ end
9
+
10
+ Then /^I expect to have found (no|\d+) log entr(?:y|ies)$/ do |count|
11
+ @results.size.should == count
12
+ end
13
+
14
+ Transform /^first$/ do |order|
15
+ 0
16
+ end
17
+ Transform /^last$/ do |order|
18
+ -1
19
+ end
20
+
21
+ Transform /^(\d+)(?:st|nd|rd|th)$/ do |order|
22
+ order.to_i - 1
23
+ end
24
+
25
+ # When searching the log for all entries after and including the time 2000-09-07 14:07:44
26
+ Transform /^ and including$/ do |inclusive|
27
+ true
28
+ end
@@ -0,0 +1,4 @@
1
+
2
+ Before do
3
+ # extend Indy
4
+ end
@@ -0,0 +1,29 @@
1
+
2
+ When /^searching the log for the time (.+)$/ do |time|
3
+ @results = @indy.for(:time => time)
4
+ end
5
+
6
+ When /^searching the log for all entries after( and including)? the time (.+)$/ do |inclusive,time|
7
+ @results = @indy.after(:time => time, :inclusive => (inclusive ? true : false)).for(:all)
8
+ end
9
+
10
+ When /^searching the log for all entries before( and including)? the time (.+)$/ do |inclusive,time|
11
+ @results = @indy.before(:time => time, :inclusive => (inclusive ? true : false)).for(:all)
12
+ end
13
+
14
+ When /^searching the log for all entries between( and including)? the times? (.+) and (.+)$/ do |inclusive,start,stop|
15
+ @results = @indy.within(:time => [start,stop], :inclusive => (inclusive ? true : false)).for(:all)
16
+ end
17
+
18
+ When /^searching the log for all entries (\d+) minutes around( and including)? the time (.+)$/ do |time_span,inclusive,time|
19
+ @results = @indy.around(:time => time, :span => time_span, :inclusive => (inclusive ? true : false)).for(:all)
20
+ end
21
+
22
+ When /^searching the log for all entries (\d+) minutes after( and including)? the time (.+)$/ do |time_span,inclusive,time|
23
+ @results = @indy.after(:time => time, :span => time_span, :inclusive => (inclusive ? true : false)).for(:all)
24
+ end
25
+
26
+ When /^searching the log for all entries (\d+) minutes before( and including)? the time (.+)$/ do |time_span,inclusive,time|
27
+ @results = @indy.before(:time => time, :span => time_span, :inclusive => (inclusive ? true : false)).for(:all)
28
+ end
29
+
@@ -0,0 +1,41 @@
1
+ @time @within
2
+ Feature: Finding log messages within a particular time
3
+ As an Indy user I am able to find all log messages that have happened between two specified times
4
+
5
+ Background:
6
+ Given the following log:
7
+ """
8
+ 2000-09-07 14:07:41 INFO MyApp - Entering application.
9
+ 2000-09-07 14:07:42 DEBUG MyApp - Focusing application.
10
+ 2000-09-07 14:07:43 DEBUG MyApp - Blurring application.
11
+ 2000-09-07 14:07:44 WARN MyApp - Low on Memory.
12
+ 2000-09-07 14:07:45 ERROR MyApp - Out of Memory.
13
+ 2000-09-07 14:07:46 INFO MyApp - Exiting application.
14
+ """
15
+
16
+
17
+ Scenario: Count of entries between the specified times
18
+ When searching the log for all entries between the time 2000-09-07 14:07:44 and 2000-09-07 14:07:46
19
+ Then I expect to have found 1 log entries
20
+
21
+ Scenario: Count of entries between and including the specified times
22
+ When searching the log for all entries between and including the times 2000-09-07 14:07:44 and 2000-09-07 14:07:46
23
+ Then I expect to have found 3 log entries
24
+
25
+
26
+ Scenario: Count of entries between the specified times
27
+ When searching the log for all entries between the time 2000-09-07 14:07:40 and 2000-09-07 14:07:50
28
+ Then I expect to have found 6 log entries
29
+
30
+
31
+ Scenario: Particular entry between the specified times
32
+ When searching the log for all entries between the time 2000-09-07 14:07:40 and 2000-09-07 14:07:50
33
+ Then I expect the last entry to be:
34
+ """
35
+ 2000-09-07 14:07:46 INFO MyApp - Exiting application.
36
+ """
37
+
38
+
39
+ Scenario: No entries between the specified times
40
+ When searching the log for all entries between the time 2000-09-07 14:07:50 and 2000-09-07 14:07:55
41
+ Then I expect to have found no log entries