mole 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mole/e_mole.rb CHANGED
@@ -28,7 +28,7 @@ module Mole
28
28
  alias_method_chain :feature_alerts, :setup
29
29
 
30
30
  # send out mole performance alert
31
- def perf_alerts( context, user_id, options={} )
31
+ def perf_alerts( context, user_id, options={} )
32
32
  Mole.logger.debug "Sending perf email from #{::Mole.emole_from} -- to #{::Mole.emole_recipients}"
33
33
  subject "[PERF] #{@host} -- #{Mole.application} -- #{user_id}"
34
34
  body :application => ::Mole.application,
@@ -10,16 +10,16 @@ class MoleFeature < ActiveRecord::Base
10
10
 
11
11
  # find performance feature
12
12
  def find_performance_feature( app_name )
13
- find_feature( performance, app_name )
13
+ find_or_create_feature( performance, app_name )
14
14
  end
15
15
 
16
16
  # find exception feature
17
17
  def find_exception_feature( app_name )
18
- find_feature( exception, app_name )
18
+ find_or_create_feature( exception, app_name )
19
19
  end
20
20
 
21
21
  def find_all_feature( app_name )
22
- find_feature( all, app_name )
22
+ find_or_create_feature( all, app_name )
23
23
  end
24
24
 
25
25
  # Finds all the features available for a given application
@@ -32,8 +32,8 @@ class MoleFeature < ActiveRecord::Base
32
32
  :order => "name asc" )
33
33
  end
34
34
 
35
- # locates an existing feature or create a new one
36
- def find_feature( name, app_name, ctx_name=nil )
35
+ # locates an existing feature or create a new one if it does not exist.
36
+ def find_or_create_feature( name, app_name, ctx_name=nil )
37
37
  if name.nil? or name.empty?
38
38
  ::Mole.logger.error( "--- MOLE ERROR - Invalid feature. Empty or nil" )
39
39
  return nil
@@ -4,28 +4,7 @@
4
4
  class MoleLog < ActiveRecord::Base
5
5
  belongs_to :mole_feature
6
6
 
7
- class << self
8
- # logs unchecked exception
9
- def check_it( context, user_id, args )
10
- if args[:boom]
11
- args[:trace] = dump_stack( args[:boom] )
12
- args[:boom] = args[:boom].to_s
13
- end
14
- log_it( context, MoleFeature::find_exception_feature( ::Mole.application ), user_id, args ) if ::Mole::moleable?
15
- end
16
-
17
- # logs perf occurence
18
- def perf_it( context, user_id, args )
19
- log_it( context, MoleFeature::find_performance_feature( ::Mole.application ), user_id, args ) if ::Mole::moleable?
20
- end
21
-
22
- # persists mole information to the database.
23
- # This call will store information on the mole dedicated tables namely
24
- # mole_features and mole_logs.
25
- def mole_it(context, feature, user_id, args)
26
- log_it( context, MoleFeature::find_feature( feature, ::Mole.application, context.class.name ), user_id, args ) if ::Mole::moleable?
27
- end
28
-
7
+ class << self
29
8
  # mole the bastard - create db entry into mole logs
30
9
  def log_it( context, feature, user_id, args )
31
10
  args ||= "no args"
@@ -39,11 +18,6 @@ class MoleLog < ActiveRecord::Base
39
18
  :browser_type => browser_type )
40
19
  end
41
20
 
42
- # dumps partial stack
43
- def dump_stack( boom )
44
- buff = boom.backtrace[0...3].join( "-" )
45
- end
46
-
47
21
  # extract orginating ip address and browser type
48
22
  def log_details( context ) #:nodoc:
49
23
  ip_addr, browser_type = nil
data/lib/mole/moler.rb CHANGED
@@ -12,7 +12,12 @@ module Mole
12
12
  # configuration to see if this event should be persisted to the db or
13
13
  # sent out to the logger.
14
14
  def check_it( context, user_id, args )
15
- return unless ::Mole.moleable?
15
+ return unless ::Mole.moleable?
16
+ # If exception is given record the first couple of frames
17
+ if args[:boom]
18
+ args[:trace] = dump_stack( args[:boom] )
19
+ args[:boom] = args[:boom].to_s
20
+ end
16
21
  if ::Mole.persistent?
17
22
  MoleLog.log_it( context, MoleFeature::find_exception_feature( ::Mole.application ), user_id, args )
18
23
  else
@@ -38,14 +43,21 @@ module Mole
38
43
  def mole_it(context, feature, user_id, args)
39
44
  return unless ::Mole.moleable?
40
45
  if ::Mole.persistent?
41
- MoleLog.log_it( context, MoleFeature::find_feature( feature, ::Mole.application, context.class.name ), user_id, args )
46
+ MoleLog.log_it( context, MoleFeature::find_or_create_feature( feature, ::Mole.application, context.class.name ), user_id, args )
42
47
  else
43
48
  ::Mole.logger.log_it( context, feature, user_id, args )
44
49
  end
45
50
  # Send out email notification if requested
46
- args[:feature] = feature
47
- Mole::EMole.deliver_feature_alerts( context, user_id, args ) if args[:email] and args[:email] == true
48
- end
51
+ if args[:email] and args[:email] == true
52
+ args[:feature] = feature
53
+ Mole::EMole.deliver_feature_alerts( context, user_id, args )
54
+ end
55
+ end
56
+
57
+ # dumps partial stack
58
+ def dump_stack( boom )
59
+ buff = boom.backtrace[0...3].join( "-" )
60
+ end
49
61
  end
50
62
  end
51
63
  end
data/lib/mole/version.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Mole
2
2
  module Version
3
- MAJOR = 0
3
+ MAJOR = 1
4
4
  MINOR = 0
5
- TINY = 1
5
+ TINY = 0
6
6
 
7
7
  # Returns the version string for the library.
8
8
  #
data/lib/mole.rb CHANGED
@@ -26,9 +26,8 @@ unless defined? Mole
26
26
  :perf_threshold => 5,
27
27
  :mode => :transient,
28
28
  :emole_from => "MOleBeatch",
29
- :mole_config => nil,
30
- :emole_recipients => [],
31
-
29
+ :emole_recipients => [],
30
+ :mole_config => nil,
32
31
  # logging options
33
32
  :log_file => $stdout,
34
33
  :log_level => :info,
data/spec/emole_spec.rb CHANGED
@@ -9,8 +9,8 @@ describe Mole::EMole do
9
9
  before( :each ) do
10
10
  ::Mole.reset_configuration!
11
11
  ::Mole.initialize( :moleable => true,
12
- :emole_from => "MOleBeatch@liquidrail.com",
13
- :emole_recipients => ['fernand@liquidrail.com'] )
12
+ :emole_from => "MOleBeatch@liquidrail.com",
13
+ :emole_recipients => ['fernand@liquidrail.com'] )
14
14
  end
15
15
 
16
16
  it "should send out a correct perf alert" do
@@ -15,14 +15,14 @@ describe MoleFeature do
15
15
  end
16
16
 
17
17
  it "should create a new feature" do
18
- feature = MoleFeature.find_feature( "Fred", ::Mole.application, self.class.name )
18
+ feature = MoleFeature.find_or_create_feature( "Fred", ::Mole.application, self.class.name )
19
19
  feature.should_not be_nil
20
20
  feature.name.should == "Fred"
21
21
  feature.context.should == self.class.name
22
22
  end
23
23
 
24
24
  it "should not create a feature with no name" do
25
- feature = MoleFeature.find_feature( "", ::Mole.application, self.class.name )
25
+ feature = MoleFeature.find_or_create_feature( "", ::Mole.application, self.class.name )
26
26
  feature.should be_nil
27
27
  end
28
28
 
@@ -30,7 +30,7 @@ describe MoleFeature do
30
30
  %w[ all performance exception].each do |f|
31
31
  MoleFeature.send( "find_#{f}_feature".to_sym, ::Mole.application )
32
32
  end
33
- MoleFeature.find_feature( "Fred", ::Mole.application, self.class.name )
33
+ MoleFeature.find_or_create_feature( "Fred", ::Mole.application, self.class.name )
34
34
  features = MoleFeature.find_features( ::Mole.application )
35
35
  features.should have(4).mole_features
36
36
  end
@@ -4,59 +4,46 @@ describe MoleLog do
4
4
  before( :each ) do
5
5
  ::Mole.reset_configuration!
6
6
  ::Mole.initialize( :mode => :persistent, :log_level => :info, :moleable => true )
7
+ @args = { :blee => "Hello", :duh => "World" }
7
8
  end
8
9
 
9
- it "should log unchecked exceptions correctly" do
10
+ it "should log unchecked exceptions correctly" do
11
+ args = @args
12
+ feature = MoleFeature.find_exception_feature( ::Mole.application )
13
+ feature.should_not be_nil
10
14
  begin
11
15
  raise "Something crapped out"
12
- rescue => boom
13
- MoleLog.check_it( self, 100, :blee => "Hello", :duh => "World", :boom => boom )
16
+ rescue => boom
17
+ args[:boom] = Mole::Moler.dump_stack( boom )
18
+ MoleLog.log_it( self, feature, 100, args )
14
19
  end
15
- except_feature = MoleFeature.find_exception_feature( ::Mole.application )
16
- except_feature.should_not be_nil
17
-
18
- log = MoleLog.find( :all, :conditions => ['mole_feature_id = ?', except_feature.id] )
19
- log.should_not be_nil
20
- log.should have(1).mole_log
21
- log.first.user_id.should == 100
20
+ check_it( feature, 100, @args )
22
21
  end
23
22
 
24
- it "should log perf exception correctly" do
25
- MoleLog.perf_it( self, 100, :blee => "Hello", :duh => "World" )
26
- perf_feature = MoleFeature.find_performance_feature( ::Mole.application )
27
- perf_feature.should_not be_nil
28
-
29
- log = MoleLog.find( :all, :conditions => ['mole_feature_id = ?', perf_feature.id] )
30
- log.should_not be_nil
31
- log.should have(1).mole_log
32
- log.first.user_id.should == 100
23
+ it "should log perf exception correctly" do
24
+ feature = MoleFeature.find_performance_feature( ::Mole.application )
25
+ feature.should_not be_nil
26
+ MoleLog.log_it( self, feature, 200, @args )
27
+ check_it( feature, 200, @args )
33
28
  end
34
29
 
35
30
  it "should mole a feature correctly" do
36
- MoleLog.mole_it( "Test", "fred", 100, :blee => "Hello", :duh => "World" )
37
- feature = MoleFeature.find_feature( "fred", ::Mole.application, "Test".class.name )
38
- feature.should_not be_nil
39
-
40
- log = MoleLog.find( :all, :conditions => ['mole_feature_id = ?', feature.id] )
41
- log.should_not be_nil
42
- log.should have(1).mole_log
43
- log.first.user_id.should == 100
31
+ feature = MoleFeature.find_or_create_feature( "fred", ::Mole.application, "Test".class.name )
32
+ feature.should_not be_nil
33
+ MoleLog.log_it( "Test", feature, 300, @args )
34
+ check_it( feature, 300, @args )
44
35
  end
45
36
 
46
37
  it "should log request info correctly" do
47
- ctrl = Moled::Controller.new
48
- MoleLog.mole_it( ctrl, "fred", 100, :blee => "Hello", :duh => "World" )
49
- feature = MoleFeature.find_feature( "fred", ::Mole.application, ctrl.class.name )
50
- feature.should_not be_nil
51
-
52
- log = MoleLog.find( :all, :conditions => ['mole_feature_id = ?', feature.id] )
53
- log.should_not be_nil
54
- log.should have(1).mole_log
55
- log.first.user_id.should == 100
56
- log.first.ip_address.should == "1.1.1.1"
57
- log.first.browser_type.should == "GodZilla"
38
+ ctrl = Moled::Controller.new
39
+ feature = MoleFeature.find_or_create_feature( "fred", ::Mole.application, ctrl.class.name )
40
+ feature.should_not be_nil
41
+ MoleLog.log_it( ctrl, feature, 400, @args )
42
+ log = check_it( feature, 400, @args )
43
+ log.ip_address.should == "1.1.1.1"
44
+ log.browser_type.should == "GodZilla"
58
45
  end
59
-
46
+
60
47
  module Moled
61
48
  class Controller
62
49
  class Request
data/spec/moler_spec.rb CHANGED
@@ -1,64 +1,76 @@
1
1
  require File.join(File.dirname(__FILE__), "spec_helper" )
2
+
3
+ require 'action_mailer'
4
+ ActionMailer::Base.delivery_method = :sendmail
5
+ ActionMailer::Base.raise_delivery_errors = true
2
6
 
3
7
  describe Mole::Moler do
4
8
  TEST_LOG = "/tmp/test.log"
5
9
  before( :each ) do
6
10
  ::Mole.reset_configuration!
7
11
  @io = StringIO.new
8
- ::Mole.initialize( :mode => :transient, :logger_name => "Test", :log_file => @io, :moleable => true )
12
+ ::Mole.initialize( :mode => :transient,
13
+ :logger_name => "Test",
14
+ :log_file => @io,
15
+ :moleable => true,
16
+ :emole_from => "MOleBeatch@liquidrail.com",
17
+ :emole_recipients => ['fernand@liquidrail.com'] )
18
+ @args = { :blee => "Hello", :duh => "World" }
9
19
  end
10
20
 
11
21
  it "should log unchecked to the db exceptions correctly" do
12
- ::Mole.switch_mode :persistent
13
- ::Mole::Moler.check_it( self, 100, :blee => "Hello", :duh => "World" )
14
- except_feature = MoleFeature.find_exception_feature( ::Mole.application )
15
- except_feature.should_not be_nil
16
-
17
- log = MoleLog.find( :all, :conditions => ['mole_feature_id = ?', except_feature.id] )
18
- log.should_not be_nil
19
- log.should have(1).mole_log
20
- log.first.user_id.should == 100
22
+ ::Mole.switch_mode :persistent
23
+ begin
24
+ raise "Something bad happened !"
25
+ rescue => boom
26
+ @args[:boom] = boom
27
+ ::Mole::Moler.check_it( self, 100, @args )
28
+ end
29
+ feature = MoleFeature.find_exception_feature( ::Mole.application )
30
+ feature.should_not be_nil
31
+ check_it( feature, 100, @args )
21
32
  end
22
33
 
23
34
  it "should log perf exception to the db correctly" do
24
35
  ::Mole.switch_mode :persistent
25
- ::Mole::Moler.perf_it( self, 100, :blee => "Hello", :duh => "World" )
26
- perf_feature = MoleFeature.find_performance_feature( ::Mole.application )
27
- perf_feature.should_not be_nil
28
-
29
- log = MoleLog.find( :all, :conditions => ['mole_feature_id = ?', perf_feature.id] )
30
- log.should_not be_nil
31
- log.should have(1).mole_log
32
- log.first.user_id.should == 100
36
+ ::Mole::Moler.perf_it( self, 100, @args )
37
+ feature = MoleFeature.find_performance_feature( ::Mole.application )
38
+ feature.should_not be_nil
39
+ check_it( feature, 100, @args )
33
40
  end
34
41
 
35
42
  it "should mole a feature to the db correctly" do
36
43
  ::Mole.switch_mode :persistent
37
- ::Mole::Moler.mole_it( "Test", "fred", 100, :blee => "Hello", :duh => "World" )
38
- feature = MoleFeature.find_feature( "fred", ::Mole.application, "Test".class.name )
44
+ ::Mole::Moler.mole_it( "Test", "fred", 100, @args )
45
+ feature = MoleFeature.find_or_create_feature( "fred", ::Mole.application, "Test".class.name )
39
46
  feature.should_not be_nil
47
+ check_it( feature, 100, @args )
48
+ end
40
49
 
41
- log = MoleLog.find( :all, :conditions => ['mole_feature_id = ?', feature.id] )
42
- log.should_not be_nil
43
- log.should have(1).mole_log
44
- log.first.user_id.should == 100
50
+ it "should log a feature to the db and send an email correctly" do
51
+ ::Mole.switch_mode :persistent
52
+ @args[:email] = true
53
+ ::Mole::Moler.mole_it( "Test", "fred", 100, @args )
54
+ feature = MoleFeature.find_or_create_feature( "fred", ::Mole.application, "Test".class.name )
55
+ feature.should_not be_nil
56
+ check_it( feature, 100, { :email => true, :blee => "Hello", :duh => "World" } )
45
57
  end
46
58
 
47
59
  it "should log unchecked exceptions to the logger correctly" do
48
60
  ::Mole.switch_mode :transient
49
- ::Mole::Moler.check_it( self, 100, :blee => "Hello", :duh => "World" )
61
+ ::Mole::Moler.check_it( self, 100, @args )
50
62
  @io.string[@io.string.index( "---" )..@io.string.size].should == "--- 100 -> blee=>Hello, duh=>World\n"
51
63
  end
52
64
 
53
65
  it "should log perf exception to the logger correctly" do
54
66
  ::Mole.switch_mode :transient
55
- ::Mole::Moler.perf_it( self, 100, :blee => "Hello", :duh => "World" )
67
+ ::Mole::Moler.perf_it( self, 100, @args )
56
68
  @io.string[@io.string.index( "---" )..@io.string.size].should == "--- 100 -> blee=>Hello, duh=>World\n"
57
69
  end
58
70
 
59
71
  it "should mole a feature to the logger correctly" do
60
72
  ::Mole.switch_mode :transient
61
- ::Mole::Moler.mole_it( "Test", "Fred", 100, :blee => "Hello", :duh => "World" )
73
+ ::Mole::Moler.mole_it( "Test", "Fred", 100, @args )
62
74
  @io.string[@io.string.index( "---" )..@io.string.size].should == "--- 100 -> blee=>Hello, duh=>World\n"
63
75
  end
64
76
 
data/spec/spec_helper.rb CHANGED
@@ -56,4 +56,21 @@ Spec::Runner.configure do |config|
56
56
  rescue
57
57
  end
58
58
  end
59
+ end
60
+
61
+ # Convenience to check mole_logs
62
+ def check_it( feature, user_id, args={} )
63
+ log = MoleLog.find( :first, :conditions => ['mole_feature_id = ?', feature.id] )
64
+ log.should_not be_nil
65
+ log.user_id.should == user_id
66
+ log_args = YAML.load( log.params )
67
+ check_args( log_args, args )
68
+ log
59
69
  end
70
+ def check_args( args, expected_args )
71
+ args.should have(expected_args.size).items
72
+ expected_args.keys.each do |k|
73
+ args[k].should_not be_nil
74
+ args[k].should == expected_args[k]
75
+ end
76
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: mole
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.1
7
- date: 2008-03-01 00:00:00 -07:00
6
+ version: 1.0.0
7
+ date: 2008-03-02 00:00:00 -07:00
8
8
  summary: A flexible way to track user's interactions within your ruby web applications
9
9
  require_paths:
10
10
  - lib