utter_events 0.1.0 → 0.2.0
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.
- 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
|