rulesio 0.9.8 → 0.9.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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