utter_events 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +20 -0
- data/lib/utter.rb +6 -0
- data/lib/utter/utils/wrapper.rb +45 -0
- data/lib/utter/version.rb +1 -1
- data/sample_rails_app/Gemfile +4 -1
- data/sample_rails_app/Gemfile.lock +31 -4
- data/sample_rails_app/config/initializers/utter.rb +73 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb46bae6c354ecba25cfa0706148df5dd12070a6
|
4
|
+
data.tar.gz: 2c62baca84bb188665a375c76817642760ea5117
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 917cd2594cfbfd4b2c9b154232e72fedb3595ee345d03054fe9a9bbaef428220e7766283328610da177d4b008388c2b584b285f57a9c8a91bfafdfcecb0988d4
|
7
|
+
data.tar.gz: 497277157be74cd61f7acbfeb4f4e47355c2901d81c9c6775c0454fb58ae67e6d7126f7cc25d7adf2ceefb095a79cc871f268497639452d40838eb0f5d822a3c
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -98,6 +98,26 @@ end
|
|
98
98
|
|
99
99
|
Note that this doesn't work on events that are called from class methods; you will need to observe the Global Events Table object in those cases.
|
100
100
|
|
101
|
+
## Examples
|
102
|
+
|
103
|
+
There is an example [Rails App](https://github.com/parasquid/utter/tree/master/sample_rails_app) that uses `Utter`
|
104
|
+
|
105
|
+
$ # after checking out this repository
|
106
|
+
$ cd sample_rails_app
|
107
|
+
$ bundle install
|
108
|
+
$ rails s
|
109
|
+
|
110
|
+
Then go to localhost:3000/articles and take a look at the console. You should see something like this:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
object_id: 70100155242700
|
114
|
+
event: index_viewed
|
115
|
+
payload: {:params=>{"controller"=>"articles", "action"=>"index"}}
|
116
|
+
```
|
117
|
+
You will need to [setup your AWS credentials](https://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKs) if you wish to be able to use the AWS related examples.
|
118
|
+
|
119
|
+
The `UtterDynamoLogger` watcher utilizes [Celluloid](https://github.com/celluloid/celluloid/wiki/Basic-usage) in order to not block the original method call.
|
120
|
+
|
101
121
|
## Development
|
102
122
|
|
103
123
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/utter.rb
CHANGED
@@ -17,10 +17,16 @@ module Utter
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def process_event(object_id, event, payload)
|
20
|
+
return unless @backing_hash.has_key? object_id
|
21
|
+
return unless @backing_hash[object_id].has_key? event
|
22
|
+
|
23
|
+
# call registered event handlers
|
20
24
|
@backing_hash[object_id][event].compact!
|
21
25
|
@backing_hash[object_id][event].each do |block|
|
22
26
|
block.call(payload)
|
23
27
|
end
|
28
|
+
|
29
|
+
# notify watchers
|
24
30
|
changed
|
25
31
|
notify_observers(object_id, event, payload)
|
26
32
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Utter
|
2
|
+
module Utils
|
3
|
+
class Wrapper
|
4
|
+
def wrap(wrapped_class, before: nil, after: nil)
|
5
|
+
wrapped_class.class_eval do
|
6
|
+
self.define_singleton_method :utter_before_action do
|
7
|
+
before || Proc.new {}
|
8
|
+
end
|
9
|
+
|
10
|
+
self.define_singleton_method :utter_after_action do
|
11
|
+
after || Proc.new {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.inherited(klass)
|
15
|
+
def klass.method_added(name)
|
16
|
+
# prevent a SystemStackError
|
17
|
+
return if @_not_new
|
18
|
+
@_not_new = true
|
19
|
+
|
20
|
+
# preserve the original method call
|
21
|
+
original = "original #{name}"
|
22
|
+
alias_method original, name
|
23
|
+
|
24
|
+
# wrap the method call
|
25
|
+
define_method(name) do |*args, &block|
|
26
|
+
self.class.superclass.utter_before_action.call(self, args, name)
|
27
|
+
|
28
|
+
# call the original method
|
29
|
+
result = send original, *args, &block
|
30
|
+
|
31
|
+
self.class.superclass.utter_after_action.call(self, args, name)
|
32
|
+
|
33
|
+
# return the original return value
|
34
|
+
result
|
35
|
+
end
|
36
|
+
|
37
|
+
# reset the guard for the next method definition
|
38
|
+
@_not_new = false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/utter/version.rb
CHANGED
data/sample_rails_app/Gemfile
CHANGED
@@ -7,6 +7,7 @@ gem 'uglifier', '>= 1.3.0'
|
|
7
7
|
gem 'jquery-rails'
|
8
8
|
gem 'jbuilder', '~> 2.0'
|
9
9
|
gem 'sdoc', '~> 0.4.0', group: :doc
|
10
|
+
gem "celluloid", require: "celluloid/current"
|
10
11
|
|
11
12
|
group :development, :test do
|
12
13
|
gem 'byebug'
|
@@ -14,4 +15,6 @@ group :development, :test do
|
|
14
15
|
gem "quiet_assets"
|
15
16
|
end
|
16
17
|
|
17
|
-
gem "
|
18
|
+
gem "utter_events", path: "../", require: "utter"
|
19
|
+
|
20
|
+
gem "aws-sdk", "~> 2"
|
@@ -1,8 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../
|
3
3
|
specs:
|
4
|
-
|
5
|
-
gem_config (= 0.3.1)
|
4
|
+
utter_events (0.2.0)
|
6
5
|
|
7
6
|
GEM
|
8
7
|
remote: https://rubygems.org/
|
@@ -43,21 +42,45 @@ GEM
|
|
43
42
|
thread_safe (~> 0.3, >= 0.3.4)
|
44
43
|
tzinfo (~> 1.1)
|
45
44
|
arel (6.0.3)
|
45
|
+
aws-sdk (2.2.22)
|
46
|
+
aws-sdk-resources (= 2.2.22)
|
47
|
+
aws-sdk-core (2.2.22)
|
48
|
+
jmespath (~> 1.0)
|
49
|
+
aws-sdk-resources (2.2.22)
|
50
|
+
aws-sdk-core (= 2.2.22)
|
46
51
|
binding_of_caller (0.7.2)
|
47
52
|
debug_inspector (>= 0.0.1)
|
48
53
|
builder (3.2.2)
|
49
54
|
byebug (8.2.2)
|
55
|
+
celluloid (0.17.3)
|
56
|
+
celluloid-essentials
|
57
|
+
celluloid-extras
|
58
|
+
celluloid-fsm
|
59
|
+
celluloid-pool
|
60
|
+
celluloid-supervision
|
61
|
+
timers (>= 4.1.1)
|
62
|
+
celluloid-essentials (0.20.5)
|
63
|
+
timers (>= 4.1.1)
|
64
|
+
celluloid-extras (0.20.5)
|
65
|
+
timers (>= 4.1.1)
|
66
|
+
celluloid-fsm (0.20.5)
|
67
|
+
timers (>= 4.1.1)
|
68
|
+
celluloid-pool (0.20.5)
|
69
|
+
timers (>= 4.1.1)
|
70
|
+
celluloid-supervision (0.20.5)
|
71
|
+
timers (>= 4.1.1)
|
50
72
|
concurrent-ruby (1.0.0)
|
51
73
|
debug_inspector (0.0.2)
|
52
74
|
erubis (2.7.0)
|
53
75
|
execjs (2.6.0)
|
54
|
-
gem_config (0.3.1)
|
55
76
|
globalid (0.3.6)
|
56
77
|
activesupport (>= 4.1.0)
|
78
|
+
hitimes (1.2.3)
|
57
79
|
i18n (0.7.0)
|
58
80
|
jbuilder (2.4.1)
|
59
81
|
activesupport (>= 3.0.0, < 5.1)
|
60
82
|
multi_json (~> 1.2)
|
83
|
+
jmespath (1.1.3)
|
61
84
|
jquery-rails (4.1.0)
|
62
85
|
rails-dom-testing (~> 1.0)
|
63
86
|
railties (>= 4.2.0)
|
@@ -126,6 +149,8 @@ GEM
|
|
126
149
|
thor (0.19.1)
|
127
150
|
thread_safe (0.3.5)
|
128
151
|
tilt (2.0.2)
|
152
|
+
timers (4.1.1)
|
153
|
+
hitimes
|
129
154
|
tzinfo (1.2.2)
|
130
155
|
thread_safe (~> 0.1)
|
131
156
|
uglifier (2.7.2)
|
@@ -141,7 +166,9 @@ PLATFORMS
|
|
141
166
|
ruby
|
142
167
|
|
143
168
|
DEPENDENCIES
|
169
|
+
aws-sdk (~> 2)
|
144
170
|
byebug
|
171
|
+
celluloid
|
145
172
|
jbuilder (~> 2.0)
|
146
173
|
jquery-rails
|
147
174
|
quiet_assets
|
@@ -150,7 +177,7 @@ DEPENDENCIES
|
|
150
177
|
sdoc (~> 0.4.0)
|
151
178
|
sqlite3
|
152
179
|
uglifier (>= 1.3.0)
|
153
|
-
|
180
|
+
utter_events!
|
154
181
|
web-console (~> 2.0)
|
155
182
|
|
156
183
|
BUNDLED WITH
|
@@ -1,8 +1,79 @@
|
|
1
|
+
|
2
|
+
require "pp"
|
3
|
+
|
1
4
|
class UtterConsoleLogger
|
2
5
|
def update(object_id, event, payload)
|
3
6
|
puts "object_id: #{object_id}\nevent: #{event}\npayload: #{payload}"
|
4
7
|
end
|
5
8
|
end
|
6
9
|
|
7
|
-
|
8
|
-
|
10
|
+
class UtterKinesisLogger
|
11
|
+
def initialize
|
12
|
+
credentials = Aws::SharedCredentials.new(profile_name: "kinesis")
|
13
|
+
@client = Aws::Firehose::Client.new(credentials: credentials, region: "us-east-1")
|
14
|
+
end
|
15
|
+
|
16
|
+
def update(object_id, event, payload)
|
17
|
+
self.async._update(object_id, event, payload)
|
18
|
+
end
|
19
|
+
|
20
|
+
def _update(object_id, event, payload)
|
21
|
+
@client.put_record(
|
22
|
+
delivery_stream_name: "checkout",
|
23
|
+
record: {
|
24
|
+
data: payload.to_s
|
25
|
+
}
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class UtterDynamoLogger
|
31
|
+
include Celluloid
|
32
|
+
|
33
|
+
def initialize
|
34
|
+
credentials = Aws::SharedCredentials.new(profile_name: "dynamodb")
|
35
|
+
@client = Aws::DynamoDB::Client.new(
|
36
|
+
credentials: credentials,
|
37
|
+
region: "us-east-1"
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
def update(object_id, event, payload)
|
42
|
+
self.async._update(object_id, event, payload)
|
43
|
+
end
|
44
|
+
|
45
|
+
def _update(object_id, event, payload)
|
46
|
+
@client.put_item({
|
47
|
+
table_name: "mv_utter_events",
|
48
|
+
item: {
|
49
|
+
event_id: SecureRandom.uuid,
|
50
|
+
object_id: object_id,
|
51
|
+
event: event,
|
52
|
+
payload: payload
|
53
|
+
}
|
54
|
+
})
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
require "utter/utils/wrapper"
|
59
|
+
|
60
|
+
[ApplicationController].each do |klass|
|
61
|
+
after_action = Proc.new do |context, args, name|
|
62
|
+
payload = {
|
63
|
+
"object_instance" => context.to_s,
|
64
|
+
"action_dispatch.request.path_parameters" => context.env["action_dispatch.request.path_parameters"]
|
65
|
+
}
|
66
|
+
context.utter("#{context.class.to_s}##{name}", payload) if context.respond_to?(:utter)
|
67
|
+
end
|
68
|
+
Utter::Utils::Wrapper.new.wrap(klass, after: after_action )
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
console_watcher = UtterConsoleLogger.new
|
75
|
+
dynamo_watcher = UtterDynamoLogger.new
|
76
|
+
# kinesis_watcher = UtterKinesisLogger.new
|
77
|
+
Utter::GLOBAL_EVENTS_TABLE.add_observer(console_watcher)
|
78
|
+
Utter::GLOBAL_EVENTS_TABLE.add_observer(dynamo_watcher)
|
79
|
+
# Utter::GLOBAL_EVENTS_TABLE.add_observer(kinesis_watcher)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: utter_events
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- parasquid
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- bin/console
|
117
117
|
- bin/setup
|
118
118
|
- lib/utter.rb
|
119
|
+
- lib/utter/utils/wrapper.rb
|
119
120
|
- lib/utter/version.rb
|
120
121
|
- sample_rails_app/.gitignore
|
121
122
|
- sample_rails_app/Gemfile
|