rulesio 0.9.8 → 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -61,7 +61,9 @@ To manually send an event when a user upgrades to a "premium" account:
61
61
  Filtering sensitive data
62
62
  ------------------------
63
63
 
64
- This gem will not send any parameters mentioned in Rails.application.config.filter_parameters, nor will it send any parameters that match /password/. We recommend extending this line in application.rb
64
+ By default, the exceptions middleware will send information to an error channel about exceptions from your application, including params, session, referer and requested url, backtrace, rails\_env and a UID of the user that was affected by the exception. The users middleware will send information to a user channel about all page views, form submissions, page errors and model validation errors from your application. This includes the user's email address (when available as current\_user.email), params and session data, referring and requested urls, status codes, rails_env and connections to any corresponding exception events. For examples of user and error events generated by the gem, see [sample user event](https://github.com/rulesio/rulesio/wiki/Sample-user-event) and [sample error event](https://github.com/rulesio/rulesio/wiki/Sample-error-event).
65
+
66
+ This gem will not send any parameters mentioned in Rails.application.config.filter\_parameters. We recommend extending this line in application.rb
65
67
 
66
68
  config.filter_parameters += [:password]
67
69
 
@@ -123,7 +125,7 @@ The RulesIO::Users middleware uses the same token as RulesIO::Rack.
123
125
  Here's an example of how to skip sending any user events for all requests to the SillyController:
124
126
 
125
127
  middleware :users do
126
- ignore_if lambda { |env| env['action_controller.instance'].is_a? SillyController }
128
+ ignore_if Proc.new { |env| env['action_controller.instance'].is_a? SillyController }
127
129
  end
128
130
 
129
131
  To make life easier in the case where you want a condition evaluated in the context of a Rails controller, you can do the same thing like this. (Only the users middleware supports ignore_if_controller.)
@@ -163,3 +165,8 @@ Compatibility
163
165
  -------------
164
166
 
165
167
  This gem can be used without Rails, but when used with Rails it depends on Rails 3 (we've tested with Rails 3.1 and 3.2). If you want to use girl_friday, you must use Ruby 1.9.2 or greater, JRuby, or Rubinius.
168
+
169
+ More info
170
+ ---------
171
+
172
+ See the [wiki](https://github.com/rulesio/rulesio/wiki).
data/Rakefile CHANGED
@@ -1 +1,13 @@
1
+ require "bundler"
1
2
  require "bundler/gem_tasks"
3
+ Bundler::GemHelper.install_tasks
4
+ Bundler.setup
5
+
6
+ require "rake/testtask"
7
+ Rake::TestTask.new(:test) do |test|
8
+ test.libs = %w(lib test)
9
+ test.pattern = "test/**/test_*.rb"
10
+ test.verbose = true
11
+ end
12
+
13
+ task :default => :test
data/lib/rulesio/users.rb CHANGED
@@ -7,9 +7,9 @@ module RulesIO
7
7
  def initialize(app, options={})
8
8
  @app, @options = app, options
9
9
  @options[:ignore_crawlers] ||= RulesIO.default_ignored_crawlers
10
- @options[:ignore_if] ||= lambda { |env| false }
10
+ @options[:ignore_if] ||= Proc.new { |env| false }
11
11
  @options[:ignore_if_controller] ||= 'false'
12
- @options[:custom_data] ||= lambda { |env| {} }
12
+ @options[:custom_data] ||= Proc.new { |env| {} }
13
13
  end
14
14
 
15
15
  def call(env)
@@ -38,7 +38,13 @@ module RulesIO
38
38
 
39
39
  def conditionally_ignored_controller(condition, env)
40
40
  controller = env['action_controller.instance']
41
- controller.instance_eval condition
41
+ if condition.is_a?(String)
42
+ controller.instance_eval(condition)
43
+ elsif condition.is_a?(Proc) && !condition.lambda?
44
+ controller.instance_eval(&condition)
45
+ else
46
+ false
47
+ end
42
48
  end
43
49
 
44
50
  def conditionally_ignored(ignore_proc, env)
@@ -1,3 +1,3 @@
1
1
  module RulesIO
2
- VERSION = '0.9.8'
2
+ VERSION = '0.9.10'
3
3
  end
data/lib/rulesio.rb CHANGED
@@ -53,10 +53,18 @@ module RulesIO
53
53
  def self.current_actor(env)
54
54
  if controller = env['action_controller.instance']
55
55
  begin
56
- data = controller.instance_eval(RulesIO.controller_data)
56
+ data = if RulesIO.controller_data.is_a?(String)
57
+ controller.instance_eval(RulesIO.controller_data)
58
+ elsif RulesIO.controller_data.is_a?(Proc) && !RulesIO.controller_data.lambda?
59
+ controller.instance_eval(&RulesIO.controller_data)
60
+ else
61
+ {}
62
+ end
57
63
  data = data.with_indifferent_access
58
64
  return data[:_actor] if data[:_actor]
59
- rescue
65
+ rescue Exception => e
66
+ puts e.message
67
+ puts e.backtrace.join("\n")
60
68
  end
61
69
 
62
70
  begin
@@ -64,7 +72,9 @@ module RulesIO
64
72
  [:to_param, :id].each do |method|
65
73
  return user.send(method) if user && user.respond_to?(method)
66
74
  end
67
- rescue
75
+ rescue Exception => e
76
+ puts e.message
77
+ puts e.backtrace.join("\n")
68
78
  end
69
79
  end
70
80
  nil
@@ -82,17 +92,24 @@ module RulesIO
82
92
  def self.prepare_event(event, env)
83
93
  event = event.with_indifferent_access
84
94
 
95
+ current_user = current_user(env)
96
+ actor = current_actor(env)
97
+
85
98
  if controller = env['action_controller.instance']
86
99
  begin
87
- data = controller.instance_eval(RulesIO.controller_data).with_indifferent_access
88
- event = data.merge(event)
89
- rescue
100
+ data = if RulesIO.controller_data.is_a?(String)
101
+ controller.instance_eval(RulesIO.controller_data)
102
+ elsif RulesIO.controller_data.is_a?(Proc) && !RulesIO.controller_data.lambda?
103
+ controller.instance_eval(&RulesIO.controller_data)
104
+ else
105
+ {}
106
+ end
107
+ event = data.with_indifferent_access.merge(event)
108
+ rescue Exception => e
109
+ RulesIO.logger.warn "RulesIO having trouble with controller_data: #{e}"
90
110
  end
91
111
  end
92
112
 
93
- current_user = current_user(env)
94
- actor = current_actor(env)
95
-
96
113
  event[:_actor] = actor || 'anonymous' unless event[:_actor].present?
97
114
  event[:_timestamp] ||= Time.now.to_f
98
115
  event[:rails_env] = Rails.env if defined?(Rails)
data/rulesio.gemspec CHANGED
@@ -18,5 +18,11 @@ Gem::Specification.new do |s|
18
18
 
19
19
  s.add_runtime_dependency 'activesupport'
20
20
  s.add_runtime_dependency 'actionpack'
21
- s.add_runtime_dependency 'girl_friday', '~> 0.10.0'
21
+ s.add_runtime_dependency 'girl_friday', '~> 0.11'
22
+
23
+ s.add_development_dependency "bundler", "~> 1"
24
+ s.add_development_dependency "test-unit", "~> 2.2"
25
+ s.add_development_dependency "mocha"
26
+ s.add_development_dependency "rake"
27
+ s.add_development_dependency "rails"
22
28
  end
data/test/helper.rb ADDED
@@ -0,0 +1,6 @@
1
+ Bundler.require
2
+ require "test/unit"
3
+ require "active_support/all"
4
+ require "mocha"
5
+
6
+ require "rulesio"
@@ -0,0 +1,143 @@
1
+ require "helper"
2
+ require "rulesio/railtie"
3
+ require "rulesio/girl_friday_queue"
4
+
5
+ MockController = Class.new
6
+
7
+ class TestConfiguration < Test::Unit::TestCase
8
+ REDIS = Object.new
9
+
10
+ STRING_CONFIGURATION = <<-CONFIG
11
+ token 'FOOF'
12
+ queue RulesIO::GirlFridayQueue, :store => GirlFriday::Store::Redis, :store_config => { :pool => TestConfiguration::REDIS }
13
+ controller_data "{:_actor => self.current_user.try(:email) || 'anonymous'}"
14
+
15
+ middleware :users do
16
+ ignore_if_controller 'self.is_a?(MockController) && ["create", "recent"].include?(params[:action])'
17
+ end
18
+ CONFIG
19
+
20
+ BLOCK_CONFIGURATION = <<-CONFIG
21
+ token 'FOOF'
22
+ queue RulesIO::GirlFridayQueue, :store => GirlFriday::Store::Redis, :store_config => { :pool => TestConfiguration::REDIS }
23
+ controller_data lambda { {:_actor => self.current_user.try(:email) || 'anonymous'} }
24
+
25
+ middleware :users do
26
+ ignore_if_controller lambda { self.is_a?(MockController) && ["create", "recent"].include?(params[:action]) }
27
+ end
28
+ CONFIG
29
+
30
+ PROC_CONFIGURATION = <<-CONFIG
31
+ token 'FOOF'
32
+ queue RulesIO::GirlFridayQueue, :store => GirlFriday::Store::Redis, :store_config => { :pool => TestConfiguration::REDIS }
33
+ controller_data Proc.new { {:_actor => self.current_user.try(:email) || 'anonymous'} }
34
+
35
+ middleware :users do
36
+ ignore_if_controller Proc.new { self.is_a?(MockController) && ["create", "recent"].include?(params[:action]) }
37
+ end
38
+ CONFIG
39
+
40
+ setup do
41
+ Rails.expects(:logger)
42
+ Rails.expects(:application).returns(mock(:config => mock(:filter_parameters => [])))
43
+ @rc = RulesIO::RailsConfigurator.new
44
+ end
45
+
46
+ test "general configuration works" do
47
+ user_middleware = @rc.instance_eval do
48
+ eval TestConfiguration::STRING_CONFIGURATION, binding, __FILE__, __LINE__
49
+ RulesIO::Rack.new(Object.new,
50
+ :webhook_url => @webhook_url,
51
+ :disable_sending_events => @disable,
52
+ :token => @token,
53
+ :queue => @queue,
54
+ :queue_options => @queue_options,
55
+ :controller_data => @controller_data
56
+ )
57
+ RulesIO::Users.new(Object.new, @middlewares[:users].configuration)
58
+ end
59
+ assert_not_nil @rc.middlewares
60
+ assert_equal 'FOOF', RulesIO.token
61
+ assert_equal RulesIO::GirlFridayQueue, RulesIO.queue
62
+ assert_equal 'self.is_a?(MockController) && ["create", "recent"].include?(params[:action])', user_middleware.instance_variable_get(:@options)[:ignore_if_controller]
63
+ end
64
+
65
+ test "configuring blocks as strings works" do
66
+ user_middleware = @rc.instance_eval do
67
+ eval TestConfiguration::STRING_CONFIGURATION, binding, __FILE__, __LINE__
68
+ RulesIO::Rack.new(Object.new,
69
+ :webhook_url => @webhook_url,
70
+ :disable_sending_events => @disable,
71
+ :token => @token,
72
+ :queue => @queue,
73
+ :queue_options => @queue_options,
74
+ :controller_data => @controller_data
75
+ )
76
+ RulesIO::Users.new(Object.new, @middlewares[:users].configuration)
77
+ end
78
+
79
+ assert @rc.middlewares[:users].configuration[:ignore_if_controller].is_a? String
80
+ assert_equal 'self.is_a?(MockController) && ["create", "recent"].include?(params[:action])', @rc.middlewares[:users].configuration[:ignore_if_controller]
81
+ assert @rc.instance_variable_get(:@controller_data).is_a? String
82
+
83
+ stub_controller_instance = stub(:current_user => stub(:email => 'email@example.com'), :params => {:action => 'update'})
84
+ stub_controller_instance.expects(:is_a?).with(MockController).returns(true)
85
+ env = {'action_controller.instance' => stub_controller_instance}
86
+ assert_equal 'email@example.com', RulesIO.current_actor(env)
87
+ assert_equal false, user_middleware.send(:should_be_ignored, env)
88
+ end
89
+
90
+ test "configuring blocks as lambdas DOES NOT work" do
91
+ user_middleware = @rc.instance_eval do
92
+ eval TestConfiguration::BLOCK_CONFIGURATION
93
+ RulesIO::Rack.new(Object.new,
94
+ :webhook_url => @webhook_url,
95
+ :disable_sending_events => @disable,
96
+ :token => @token,
97
+ :queue => @queue,
98
+ :queue_options => @queue_options,
99
+ :controller_data => @controller_data
100
+ )
101
+ RulesIO::Users.new(Object.new, @middlewares[:users].configuration)
102
+ end
103
+
104
+ assert @rc.middlewares[:users].configuration[:ignore_if_controller].is_a? Proc
105
+ assert @rc.instance_variable_get(:@controller_data).is_a? Proc
106
+ assert @rc.middlewares[:users].configuration[:ignore_if_controller].lambda?
107
+ assert @rc.instance_variable_get(:@controller_data).lambda?
108
+
109
+ stub_controller_instance = stub(:current_user => stub(:email => 'email@example.com'), :params => {:action => 'update'})
110
+ # is never called, because a lambda doesn't work right with instance_eval
111
+ stub_controller_instance.expects(:is_a?).never
112
+ env = {'action_controller.instance' => stub_controller_instance}
113
+ # returns nil, because lambda doesn't work right with instance_eval
114
+ assert_equal nil, RulesIO.current_actor(env)
115
+ assert_equal false, user_middleware.send(:should_be_ignored, env)
116
+ end
117
+
118
+ test "configuring blocks as Procs works" do
119
+ user_middleware = @rc.instance_eval do
120
+ eval TestConfiguration::PROC_CONFIGURATION, binding, __FILE__, __LINE__
121
+ RulesIO::Rack.new(Object.new,
122
+ :webhook_url => @webhook_url,
123
+ :disable_sending_events => @disable,
124
+ :token => @token,
125
+ :queue => @queue,
126
+ :queue_options => @queue_options,
127
+ :controller_data => @controller_data
128
+ )
129
+ RulesIO::Users.new(Object.new, @middlewares[:users].configuration)
130
+ end
131
+
132
+ assert @rc.middlewares[:users].configuration[:ignore_if_controller].is_a? Proc
133
+ assert @rc.instance_variable_get(:@controller_data).is_a? Proc
134
+ assert !@rc.middlewares[:users].configuration[:ignore_if_controller].lambda?
135
+ assert !@rc.instance_variable_get(:@controller_data).lambda?
136
+
137
+ stub_controller_instance = stub(:current_user => stub(:email => 'email@example.com'), :params => {:action => 'update'})
138
+ stub_controller_instance.expects(:is_a?).with(MockController).returns(true)
139
+ env = {'action_controller.instance' => stub_controller_instance}
140
+ assert_equal 'email@example.com', RulesIO.current_actor(env)
141
+ assert_equal false, user_middleware.send(:should_be_ignored, env)
142
+ end
143
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rulesio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.8
4
+ version: 0.9.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-09-11 00:00:00.000000000 Z
13
+ date: 2013-02-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -51,7 +51,7 @@ dependencies:
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 0.10.0
54
+ version: '0.11'
55
55
  type: :runtime
56
56
  prerelease: false
57
57
  version_requirements: !ruby/object:Gem::Requirement
@@ -59,7 +59,87 @@ dependencies:
59
59
  requirements:
60
60
  - - ~>
61
61
  - !ruby/object:Gem::Version
62
- version: 0.10.0
62
+ version: '0.11'
63
+ - !ruby/object:Gem::Dependency
64
+ name: bundler
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: '1'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: '1'
79
+ - !ruby/object:Gem::Dependency
80
+ name: test-unit
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ~>
85
+ - !ruby/object:Gem::Version
86
+ version: '2.2'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: '2.2'
95
+ - !ruby/object:Gem::Dependency
96
+ name: mocha
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: rails
129
+ requirement: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ! '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ type: :development
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
63
143
  description: Rack middleware for connecting Rack applications to rules.io, with extensions
64
144
  for Rails 3 applications.
65
145
  email:
@@ -83,6 +163,8 @@ files:
83
163
  - lib/rulesio/users.rb
84
164
  - lib/rulesio/version.rb
85
165
  - rulesio.gemspec
166
+ - test/helper.rb
167
+ - test/test_configuration.rb
86
168
  homepage: https://github.com/rulesio/rulesio
87
169
  licenses: []
88
170
  post_install_message:
@@ -107,4 +189,6 @@ rubygems_version: 1.8.24
107
189
  signing_key:
108
190
  specification_version: 3
109
191
  summary: Rack middleware for connecting to rules.io
110
- test_files: []
192
+ test_files:
193
+ - test/helper.rb
194
+ - test/test_configuration.rb