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 +9 -2
- data/Rakefile +12 -0
- data/lib/rulesio/users.rb +9 -3
- data/lib/rulesio/version.rb +1 -1
- data/lib/rulesio.rb +26 -9
- data/rulesio.gemspec +7 -1
- data/test/helper.rb +6 -0
- data/test/test_configuration.rb +143 -0
- metadata +89 -5
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
|
-
|
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
|
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] ||=
|
10
|
+
@options[:ignore_if] ||= Proc.new { |env| false }
|
11
11
|
@options[:ignore_if_controller] ||= 'false'
|
12
|
-
@options[:custom_data] ||=
|
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
|
-
|
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)
|
data/lib/rulesio/version.rb
CHANGED
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 =
|
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 =
|
88
|
-
|
89
|
-
|
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.
|
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,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.
|
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:
|
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.
|
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.
|
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
|