indy 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ === 0.1.5 / 2011-01-21
2
+
3
+ * Searching with time scopes (#after, #within, #before) are much faster
4
+ * Dates used in time scopes are limited to 1901 - 2038
5
+ * The Windows platform limits dates further to 1969 - 2038
6
+ * Explicit format string for time forces the old (slower) time scoping code
7
+ * However, this removes the harsh limits on date values
8
+
1
9
  === 0.1.4 / 2011-01-19
2
10
 
3
11
  * Add support for Ruby 1.8.5
data/indy.gemspec CHANGED
@@ -62,9 +62,12 @@ Gem::Specification.new do |s|
62
62
 
63
63
  }
64
64
 
65
- s.rubygems_version = "1.3.7"
66
- s.files = `git ls-files`.split("\n")
67
- s.extra_rdoc_files = ["README.md", "History.txt"]
68
- s.rdoc_options = ["--charset=UTF-8"]
69
- s.require_path = "lib"
65
+ # exclusions = [File.join("performance", "large.log")]
66
+ # s.files = `git ls-files`.split("\n") - exclusions
67
+
68
+ s.rubygems_version = "1.3.7"
69
+ s.files = `git ls-files`.split("\n")
70
+ s.extra_rdoc_files = ["README.md", "History.txt"]
71
+ s.rdoc_options = ["--charset=UTF-8"]
72
+ s.require_path = "lib"
70
73
  end
data/lib/indy/indy.rb CHANGED
@@ -1,9 +1,10 @@
1
- require 'ostruct'
2
1
  require 'active_support/core_ext'
3
2
 
4
3
  class Indy
5
4
 
6
- VERSION = "0.1.4"
5
+ class InvalidSource < Exception; end
6
+
7
+ VERSION = "0.1.5"
7
8
 
8
9
  #
9
10
  # hash with one key (:string, :file, or :cmd) set to the string that defines the log
@@ -21,10 +22,6 @@ class Indy
21
22
  #
22
23
  attr_accessor :time_format
23
24
 
24
- FOREVER_AGO = DateTime.now - 200_000
25
- FOREVER = DateTime.now + 200_000
26
-
27
-
28
25
  #
29
26
  # Initialize Indy.
30
27
  #
@@ -72,7 +69,10 @@ class Indy
72
69
  # @example
73
70
  # Indy.search(:source => {:cmd => "cat apache.log"}, :pattern => LOG_PATTERN, :time_format => MY_TIME_FORMAT).for(:all)
74
71
  #
75
- def search(params)
72
+ def search(params=nil)
73
+
74
+ raise Indy::InvalidSource if params.nil?
75
+
76
76
  if params.respond_to?(:keys) && params[:source]
77
77
  Indy.new(params)
78
78
  else
@@ -231,7 +231,8 @@ class Indy
231
231
  #
232
232
  def within(scope_criteria)
233
233
  if scope_criteria[:time]
234
- @start_time, @end_time = scope_criteria[:time]
234
+ @start_time, @end_time = scope_criteria[:time].collect {|str| parse_date(str) }
235
+
235
236
  @inclusive = scope_criteria[:inclusive] || false
236
237
  end
237
238
 
@@ -254,6 +255,8 @@ class Indy
254
255
  #
255
256
  def source=(param)
256
257
 
258
+ raise Indy::InvalidSource if param.nil?
259
+
257
260
  cmd = param[:cmd] rescue nil
258
261
  @source[:cmd] = param[:cmd] if cmd
259
262
 
@@ -261,6 +264,8 @@ class Indy
261
264
  File.exist?(param) ? @source[:file] = param : @source[:string] = param
262
265
  end
263
266
 
267
+ raise Indy::InvalidSource unless @source.values.reject {|value| value.kind_of? String }.empty?
268
+
264
269
  end
265
270
 
266
271
  #
@@ -293,6 +298,7 @@ class Indy
293
298
  #
294
299
  def _search(&block)
295
300
 
301
+ line_matched = nil
296
302
  time_search = use_time_criteria?
297
303
 
298
304
  source_io = open_source
@@ -300,6 +306,8 @@ class Indy
300
306
 
301
307
  hash = parse_line(line)
302
308
 
309
+ hash ? (line_matched = true) : next
310
+
303
311
  if time_search
304
312
  set_time(hash)
305
313
  next unless inside_time_window?(hash)
@@ -307,11 +315,12 @@ class Indy
307
315
  hash[:_time] = nil if hash
308
316
  end
309
317
 
310
- next unless hash
311
318
  block_given? ? block.call(hash) : nil
312
319
 
313
320
  end
314
321
 
322
+ warn "No matching lines found in source: #{source_io.class}" unless line_matched
323
+
315
324
  source_io.close if @source[:file] || @source[:cmd]
316
325
 
317
326
  results.compact
@@ -375,8 +384,8 @@ class Indy
375
384
  def use_time_criteria?
376
385
  if @start_time || @end_time
377
386
  # ensure both boundaries are set
378
- @start_time = @start_time || FOREVER_AGO
379
- @end_time = @end_time || FOREVER
387
+ @start_time = @start_time || forever_ago
388
+ @end_time = @end_time || forever
380
389
  end
381
390
 
382
391
  return (@time_field && @start_time && @end_time)
@@ -416,16 +425,26 @@ class Indy
416
425
  #
417
426
  def parse_date(param)
418
427
  return nil unless @time_field
428
+ return param if param.kind_of? Time or param.kind_of? DateTime
419
429
 
420
430
  time_string = param[@time_field] ? param[@time_field] : param
421
431
 
422
- begin
423
- # Attempt the appropriate parse method
424
- @time_format ? DateTime.strptime(time_string, @time_format) : DateTime.parse(time_string)
425
- rescue
426
- # If appropriate, fall back to simple parse method
427
- DateTime.parse(time_string) if @time_format rescue nil
432
+ if @time_format
433
+ begin
434
+ # Attempt the appropriate parse method
435
+ DateTime.strptime(time_string, @time_format)
436
+ rescue
437
+ # If appropriate, fall back to simple parse method
438
+ DateTime.parse(time_string) rescue nil
439
+ end
440
+ else
441
+ begin
442
+ Time.parse(time_string)
443
+ rescue Exception => e
444
+ raise "Failed to create time object. The error was: #{e.message}"
445
+ end
428
446
  end
447
+
429
448
  end
430
449
 
431
450
  #
@@ -469,4 +488,24 @@ class Indy
469
488
  Struct::Line.new( *params )
470
489
  end
471
490
 
491
+ #
492
+ # Return a time or datetime object way in the future
493
+ #
494
+ def forever
495
+ @time_format ? DateTime.new(4712) : Time.at(0x7FFFFFFF)
496
+ end
497
+
498
+ #
499
+ # Return a time or datetime object way in the past
500
+ #
501
+ def forever_ago
502
+ begin
503
+ @time_format ? DateTime.new(-4712) : Time.at(-0x7FFFFFFF)
504
+ rescue
505
+ # Windows Ruby Time can't handle dates prior to 1969
506
+ @time_format ? DateTime.new(-4712) : Time.at(0)
507
+ end
508
+ end
509
+
510
+
472
511
  end